GetNthRecordメモ
- FileMaker
- 参照数: 4182
FileMakerには、GetNthRecordという関数があって、詳しくは下記に。
簡単に書くと、特定のレコード番号のフィールドの値が取れる関数です。
困ったこと
こんなテーブルがあるとしまして。
例えば1つ前のレコードの合計を参照して、現在の売上を足した合計を表示する、みたいな使い方をする場合、合計という名前の計算フィールドを作って、
Case ( Get ( レコード番号 ) = 1 ; 売上 ; GetNthRecord ( 合計 ; Get ( レコード番号 ) - 1 ) + 売上 )
こんな計算式を指定します(この例だとifでもいいんですが)。
このフィールドは売上の値の変更によって随時計算して欲しいので、「計算結果を保存せず必要時に再計算する」にチェックを入れる訳ですが、これをすると174レコード目で値の表示が「?」になります。
このフィールドをクリックしてみると、正しい数値が表示されるのですが、フォーカスを外すと「?」に戻ってしまいます。
疑問に思って調べてみたところ、こんなページが見つかりました。
-
29 レコードを超えると GetNthRecord を使った計算式が正しく計算されない
http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9341/kw/GetNthRecord
これは、FileMaker Goで確認されている問題とのことですが、全く同じですね。プロダクトに11.xと書かれているので、12では大丈夫なのかな?
試してみたこと
とりあえず、このままでは困るので、合計フィールドの計算式をこんな風にしてみると、
Case ( Get ( レコード番号 ) = 1 ; 売上 ; GetNthRecord ( 売上 ; Get ( レコード番号 ) - 1 ) )
無事値が取れる。また、「計算結果を保存せず必要時に再計算する」のチェックを外しても値はとれる。要するに、「索引の設定されていないフィールドを参照すると駄目になる」ということみたいです。
追記(2014/01/15)
環境がFileMaker13になったので、同様に試してみたのですが、80レコード目で表示が「?」になってしましました。
やはり、GetNthRecordを使っているフィールド自体を、GetNthRecord関数のフィールド名に与えてしまうとダメなようです。
この例で一番簡単な対処法は、集計フィールドの合計で、「現在の合計」にチェックを入れて使用することだと思います。
以下の文は集計フィールドを使う事を思いつかず、頓珍漢な事を書いてるので薄字に。
対処法
この例の場合索引設定をした場合の最大の問題は、ソートをしても再計算されないことです。
計算結果を保存している都合上、参照しているフィールドの値をどうにかしなければならないので、
こんなスクリプトを動かすくらいしか対処法が思いつきません。
こんな処理をしなければならない事自体が無駄っぽいし、対象レコードが多くなると処理に時間が掛かる。その上、手動でソートされるとどうしても値がずれるといい事なしで、対処法とは言えない感じです。何かいい手法はないでしょうか…
余談
ひょっとして、GetNthRecord関数で自分のフィールドを参照してるのがわるいんじゃないか!?と思って、間に他のフィールドを入れてみました。
前合計というフィールドを、
Case ( Get ( レコード番号 ) = 1 ; 0 ; GetNthRecord ( 合計 ; Get ( レコード番号 ) - 1 ) )
そして、合計をこんな感じに。
Case ( Get ( レコード番号 ) = 1 ; 売上 ; 前合計 + 売上 )
結論としては関係なかったのですが、何故か102以降のレコードが「?」になってしまいました。何かメモリとかそこらへんの制約があるんでしょうか。不思議です。