0

設計上の問題と Batch Apex で何が起こるかについてサポートが必要です。

これがシナリオです。テリトリー オブジェクトがあり、1 つのフィールドを更新するときに、最大数百、数千の連絡先のフィールドを更新する必要があります。これを行うために、Batch Apex を使用しています。そして、更新される前にテリトリー レコードでそれを呼び出します。

質問:

  1. ユーザーがテリトリーを A から B に更新し、[保存] をクリックしたとします。これにより、連絡先の大きなバッチが更新され、しばらく時間がかかります。その後、彼は B を C に変更します。影響を受けるすべてのレコードの最終更新が C になることが保証されていますか? どうして?

  2. または、バッチ ジョブをスケジュールする方法はありますか? asyncApexJob を調べて、それをフレームワークとして使用しています…</p>

  3. より良いデザインはありますか?

4

2 に答える 2

1
  1. Batch Apex は、トリガと同じようには機能しません。質問 1 で説明されている状況が発生する唯一の方法は、トリガーからバッチを呼び出し/実行する場合です。可能であれば、それを避けることを強くお勧めします。
  2. (および 3.) バッチは通常、 Apex スケジューラを使用して、夜間または営業時間外に実行されるようにスケジュールされます。これが推奨される解決策です。
于 2012-06-15T19:36:34.663 に答える
0

まず、BEFORE UPDATEセクションではなく、TerritoryオブジェクトのAFTERUPDATEトリガーにロジックを配置する必要があります。原則として、トリガーアクションの対象となるレコード/オブジェクト(つまり、この場合はテリトリーオブジェクト)のフィールドまたは値を更新する必要がある場合は、BEFOREUPDATEまたはBEFOREINSERTセクションを使用します。他のレコード/オブジェクト(つまり、この場合は連絡先)を作成/更新/削除する場合は、[更新後]または[挿入後]セクションを使用します。

第二に、トリガーからバッチアペックスプロセスを開始することに何も問題はないと思います。

たとえば、「BatchUpdateContactsBasedOnTerritory」というバッチクラスがあるとします。そして、このクラスには3つの重要な機能があります。

  1. 「Database.Batchable」に加えて「Database.Stateful」を実装します
  2. テリトリーのリストを引数/パラメーターとして受け取るコンストラクターメソッドがあります
  3. 渡される地域のリストを保持するためのメンバー変数があります

バッチクラスの一部

global list<Territory> TerritoryList;

global BatchUpdateContactsBasedOnTerritory(list<Territory> updatedTerritories){
    TerritoryList = updatedTerritories;
}

あなたのトリガー

trigger TerritoryTrigger on Territory (after delete, after insert, after undelete, after update, before delete, before insert, before update)
{
    if(trigger.isInsert)
    {
        if(Trigger.isBefore){
            // before insert event not implemented 
        }
        else if(Trigger.isAfter){
            // after insert event not implemented 
        }
    }else if(trigger.isUpdate){
        if(Trigger.isBefore){
            // before update event not implemented 
        }
        else if(Trigger.isAfter){
            // after update event - call batch class to process 1000 records at a time
            Database.ExecuteBatch(new BatchUpdateContactsBasedOnTerritory(trigger.new),1000);
        }
    }else if(trigger.isDelete){
        if(Trigger.isBefore){
            // before delete event not implemented 
        }
        else if(Trigger.isAfter){ 
            // after delete event not implemented 
        }
    }
    else if(Trigger.isUnDelete){ 
        // undelete event not implemented
    }
}
于 2012-06-16T17:42:02.003 に答える