FileMakerには、GetNthRecordという関数があって、詳しくは下記に。

簡単に書くと、特定のレコード番号のフィールドの値が取れる関数です。

困ったこと

こんなテーブルがあるとしまして。

例えば1つ前のレコードの合計を参照して、現在の売上を足した合計を表示する、みたいな使い方をする場合、合計という名前の計算フィールドを作って、

Case ( 
  Get ( レコード番号 ) = 1 ; 売上 ;
  GetNthRecord ( 合計 ; Get ( レコード番号 ) - 1 )  + 売上
)

こんな計算式を指定します(この例だとifでもいいんですが)。

このフィールドは売上の値の変更によって随時計算して欲しいので、「計算結果を保存せず必要時に再計算する」にチェックを入れる訳ですが、これをすると174レコード目で値の表示が「?」になります。
このフィールドをクリックしてみると、正しい数値が表示されるのですが、フォーカスを外すと「?」に戻ってしまいます。

疑問に思って調べてみたところ、こんなページが見つかりました。

これは、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以降のレコードが「?」になってしまいました。何かメモリとかそこらへんの制約があるんでしょうか。不思議です。

FileMaker記事一覧

Template by JoomlaShine