挿入時に、ある項目属性の値を別の項目属性の値から減算します。
削除時に、ある項目属性の値を別の項目属性の値に加算します。
更新時に、更新する項目属性の新しい値と古い値の差分を計算して、その差分を別の項目属性から減算します。
Subtract(att1 , att2
) [ if
cond ] ;
次のモードを使用できます:
-
挿入: att1 項目属性の値が att2 項目属性の値から減算されます (指定された条件が true の場合)。
-
削除: att1 項目属性の値が att2 項目属性の値に加算されます (指定された条件が true の場合)。
-
更新: att1 項目属性の新しい値と古い値の差分が att2 項目属性の値から減算されます (指定された条件が true の場合)。
次の例を参照してください:
Customer Trip Prize Country
{ { { {
CustomerId* TripId* PrizeId* CountryId*
CustomerName TripDate PrizeDate CountryName
CustomerLastName CountryId PrizeDescription City
CustomerPhone CountryName PrizeMiles {
CustomerTotalMiles CityId CustomerId CityId*
Trip CityName CustomerName CityName
{ TripMiles CustomerTotalMiles }
TripId* } } }
TripDate
CountryId
CountryName
CityId
CityName
TripMiles
}
}
ここでは、マイルと交換する商品を定義できる Prize トランザクションを使用します。
それぞれの商品には特定のマイル数が必要であり、必要なマイルを貯めた (またはそれ以上のマイルを保有している) 顧客に商品が提供されます。そのため、顧客に商品を提供する際は、顧客がその商品に相当する十分なマイルを保有しているかどうかを確認する必要があります。顧客が十分なマイルを保有していて商品を受け取る場合は、交換したマイルを減算する必要があります。顧客が十分なマイルを保有していない場合は、エラーメッセージを表示する必要があります。
Prize トランザクションには次の 2 つのルールが定義されています:
Subtract(PrizeMiles, CustomerTotalMiles);
Error(“Customer doesn’t have enough miles accrued”) if CustomerTotalMiles < 0;
Subtract ルールには次の動作が定義されています:
- 新しい賞品が挿入されると、PrizeMiles の値が CustomerTotalMiles から減算されます。
- 賞品が削除されると、PrizeMiles の値が CustomerTotalMiles に加算されます。
- PrizeMiles の値が変更されると、その古い値が顧客の合計マイル数に自動的に加算され、新しい値が顧客の合計マイル数から減算されます。
Subtract ルールと Error ルールには CustomerTotalMiles 項目属性が含まれており、一方のルールがその項目属性を更新し、もう一方のルールがその値を評価するため、GeneXus は、最初に CustomerTotalMiles 項目属性を更新する減算を実行してから、その値を評価する必要があると判断します。
最初に減算が実行されるため、顧客が保有するマイル数が商品に必要なマイル数よりも少ない場合は、CustomerTotalMiles 項目属性の値がマイナスになります。したがって、CustomerTotalMiles<0 であるかどうかが Error ルールによって評価されます。該当する場合は Error ルールがトリガーされ、エラーメッセージが表示され、Subtract ルールが取り消されます。つまり、Subtract ルールの実行内容は元に戻され、顧客の合計マイル数は変更されません。
減算の実行後に CustomerTotalMiles の値がマイナス (CustomerTotalMiles<0) にならない場合は、減算処理が実行されたことを示します。
顧客に提供する商品のレコードが削除されると、Subtract ルールは減算ではなく加算を実行します。つまり、商品に対応するマイル数 (PrizeMiles) が、顧客が貯めた合計マイル数 (CustomerTotalMiles) に加算されます。
Add ルール