初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2022-10-18 09:13:03

あああ
Guest

1つ前のレコードを含めた計算方法

お疲れ様です。

FM19

Excelで「=C1+A2-B2」と計算していたものをファイルメーカーで計算しようとするとなるとどのような計算式になりますでしょか。

ご教授願いたいです。

#2 2022-10-18 09:14:36

あああ
Guest

Re: 1つ前のレコードを含めた計算方法

「C2=C1+A2-B2」

#3 2022-10-18 09:59:24

チポ
Member

Re: 1つ前のレコードを含めた計算方法

対象レコードの並びで、
一つ前のCフィールドということなら、
  GetNthRecord ( C ; Get ( レコード番号 ) - 1 )
で得られます。

対象レコードやソートが変わった時にもその一つ前なら、
その索引を非保存とします。

Offline

#4 2022-10-18 10:16:05

Shin
Member

Re: 1つ前のレコードを含めた計算方法

その時のレコードのソート状態にもよるでしょうが、
GetNthRecord ( フィールド ; Get ( レコード番号 ) - 1 )
で、一つ前のレコードを取得できます。
ですが、その計算式が参照しているフィールドはさらにその前のレコードを参照していますので、循環してしまうことになり、1500レコードを超えたあたりで計算できなくなります。
そのレコードより以前の合計を計算させるのでしたら、A-B の結果を集計されたほうがいいです。集計フィールドを使うか、リレーションで計算させます。

Last edited by Shin (2022-10-18 11:41:24)

Offline

#5 2022-10-18 17:59:34

宗司
Guest

Re: 1つ前のレコードを含めた計算方法

便乗質問失礼いたします。
Shinさんの
>>その計算式が参照しているフィールドはさらにその前のレコードを参照していますので、循環してしまうことになり、1500レコードを超えたあたりで計算できなくなります。

とありますが、計算に1500レコードの限度があるのですか?

#6 2022-10-19 07:23:24

Shin
Member

Re: 1つ前のレコードを含めた計算方法

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

#7 2022-10-19 09:09:08

チポ
Member

Re: 1つ前のレコードを含めた計算方法

循環
というより、
参照の連鎖
といったほうがいいかも。

以前の古い環境では、
数百レコードでハングアップした記憶がありますヨ

環境や計算にもよるのではないでしょうか。。


それを防ぐには、
参照の値を自レコードに固定値として取り込む手もありますね。

Offline

#8 2022-10-19 11:57:40

himadanee
Guest

Re: 1つ前のレコードを含めた計算方法

循環以外のいい言葉が思いつかなかったのですが、連鎖はいいですね。

例えば計算フィールドを
Let ( $$n=$$n + 1 ;
n + Case ( Get(レコード番号) > 1 ; GetNthRecord ( sumn ; Get(レコード番号) - 1 ) )
)
のようにして、$$nをデータビューアで観察すると、
1)新規レコードを作ると全レコード数分の計算が実行される(#6のShinさんの解説)
2)計算フィールドにカーソルを入れてフィールド外をクリックすると大量に計算が実行される
などが見られます。
計算の回数は(1)の方はまあ理屈通りですが、(2)の場合は、よくわかりませんでした。

#9 2022-10-19 12:33:29

宗司
Guest

Re: 1つ前のレコードを含めた計算方法

Shinさんご回答ありがとうございました。そういうことなんですね。確かに計算膨大になりますね。。。
自分の環境でもGetNthRecordを使っている箇所があり、主に釣銭によるものなのですが
ここは内容が違いますので、別スレッドで質問させていただきます!

#10 2022-10-20 10:31:43

あああ
Guest

Re: 1つ前のレコードを含めた計算方法

Shin様
チポ様
himadanne様

とても分かりやすい回答ありがとうございます。
今後もご協力の方よろしくお願いいたします。

#11 2022-10-21 16:11:36

あああ
Guest

Re: 1つ前のレコードを含めた計算方法

1レコード目の計算結果が?になってしまいます。
1つ前のレコードがないからでしょうか。

#12 2022-10-21 16:33:37

Shin
Member

Re: 1つ前のレコードを含めた計算方法

あああ wrote:

1レコード目の計算結果が?になってしまいます。
1つ前のレコードがないからでしょうか。

どの様な式になっているかわかりませんが、おそらくその理由でしょう。
A-B という計算フィールドを作り、それを合計する集計フィールド(現在の合計)で表示させるのが簡単でいいと思いますよ。

Offline

#13 2022-10-21 17:12:45

ゲスト
Guest

Re: 1つ前のレコードを含めた計算方法

たぶんそうですよね。値のないものと計算結果しても答え出ませんよね。

その方法で表示させてみようと思います。ありがとうございました。

#14 2022-10-22 10:25:07

あああ
Guest

Re: 1つ前のレコードを含めた計算方法

お疲れ様です。

かなり苦戦しています。。
アドバイス頂きたいです。

レコード数  金額   現在の金額
  1    1000   1000
  2    2000   3000
  3    4000   7000
  4    7000   14000
  5    6000   20000

これは例ですが、これでの「現在の金額」みたいなフィールドを作成したいです。
ポータルで表示させます。

#15 2022-10-22 10:54:43

Shin
Member

Re: 1つ前のレコードを含めた計算方法

累計残高について
のサンプルが参考になるでしょう。
ポータルの表示は、最初から全てを対象にします。
期間を区切って表示したいのでしたら、期末、期首に日にそれぞれ繰越、繰入の仮想レコードを作り、繰り越しで残高0にしておくようにします。その期首、期末日付で表示させます。

Offline

#16 2022-10-22 11:14:09

himadanee
Guest

Re: 1つ前のレコードを含めた計算方法

#12にあるように「集計フィールド(金額の「現在の合計」)」を作るだけでいいのでは?

しいて言えば、ポータルレコードを追加できるようにしてると、ポータル行を追加した後レコード確定するまで一旦集計値が全部消える動作が気になりますね...前からこうだったかな?

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 10 queries executed - Memory usage: 595.04 KiB (Peak: 611.95 KiB) ]