話題 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を開いてください。各ボタンで同じ結果が得られます。