FileMaker Pro 18 Advanced の新機能【再帰計算できる「While」関数の変数について】
2019年07月16日 10:00 AM
FileMaker 18
前回は、「While」関数の具体的な使用例を紹介しました。
前回の「While」関数のブログ: FileMaker Pro 18 Advanced の新機能【再帰計算できる「While」関数の便利な使い方】
今回は、「While」関数を使用する際に気をつけたい変数について、少し触れたいと思います。
□■ 「While」関数 の変数 ■□
まず、「While」関数の構文を復習してみます。
- While ( [ 初期変数 ] ; 条件 ; [ ロジック ] ; 結果 )
上記、引数の 角括弧[]で囲んでいる [ 初期変数 ] と [ ロジック ] は、計算で必要な変数を必要な分書くことができます。
下記の例を見てみましょう。
[ 初期変数 ] の箇所には、「~cnt」という変数と、「~result」という変数を定義しています。
[ ロジック ] の箇所には、その変数を使用して、それぞれの変数に値を再設定しています。
そして、計算結果として、「~result」に入っている値を戻り値としていますので、
“12345678910” という値が返ってきます。
では、
[ 初期変数 ] の箇所の、「~result」という変数を定義せずに、[ ロジック ] の箇所のみで定義したら、どうなるでしょうか?
エラーが返ってきます。
———-
//ロジック
~cnt = ~cnt + 1;
~result = ~result & ~cnt
———-
[ 初期変数 ]で、「~result」変数がないので、赤字の部分が見つからないと言っているんですね。
では、計算で使用したい変数は、[ 初期変数 ]ですべて定義しておかないといけないのでしょうか?
前回の 「While」関数の便利な使い方 で紹介した計算式を再度見てみます。
[
{
“code”: “0001”,
“kana”: “ミズホ”,
“name”: “みずほ”,
“url”: “https://bank.teraren.com/banks/0001.json”,
“branches_url”: “https://bank.teraren.com/banks/0001/branches.json”
},
{
“code”: “0005”,
“kana”: “ミツビシトウキヨウUFJ”,
“name”: “三菱東京UFJ”,
“url”: “https://bank.teraren.com/banks/0005.json”,
“branches_url”: “https://bank.teraren.com/banks/0005/branches.json”
}
]
上記のような、JSONデータから、
みずほ
三菱東京UFJ
という名前をリストにする計算式です。
黄色で、塗った箇所に、「~name」という変数が定義されています。
初期変数では定義していませんが、エラーは返ってきていません。
変数を定義する計算式で、使用していないからなのですが、
つまり、再帰計算させるループ間で、情報を保持しておく場合には、[ 初期変数 ]で、変数を定義しておかないといけないわけです。
上記、「~name」という変数は、一回の計算で使用するだけで、その値は次の計算時には、必要ないものです。
ですので、ロジックにだけあればいいものとなります。
もちろん計算式の書き方の問題なので、「~name」という変数を書かず、「~result」変数の計算で、参照している「~name」変数部分を、
計算式にしてしまえば、「~name」変数はいらないのですが、上記の例では、計算式の視認性を良くするために、このような書き方をしています。
変数にする基準としては、視認性だけではなく、同じ計算式が、何回も出てくる場合、その部分を変数にしておくと、視認性だけではなく、
パフォーマンスも良くなるので、その点も考慮しましょう。
□■ 「While」関数 で、グローバル変数の定義 ■□
「While」関数の変数で、$, $$をつけると、ローカル変数、グローバル変数が定義できます。
例えば、
While (
[
//初期変数
$$TEST = “TEST”
] ;
//条件 “”;
[
//ロジック
];
//結果
“”
)
上記のように[ 初期変数 ]でグローバル変数を定義すれば、
グローバル変数が定義されます。
では、下記のように
[ ロジック ] で、グローバル変数を書いたらどうなるでしょうか?
While (
[
//初期変数
~cnt = 0
] ;
//条件
~cnt < 1;
[
//ロジック
~cnt = ~cnt + 1;
$$TEST = “TEST”
];
//結果
~cnt
)
同じく定義することができました。
「While」関数で、ローカル変数、グローバル変数が定義できるのは、
変数を定義できる[ 初期変数 ][ ロジック ] の箇所、どちらでもできました。
□■ 「While」関数 で、変数の接頭辞 ■□
ローカル変数は、”$”を変数につけます。
グローバル変数は、”$$”を変数につけます。
関数の変数には、特に決められた接頭辞はありません。
私は、現在 FileMaker のカスタムApp開発者の多くが使うチルダ記号( ~ )を使っています。
計算式内の変数なのか、データベースのフィールド名なのかなど、すぐに判断がつくからです。
また、下記のような場合、
フィールドA(数字)には、100が入力されていて、
フィールドB(計算)の計算で、 「フィールドA」という変数に、200が設定されています。
フィールドBの結果は、200となっていますので、結果に書かれているフィールドAは、「フィールドA」変数となります。
変数のほうが優先されるようです。
ですが、とてもややこしいですね。
関数内の変数には、フィールド名では使わない何かしらの接頭辞を設定して、
計算式を書くことを推奨します。
いかがでしたでしょうか?
「While」関数を使用して、面倒だった処理が、計算式で簡単に処理できるケースが、たくさんありますので、
仕様を把握して、活用していきましょう。