みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お疲れ様です。
FM19
Excelで「=C1+A2-B2」と計算していたものをファイルメーカーで計算しようとするとなるとどのような計算式になりますでしょか。
ご教授願いたいです。
「C2=C1+A2-B2」
対象レコードの並びで、
一つ前のCフィールドということなら、
GetNthRecord ( C ; Get ( レコード番号 ) - 1 )
で得られます。
対象レコードやソートが変わった時にもその一つ前なら、
その索引を非保存とします。
Offline
その時のレコードのソート状態にもよるでしょうが、
GetNthRecord ( フィールド ; Get ( レコード番号 ) - 1 )
で、一つ前のレコードを取得できます。
ですが、その計算式が参照しているフィールドはさらにその前のレコードを参照していますので、循環してしまうことになり、1500レコードを超えたあたりで計算できなくなります。
そのレコードより以前の合計を計算させるのでしたら、A-B の結果を集計されたほうがいいです。集計フィールドを使うか、リレーションで計算させます。
Last edited by Shin (2022-10-18 11:41:24)
Offline
便乗質問失礼いたします。
Shinさんの
>>その計算式が参照しているフィールドはさらにその前のレコードを参照していますので、循環してしまうことになり、1500レコードを超えたあたりで計算できなくなります。
とありますが、計算に1500レコードの限度があるのですか?
FM の書き方では説明が煩雑になるので Excel の書き方で説明しますが。例えば、
C12=C11+A12-B12
となりますが、実は、
C11=C10+A11-B11
なので、
C12=(C10+A11-B11)+A12-B12
となりますが、さらにC10をみると、
C10=C9+A10-B10
C9=C8+A9-B9
:
と続くことになり、最終的に
C12=(((...(C0+A1-B1)......)+A9-B9)+A10-B10)+A11-B11)+A12-B12
という計算になります。(C0がでればエラーになるかもしれませんが、それが null を返してくるとして)
この計算がある程度大きくなると、スタック(計算結果を一時保存するエリア)が満杯になって(スタックオーバーフローと言います)、計算できなくなります。
計算式の複雑さにもよるのですが、大体1500を超えたあたりでおこります。
この質問は、よく出てきていますよ。つい最近も、計算結果が ? になってしまう、という質問 が出ていました。
式の形から、残高=残高+入金ー出金 のようですので、これを避けるには、累計残高について のような手法を使われるのがいいでしょう。
レコード数が膨大になってくれば集計も遅くなるので、期末や棚卸しのタイミングで繰越処理を行っておくと、処理が早くなります。
Last edited by Shin (2022-10-19 07:26:40)
Offline
循環
というより、
参照の連鎖
といったほうがいいかも。
以前の古い環境では、
数百レコードでハングアップした記憶がありますヨ
環境や計算にもよるのではないでしょうか。。
それを防ぐには、
参照の値を自レコードに固定値として取り込む手もありますね。
Offline
循環以外のいい言葉が思いつかなかったのですが、連鎖はいいですね。
例えば計算フィールドを
Let ( $$n=$$n + 1 ;
n + Case ( Get(レコード番号) > 1 ; GetNthRecord ( sumn ; Get(レコード番号) - 1 ) )
)
のようにして、$$nをデータビューアで観察すると、
1)新規レコードを作ると全レコード数分の計算が実行される(#6のShinさんの解説)
2)計算フィールドにカーソルを入れてフィールド外をクリックすると大量に計算が実行される
などが見られます。
計算の回数は(1)の方はまあ理屈通りですが、(2)の場合は、よくわかりませんでした。
Shinさんご回答ありがとうございました。そういうことなんですね。確かに計算膨大になりますね。。。
自分の環境でもGetNthRecordを使っている箇所があり、主に釣銭によるものなのですが
ここは内容が違いますので、別スレッドで質問させていただきます!
Shin様
チポ様
himadanne様
とても分かりやすい回答ありがとうございます。
今後もご協力の方よろしくお願いいたします。
1レコード目の計算結果が?になってしまいます。
1つ前のレコードがないからでしょうか。
1レコード目の計算結果が?になってしまいます。
1つ前のレコードがないからでしょうか。
どの様な式になっているかわかりませんが、おそらくその理由でしょう。
A-B という計算フィールドを作り、それを合計する集計フィールド(現在の合計)で表示させるのが簡単でいいと思いますよ。
Offline
たぶんそうですよね。値のないものと計算結果しても答え出ませんよね。
その方法で表示させてみようと思います。ありがとうございました。
お疲れ様です。
かなり苦戦しています。。
アドバイス頂きたいです。
レコード数 金額 現在の金額
1 1000 1000
2 2000 3000
3 4000 7000
4 7000 14000
5 6000 20000
これは例ですが、これでの「現在の金額」みたいなフィールドを作成したいです。
ポータルで表示させます。
#12にあるように「集計フィールド(金額の「現在の合計」)」を作るだけでいいのでは?
しいて言えば、ポータルレコードを追加できるようにしてると、ポータル行を追加した後レコード確定するまで一旦集計値が全部消える動作が気になりますね...前からこうだったかな?
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 594.97 KiB (Peak: 611.88 KiB) ]