みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
どうしても使い分けたいなら、
式内で完結なら D、式外に繰越なら $D だから、式は、
Let([
D=Case(Get(レコード番号)=1; ""; $D);
$D=D+1
];
$D
)
Last edited by Hiro (2017-02-24 13:53:27)
Offline
$付き変数の不可解さは、関数であるFileMakerの計算式に束縛を導入する筈のLet()を、
スクリプトに手続き型Variableをもたらすための「変数を設定」スクリプトステップと、
無理矢理中途半端に共存させようとした結果です。
FileMakerの計算式は関数です。関数中に、渡されたわけでもなく、自明でもない、
スコープも寿命も不安定な$付きの変数を混ぜること自体、
本来なら、まともな計算式の記述を放棄しているも同然です。
例にも挙げてますが、そういう式の評価中に、同識別子の「変数を設定」が動いたら…。
最低限、スコープと寿命と、それをぶち壊しにする仕様を把握し切れてから使うべきです。
-
LetとEvaluateによるループ計算処理で、その簡便さに対し、
ループ回数の低さ(大凡300回以下)が利便上の問題とされますが、
・入れ子の2重ループ式にするとカスタム関数の限界数(非末尾再帰1万回)
をも超えたループ回数も可能になります。(スピードは鈍足ですが)
・例えば、安全を見て1重の最大数を半分以下の125回に制限しても、
その2重ループは、 125X125=15,625 回となります。
これ、面白いですね。
ただスタックなりのリソースは大丈夫なんでしょうか?
Let()とEvaluate()での挙動考えると、評価待ちの両者がえらい深さになりそうな。
でも、125X125の各125単位で演算切れて一重目の125までは戻るんでしょか。
もしその通りなら、一重で300回回すより、10X30とかで回した方が軽い?
以下の2重ループ式で少し調べてみました。(式はループ回数をただカウントするだけの単純な式)
Let([
$i=0; $x="";
$loop1="Case($i=$max1; $x;
Let([
$x=$x + Let([$j=0; $y=\"\"]; Evaluate($loop2));
$i=$i+1
]; Evaluate($loop1))
)";
$loop2="Case($j=$max2; $y;
Let([
$y=$y+1;
$j=$j+1
]; Evaluate($loop2))
)"
];
Let([$max1=130; $max2=130]; Evaluate($loop1)) //←親・子ループの其々回数をココで差し替えて色々実験
)
1重ループの限界回数と2重ループの其々限界回数には相関関係があるようです。
1重ループの限界回数 = 親ループの回数+子ループの回数 // 260 = 1 + 259 みたいな
このため、2重ループ式で最大回数を得るのは、1重ループの限界回数の調度1/2回を
親と子ループ双方に適用するときと言えます。
例えば、1重ループの限界回数が260回の場合、(260/2)X(260/2)で2重の最大結果16,900回を得ます。
Offline
[ Generated in 0.004 seconds, 7 queries executed - Memory usage: 511.27 KiB (Peak: 518.8 KiB) ]