FileMaker で前回終了時にアクティブだったレコードへ移動する2

FileMaker で終了時にアクティブだったレコード情報を保持し、次回ファイルを開いた時にそのレコードがアクティブになった状態にする方法について先日書いた。

FileMaker で前回終了時にアクティブだったレコードへ移動する – with a Christian Wife
https://wacw.cf/2020/12/10/go-to-the-last-active-record-in-filemaker/

要するに、場所を記憶しておく方法だ。

そこではグローバルフィールドを使っているが、それゆえに共有ファイルで同じことを実現できない。例えば、FileMaker Server にホストしたカスタム App の場合、異なるクライアント間で、最終レコードの場所を共有できないのだ。

これはグローバルフィールドの性質によるものである。

[FileMaker] 共有ファイルはグローバルフィールドの値が共有されない – with a Christian Wife
https://wacw.cf/2020/12/07/global-fields-are-not-shared-between-host-and-clients/

グローバルフィールドはトリッキーなので、最初からグローバルフィールドを使わない方法でカスタム App を作るのがいいのかもしれない。

今回の場合、グローバルフィールドを使わない方法でカスタム App を作るには以下のようにすればいい。

環境:FileMaker Pro 18 Advanced(英語)、macOS Catalina Version 10.15.6

(1)全レコードに Record ID 用のフィールドを作る(テーブル名を Table、フィールド名を RecordID と名付けるとする)。ハウスキーピングフィールドで自動作成されたものを利用するか、以下のスクリプトをループさせるか、レコード作成時に自動で入力されるようにする。

Set Field [ Table::RecordIDField ; Get ( RecordID ) ]

(2)別テーブル(PositionTable と名付けるとする)を作成し、適当なテキストフィールド(LastSavedPosition と名付けるとする)を作成する。1つ新規レコードを作成しておく(フィールドは空にしておく)。

(3)Table テーブルの RecordID フィールドと PositionTable テーブルの LastSavedPosition フィールドをデカルト積でリレーションシップを作る。

参考:
FileMaker Pro でのデカルト積リレーションシップの使用
https://support.claris.com/s/article/FileMaker-Pro-%E3%81%A7%E3%81%AE%E3%83%87%E3%82%AB%E3%83%AB%E3%83%88%E7%A9%8D%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97%E3%81%AE%E4%BD%BF%E7%94%A8-1503692924111?language=ja

(4)ファイルを閉じるときに実行する以下のスクリプトを作成する。

# 変数に現在の Record ID を格納する。
Set Variable [$LastPosition ; Value: Table::RecordID ]
# PositionTable テーブルに変数の値を格納する。
Set Field [ PositionTable::LastSavedPosition ; $LastPosition ]
#ファイルを閉じる。
Close File [ Current File ]

(5)「File>File Options>Script Triggers>OnLastWindowClose」に4のスクリプトを割り当てる。

(6)次回ファイルを開いたときに実行する以下のスクリプトを作成する。

Go to Record/Request/Page [ First ]
Loop
Exit Loop If [ PositionTable::LastSavedPosition ) = Table::RecordID ]
Go to Record/Request/Page [ Next ; Exit after last: On ]
End Loop

(7)「File>File Options>Script Triggers>FirstWindowOpen」に6のスクリプトを割り当てる。