話題 07  Fileを超えてデータを引き渡す 2つの方法

Filemakerのなかの File間のデータ受け渡しをする方法のことです。

Relationを介してdata受け渡しすることができるならそれがもっとも確実でスマートな方法ですが, ときにはrelationを介さないで他のFileにデータを引き渡したいこともあります。例えば, A Fileで操作していて, B Fileの総レコード数が知りたい, というような場面です。


  1. 1. 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は 引き出されたとき, テキストに変換されていますので, 再度, 日付に変換し直さねばなりません。時刻も同様です 。


  1. 2. Copy and Paste を用いる方法

OS操作のコピペ機能を使って個別にデータを受け渡すことも可能ですが, スマートにScriptで氏名, 項目, 金額等を同時に受け渡したいという場合, Copy & Pasteでは 同時には1個のデータしか受け渡せませんから, Get(スクリプト引数) と同じように”合成”Fieldが必要になります。また引き受けたいFileで いったん”格納”するFieldを作成しておけねばなりません。また, “コピー” stepのとき, “貼り付け” stepのとき, レイアウトにその合成Field, 格納Fieldを配置しておかねばなりません。さらにその文字列をバラすのに, カスタム関数, Middle_Position が役に立ちます。


Sample (FMsample07, FMsample07-12)

A  Get(スクリプト引数), Copy & Paste の方法を使って複合データを転送する

FMC_Kokyaku Fileを開いてください。

篠原商店から, 緊急に未確認ながら ”ロシアのカニ(箱)”を購入したいという要請があり (ちょっと強引な場面設定ですが (^.^) ), とりあえず, 顧客名簿の篠原商店の画面から, メモとして会計Fileにデータを転送します。それを 販売原簿Fileで読み取ってレコードとして入力します。

各ボタンで同じ結果が得られます。





B  Get(スクリプト引数) あるいは relation を使って 別Fileのレコード総数を算出する

別のFileのレコード総数をgetする方法です。FMD_GetRecordを 開いてください。

  1. (a)お互いのFileに固定数_1(数字)のFieldを作成し, それらをkey Fieldとして , relationを組み, 統計関数, count関数, あるいはsum関数を使って, 相手のレコード総数を算出するという オーソドックスな方法です。

  2. (b)relationを使わないで 別のFileのレコード総数を算出するのは, ちょっと工夫が必要です。

  3. FMD FileのScriptから 総数を算出したいFMB FileのScriptを開き, そこで レコード総数をグローバル変数$$FMBに組み込みます。(その変数は FMB File内でしか有効でないので) それを Get(スクリプト引数)にして FMDの仲介Scriptで FMDに引き渡します。仲介Script内でグローバル変数$$FMB_TNに組み込みます。これでFMBのレコード総数が FMDに引き渡されたことになります。relationと違って新たなFieldを作成しなくてもよいですが, 新たなScriptをそれぞれのFileに作成する必要があります。どちらも一長一短というところでしょうか。