トリガの作成
このレッスンで作成するトリガは、請求書明細の削除の前に起動します。請求書明細に品目名が含まれる場合は、削除されないようにします。
- 開発者コンソールで、 をクリックします。
- 名前に「RestrictInvoiceDeletion」と入力し、[sObject] ドロップダウンリストから Invoice_Statement__c を選択して、[Submit (送信)] をクリックします。
-
自動生成されたコードを削除し、次のコードを追加します。
1swfobject.registerObject("clippy.codeblock-0", "9"); 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17trigger RestrictInvoiceDeletion on Invoice_Statement__c (before delete) { 18 // With each of the invoice statements targeted by the trigger 19 // and that have line items, add an error to prevent them 20 // from being deleted. 21 for (Invoice_Statement__c invoice : 22 [SELECT Id 23 FROM Invoice_Statement__c 24 WHERE Id IN (SELECT Invoice_Statement__c FROM Line_Item__c) AND 25 Id IN :Trigger.old]){ 26 Trigger.oldMap.get(invoice.Id).addError( 27 'Cannot delete invoice statement with line items'); 28 } 29} -
をクリックします。トリガは、保存するとデフォルトで有効になります。
もうひとこと...
- トリガは RestrictInvoiceDeletion という名前で、Invoice_Statement__c sObject に関連付けられます。
- 1 つ以上の Invoice_Statement__c sObject が削除される前に、トリガが実行されます。この動作は、before delete パラメータで指定されます。
- トリガには、品目名を含む請求書明細を反復処理する SOQL for ループが含まれます。
- WHERE 句の最初の条件に含まれるネストされたクエリ (SELECT Invoice_Statement__c FROM Line_Item__c) を確認してください。各品目名には、親請求書明細を参照する Invoice_Statement__c 項目があります。このネストされたクエリは、すべての品目名の親請求書明細を取得します。
- クエリは、請求書明細の ID 値が、ネストされたクエリ WHERE Id IN (SELECT Invoice_Statement__c FROM Line_Item__c) で返された親請求書明細のセットに含まれるかどうかをチェックします。
- 2 つ目の条件は、このトリガで対象とする請求書明細のみがクエリされるように制限します。これを行うために、各 ID 値が Trigger.old に含まれるかどうかをチェックします。Trigger.old には、削除対象でまだ削除されていない古いレコードのセットが含まれます。
- 条件を満たす請求書明細ごとに、トリガは addError メソッドを使用してカスタムエラーメッセージを追加し、レコードが削除されるのを防ぎます。品目名を含む請求書明細を削除しようとすると、ユーザインターフェースにこのカスタムエラーメッセージが表示されます。これについては次のレッスンで確認します。