状況によっては、トランザクションに関連するデータプロバイダーでパラメーターを使用するために、パラメーターの受け取りを必要とするダイナミックトランザクションを定義する必要があります。
ここでは、パラメーターを受け取る必要があるダイナミックトランザクションのシナリオを紹介します。このシナリオでは、データプロバイダーでパラメーターを使用してデータを取得し、そのデータをダイナミックトランザクションの項目属性に割り当てます。
次のトランザクションを考えてみます。
Customer
{
CustomerId*
CustomerName
CustomerAddress
....}
Invoice
{
InvoiceId*
InvoiceDate
CustomerId
CustomerName
CustomerAddress
InvoiceAmount
....}
特定期間の購入金額が大きい顧客を調べるには、エンドユーザーが日付範囲を入力できるような Web パネルを定義する必要があります。そして、エンドユーザーがボタンを押すと、該当期間中の各顧客に対する合計請求金額とその順位を出力した PDF リストを出力するようにします。請求金額は降順に出力されるようにします。
ここで、Ranking というダイナミックトランザクションを作成し、はじめに次のように定義します:
Ranking
{
RankingCustomerId*
RankingCustomerName
RankingTotalAmount
}
Ranking トランザクションのプロパティを設定します:
[ Data Provider ] プロパティ = Yes
[ Used To ] プロパティ = Retrieve Data
これにより、GeneXus は Ranking トランザクションに関連する物理テーブルを作成する必要がないと認識します。また、Ranking_DataProvider という名前のデータプロバイダーが既定で作成され、そのソースがトランザクションの構造に初期化されます。次の手順では、Ranking トランザクションの項目属性にロードするデータを Ranking_DataProvider に入力する必要があります:
RankingCollection
{
Ranking from Invoice unique CustomerId
{
RankingCustomerId = CustomerId
RankingCustomerName = CustomerName
RankingTotalAmount = Sum(InvoiceTotal, ....}
}
このデータプロバイダーは請求書をスキャンします。CustomerId の各値はそれぞれ 1 回限り使用され、RankingCustomerId 項目属性に割り当てられます。特定の顧客のすべての請求金額が合計され、その結果が RankingTotalAmount 項目属性に割り当てられます。ただし、Sum 式がまだ完成しておらず、エンドユーザーが Web パネルに入力した日付範囲に属する請求書のみを考慮するようにフィルタ条件を設定する必要があります。
ダイナミックトランザクションに関連するデータプロバイダーでパラメーターを受け取り、それらをソースで使用する必要がある場合は次のようにします:
1) 必要なパラメーターと同数の項目属性をダイナミックトランザクションのキーの一部として定義します (もちろんデータタイプが一致する必要があります)。この例では、Ranking トランザクションを次のように変更する必要があります:
Ranking
{
RankingInitialDateReceived*
RankingFinalDateReceived*
RankingCustomerId*
RankingCustomerName
RankingTotalAmount
}
2) ダイナミックトランザクションに関連するデータプロバイダー、およびそのダイナミックトランザクションに対して、新しい項目属性を含む Parm ルールを挿入します (この例では次のようにします: Parm(RankingInitialDateReceived, RankingFinalDateReceived);)。
Ranking_DataProvider
Rule: Parm(RankingInitialDateReceived, RankingFinalDateReceived);
Source: RankingCollection
{
Ranking from Invoice unique CustomerId
{
RankingInitialDateReceived
RankingFinalDateReceived
RankingCustomerId = CustomerId
RankingCustomerName = CustomerName
RankingTotalAmount = Sum(InvoiceTotal, InvoiceDate >= RankingInitialDateReceived and InvoiceDate <= RankingFinalDateReceived)
}
}
Ranking_DataProvider のソースで、主キーを構成するすべての項目属性が宣言され、Sum 式の定義が完成していることを確認してください。
3) パラメーターを含むダイナミックトランザクションの定義が完成しました。これで、Web パネルからプロシージャーを呼び出すことが可能になりました。エンドユーザーが入力した変数がプロシージャーに送信されて、順位が一覧表示されます:
Event 'CallRanking'
Ranking(&InitalDate, &FinalDate)
End event
Ranking Procedure
Rule: Parm(RankingInitialDateReceived,RankingFinalDateReceived);
Source: For each Ranking order (RankingTotalAmount)
print OneLineRanking ---> {RankingCustomerId, RankingCustomerName, RankingTotalAmount}
Endfor
- パラメーターを受け取るダイナミックトランザクションを使用する場合、データベースにビューではなく関数が作成されます。
- 関数を使用するには、パラメーターをインスタンス化する必要があります。
- ダイナミックトランザクションの項目属性を使用するオブジェクト (この例では、順位をリストするプロシージャー) では、ダイナミックトランザクションの主キーを構成する項目属性を事前にインスタンス化しておく必要があります (この例では、Parm ルールで受け取っていますが、For each などの中でインスタンス化できます)。これは、関数にパラメーターを認識させる必要があるためです。
制限:
- MySQL ではこのような定義はサポートされていません。
|