Technical Capabilities Tech Blog

#検証#実装方法:ダイナミックトランザクション

2021年11月12日

こんにちは、植田です。
先日、GeneXus16のシニアアナリスト認定試験をオンライン受験し、そこで出題された
ダイナミックトランザクション(Dynamic Transaction)について、検証を交えながら
記事を書いていきたいと思います。

【参考Wiki】ダイナミックトランザクション

よくある勘違い(Used toプロパティ)

ダイナミックトランザクションはトランザクションオブジェクトを利用することにより実装出来ますが、
検証する前にUsed toプロパティについて理解しておく必要があります。

【参考Wiki】[Used to]プロパティ

Wikiページにもあるように、「ダイナミックトランザクション」とは物理的なテーブル構造を持たず、
ビューとして複数のテーブルから情報を参照する事ができる概念を表しています。

Transactionオブジェクトを作成し、DataProvidarプロパティを有効にした後、
Used toプロパティで設定可能な項目として

・Populate data:〈表などに〉(データなどを)入力する

・Retrieve data:〈情報などを〉検索する

が選択可能で、今回の場合はRetrieve dataを選択する必要があります。

実装方法

アンケートシステムを使用して、「正会員と仮登録者の情報」を1つに纏めて扱う
ダイナミックトランザクションを作成していきます。

会員トランザクション】

  

【仮会員トランザクション】

 

ダイナミックトランザクションを作成するにはトランザクションを新規に作成します。

 

このトランザクション専用の項目属性(Attribute)を定義していきます。
※このトランザクション上にはマージするデータを区別するための項目属性(会員種別)を保持させます。

 

最後にトランザクション自体のプロパティから、Data Provider = TrueUsed to = Retrieve data に設定します。

 

保存すると、KBエクスプローラ上のMnbLstDTRの下に自動的にデータプロバイダが作成されます。

 

今回は正会員と仮会員の両方の情報を取得したいので
まずはDataProviderに正会員の情報を取得する式を記述していきます。
※3行目にMnbLstDTR from MnbTRと記述するとベーストランザクションのヒントになります。

 

次に同じような記述方法で仮会員情報を取得する式を入力していきます。

 

ここでビルドしていくと影響分析が実行されますが、以下のエラーになりました。

 

GeneXus Wikiでこちらのエラーコードを調べると

rgz0036 Cannot solve attributes %1%2.
このメッセージは、 [ Used To ] プロパティが [ Retrieve data ] のトランザクションで、
特定の項目属性のロードを解決できなかったことを示します。

という記述がされていて、フォーミュラ式では情報を取得できない事が判明しました。また、

MnbLstFullNm = MnbSeiNm + space(1) + MnbNm

としてフォーミュラ式を分解して設定したところ、同様のエラーが発生しました。
つまり、ダイナミックトランザクションで取得する項目は単独でDBに保持している必要がある(又は固定値)
事がわかります。(後述にありますが、実際にはVIEWを作成するのである程度理解はできるかな。)

MnbLstFullNmをトランザクション及びDataProviderから外してビルドしたところ
MnbLstDTR is dynamic transaction と表示され、
CREATE VIEW [MnbLstTR]として、DDLを発行する動きが確認できました。UNIONでの結合になります。

※因みにビューの名称もTableオブジェクトから変更が可能です。

 

最後にトランザクションにWork Withパターンを適用し、一覧画面からデータを確認してみたいと思います。

まとめ

如何でしたでしょうか?
ダイナミックトランザクションの特徴として

・実態の異なる複数のテーブルに対してあたかも通常のトランザクションの様に定義し、使用することが可能

・ダイナミックトランザクションのデータの実態はVIEWとなる

・現状は一部制約事項(フォーミュラをVIEW化不可)も存在する

等があげられますが、利点として下記のような

・異なる2つのデータをある項目で整列してマージしたい

場合においては、ダイナミックトランザクションを使用しない場合には実装が煩雑(SDTに詰めてソート等)
になるため特に有効な手段なのではないでしょうか?

今回も色々勉強させて頂きました!
最後までご覧頂きありがとうございました!

Tech Blog一覧