変数を名前で設定

[Q] FileMakerのスクリプトに関する問題です。下の表の(1), (2)には何が入るでしょうか?

フィールド設定 フィールドを名前で設定
スクリプト実行 (1)
変数を設定 (2)
[A] それぞれ、そのようなスクリプトステップは存在しません。ですが、それに替わる方法はあります。
(1)については、「バーチャルリストで目次を生成する」のデモ1を参照してください。
(2)については、バーチャルリストによるレポート生成(パート1)のレポート2で使われていました。今回の記事で詳しくご紹介します。


FileMaker Hacks logo

Set Variable by Name

(元記事はこちら)

Kevin Frank
2016/4/6

最近、いろいろな集計や作表の処理をしているときに、一つ以上の変数を「動的にインスタンス化」する簡単な方法があればいいのに、と思うことがよくあります。別の言い方をすると、「変数を名前で設定する」ということですが、その変数名は人が決め打ちするのではなく、プログラムで生成するという意味です。

この問題はこのブログでここ5年ほどの間に何度か取り上げられてきました。代表的なものはDynamic Variable Instantiationですが、そこで私が書いたのは..

2016-04-06_074440
ここに「Specify…(指定)」ボタンがあればいいのに

..ということと、合わせて一時的な解決方法として、なんとも扱いにくいわけのわからない式を提案しました。具体的な式は以下の通りです。

2016-04-06_083324

実際のところ、この方法は時々使うものとしては悪くありません(特に変数に渡す値が上のGetSummaryのように単純であれば)。

しかしこの手法を日常的に使うようになり、さらに変数に渡す値が複雑になってくると、結局カスタム関数を使ったほうがいろいろ楽になるということに気づきました。自分のニーズにぴったりあうものはなかなか見つかりませんでしたが、うまく行きそうな候補をBrian Dunningのサイトで見つけ、それを修正することにしました。

名称はSetVarByName(変数を名前で設定)にしました。この機能確認用のデモファイルに定義してあるので試してみてください。
SetVarByName.zip

カスタム関数のめざす姿

  • 設定と利用が簡単
  • 単体で動作する — フレームワークの一部品ではない
  • ゼロや負数の繰り返しを許容する(もちろんそれに加えて正数の繰り返しも)
  • $ローカル変数と$$グローバル変数の定義が可能(指定がない場合はデフォルトで$ローカル変数)
  • 値が静的なテキストか実行コードかを自動的に解釈する

定義

2016-04-06_142711

オリジナルのカスタム関数にVaughan Bromfieldが加えた改良点は、メイン部分をEvaluationErrorで囲ったことです。これによって、文法に明らかな問題がない場合にゼロを返します。私はその考え方をさらに進めて、最初のLetの宣言部分も別のEvaluationErrorで評価するようにしました。これにより、カスタム関数に渡したのが静的な文字列なのか、あるいは解釈されるべき実行コードなのかを推測する機能を実現します。

静的な値の例

2016-04-06_104124

結果:

2016-04-06_103747

実行コードの例

2016-04-06_092852

結果:

2016-04-06_092309

説明:

  • $counter = 2
  • “$col_” & $counter = “$col_2”
  • $col_2 = 12
  • $col_1 = 3
  • $col_2 / $col_1 = 4

実行コードの自動判別をオーバーライドする

もしなんらかの理由で、実行コードの自動判別をオーバーライドする必要がある場合は、Quote関数と(必要であれば)エスケープしたクォーテーションマークを組み合わせて使用します。

2016-04-06_095832

この式の結果は次のようになります。

5.

ポイントは、このカスタム関数を利用すればめったにないケースのためのややこしい式が不要になり、最低限の操作でほとんどの場合に目的の結果を得ることができます。

少なくとも、私にとっては作業がとてもはかどるようになりました。今後掲載予定の「バーチャルリストによるレポート生成」の連続シリーズで、実際の場面での利用例を紹介します。

最後に、カスタム関数について有用なフィードバックと提案をいただいたRob Russell、Howard Schlossberg、Geoff Gerhard、Darren Terryに感謝の意を表します。

Leave a Reply