OnWindowTransaction その2 -まだよくわかっていない人のために-

OnWindowTransaction

前回、「OnWindowTransaction」のことについての記事を書きました。(前回の記事はココ)
今回はその続きになります。
「OnWindowTransaction」についてよくわかっていない方は前回の記事をご欄ください。
おさらいをしておきます。

  1. レコードの新規作成、更新、削除が行われると、「ファイル>ファイルオプション>スクリプトトリガ」で指定したスクリプトが呼び出される。
    変更内容はスクリプトの引数で受け取る。
  2. フィールド名で指定したフィールドの内容が監視される
    (指定がない場合は「onWindowTransaction」というフィールドが監視対象となる)

ということでした。そして前回、疑問として残した、

  • いつ、だれが変更したという情報はないの?
  • 監視対象(変更内容の情報をとりたい)フィールドが複数ある場合はどうするの? 
  • 変更後の内容とセットで変更前の値も同時にログに出力しておきたい時は?
     (ログをさかのぼって見るのはイヤだ)

ということについて、どのようにすればよいのかを一緒にみていきたいと思います。

監視対象(変更内容の情報をとりたい)フィールドが複数ある場合

通常そのままでは、下記②で指定したフィールド(空の時は「onWindowTransaction」というフィールド)が監視対象となって、このフィールドの新規、更新、削除のログが取得されるということでした。

このままでは、フィールドをひとつしか指定できません。
そこで「Get ( 変更されたフィールド )」という取得関数を使用します。

Get ( 変更されたフィールド )

「Get ( 変更されたフィールド )」関数についてヘルプをみてみましょう。

URL : https://help.claris.com/ja/pro-help/content/get-modifiedfields.html

この取得関数を使用して、変更されたフィールドのリストを取得することができます。
例えば、生年月日と性別が変更された場合、

※トリガでGet ( 変更されたフィールド )をカスタムダイアログ表示

  • 性別
  • 生年月日

というリスト(改行区切りのリスト)が取得できます。

やってみる

では実際にみてみましょう。
サンプルは前回の記事で使用した業種別サンプルの「会員管理」を使用します。(業種別サンプル)

●会員テーブルに計算フィールド「OnWindowTransaction」を定義します。

:

フィールドに定義する計算式は「Get ( 変更されたフィールド )」にします。

●スクリプトトリガ「trg_変更されたフィールド」を定義します。

●ファイル>ファイルオプション>スクリプトトリガのOnWindowTransactionに「trg_変更されたフィールド」を指定します。

実行してみましょう。
会員情報画面から生年月日と性別を変更して確定すると、JSON形式の文字列で下記情報がわたされてきます。

修正情報タイムスタンプ

  • 修正者
  • 生年月日
  • 性別

が変更されたフィールドになります。
「修正情報タイムスタンプ」と「修正者」にも自動的に値が設定されるようになっているため変更されたフィールドのリストに含まれます。

※「\r」はキャリッジリターン(改行) 

いつ、だれが変更したという情報

上の例では、計算フィールド「OnWindowTransaction」に「Get ( 変更されたフィールド )」のみを記述していました。
「いつ、だれが変更したという情報はないの?」を解決するために、「いつ、だれが」という情報もあわせて取得するように処理の記述を追加すればこの疑問を解決できることになります。

準備

  • カスタム関数「JSON_AuditLog」作成
  • 会員と会費のテーブルに新たに「JSON_AuditLog」フィールド追加
  • スクリプト「trg_onWindowTransaction」作成

それぞれの詳細は下記となります。

  1. カスタム関数「JSON_AuditLog」
    「Get ( 変更されたフィールド )」を引数としてこのカスタム関数にわたすことで「いつ、だれが」という情報を追加してかえす。
  2. 「JSON_AuditLog」フィールド
    監視対象(変更内容の情報をとりたい)フィールドとして指定。このフィールドの計算式にカスタム関数「JSON_AuditLog」の呼び出しを指定する。
  3. 「trg_onWindowTransaction」
    ファイル>ファイルオプション>スクリプトトリガの「OnWindowTransaction」スクリプトトリガに指定。
    テーブルに新規、更新、削除が発生した際に、「変更されたフィールド、いつ、だれが」という情報を引数で受け取ることができる。

やってみる

では実際にみてみましょう。

