For Each コマンドまたは New コマンドの本文でレコードの更新または作成を試行しているときに、別のレコード用に既に存在している、キー候補 (For Each の場合) や主キー (New の場合) の項目属性の値を使用して、実行するコードを指定できます。
この節は更新に関係があるため、プロシージャーでのみ機能します。
When duplicate
<When Duplicate 節のコード>
GeneXus は、キー候補の一意性を保証するため、一意のインデックスを使用します。また、主キーには主キーインデックスを使用します。重複を検出した場合、この節が For Each/New コマンドでプログラミングされていれば、関連するコード (<When Duplicate 節のコード>) を実行します。
この節が含まれていないと、キー候補 (For Each) である項目属性を更新しようとした場合、または候補キーや主キー (New) に値を割り当てようとし、その値を持つレコードが既に存在する場合、どのコードも実行されません。
New コマンドについて: ほとんどの場合、既存レコードの一部の項目属性の更新が必要になります。その場合、For Each コマンドが必要です。内部には、更新する項目属性が割り当てられます。あまり一般的ではありませんが、ほかのコマンドを実行することもできます。つまり、次のようになります:
<When Duplicate 節のコード> ::= |
[ <別のコード> ] |
|
For each
{ <項目属性> = <エクスプレッション> } ...
endfor
|
|
[ <別のコード> ] |
- For Each 内: 他の For Each コマンドが <CodeWhenDuplicate> に含まれていて、そのテーブルに (<MainCode> の) 外部の For Each を持つ同じ共通の項目属性がある場合、この項目属性はインスタンス化されたものとみなされ、When Duplicate 内の For Each でフィルタとして機能します。
各コマンドの詳細については、「For Each コマンド」と「New コマンド」の構文のセクションを参照してください。
Customer テーブルで CustomerName 項目属性がキー候補 (一意のインデックスが存在) であり、For Each を使ってアクセスされる多数のレコードを更新する場合:
for each Customer
CustomerName = &customer
when duplicate
msg( '顧客 ' + &customer + ' は既に存在します')
endfor
&customer に格納された値を持つレコードが既に存在する場合、for each のメインコードは実行されません。その代わりに、when duplicate コードが実行されます。
|