【Claris FileMaker 2023】 新機能~「OnWindowTransaction」スクリプトトリガ 基本編~

2023年05月23日 03:56 PM

Claris FileMaker 2023


Claris FileMaker Pro 2023 がリリースされました。
2020年にバージョン19がリリースされてからのメジャーアップデートとなります。
また、バージョンの呼称が、西暦を使用するようになりました。

では、今回のリリースに含まれる新機能のなかでも、目玉機能になる「OnWindowTransaction」トリガについて、見てみたいと思います。

リリースノート:FileMaker Pro 2023 新機能および機能強化

■□ 「OnWindowTransaction」スクリプトトリガ □■

まず、ヘルプから見てみましょう。

FileMaker Pro ヘルプ:リファレンス>スクリプトトリガリファレンス>OnWindowTransaction

トランザクションが正常に確定された後にスクリプトを実行して JSON オブジェクトを作成します。JSON オブジェクトには完了したトランザクション内のすべての操作に対してファイル名、基本テーブル名、レコード ID、操作、および「onWindowTransaction」という名前の基本テーブルのフィールド (または指定されたフィールド) の内容が含まれます。

OnWindowTransaction

「トランザクションが正常に確定された後にスクリプトを実行」ということですので、新しい機能はスクリプトトリガです。では、発火するタイミングですが、それはトランザクション確定後と書かれているので、わかりやすくまず思いつくのは、レコードの編集操作だと思います。

■□ 使ってみる □■

なにはともあれ、動かしてみたいと思います。設定箇所は、こちらです。

[ファイル > ファイルオプション…]と選択して、

ファイルオプション画面を開きます。

ここで「OnWindowTransaction」スクリプトトリガが設定できます。

では、スクリプトを作成します。
スクリプトには、$$JSONというグローバル変数を設定するようにしてみました。

では、このスクリプトをトリガに設定します。

では、操作をしてみましょう。

日付を変更してみました。レコードの変更が確定すると、このように変更したという情報が変数に設定されます。

では、内容を確認してみましょう。

JSONは、このように記載されていますが、それぞれの内容は、キャプチャのようになっています。

  • ファイル名
  • テーブル名
  • 操作
  • レコードID

となっています。

操作には、

  • “Modified” = レコード編集
  • “New” = レコード新規作成
  • “Deleted” = レコード削除

があります。ですので、「どのテーブルの・どのレコードを・新規作成/編集/削除したのか」という内容は、このスクリプトトリガを使うと取得できることになります。

■□ レコード削除について □■

ユーザの操作ログを作成する場合、今までも新規作成・編集は、限定的ではありますが、取得することはできましたが、この削除については、取得できませんでした。

なぜかというと、リレーションシップのオプションにある

「他のテーブルでレコードが削除された時、このテーブルの関連レコードを削除」

のオプションを使用した場合に、関連レコードの削除のオプションで削除されたレコードは、どのレコードなのかを取得する術がなかったからです。

「OnWindowTransaction」スクリプトトリガでは、取得できるのかどうか、試してみました。

キャプチャのようなテストをしてみました。見積レコードが削除されたら、関連する見積明細レコードも削除されるように、リレーションのオプションを設定しています。

では、実際に削除したらどのような$$変数になるのか、確認してみました。

そうすると、削除した見積レコードに関連する見積明細のレコードが、2件削除され、$$JSONには、その削除されたレコードIDが取得されています。

これは、とても重要なことで、いままでできなかったことが、このスクリプトトリガでできるようになりました。

■□ テーブルデータを削除について □■

レコードを削除する高速で便利なスクリプトステップがあります。
それが「テーブルデータを削除」スクリプトステップです。

このスクリプトステップは、テーブルのレコードをすべて削除するステップですが、この処理を実行する際に、OnWindowTransactionトリガが実行されるかどうか、確認してみました。

「テーブルデータを削除 [ ダイアログあり: オン ; テーブル: <現在のテーブル> ]」を実行するスクリプトを作成します。

データビューアに$$JSONがないことを確認し実行してみます。
OnWindowTransactionトリガが起動すれば、$$JSONが設定されるはずです。

