ここでは、ダイナミックトランザクションの使用例を紹介します。
1) 次の Product トランザクションについて考えます:
Product
{
ProductId*
ProductDescription
ProductStock
ProductExpirationDate
}
会社が次のようにプロモーションを定義したとします。次に該当する製品を 50% 割引にします:
- 在庫が 1,000 個を超える製品
- 今年中に有効期限を迎える製品
現在のプロモーションを常に把握できるように、ダイナミックトランザクション (Promotion) を作成し、それに関連付けられたデータプロバイダー (Promotion_DataProvider) によってプロモーションの要件を満たす製品が取得されるようにします。
Promotion
{
PromotionId*
PromotionDescription
PromotionStock
PromotionExpirationDate
}
Promotion トランザクションのプロパティを設定します:
これにより、Promotion トランザクションに関連付けられた物理テーブルの作成が不要であることが GeneXus に認識されます。また、Promotion_DataProvider という名前のデータプロバイダーが既定で作成され、そのソースがトランザクションの構造に初期化されます:
次に、Promotion トランザクションの項目属性にロードするデータを Promotion_DataProvider に入力します:
このデータプロバイダーは、所定のプロモーション条件を満たす製品をスキャンします。条件を満たした各製品の項目属性の値が Promotion の項目属性にロードされます。
ここでは、現在の日付を取得するために ServerDate 関数を使用していることに注目してください。これは、ダイナミックトランザクションに関連付けられたデータプロバイダーでは、サーバーで評価できない変数や関数は使用できないためです。
Promotion トランザクションとそれに関連するデータプロバイダーのモデル化が完了したら、Promotion トランザクションとその項目属性を通常どおり扱えるようになります。たとえば、Promotion トランザクションのフォームを実行して、現在のプロモーションを確認することができます。また、Work With for Web パターンおよび Work With for Smart Devices パターンを Promotion トランザクションに適用することもできます。さらに、物理テーブルや物理フィールドが関連付けられているかどうかに関係なく、Promotion を標準の項目属性として透過的に使用することもできます。それに加え、For each コマンド、データプロバイダー、Web パネルや SD パネルのグリッドにおいて、Promotion トランザクションをベーストランザクションとして扱うことも可能です。
現在のプロモーションを取得するためにダイナミックトランザクションを定義する利点は何ですか。
ナレッジベース内でグローバルな、強力な定義として利用できることです。Promotion の概念が存在し、この方法で定義した場合、関連するデータを格納する必要はありません (データベースでは、テーブルではなくビューが作成されます)。
プロモーションの定義が変更された場合、Promotion ダイナミックトランザクションに関連付けられたデータプロバイダーを修正するだけで、そのプロモーションに関連するすべてのオブジェクトは有効な状態に保たれます。
2) 同じ GeneXus ナレッジベースに次のトランザクションがあるとします:
Customer
{
CustomerId*
CustomerName
CustomerAddress
....
}
Invoice
{
InvoiceId*
InvoiceDate
CustomerId
CustomerName
CustomerAddress
InvoiceAmount
....
}
次のような問い合わせを受けることが考えられます:
2.1. 特定期間中の 1 日あたりの請求金額を調べる
2.2.特定の日付の合計請求金額を調べる
2.3. 年間で請求金額が最も多かった日付を調べる
これらの問い合わせは個別にローカルソリューションを定義して解決することもできますが、ダイナミックトランザクションを定義して、いくつかのシナリオで実行するほうがより強力です。そのため、ここでは、Statistics というダイナミックトランザクションを作成します:
Statistics
{
StatisticsDate*
StatisticsTotalAmount
}
Statistics トランザクションのプロパティを設定します:
[ Data Provider ] プロパティ = Yes
[ Used To ] プロパティ = Retrieve Data
これにより、Statistics トランザクションに関連付けられた物理テーブルの作成が不要であることが GeneXus に認識されます。また、Statistics_DataProvider という名前のデータプロバイダーが既定で作成され、そのソースがトランザクションの構造に初期化されます。次に、Statistics トランザクションの項目属性にロードするデータを Statistics_DataProvider に入力します:
このデータプロバイダーは請求書をスキャンします。請求日の各値はそれぞれ 1 回限り使用され、StatisticsDate 項目属性に割り当てられます。特定の日付のすべての請求金額が合計され、その結果が StatisticsTotalAmount 項目属性に割り当てられます。1 日あたりの合計金額が分かれば、Statistics をベーストランザクションとして扱い、その項目属性を通常どおり使用することで、各ニーズを解決できるようになります。
2.1. 特定期間中の 1 日あたりの請求金額を調べる
For each Statistics
where StatisticsDate >= &InitialDate
where StatisticsDate >= &FinalDate
Print Printblock1 {StatisticsDate,StatisticsTotalAmount}
Endfor
2.2.特定の日付の合計請求金額を調べる
For each Statistics
where StatisticsDate = &Date
Print Printblock1 {StatisticsDate,StatisticsTotalAmount}
Endfor
2.3. 年間で請求金額が最も多かった日付を調べる
For each Statistics order (StatisticsTotalAmount)
where StatisticsDate.Year() = &Today.Year()
Print Printblock1 {StatisticsDate,StatisticsTotalAmount}
exit
Endfor
|