みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
ここのところ、FMPの計算についての昔のセミナーテキストを取り出して、公開に向けて手を加えているのですが
そのなかで再帰計算についてを改めて追加、編集することにしたのですが、
その過程で ん?? という現象に出会いました。
先日
https://fm-aid.com/bbs2/viewtopic.php?id=6094
[解決] チェックボックスにチェックが入ったものだけを計算
での質問を他のフィールドやリレーションを使わないで
Evaluete関数を使った再帰計算で作れないかと挑戦をしたのですが
そこで、一応計算はできたのですが、
その結果をウィンドウの再表示などをしないと
結果が表示されないという問題にぶつかりました。
検証環境が悪い?(Mac/Win)のFMP11/12
それとも、計算式の組み方が悪いのか?
この手の計算式を得意としない私には判断ができなくて
軽々ん豊富な方々にお知恵を拝借したいと思い
恥を忍んでの投稿です。
検証ファイルは
http://yahoo.jp/box/cnBOBj
においてあります。
よろしくご検証ください。
Offline
Let([
$recs=Get(対象レコード数);
$res="";
$txt="チェック";
$recCal="
Case($recs>0 ;
Let([
$t2=GetNthRecord(checkBox; $recs);
$res=Case($t2=$txt;GetNthRecord(数字; $recs))+$res;
$recs =$recs-1
];
Evaluate($recCal)
);
$res
)
"
];
Evaluate($recCal)
//➡(変更) Evaluate($recCal; checkbox) 又は Evaluate($recCal; [checkbox; 数字])
)
※ 非保存計算フィールド ➡ グローバル計算フィールド
ループ式内に自動更新に必要な再計算起動トリガー要素(引数)が無い為でしょう。
・簡単には、ループ式末尾のEvaluate()に起動トリガーフィールドを追加するのが楽でしょう。
Evaluate($recCal) → Evaluate($recCal; [checkbox; 数字])
・ただし、これで再評価発火するのは現在のレコードだけだから、それが対象レコード全域に反映されるべく、
・このループ計算フィールドをグローバル格納フィールドへ変更して最適化完了です。
Offline
ループ式内に自動更新に必要な再計算起動トリガー要素(引数)が無い為でしょう。
・簡単には、ループ式末尾のEvaluate()に起動トリガーフィールドを追加するのが楽でしょう。
Evaluate($recCal) → Evaluate($recCal; [checkbox; 数字])
・ただし、これで再評価発火するのは現在のレコードだけだから、それが対象レコード全域に反映されるべく、
・このループ計算フィールドをグローバル格納フィールドへ変更して最適化完了です。
Hiroさんありがとうございます。
さすがと感謝します。
しかし、こういう問題は、仕様の中に書かれていこと?
べつにエラーになっているわけではないので、
Evaluate($recCal; [checkbox; 数字])
の [checkbox; 数字] が必要なのか
どうにもわからないということなんです。
もともと こうした計算は
スクリプトで処理をするタイプの私には、理解が難しい関数です。
よろしくご教授を。
あぁ グローバル化するのは 作成過程でいっとき行ったのですが
私の計算式では、改善はありませんでした。
Last edited by シャチ (2017-03-13 15:05:54)
Offline
もう一つご教授を
サンプルファイルの中で Evaluateで2種類の集計をしていますが
この式でEvaluateの第2引数をひと湯としない理由を知りたいのですが。
Offline
書かれている変更部分のことは
関数リファレンスに書かれている
Evaluate 関数には、オプションとして2番目の引数があり、ここに計算の基準となるフィールドを指定します。依存するフィールドの内容が変更されると、FileMaker Pro は、計算式が再評価されます。次の例では、「小計」が変更されると、「合計」が再計算されます。
のことなんでしょうか?もし、そうだとしてもかなり難解な説明のような気がしますが。
Offline
その解説は、初めて読んだ時にはよくわからない内容でしたが、理屈が解ってしまうと意味は解りますね。
要するに初心者向きの書き方ではない、他の人に解ってもらいたいという熱意が無い、という事でしょうね。だから、初心者向きの解説書が必要になるのでしょう。
この第2引数を設定しておかないと、最初に式が設定され評価された時の値を持ち続けるような設計になっていますので、あえてそれを再計算させるために第2引数が用意された、という事だと思います。
ちょうど、公式の掲示板で似た様な疑問が出されていましたね。
Offline
Shinさん
ありがとうごあいます。
なるほどと、だいたい理解し始めているところです。
まぁ、とにかく翻訳物のリファレンスが何位な日本語であることもあるのですが
元の英語版のリファレンスもかなり難解なのだろうと。。。。
それにしても、もっとユーザー目線のリファレンスが欲しいものですね。
今回のこの事例は、
次にアップする予定の 「FileMaker Pro7以降の データと計算の仕組み」に
織り込ませていただきます。
Hiroさん Shinさん
心から御礼申し上げます。
Offline
Evaluate関数の第二引数の用法は、本題の本質から少し外れるので、ここでは置いといて、
・ループ計算式は別に特殊な計算式ではなく、一般式と全く同じ仕様の基、全く同じ考え方で良いと思います。
・たとえ非保存の一般式であっても、再評価を誘発するための何らかのトリガー要素(OnChangeEvent)が
式内に含まれる事が必須ですよネ。
・標準仕様に則って、臨機応変に対応すれば難しいことではないでしょう。
・一般式でも良くやるテク手法は、今回の要素ナシ式で例えるなら、
$res="" ➡ $res=Left(checkbox & 数字; 0) //強制的に無意味な引数式を挿入
それとループ式で、別に気になったことをもう一件、
ループ式は無限ループに陥るのが一番怖いので、ループ抜け条件を先ず定義するのが吉です。
Let([
$recs=Get(対象レコード数);
$res="";
$txt="チェック";
$recCal="
Case($recs=0; $res; /*ループ抜け条件を先ず確保*/
Let([
$t2=GetNthRecord(checkBox; $recs);
$res=Case($t2=$txt;GetNthRecord(数字; $recs))+$res;
$recs =$recs-1
];
Evaluate($recCal)
)
)
"
];
Evaluate($recCal; [checkbox; 数字])
)
Last edited by Hiro (2017-03-13 16:32:02)
Offline
シャチさんがシーラカンスさん?(汗
Offline
あぁ ハンドルメネーム めちゃくちゃですねぇ。
面倒だから、一緒にしてしまいます。 お気付きの方も多いかと思いますが、同一人物でした。
で、最初の第2引数を使って変更した式を織り込んだものを修正版(v2)として
http://yahoo.jp/box/y08MkM
にアップしました。
///今後の投稿は シーラカンスで 通そうかと思います。
Offline
$res="" ➡ $res=Left(checkbox & 数字; 0) //強制的に無意味な引数式を挿入
これをするとなると、初心者(私も含めて)には余計に難解になるともうけど。
Offline
気付きませんでした(汗)関係ないレスすみません。投稿楽しみにしています。
Offline
いやぁ キャラを幾分でも変えるって 結構大変ですねぇ。
これで楽になりました。
余計な話で、失礼しました。
Offline
この例だと300行ぐらいしか計算できないし、初心者向けならカスタム関数の方がいいのでは^^;
Offline
実はその件は、Eveluate関数の問題点ということは理解しています。
そのために、私はスクリプトトリガで処理をしているのです。
カスタム関数の方がいいことも理解していますが、
カスタム関数はAdvanced版が必要になるので
それで、Peo11以降はmスクリプトトリガをお勧めしています。
今回の計算例は、
あくまでも 再帰計算の可能性 の検証というレベルで考えてください。
Last edited by シーラカンス (2017-03-13 19:59:05)
Offline
余談ですが、私の記憶・推察が正しければ、
確か#14 waderさんはこの素晴しいEvaluate再帰式の生みの親、
元祖発案された凄い方ではないでしょうか。
Last edited by Hiro (2017-03-13 21:33:21)
Offline
解決マークをつけていなかった
Evaluate関数、カスタム関数、スクリプトトリガ
これたでの計算の比較検証用ファイルは
https://fm-aid.com/bbs2/viewforum.php?id=2&p=2
で
Last edited by シーラカンス (2017-03-22 20:14:24)
Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 558.66 KiB (Peak: 579.57 KiB) ]