一般的なデータ トリガーの使用
Business Central には、データ型とテーブルのリレーションシップによってデータの妥当性を維持する機能だけでなく、データ関連のビジネス ロジックも含まれています。 このロジックにより、データベースの情報をユーザーが挿入、変更、または削除する際に、より複雑なデータ関連のビジネス ルールが一貫して適用されます。 これらの複雑なビジネス ルールは、テーブル トリガーで AL コードとしてコード化されています。 コードの同じパターンは、属しているアプリケーション領域に関係なく、同じタイプのテーブル内で検索できます。
この原則を理解し、記述したコードが原則に違反していないことを確認することが重要です。
OnInsert トリガー
OnInsert テーブル トリガーは、ユーザーが新しいレコードをテーブルに挿入するときに実行されます。 トリガー内のコードは、レコードがテーブルに挿入される前に実行されます。 トリガーのコードによってランタイム エラーが発生した場合は、挿入操作がキャンセルされます。
OnInsert トリガーは、異なるテーブルのタイプごとに次のような目的を持っています。
マスター テーブル - ユーザーが値を手動で指定していない場合、適切な番号シリーズから 番号 フィールドを割り当てます。 また、既定の分析コード テーブルのコンフィギュレーションに基づいて、勘定タイプの既定の分析コードを割り当てます。
補助テーブル - 3 つ以上のフィールドを含む複雑な主キーを持つテーブルに対して必要な主キーフィールドがすべて入力されているかどうかを確認します。あるいは、相互に排他的または使用できない主キーの組み合わせが選択されているかどうかを確認します。
仕訳帳テーブル - ショートカット分析コード 1 とショートカット分析コード 2 のフィールドの値を検証します。
ドキュメント (ヘッダー) テーブル - ユーザーが値を手動で指定していない場合、適切な番号シリーズから 番号 フィールドを割り当てます。 これにより、日付などの特定の既定値が適用されます。 アプリケーション領域のプライマリ マスター レコードに関連付けられているフィールドのフィルターが確認されます。 また、フィールドが単一の値にフィルター処理されている場合は、フィールドにフィルターの値が割り当てられます。
ドキュメント (行) テーブル - ドキュメントが異なる状態をサポートしている場合に、状態が新しい行を受け付けることができるようにします。
これらのテーブル タイプでは、OnInsert トリガーにはより多くのコードが含まれる場合があります。 その他のテーブル タイプの場合、OnInsert トリガーには、該当するシナリオに固有のコードが含まれている場合があります。また、一般的な原則が適用されることはありません。
OnModify トリガー
OnModify テーブル トリガーは、ユーザーがテーブル内の既存のレコードを変更したときに実行されます。 トリガー内のコードは、テーブルのレコードが更新される前に実行されます。 トリガー コードでエラーが発生すると、アプリケーションによって変更がキャンセルされます。
OnModify トリガーは、異なるテーブルのタイプごとに次のような目的を持っています。
マスター テーブル - 最終更新日フィールドを現在のシステム日付に設定します。 (マスター テーブルに対しては、OnRename トリガーは同じアクションを完了する必要があります)。
仕訳帳テーブル - 変更が特定の仕訳帳タイプのビジネス ルールに違反していないことを確認します。
ドキュメント (ヘッダー) テーブル - ユーザーが値を手動で指定していない場合、適切な番号シリーズから 番号 フィールドを割り当てます。 これにより、日付などの特定の既定値が適用されます。 アプリケーション領域のプライマリ マスター レコードに関連付けられているフィールドのフィルターが確認されます。 また、フィールドが単一の値にフィルター処理されている場合は、フィールドにフィルターの値が割り当てられます。
ドキュメント (行) テーブル - 変更が特定のドキュメントのビジネス ルールに違反していないことを確認します。
その他のテーブル タイプの場合、OnModify トリガーには、該当するシナリオに固有のコードが含まれている場合があります。また、一般的な原則が適用されることはありません。
OnDelete トリガー
OnDelete テーブル トリガーは、ユーザーがレコードをテーブルから削除するときに実行されます。 トリガー内のコードは、レコードがテーブルから物理的に削除される前に実行されます。 トリガー コードでエラーが発生した場合、レコードは削除されません。
OnDelete トリガーは、異なるテーブルのタイプごとに次のような目的を持っています。
マスター テーブル - マスター レコードに関連する、開始されているがまだ完了していないトランザクション (注文やジョブなど) が存在しないことを確認します。 このタイプのトランザクションは、システムが不整合な状態になったり、トランザクションの処理に問題を引き起こす原因となる可能性があります。 トリガーによって、マスター レコードのすべての補助情報 (既定の分析コードや開いているドキュメントおよびトランザクションを含む) が削除されます。
補足テーブル - 補足レコードの補助情報をすべて削除します。
仕訳帳テーブル - 削除が特定の仕訳帳タイプのビジネス ルールに違反していないことを確認します。
ドキュメント (ヘッダー) テーブル - 削除が特定のドキュメントのビジネス ルールに違反していないことを確認し、すべてのドキュメント明細行と補助ドキュメント情報を削除します。
ドキュメント (行) テーブル - 削除が特定のドキュメントのビジネス ルールに違反していないことを確認し、すべての補助ドキュメント明細行情報を削除します。
ドキュメント履歴 (ヘッダー) テーブル - 転記されたドキュメントを削除できる条件を満たしていることを確認し、転記されたドキュメント明細行と転記済の補助ドキュメント情報を削除します。
ドキュメント履歴 (行) テーブル - 転記済の補助ドキュメント明細行情報を削除します。 ユーザーはドキュメント履歴明細行を直接削除することができないので、削除の条件が満たされているかどうかは確認されません。
シナリオによっては、OnDelete トリガーは、前に指定されていたよりも多くのコードを含み、より多くの目標を達成する場合があります。
OnValidate トリガー
OnValidate フィールド トリガーは、ユーザーがフィールドに値を入力した後に実行されます。 このトリガーのコードは、アプリケーションが既定の検証動作 (データ型の検証など) を実行した後に実行されます。
このトリガーは、マスター テーブル、補助テーブル、補足テーブルなど、他のテーブルに関連するフィールドに定義されていることがよくあります。 トリガーは、このようなフィールドに定義されている場合、次の重要な操作を頻繁に実行します。
既定の分析コードを割り当てる (該当する場合)
特定の既定値を他のフィールドに割り当てる
ケースに固有の複雑なビジネス ルールを検証する
たとえば、リソース仕訳帳明細行テーブルのリソース番号フィールドの場合、OnValidate トリガーは次のタスクを実行します。
選択したリソースの既定の分析コードをリソース仕訳帳明細行に割り当てる
選択されているリソースがブロックされていないことを確認する
選択されているリソースの複数のフィールド (説明、直接単価、リソース グループ番号、一般製品転記グループなど) をリソース仕訳帳明細行に割り当てます。
リソース明細行がシステムによって自動的に作成されていない場合は、タイム シートを必要とするリソースにタイム シートが指定されていることを確認します。