Claris FileMaker Pro の重要な機能の1つである検索について、検索するフィールドのタイプがタイムスタンプで、かつ演算子を用いて実行する場合に、特に注意が必要になるケースについて解説します。
基準となる日時より大きなレコードを絞り込む
検索モードで基準とする値より大きいレコードを絞り込む場合、演算子「 > 」を使用します。今回はこの演算子を使用して、テーブルに保存されている10件のレコードからデータを絞り込む検証を行います。
<検証環境>
Claris FileMaker Pro 20.3.2.201
Timeというテーブルに「番号」「タイムスタンプ」の二つのフィールドがあります。「タイムスタンプ」のフィールドのタイプはタイムスタンプです。
テーブルに10件のデータが保存されており、内容は以下になります。
最初に “2023/11/02 12:00:03” より大きなデータを検索で絞り込みます。スクリプトステップは以下の通りで演算子「 > 」を含みます。
スクリプトを実行した結果は6件で、”2023/11/02 12:00:03” より大きなレコードを正しく絞り込むことができました。
次に “2023/11/02 12:00” より大きなデータを検索で絞り込みます。前回と同様にスクリプトステップは以下の通りで演算子「>」を含みます。
スクリプトを実行した結果は4件で、12:00分台の5件のレコードは対象レコードにはなりませんでした。
次に、スクリプトステップのフィールド設定の値を “2023/11/02 12:00” から “2023/11/02 12:00:00” に秒数の部分を追加して再度実行してみます。
結果は9件で、”2023/11/02 12:00” より大きなレコードを正しく絞り込むことができました。
意図しない検索結果
ツールのスプリクトデバッガで “2023/11/02 12:00” で検索した場合の動作を確認してみます。フィールド設定した時点で “>2023/11/02 12:00:*” と秒数部分に演算子(*アスタリスク)が自動的に追加され、12:00分台より大きいという条件で検索されています。
このようにタイムスタンプの秒数部分がない値で検索を行うと、自動的に検索条件が追加され、ユーザが意図しない結果を取得する可能性がでてきます。
何が問題か?
FileMaker Pro では自動で保存されるフィールド「 修正情報タイムスタンプ 」や関数の「 Get ( タイムスタンプ ) 」「Get ( 時刻 ) 」「 GetAsTimestamp ( テキスト ) 」は、その時刻が0秒ジャストの場合 ”YYYY/MM/DD HH:MM” で返されます、0秒ジャストではない場合は ”YYYY/MM/DD HH:MM:SS” で返されます。この取得した値をそのまま演算子「 > 」と組み合わせて検索条件に使用すると、検索条件を取得するタイミングによっては検索結果が変わることになります。
まとめ
検索条件で秒を省略すると:*が補われるのが問題なので次のようにまとめられます。演算子「 > 」を使用する場合は、検索に使用する基準となるタイムスタンプのデータに秒の部分の記述が無い場合は ”:00” を追記します。
この特定のケース以外の通常開発で用いられる、以下の条件では問題はおこりません。
・検索条件における演算子「 < 」「>=」「<=」を使用するケース
・「…」 を使った範囲検索条件
・計算式での大小比較
・リレーションシップにおける大小の比較
最後に
ある処理を行ったタイムスタンプの情報を保存しておき、次回の処理でそのタイムスタンプの値より大きいレコードを処理対象にしたい同期のソリューションや、現在の時刻より先の予約されたレコードを抽出してまとめて処理を行いたいなど、この条件でタイムスタンプのフィールド検索をするケースはあるかと思います。
スクリプトを実行するタイミング によって正しい結果を得たり、得られなかったりすると、再現性が低いので原因を調査する時間に多くを費やさなければならないことがあります。事前にこのような特定のケースがあることを把握していれば、素早い解決の手助けになるかと思います。