0

このトリガーが、基準に一致しないレコードを更新することがある理由がわかりません。アカウントが「保留中」からアクティブなサービスに移行すると、キャンセルされたすべての割り当てが保留に戻されるという考え方です。何が原因なのかわかりませんが、サービスに変更のないアカウントの割り当ては、しばらくの間キャンセルされないようです。コードは次のとおりです。

trigger cancelAssignments on Account (before update) {
    List<Assignment__c> masterListA = [select Id, Status__c, Practice__c from Assignment__c where Practice__c IN :Trigger.newMap.keySet() and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Feedback Needed' OR status__c = 'Pending Review' OR status__c = 'Accepted')];    
    List<Assignment__c> masterListB = [select Id, Status__c, Practice__c from Assignment__c where Practice__c IN :Trigger.newMap.keySet() and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Canceled')]; 

    for (Account oAccount : trigger.new) {
        if (oAccount.current_services__c == null || oAccount.current_services__c == 'Hold'){
            for (Account oAcct : trigger.old){
                if (oAcct.current_services__c != null && oAcct.current_services__c != 'Hold'){
                    List<Assignment__c> assignmentsToUpdate = new List<Assignment__c>();
                    for (Assignment__c rd : masterListA){
                        if (rd.practice__c == oAccount.id){
                        rd.Status__c = 'Canceled';
                        assignmentsToUpdate.add(rd); 
                    }
                    }update assignmentsToUpdate;
                }
            }
        }
        else if (oAccount.current_services__c != 'Hold' && oAccount.current_services__c != null  ){
            for (Account oAcctB : trigger.old){
                if (oAcctB.current_services__c == 'Hold'){
                    List<Assignment__c> assignmentsToUpdateB = new List<Assignment__c>();
                    for (Assignment__c rdB : masterListB){
                        if (rdB.practice__c == oAccount.id){
                        rdB.Status__c = 'Pending Review';
                        assignmentsToUpdateB.add(rdB); 
                    }
                    }update assignmentsToUpdateB;
                }
            }    
        }
    }
}
4

2 に答える 2

0

次のような問題が考えられます。

  • masterListB複数のアカウントの割り当てを取得します
  • ループ内のコードは、for (Account oAcctB : trigger.old)「保留」ステータスにある古いアカウントが同じアカウントであるかどうかを確認することはありません

1 つの解決策は、以下の編集を行うことです。

/* Old condition replaced:
   if (oAcctB.current_services__c == 'Hold') { */

if (oAcctB.current_services__c == 'Hold' and oAcctB.Id == oAccount.Id) {

これが正しい解決策であるかどうかを証明するために、次のような単体テストを作成することをお勧めします。

  1. 「Alpha Corp」と「Beta Corp」の 2 つのアカウントを作成します。
  2. アルファ社の現在のサービスを「保留」に設定する
  3. Beta Corp の現在のサービスを「アクティブ」に設定する
  4. 状況が「キャンセル済み」の関連する割り当てを Alpha Corp に追加します。
  5. ステータスが「キャンセル済み」の関連する割り当てを Beta Corp に追加します
  6. 請求先の国を「US」から「United States」に変更するなどの簡単なことを行って、1 回の DML 操作で両方のアカウントを更新します。
  7. 関連する Alpha Corpの割り当てが「キャンセル済み」のままであることを主張する

あなたが共有したコードは単体テストに合格しないと思われます。その場合、問題を突き止めて修正することができます。

于 2013-05-01T10:59:43.390 に答える
0

マーティのコードは私が尋ねた質問に答えていましたが、いくつかの「コード ステートメントが多すぎます」というエラーにも遭遇しました。それを解決すると思われる最終的なコードは次のとおりです。

trigger cancelAssignments on Account (before update) {
List<account> quitingAccounts = new List<account>();
List<account> returningAccounts = new List<account>();
List<Assignment__c> assignmentsToCancel;
List<Assignment__c> assignmentsToReturn;
for (Account oAccount : trigger.new)
    {
    if (oAccount.current_services__c == null || oAccount.current_services__c == 'Hold')
        {
        for (Account oAcct : trigger.old)
            {
            if (oAcct.current_services__c != null && oAcct.current_services__c != 'Hold' && oAcct.Id == oAccount.Id)
                {                    
                quitingAccounts.add(oAcct);                                      
                }
            }
        }
    else if (oAccount.current_services__c != 'Hold' && oAccount.current_services__c != null  )
        {
        for (Account oAcctB : trigger.old)
            {
            if (oAcctB.current_services__c == 'Hold'  && oAcctB.Id == oAccount.Id)
                {
                returningAccounts.add(oAcctB);
                }
            }    
        }
    }        
assignmentsToCancel = [select Id, Status__c, Practice__c from Assignment__c  where Practice__c IN :quitingAccounts and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Feedback Needed' OR status__c = 'Pending Review' OR status__c = 'Accepted')];
assignmentsToReturn = [select Id, Status__c, Practice__c from Assignment__c  where Practice__c IN :returningAccounts and type_of_work__c != 'a0Qa000000G1WmVEAV' AND status__c = 'Canceled'];
for (Assignment__c rd : assignmentsToCancel)
    {
    rd.Status__c = 'Canceled';
    }
for (Assignment__c rd : assignmentsToReturn)
    {
    rd.Status__c = 'Pending Review';
    }
update assignmentsToCancel;
update assignmentsToReturn;

}

于 2013-05-08T12:41:03.027 に答える