【Claris FileMaker 2023】 新機能~「OnWindowTransaction」スクリプトトリガ 応用編1~
2023年05月24日 11:55 AM
Claris FileMaker 2023
Claris FileMaker Pro 2023 がリリースされました。
2021年にバージョン19がリリースされてからのメジャーアップデートとなります。
また、バージョンの呼称が、西暦を使用するようになりました。
では、今回のリリースに含まれる新機能のなかでも、目玉機能になる「OnWindowTransaction」トリガで使用する「OnWindowTransaction」フィールドについて考えてみました。
リリースノート:FileMaker Pro 2023 新機能および機能強化
■□ 「OnWindowTransaction」スクリプトトリガ □■
ヘルプを確認してみます。
FileMaker Pro ヘルプ:リファレンス>スクリプトトリガリファレンス>OnWindowTransaction
トランザクションが正常に確定された後にスクリプトを実行して JSON オブジェクトを作成します。JSON オブジェクトには完了したトランザクション内のすべての操作に対してファイル名、基本テーブル名、レコード ID、操作、および「onWindowTransaction」という名前の基本テーブルのフィールド (または指定されたフィールド) の内容が含まれます。
OnWindowTransaction
と載っています。
このスクリプトトリガの基本的なことを、【「OnWindowTransaction」スクリプトトリガ 基本編」】ブログに記載していますので、ぜひあわせてご覧ください。
ヘルプには “「onWindowTransaction」という名前の基本テーブルのフィールド (または指定されたフィールド) の内容” と記載されています。
これは、「OnWindowTransaction」スクリプトトリガ発火時に、「Get ( スクリプト引数 )」で取得できるJSONオブジェクトに、特定のフィールドの値を含めることができる、という内容になります。
それでは、JSONオブジェクトを見ていきましょう。
「OnWindowTransaction」スクリプトトリガ発火時に、「Get ( スクリプト引数 )」で取得できるJSONオブジェクトを確認すると次のような値になっていました。
この「特定のフィールド値」を「だれが・いつ・どのような値に変更したのか」という内容がわかるようにJSONが設定されるように計算式を考えました。
そうすると、下記のキャプチャのようにログが取得できました。
設定箇所ですが、ファイルオプションのスクリプトトリガで、OnWindowTransactionにスクリプトを設定し、フィールド名の欄に「z_AuditLog_c」というフィールド名を入力しておきます。
そうすると、指定したフィールドの値が、JSONの特定のフィールド値の箇所に記載されることになります。
※ 「onWindowTransaction」という名前のフィールドであれば、フィールド名を設定せずとも、JSONに含まれる特定のフィールドとして使用できます。(すべて大文字「ONWINDOWTRANSACTION」でも、すべて小文字「onwindowtransaction」でも問題なく使用できました。)
■□ 「z_AuditLog_c」フィールドの計算式 □■
この「z_AuditLog_c」フィールドは、計算フィールドで作成しました。
JSONの内容を再度見てみましょう。
このキャプチャのように、変更時にJSONオブジェクトを計算によって取得しています。
この「変更されたフィールド」と記載している箇所に、”FieldName”というキーでフィールド名を、”FieldValue”というキーで変更後の値を記載していて、配列として複数の変更後の内容が取得されるようにしています。
こちらは、「Get ( 変更されたフィールド )」関数で取得されたフィールド名のリストを、変更後のフィールドの値と一緒にJSONオブジェクトにしています。
「Get ( 変更されたフィールド )」関数で取得されたフィールド名は、新規作成時や編集時で複数取得できます。
フィールド名が分かれば、変更後の値も「GetField」関数で取得できます。
しかし、取得されたフィールド名のリストを、このようなJSONオブジェクトにするには、そのフィールドのリストを1行ずつJSONオブジェクトにしないと行けないので、繰り返し計算をさせることになります。
では、「z_AuditLog_c」フィールドの計算式を見ていきましょう。
While (
[
//初期変数
~modifiedFields = Get ( 変更されたフィールド );
~i = 0 ;
~arrayNo = 0;
~cnt = ValueCount ( ~modifiedFields );
~json = "[]"
] ;
//条件
~i < ~cnt;
[
//ロジック
~i = ~i + 1 ;
~fieldName = GetValue ( ~modifiedFields ; ~i );
~fieldValue = GetField ( ~fieldName );
~chk =
Case (
PatternCount ( ~fieldName ; "z_" );
False;
//else
True
);
~json =
Case (
not ~chk;
~json;
//else
JSONSetElement ( ~json ;
["[" & ~arrayNo & "].FieldName" ; ~fieldName ; JSONString ];
["[" & ~arrayNo & "].FieldValue" ; ~fieldValue ; JSONString ]
)
);
~arrayNo = Case ( ~chk ; ~arrayNo + 1 ; ~arrayNo )
];
//結果
JSONSetElement ( "{}" ;
["UserName" ; Get ( ユーザ名 ) ; JSONString ];
["TimeStamp" ; Get ( タイムスタンプ ) + Mod ( Get ( 現在の時刻 UTC ミリ秒 )/1000 ; 1 ) ; JSONString ];
["CurrentHostTimeStamp" ; Get ( ホストのタイムスタンプ ) + Mod ( Get ( 現在の時刻 UTC ミリ秒 )/1000 ; 1 ) ; JSONString ];
["PrivilegeSetName" ; Get ( アカウントアクセス権セット名 ) ; JSONString ];
["AccountName" ; Get ( アカウント名 ) ; JSONString ];
["LayoutNo" ; Get ( レイアウト番号 ) ; JSONString ];
["WindowName" ; Get ( ウインドウ名 ) ; JSONString ];
["ScriptName" ; Get ( スクリプト名 ) ; JSONString ];
["ScriptParameter" ; Get ( スクリプト引数 ) ; JSONString ];
["ModifiedFields" ; ~json ; JSONArray ]
)//JSONSet
)//While
繰り返し計算をしたいので、「While」関数を使用します。
- 「Get ( 変更されたフィールド )」関数で取得されたフィールド名のリスト分、計算を繰り返す。
- ロジック部分の計算では、変更されたフィールドのフィールド名とフィールド値をJSONオブジェクトにして、配列として、JSONに記載。
- 結果部分の計算では、アカウント名や、タイムスタンプなどのように、ログに必要な項目を取得関数で取得しJSONに記載。変更されたフィールド内容のJSONとあわせて、1つのJSONオブジェクトにする。
- オブジェクトフィールドのオブジェクトは、ファイル名が取得できればいいとしておく。
※ オブジェクトフィールドのファイルを、Base64Encode関数でエンコードして、ログに含めることもできそうですが、データ量を考慮して、今回は含めないことにしました。
この計算を設定した「z_AuditLog_c」という非保存の計算フィールドを各テーブルに作成します。
ファイルオプションのOnWindowTransactionスクリプトトリガのフィールド名に、作成した「z_AuditLog_c」計算フィールドを指定しておけば、
「だれが・いつ・どのような値に変更したのか」
という内容がわかるJSONオブジェクトが取得できます。
■□ まとめ □■
いかがでしたでしょうか?
この「OnWindowTransaction」スクリプトトリガ発火時に取得できるJSONオブジェクトに含める、特定のフィールドの計算をどのように作成するか、をご説明しました。
その計算式によって、編集ログの内容をコントロールすることができます。
システムに必要なログを、計算式を工夫することで思うように設定できるので、素晴らしい新機能です。
この取得したJSONを別途保存することが必要ですが、応用編2ではそのやり方を紹介したいと思います。
■□ サンプルファイル □■
紹介した計算式を使ったサンプルファイルがダウンロードできます。
サンプルファイルでは、紹介した計算式をカスタム関数にしています。
また、ログに含めたくないフィールド名を指定できるような工夫もしています。
参考にしてみてください。
※ 動作確認用ファイルです。ログを保存する機能は別ブログで紹介します。