トランザクションに関連するデータの自動入力について、よくある質問を示します:
1.トランザクションの [ Business Component ] プロパティが GeneXus によって自動的に True に設定される場合と、このプロパティを明示的に設定できる場合を教えてください。
トランザクションの
[ Used To ] プロパティを Populate data に設定した場合、
対応するデータプロバイダーで指定されているデータを、トランザクションに関連付けられている物理テーブルに格納するために、トランザクションの
[ Business Component ] プロパティが自動的に True に設定されます。ビジネスコンポーネントとして実行されるトランザクションを通じて行われる処理は「UPSERT」です。つまり、追加を試行しますが、重複するキーが見つかって処理に失敗した場合は、更新が実行されます。
これに対して、トランザクションの
[ Used To ] プロパティを Retrieve data に設定した場合は、トランザクションに対応する物理テーブルが作成されないので、 [ Business Component ] プロパティは既定値 (False) のままになります。これを True に設定することもできます (
詳細情報)。
2.データの入力はいつ実行されますか。
[ Used to ] プロパティの説明を参照してください。
3.トランザクションに自動生成キーが必要で、関連付けられているデータプロバイダーが複数回実行されるため、データコンテンツが繰り返される可能性がある問題の解決方法を教えてください。
データコンテンツが繰り返される可能性がある例を考えてみましょう:
MaritalStatus
トランザクションは、MaritalStatusId 項目属性の
[ Autonumber ] プロパティが True に設定され、データプロバイダーが次のように定義されています:
挿入する際は、常に新しい識別子の値が生成されるため、重複するキーが検出されることはありません。したがって、データコンテンツが繰り返される可能性があります。この問題を回避するには、次の方法が考えられます:
1) MaritalStatusId 識別子項目属性の [ Autonumber ] プロパティを True に設定しません。
MaritalStatus_DataProvider を次のように定義します:
この場合、MaritalStatus_DataProvider の実行時に挿入しようとすると、重複するキーが検出されます。
2) MaritalStatus トランザクションの実行時に (フォームを通じて、またはビジネスコンポーネントとして) MaritalStatusId 項目属性の自動生成キーを取得するには、MaritalStatus トランザクションで次のルールを定義します (定義した NextNumber プロシージャーで主キーの値を取得):
MaritalStatusId = NextNumber() if MaritalStatusId.IsEmpty() on BeforeInsert;
Procedure: NextNumber
Rule: Parm(out:&NextId);
For each MaritalStatus order (MaritalStatusId)
&NextId = MaritalStatusId + 1
exit
when none
&NextId = 1
endfor
最後に考慮すべき点として、MaritalStatusId 識別子項目属性を読み取り専用に設定し、MaritalStatus トランザクションは、インスタンス化された複数のモードで呼び出す必要があります (たとえば、対応する Work With Web パネルから)。この場合、トランザクションが挿入モードで実行されると、識別子の値は空になるため、エンドユーザーは値を入力できず、NextNumber プロシージャーが実行されます。
注: トランザクションに定義されているルールがトリガーされるよう、
ビジネスコンポーネントの概念を使用することをお勧めします。new コマンドを使用して挿入する場合は、NextNumber プロシージャーを明示的に呼び出す必要があります。