Dictionary関数が必要な理由(FileMaker)

表題:Dictionary関数が必要な理由…を、竹内氏@スプラッシュ 的に言うならば…Dictionary関数を使うと何がうれしいの?…ちうよーな話です。FileMaker において、D.R.Y. なメソッドを考える上で、「複数のテーブルやファイルをまたいで、複数の値を受け渡ししたい」と思うことはよくあります。(とくに、ver 6 以前の名残でやたらとファイルが多い…というようなケースではなおのことです)以下に、条件を整理し、このようなケースで適切な手法を考えます。

グローバルフィールドは使いたくない

D.R.Y. な手法を考えるとなると、なるべくテーブルに余計なフィールドを追加したくはありませんね。

グローバル変数は使えない

一見「グローバル変数で良いんじゃね?」と思いがちですが、以下の理由でグローバル変数は使えません。・グローバル変数は、ファイルを超えての受け渡しはできません・現時点でグローバル変数は、現実には希にですが受け渡しに失敗することがあります

『スクリプト引数』と『スクリプトの結果』を使う

ファイルを越えて、受け渡しができる変数(のようなもの)で、このような場合の万能選手は、『スクリプト引数』と『スクリプトの結果』 です。※ 『スクリプト引数やスクリプトの結果』というのは、長いので以下、スクリプト引数と言います

スクリプト引数は「ひとつの値だけ」しか持たせられない

さて、スクリプト引数を使うとしても、これらには、ひとつの値しか持たせることができません。どうするか…

改行区切りで持たせればいい?

ひとつのスクリプト引数の中に複数の値を持たせるためには、改行区切りが使えるんじゃないか?とすぐ思いつくでしょうが、問題がふたつあります。
メンテナンス性が悪い
何番目に何の値を入れたのかが分かりにくいので見通しが悪いと言わざるを得ません場合によっては、複数のスクリプト間で、スクリプトの結果というバトンをリレーすることになるわけですが、最初のスクリプトに渡してやるべき値の種類や数が、次のスクリプトに渡してやるべきそれらと合致しない場合が多いです。そうなると、「いったい全体どのスクリプトの何番目に何の値を入れてるの???」という問題が起きます。とくに、いったん作ったものを、どこででも使い回せるように(D.R.Y. に)作りたい場合は、このような「ひとつのスクリプト引数のなかに複数の値を入れる」ときの手法は統一するべきです。
そもそも改行を含む値を入れることができない
当然ひとつの値自体に改行を含むようなケースでは使えません

改行区切りの配列ではなく、連想配列を使えれば…

「これは、何番目の行の値」というただの改行区切りを『配列』といい、対して、「リンゴは14個で、イチゴは3個…」のようなものを『連想配列』と言います。つまり、LabelName(添え字と言ったりもします)と Vale(値)のセットにできれば上述の改行区切りの問題点は片付きます。

カスタム関数を使う

連想配列のような形式での値の受け渡しをする為には、のちのち楽チンにメンテナンスでき、使い回しできることが望まれますので、このあたりは、カスタム関数に頼ってしまいます。※ このようなカスタム関数(群)を便宜上、Dictionary関数と呼ぶことにします。

Dictionary関数を使う

Dictionary関数にはいくつかの流派がありますw以下のエントリで紹介しているのは、sixfiedrice.com で紹介された手法ですが、現在私は、goya.com の Dictionary関数 を主に使っています。(sevensdoor など日本では goya.com の方をよく使うことが多く、そこに合わせておいた方が何かと面倒じゃないだろうというだけのことであり、理屈としては、以前に書いた以下のエントリと同じ理屈であり、同じ性質のものです)

おすすめ Dictionary 関数セット

以下の 5つのカスタム関数を、すべてのソリューションファイルに入れておくことを勧めます。GetProperty ( propertyList ; propertyName )
Case (
IsEmpty ( propertyList ) ; "" ;
Let ( [
propertyName =
Trim (
Substitute (
propertyName ; [ ¶ ; "" ] ; [ "=" ; "" ]
) // Substitute
) ; // Trim
first = GetValue ( propertyList ; 1 ) ;
eq = Position ( first ; "=" ; 1 ; 1 ) ;
firstName = Trim ( Left ( first ; eq - 1 ) ) ;
firstValue = Right ( first ; Length ( first ) - eq ) ;
remValues = RightValues ( propertyList ; ValueCount ( propertyList ) - 1 )
] ;
Case (
firstName = propertyName ; Evaluate ( firstValue ) ;
GetProperty ( remValues ; propertyName )
) // Case
) // Let
) // Case
GetResultProperty ( propertyName )
GetProperty ( Get ( スクリプトの結果 ) ; propertyName )
GetScriptProperty ( propertyName )
GetProperty ( Get ( スクリプト引数 ) ; propertyName )
SetProperty ( name ; value )
Trim ( Substitute ( Name ; [ ¶ ; "" ] ; [ "=" ; "" ] ) ) & "=" & Quote ( Value ) & ¶
SetPropertyField ( field ; value )
SetProperty ( GetFieldName ( field ) ; value )
よさげな DEMO ファイルはまた時間をみて作ったり作らなかったりします。

0コメント

  • 1000 / 1000