●カスタム関数「JSON_AuditLog」
引数として「変更されたフィールド」の情報を受け取り、それに「いつ、だれが」という情報を追加してJSON形式の文字列を生成してかえします。

 :

引数としてわたされた「Get ( 変更されたフィールド )」情報の他に下記のような情報を追加するようにしています。(詳細は省略)

●「JSON_AuditLog」フィールド

履歴を取りたいテーブルに追加するので、今回は会員テーブルと会費テーブルに追加します。

●「trg_onWindowTransaction」
検証のため受け取った引数の内容をカスタムダイアログに表示します。

このスクリプトを「OnWindowTransaction」スクリプトトリガに指定して、フィールドには「JSON_AuditLog」フィールドを指定します。

実行してみましょう。会費の入金予定日、入金額、入金日を変更して確定します。

JSON形式の文字列が引数として取得できました。

変更後の内容とセットで変更前の値も同時にログに出力

ここまでくれば、ログに出力する処理は簡単に実装できます。
別途ログ管理用のファイルを用意します。

ログ管理用のファイルは別ファイルで用意

「OnWindowTransaction」トリガはファイル内のすべてのテーブルで有効になります。
そのため、同じファイルではなく、別ファイルにログテーブルを用意するようにしてください。

ログに出力

  1. ログ管理用の「会員管理log.fmp12」ファイルを用意
  2. JSON形式の文字列(先ほどカスタムダイアログで表示された)をそのまま保存する

で完成です。

※ログテーブルにはJSON形式の文字列をそのまま登録して、「会員管理log.fmp12」側に、「見やすいように文字列を成型する処理」を実装します。

●ログテーブルに書き出す処理は「会員管理log.fmp12」側に実装して、「trg_onWindowTransaction」スクリプトの処理にそれを呼び出すステップを追加します。

●「会員管理log.fmp12」 の「ログテーブルに書き込む」スクリプト

(JsonLogフィールドの計算値に$JsonLog指定)
書き込まれたログ(JsonLogテーブル)は下記のようになります。

ファイル、テーブル、テーブルNoなどのフィールドにはJSON形式の文字列から値を取得するようにフィールドの計算値を設定します。

「ファイル」フィールドの例

変更前の値

「変更前の値」の取得方法は、

  • 変更される前の値を取得する
  • ログテーブルの履歴からひとつ前の値を取得する

などの方法が思いつきます。

今回はログテーブルの履歴からひとつ前の値を取得する方法でやってみましょう。
厳密には、更新があった際に「変更前の値を取得する」処理ではないですが、実際のログをみたときに、ログをさかのぼって見なくても「前回値」フィールドに値が表示されるようにします。

ここからは、「会員管理log.fmp12」側への実装になります。

①「JsonLog」テーブルには変更されたフィールドが複数あっても、1レコードに記載されてしまいます。それを管理しやすくするために変更されたフィールド数分のレコードに分解して登録するようにします。

分解して登録するテーブルを「JsonLog詳細」テーブルとします。
上の場合、2レコード登録されるようにします。

②「JsonLog詳細」テーブルに「前回値」フィールドを作成して、計算値で”ひとつ前の値”を取得してくるようにします。

これで完成です。詳細は下記になります。

●「JsonLog」テーブルの他に「JsonLog詳細」テーブルを作成します。

●「JsonLog詳細」テーブルに「前回値」フィールドを定義して、計算値に”ひとつ前の値”が設定されるようにします。

●「ログテーブルに書き込む」スクリプトに、変更されたフィールド分のレコードに分解して登録する処理を追加します。

みてみましょう。
「JsonLog詳細」テーブルに変更された情報とひとつ前の前回値情報が表示されました。

最後に

いかがでしたでしょうか。
「OnWindowTransaction」について、今回の記事が参考になれば幸いです。

中の人

ひみつ

ロゴ:Claris Partner PLATINUM
Claris パートナーの中でも最上位のPLATINUMレベルメンバーとして、Claris FileMaker を活用したソリューションを提供いたします。
FileMaker 、ファイルメーカー、 FileMaker Cloud 、 FileMaker Go およびファイルフォルダロゴは、
Claris International Inc. (旧 FileMaker, Inc.)の米国および/またはその他の国における登録商標です。
アイコン:ページトップへ