Filemaker_Tech
Filemaker_Tech
話題 07 FMのFileを超えてデータを引き渡す 2つの方法
追記あり: List関数に注意 (後述)
1. Relationを介して File間のデータ受け渡しをする方法
Relationを介してdata受け渡しすることができるならそれがもっとも確実でスマートな方法です。
しかし, ときにはrelationを介さないで他のFileにデータを引き渡したいこともあります。
2. Get(スクリプト引数)関数 を用いる方法
この方法は FilemakerのFile間でメモのようにデータ受け渡しできるスマートな方法です。ただ, 同時に 1個のテキストデータしか渡せませんので, 例えば
氏名, 項目, 金額等を同時に受け渡したいという場合, それらをまとめて1個の文字列, 例えば, “$”を区切り文字として”合成”テキストFieldを作ります。
”合成”Field = 氏名 & “$” & 項目 & “$” & GetAsText( 金額 ),
これを 引き受けたいFileのScriptで Get(スクリプト引数)で引きだしますが, 引き出した文字列はもとのデータにバラさねばなりません。これをバラすのに話題2で紹介したカスタム関数, Middle_Positionが役に立ちます。
Middle_Position( 合成 ; “$” ; 1 ) -> 氏名, Middle_Position( 合成 ; “$” ; 2 ) -> 項目, GetAsNumber ( Middle_Position( 合成 ; “$” ; 3 ) ) -> 金額 になります。手前味噌で恐縮ですが, このカスタム関数Middle_Positionはかなり使えます。
スクリプト引数にList関数, 例えば List ( 氏名 ; 項目 ; 金額 )とすれば, “合成”文字列を使わなくてもよく, Get(スクリプト引数)の計算結果は 改行記号で区切られたテキストになるので, GetValue関数, MiddleValue関数で個別に取り出せる, というほうがさらにスマートでしょうか。
ただし, いずれの場合も日付Fieldは 引き出されたとき, テキストに変換されていますので, 再度, 日付に変換し直さねばなりません。時刻も同様です 。
追記 : List関数に注意 (2024.4.9)
引き渡したい複数のデータをList関数にして スクリプト引数として転送するのが便利だと思っていたのですが, 思わぬ落とし穴があることがわかりました。この穴にはまってしまって 抜け出すのにだいぶ時間をとられました。
たとえば, ScriptXX 実行時に スクリプト引数を List ( word-A ; word-B) とします。このword-A,word-Bがいつも 無(Empty)でなければ 正常に機能するのですが, 前半部 word-Aが 無(Empty)になると, word-Bが繰り上がって, word-Aの位置に来てしまいます。List ( "最初の文字" ; “次の文字" ) が List ( “次の文字” ; Empty ) になってしまします。これを回避するには word-Aが無の場合, 空文字 ” “ を入力すれば, 実データとして認識されるので, List関数は思い通りに機能します。注意が必要です。 その点, Middle_Position関数では, word-AがEmptyなら, $$word-B となって word-Aが 無(Empty)として取り出せます。位置がずれることはありません。
また, 上記の例で List ( word-A ; word-B) の word-A を取り出す目的で MiddleValue ( get(スクリプト引数) ; 1 ; 1)としたのでは, 結果が改行記号付き word-A & “¶” になってしまいますので, それが不要ならSubstitute ( MiddleValue ( get(スクリプト引数) ; 1 ; 1); “¶” ; “” ) として, 改行記号を取り除く必要があります。
3. Copy and Paste を用いる方法
OS操作のコピペ機能を使って個別にデータを受け渡すことも可能ですが, スマートにScriptで氏名, 項目, 金額等を同時に受け渡したいという場合, Copy & Pasteでは 同時には1個のデータしか受け渡せませんから, Get(スクリプト引数) と同じように”合成”Fieldが必要になります。また引き受けたいFileで いったん”格納”するFieldを作成しておけねばなりません。また, “コピー” stepのとき, “貼り付け” stepのとき, レイアウトにその合成Field, 格納Fieldを配置しておかねばなりません。さらにその文字列をバラすのに, カスタム関数, Middle_Position が役に立ちます。
Sample (FMsample07, FMsample07-12)
篠原商店から, 緊急に未確認ながら ”ロシアのカニ(箱)”を購入したいという要請があり (ちょっと強引な場面設定ですが (^.^) ), とりあえず, 顧客名簿の篠原商店の画面から, メモとして会計Fileにデータを転送します。それを 販売原簿Fileで読み取ってレコードとして入力します。 FMC_Kokyaku Fileを開いてください。各ボタンで同じ結果が得られます。