話題 14  ポータルスクリプトが無限 Loop に陥るとき

ポータル内を移動してLoopを利用するScriptが無限Loopに陥ってしまうことです。

レコードを前後して計算するような複雑な操作は ポータル内で動くScriptで実現させることが多いですし, ポータルScriptをLoop stepで自在に操ることはFilemaker使い手には必須のテクです。


  1. 1. Relationの定義で....作成を許可をcheckしなければ

基本的にはrelationの定義のときに “このリレーションシップを使用して, このテーブルでのレコードの作成を許可”にcheckしなければ, そして, Scriptでポータル内の行へ移動で ”最後まできたら終了”check を忘れなければ, 無限Loopに陥ることはありません。





  1. 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の仕様ということでしょう。




↓ただし, 最後に不要なゴミレコードが出来てしまいます。(-_-)


 
Sample File のdownload (.fp7)Tech_14_files/FMsample14.zip