Transaction オブジェクトの
ビジネス コンポーネント タイプに基づく変数は、トランザクションの項目属性ごとに 1 つのプロパティを提供します。
次のトランザクションをビジネスコンポーネントとして定義する (
[ Business Component ] プロパティを True に設定する) とします:
Customer
{
CustomerId*
CustomerName
CustomerAddress
CustomerPhone
CustomerEmail
CustomerAddedDate
CustomerTotalMiles
}
この場合、Customer トランザクションのビジネス コンポーネント データ タイプが
ナレッジベースに自動的に作成されます。そうすると、Customer データタイプに基づいて、任意のオブジェクトで変数を定義できるようになります。したがって、
Procedure オブジェクトでは Customer タイプに基づいて
&Customer という変数を定義し、
プロシージャーの [ Source ] では
&Customer 変数およびそのプロパティを使用します。
次の状況を考えてみます: プロモーションの目的で、各顧客のマイル数を 1,000 マイル増やしたいと考えている旅行代理店があります。どうすればいいでしょうか。格納されているすべての顧客を参照して、顧客ごとの合計マイル数を更新します。
プロシージャーの [ Source ] で
For Each コマンドを記述して CUSTOMER テーブルをナビゲートする必要があります。次の画像でその方法を示しています。プロシージャーの [ Source ] の For each コマンドで Customer
ベーストランザクションを参照しています:
変数名に続けてドットを入力すると、選択可能な 2 種類のエレメントが表示されます:
- 矢印と紫色のアイコンが付いたエレメントは、変数に適用されるメソッドです。
- 青い歯車のアイコンが付いたエレメントはプロパティです。つまり、Customer トランザクション構造に含まれる項目属性はビジネスコンポーネントとして設定します。
Load メソッドを選択します。この場合、括弧内に含める
主キーの値は CustomerId 項目属性です。CustomerId を利用できるのは、ナビゲートされた顧客ごとに CustomerId の値 (および CUSTOMER
拡張テーブルに属する残りの項目属性) が取得されるためです:
For each Customer
&Customer.Load(CustomerId)
Endfor
ナビゲートされた顧客がメモリーにロードされたら、顧客の合計マイル数を変更して、その変更を保存する必要があります。
For Each 内に 2 つ目の命令を記述し、アンパサンド (&) を入力すると、すべての変数が表示されます。&Customer 変数を選択し、ドットを入力します。使用可能なすべてのメソッドおよびプロパティが表示されます。CustomerTotalMiles プロパティまたは項目属性を選択し、既存の値に加えて 1,000 マイルを割り当てます:
For each Customer
&Customer.Load(CustomerId)
&Customer.CustomerTotalMiles += 1000
Endfor
トランザクションのフォームで編集可能な項目属性と同じ項目属性にのみ値を割り当てることができます (つまり、推論された項目属性や、グローバル式として定義される項目属性に値を割り当てることはできません)。
次に、この更新内容を物理的に保存する必要があるため、&Customer 変数に Save メソッドを適用します:
For each Customer
&Customer.Load(CustomerId)
&Customer.CustomerTotalMiles += 1000
&Customer.save()
Endfor
Save メソッドが実行されると、トランザクションに定義したルールと、トランザクションによる自動検証がトリガーされます。Error ルールまたは自動検証がトリガーされる場合は、実行された内容に対応するテキストがコレクションのメモリーにロードされます。このコレクションを読み込んで処理することもできます。この例では、コレクションの処理については示しません。
次に、保存処理が実際に成功したかどうかを確認してみましょう。処理が成功した場合は
Commit コマンドを実行し、失敗した場合は Rollback を実行します:
For each Customer
&Customer.Load(CustomerId)
&Customer.CustomerTotalMiles += 1000
&Customer.save()
if &Customer.success()
commit
else
rollback
endif
Endfor
これで処理は完了です。