FileMakerでリスト画面を作っていると、「いま選んでいるレコードの1つ前」「1つ後ろ」の内容を表示したくなることがあります。例えば、前後の履歴を比べたいときや、隣のレコードの値を一緒に表示したいときなどです。
そんなときに便利なのが GetNthRecord 関数です。ただ、使い方や「どのレコードを基準にしているのか」が少し分かりにくく、うまく動かないこともあります。
ここでは、専門用語をできるだけ避けながら、「前のレコード」「次のレコード」を取得する基本的な考え方と、具体的な設定方法を紹介します。
GetNthRecordとは?前後レコードを取るための基本イメージ
GetNthRecord は、簡単に言うと「指定した番号のレコードから、指定したフィールドの値を取ってくる」関数です。
書き方は次のようになります。
GetNthRecord ( フィールド名 ; レコード番号 )
ここで重要なのは、「レコード番号」の部分です。これは「現在のレコードを基準にした相対位置」でも指定できます。
- 現在のレコード:
Get ( RecordNumber ) - 1つ前のレコード:
Get ( RecordNumber ) - 1 - 1つ後ろのレコード:
Get ( RecordNumber ) + 1
この考え方を使うことで、前後のレコードの値を簡単に取得できます。
前のレコードの値を取得する計算式の例
たとえば、「売上」フィールドの1つ前のレコードの値を表示したい場合を考えてみます。計算フィールドやオブジェクトの条件付き書式などで、次のような式を使えます。
GetNthRecord ( 売上 ; Get ( RecordNumber ) - 1 )
この式の意味は、「いま表示しているレコード番号から1つ前のレコードの『売上』を取ってくる」です。
ただし、1件目のレコードには「1つ前」が存在しません。そのため、1件目でこの式を使うと、結果は?(未定義)になります。これを避けたい場合は、条件を追加しておくと安心です。
If (
Get ( RecordNumber ) > 1 ;
GetNthRecord ( 売上 ; Get ( RecordNumber ) - 1 ) ;
""
)
このようにしておくと、「2件目以降のときだけ前のレコードを取得する」という動きになります。
次のレコードの値を取得する計算式の例
同じように、1つ後のレコードの値を表示したい場合は、レコード番号に +1 をします。
GetNthRecord ( 売上 ; Get ( RecordNumber ) + 1 )
こちらも、最後のレコードには「次のレコード」が存在しません。全レコード数を確認するために Get ( FoundCount ) を使い、範囲外にならないようにしておくと安全です。
If (
Get ( RecordNumber ) < Get ( FoundCount ) ;
GetNthRecord ( 売上 ; Get ( RecordNumber ) + 1 ) ;
""
)
こうすると、「最後のレコード以外のときだけ、次のレコードの『売上』を取得する」という動作になります。
前後レコードを並べて表示するレイアウト例
具体的な使い方の一例として、「現在・前・次」の3つのレコードの値を1画面に並べて表示するレイアウトを考えてみます。
- 「現在の値」を表示する通常のフィールド(例:
売上)を配置 - テキストオブジェクトや計算フィールドで「前の値」を表示するオブジェクトを作成
- 同様に「次の値」を表示するオブジェクトを作成
たとえば、計算フィールド「前回売上」「次回売上」を次のように定義します。
前回売上:
If (
Get ( RecordNumber ) > 1 ;
GetNthRecord ( 売上 ; Get ( RecordNumber ) - 1 ) ;
""
)
次回売上:
If (
Get ( RecordNumber ) < Get ( FoundCount ) ;
GetNthRecord ( 売上 ; Get ( RecordNumber ) + 1 ) ;
""
)
これらをレイアウト上で
- 前回売上
- 売上(現在)
- 次回売上
と横に並べておくと、前後のデータを見比べやすい画面が作れます。
GetNthRecordを使うときに気をつけたいポイント
GetNthRecord は便利ですが、次のポイントを押さえておくとトラブルが減ります。
- 対象は「現在の検索結果の並び順」
どのレコードを「前後」とみなすかは、現在のソート順に依存します。並び順を変えると、「前のレコード」「次のレコード」も変わります。 - 関係グラフは関係ない(同じテーブル内で使う場合)
同じテーブル内で前後レコードを取るときは、リレーションではなく「いまのテーブルのレコード順」を見ています。 - 別テーブルの前後レコードも取得できるが少し複雑
別テーブルの前後を取りたい場合は、そのテーブルのコンテキスト(レイアウトやリレーション)によって結果が変わるので、基本的には「同じテーブル内で使う」ケースから慣れていくのがおすすめです。
スクリプトで前後のレコードを移動したいときとの違い
「前のレコード」「次のレコード」と聞くと、「レコードへ移動」ステップを使ったスクリプトを思い浮かべる方も多いと思います。
スクリプトで移動する場合:
- 画面上で選択中の「対象レコード」そのものを変える
- ユーザーが見ているレコードを切り替えたいときに使う
GetNthRecord を使う場合:
- レコードは移動せず、「別のレコードの値だけを参照」する
- 前後のレコードの値を「同時に表示・比較」したいときに使う
この違いを意識すると、「どちらを使うべきか」が選びやすくなります。
まとめ:前後レコードの参照は「現在のレコード番号」を意識する
GetNthRecord で前後のレコードを扱うときのポイントは次の3つです。
Get ( RecordNumber )を基準に、-1 や +1 で前後を指定する- 先頭と末尾のレコードは存在しない位置を指定しないように、If でガードする
- 結果はあくまで「現在の検索結果の並び順」に従う
これらを押さえておけば、履歴の比較や前後データの表示など、少し高度なレイアウトもシンプルな計算だけで実現できます。まずは1つのフィールドだけでもいいので、「前」「現在」「次」を並べて表示するところから試してみてください。