初心者のFileMaker pro Q&A

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。

何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

ログインしていません。

アナウンス


#1 2020-09-07 20:37:11

Iam
ゲストユーザー

[解決] 複数レコードを一つのフィールドに

Filemaker18使用です。
似たような質問もあったのですが、自分の環境でどのようにしていいか解らなかったので質問させてください。
注文テーブルという中に明細テーブルのポータルがあります。
この明細テーブルを使い関連レコードで移動(明細テーブルへ)した後、明細テーブルの複数レコードをこれまた明細テーブルのグローバルフィールドへ纏めたいです。
関連フィールドのみをリストにしたい感じです。※ちなみにリレーションは ユニーク値のIDとフラグという2つで=にしています。
フラグは注文前は 1 で 注文が終わると全部 2 になるといった感じです。

"定型文" & 明細テーブル::注文詳細 & "定型文B"

出来上がるのが

定型文サラダ定型文B
定型文スパゲティ定型文B
定型文ケーキ定型文B

というようにしたいです。List関数や ExcuteSQL関数を使うのではと思うのですが
どうもうまく行きません。正しい方法をお教え下さい。お願いします。

#2 2020-09-08 01:29:07

Shin
メンバー

Re: [解決] 複数レコードを一つのフィールドに

集計フィールドで品名のリストを作り、substitute() で定型文を挟めばいいでしょうえ

オフライン

#3 2020-09-08 03:01:08

Hiro
メンバー

Re: [解決] 複数レコードを一つのフィールドに

そのグローバルフィールドに対して、
下記計算値で「フィールド内容の全置換」を実行して、
目的リストを生成代入します。
その式は、

Let(
[
   #add="定型文" & 注文詳細 & "定型文B";
   $lst=List($lst; #add)
];
   Case(Get(対象レコード数)=Get(レコード番号); $lst)
)

オフライン

#4 2020-09-08 08:29:08

Shin
メンバー

Re: [解決] 複数レコードを一つのフィールドに

もっと簡単に、グローバルフィールドを空にしておいて、
グローバルフィールド & "¶定型文" & 注文詳細 & "定型文B"
で全置換してもいいかも。

オフライン

#5 2020-09-08 10:29:04

Moz
メンバー

Re: [解決] 複数レコードを一つのフィールドに

グローバルフィールドへの全置換なら
List ( グローバルフィールド ; "定型文" & 注文詳細 & "定型文" )も。

改行区切り作るとき List 関数は便利ですね。

編集者 Moz (2020-09-08 10:30:07)

オフライン

#6 2020-09-08 11:02:19

Hiro
メンバー

Re: [解決] 複数レコードを一つのフィールドに

折角のグローバル保存なのだから、#4 や #5案のように、
全レコードを個々毎に置換してしまうと、書き込みロスが生じて逆効果です。
また、毎回グローバルフィールドを空にしておく手間も増えます。

オフライン

#7 2020-09-08 11:33:06

Moz
メンバー

Re: [解決] 複数レコードを一つのフィールドに

不勉強で申し訳ありません。

#3案と#4案、#5案はいずれもグローバルフィールドに対する全置換法と見受けられます。
対象レコード分のフィールド値を全置換で集約できるのはグローバルの特性を利用したものですね。
Loop法に比べて少ない手数で実行できますが初学者には理解が難しいので一長一短ですが......。

後学のため#3案の優位点とパフォーマンスに有意差が生じるならばその検証ソースを頂きたいです。
所謂空中戦といわれる変数への値保存とグローバル格納への値保存の比較では現在のバージョンでは有意差は無いと思うのです。

オフライン

#8 2020-09-08 11:34:25

Shin
メンバー

Re: [解決] 複数レコードを一つのフィールドに

何万レコードが対象ならばロスは大きいでしょうが、せいぜい数十レコードなのでロスも無視できるかと。
簡単なファイルで、1000レコードを用意。
#4の全置換で約110mSec程度、#3の置換で約30mSecでした。10レコードだと、1.1mSec と0.3mSec 換算になるでしょうから、どちらも無視できる時間では。
ちなみに、#2は 3mSec です。

"a" & ¶ & フィールド と、List (  "a" ; フィールド ) は、実行時間に差はありませんでした。

編集者 Shin (2020-09-10 10:33:07)

オフライン

#9 2020-09-08 12:34:25

Iam
ゲストユーザー

Re: [解決] 複数レコードを一つのフィールドに

皆さんご回答いただき、ありがとうございます。
まずは皆さんから教わった方法で目的が達成できました。ありがとうございます。

今後の応用に利かすため、今回の式のご説明をお願いしたいのですが、
私の現在の理解と解らない点をあげ#3の式を日本語にすると

#add っていうのは "定型文" & 注文詳細 & "定型文B" ということにするよ ※理解出来ました。
$lst は #add をListして行ごとに並べるよ ※$lstの変数を決めている時にList(#add)ではなく自己の$lstが入るのか解りませんでした。
こういうルールで進めていくから次に命令するよ
Get(対象レコード数)=Get(レコード番号) のケースだったら $lst を返すよ。
※命令を $lst だけで出すのでなく、何でcaseでGet(対象レコード数)=Get(レコード番号) を指定するのか解りませんでした。

あと、変数を指定するのに、$addではなく#addになるのも解りませんでした。

この辺が理解出来れば自分自身の以降の応用に出来るかと思いますので、今回の式のご説明いただければ幸いです。

#10 2020-09-09 12:37:53

Hiro
メンバー

Re: [解決] 複数レコードを一つのフィールドに

変数記号の「#」は、現行式内でのみ有効な「一時変数」の任意識別マーカです。(省略も可能)
対して「$」は、FM予約マーカで現行式内を越えて有効な「ローカル変数」です。
#3式のLet変数で、#addは一時変数で、$lstは繰越変数として設定しています。
また、$lst=List($lst; #add) は、自己回帰式で「繰越更新」に必須です。

「Get(対象レコード数)=Get(レコード番号)」は、現在「最後のレコードか?」の判定条件式です。

オフライン

#11 2020-09-09 16:08:16

Iam
ゲストユーザー

Re: [解決] 複数レコードを一つのフィールドに

なるほど!
#と$について理解出来ました。
繰越変数 自己回帰式 繰越更新については調べてもちょっと理解が出来なかったですが、現時点では「そういうもの」ということで記憶しておきます。
最後のレコードか?という式も理解出来ました!
次回同じようなことがあっても自分で式が作れそうです。
Hiroさんご説明ありがとうございました。

クィック投稿

メッセージを書いて送信してください。
登録の確認

実在の人物による登録であることを確認します。

Board footer