実行後、テーブルのレコードはすべて削除されました。
しかし、$$JSONが設定されていないので、OnWindowTransactionトリガは起動しなかったことがわかります。

「テーブルデータを削除」スクリプトステップを使用したレコード削除に関しては、OnWindowTransactionが起動しないため、この処理に限り削除ログは取得できません。

ただし、この「テーブルデータを削除」スクリプトステップを使用するようなテーブルは、一時的にレコードを作成するような処理のテーブルなので、削除ログが作成できなくてもいいテーブルとも言えます。

これは、正しい動作だと思いました。

■□ だれが・いつ・どのような値に変更したのか □■

今まで、見てきた内容では、「だれが・いつ・どのような値に変更したのか」という内容が、出てきていません。

操作には、“Modified” = レコード編集、”New” = レコード新規作成、”Deleted” = レコード削除 があっても、編集ログ(監査証跡)にはなりません。

しかし、今回の新機能と関数等を組み合わせることにより、編集ログも取得することができるようになりますので、すこし触れてみたいと思います。

「OnWindowTransaction」スクリプトトリガで取得できるJSONには、もう一つ要素がありました。
それが、キャプチャに書いている「特定のフィールド値」の部分です。

ファイルオプションの「OnWindowTransaction」スクリプトトリガの設定項目に、スクリプト以外にフィールド名という項目があります。

ここに指定したフィールドの値が、JSONに含まれることになります。

ということは、編集ログの内容は、このフィールドの計算式の作成の仕方によって、開発者がコントロールできることになります。

素晴らしい!!!!!

「onWindowTransaction」という名前のフィールドでは、フィールド名を設定せずとも、JSONに含まれる特定のフィールドとして使用できます。

(すべて大文字「ONWINDOWTRANSACTION」でも、すべて小文字「onwindowtransaction」でも問題なく使用できました。)

いままで編集ログを取得するために作成していた計算式があります。

こちらは、Claris Engageなどでセッションでも、紹介していますが、フィールドの自動入力オプション「計算値」を利用して、編集ログを取得する手法で使っているものです。

この計算方法を、そのまま使用できそうですが、今回は動作確認のため「Get ( 変更されたフィールド )」関数だけを設定して確認をしてみましょう。

「z_Log_c」計算フィールドを追加して、「Get ( 変更されたフィールド )」を計算式に設定しました。
そのフィールドを、ファイルオプションのフィールド名のところに設定します。

それでは、新規レコードを作成して、$$JSONの内容を確認してみます。

$$JSONには、「z_Log_c」計算フィールドの値が、含まれているのがわかります。
フィールド名がわかれば、「GetField ( フィールド名 )」関数を使用して、変更後の値が取得できます。

また、取得関数を使用すれば、アカウント名やユーザ名、スクリプト名、スクリプト引数、持続IDなどなど、様々な情報を計算フィールドに含めることができます。

次回ブログで、ここらへんのTipsを紹介したいと思います。

■□ 注意 □■

取得した値は、別途保存する必要があります。
「OnWindowTransaction」スクリプトトリガで起動したスクリプトで、取得したJSONを別テーブルに保存することが思いつくかもしれません。

しかし、ここに1点注意事項があります。

それは、「OnWindowTransaction」スクリプトトリガは、そのファイルに含まれるすべてのレイアウトで、起動される点です。
どういうことかというと、そのファイルの別テーブルにJSONを保存するときに、そのファイルのレイアウトの場合には、「OnWindowTransaction」スクリプトトリガトリガは起動するので、無限ループに陥るということです。

ですので、別テーブルに保存するには、別ファイルのレイアウトで保存処理をする必要があります。

保存の仕方は、パフォーマンスなども考慮しながら実装する必要もありますので、
別のブログで、紹介したいと思います。

■□ まとめ □■

いかがでしたでしょうか?

編集ログを取得したいという内容は、昔からある要望で、かなり待ち望まれていたものでした。
実装には、こつがいるかと思いますが、すばらしい新機能だと思います。

次回、応用編も紹介していきますので、ご参考にしていただけたら嬉しいです。