Filemaker_Tech
Filemaker_Tech
話題 14 ポータルスクリプトが無限 Loop に陥るとき
ポータル内を移動してLoopを利用するScriptが無限Loopに陥ってしまうことです。
レコードを前後して計算するような複雑な操作は ポータル内で動くScriptで実現させることが多いですし, ポータルScriptをLoop stepで自在に操ることはFilemaker使い手には必須のテクです。
1. Relationの定義で....作成を許可をcheckしなければ
基本的にはrelationの定義のときに “このリレーションシップを使用して, このテーブルでのレコードの作成を許可”にcheckしなければ, そして, Scriptでポータル内の行へ移動で ”最後まできたら終了”check を忘れなければ, 無限Loopに陥ることはありません。
2. Relationの定義で....作成を許可をcheckしたら
基本的にはrelationの定義のときに “このリレーションシップを使用して, このテーブルでのレコードの作成を許可”にcheckすれば, Scriptでポータル内の行へ移動で ”最後まできたら終了”を入れても 無限Loopに陥ると考えた方がいいと思います。”Exit Loop if ” stepで抜け出すようにします。
ポータルのレイアウト画面で, 垂直スクロールバーをOFFにしていると, Scriptの動きはポータルの枠内で止まりますので 無限Loopにはなりません。
垂直スクロールバーをONにしていると, 無限Loopに陥りますので, “Exit Loop if ” stepで抜け出すようにします。
ただし, 無限Loopに陥らない例外もあります。(sample参照)
Sample (sample14)
各レコードの価格Fieldを順次足して小計Fieldに書き出す単純なScriptです。
Relationの定義で”作成を許可”をcheckしています。上に書きましたが, “垂直スクロールバー”をOFFにしていますから, 枠内に収まります。(厳密には無限Loopにはなりません)
ゴミレコードが出たら, “空白行削除”Scriptでclearしてください。
↓“無限Loopになる”Scriptですが,
↓”Exit Loop if ” step を入れると抜けられます。
↓①のScriptの”Field設定”を”計算結果を挿入”に替えると, “Exit Loop if ”がなくても, それだけで無限Loopを回避できます。どういう意味なのか, ちょっと考え込んでしまいますが, “Field設定”stepが実行されると, その時点で, そのポータル行は最後行でなくなる(追加レコードが確定する?)ので, 永遠に最後行に到達しない, ということでしょうか? まあとにかくそういうFMの仕様ということでしょう。
↓ただし, 最後に不要なゴミレコードが出来てしまいます。(-_-)