トランザクションのルールでOld関数を使う場合はトリガーを意識しよう


初めまして
ITcoworkの工藤です

今回が初の投稿となりますが、案件で使用しているGeneXusに関する技術情報について書いていきたいと思います。

今回は、トランザクションのルールで使用するOld関数・・・ではなく
トリガーについてです

タイトルに”Old関数”と謳ってはいますが、単にトリガーを見るのに適していたから使っただけです。



・・
・・・

例として以下のようなトランザクションを使用します。
TestTranImage001

はい、簡単なトランザクションですね
このトランザクションの更新時に、Productレベルの値に対してOld関数を利用した場合
トリガーによっては値を取得できない場合があります
以下が詳細になります
TransactionTrigerImage0001
ProductレベルとPriceレベルで実テーブルが異なるため
同一トランザクション内であってもそれぞれ値のとれるタイミングが異なります。

Priceレベルで行うルールの条件に、Productレベルの値変更チェック

Error(“エラー”) If Price.IsEmpty() And ProductName <> Old(ProductName) On AfterValidate;

のようなルールを使用した場合
Old関数で古い値が取得できないため、思うような動作が行えません。

そういった場合は、トランザクションとは別にDBへアクセスするプロシージャを作成し、同一テーブルを参照することで古い値を取得することができます。

要は、ルールを記述する場合は、実際のDBに対して行われるDBのトランザクションやセッションの関係を意識しないといけないということです。

ちなみに、“AfterTran”というイベントがありますが、これはトリガーとは無関係です。
GeneXusトランザクションの処理がすべて完了したら実行されるイベントです。