0

実稼働環境で取得したトリガーについて、開発者スクリプトの例外メールを受け取りました。

Apex script unhandled trigger exception by user/organization: 00590000002GfMD/00D90000000cIze
SetContactDonorCampaign: execution of BeforeInsert
caused by: System.DmlException: Update failed. First exception on row 0; first error:
MISSING_ARGUMENT, Id not specified in an update call: []
Trigger.SetContactDonorCampaign: line 25, column 1

このエラーは、失敗したレコードの ID を教えてくれません。これは少し面倒です。トリガー自体は、参照 Contact__c が入力された Payment_Information__c レコードが作成されたことを認識し、その連絡先の複数選択リストに「寄付者」がまだ含まれていない場合はそれを含めるように設定します。

trigger SetContactDonorCampaign on Payment_Information__c (before insert,before update) {

    for(Payment_Information__c donation : Trigger.new)
    {
        Contact reg = new Contact();
        if(donation.Contact__c != NULL)
        {
            reg = [SELECT id, Campaign__c FROM Contact WHERE Id = :donation.Contact__c];
            String regCampaign = '';
            if (reg.Campaign__c != NULL)
            {
                if (!reg.Campaign__c.contains('Donor'))
                {
                  regCampaign = reg.Campaign__c + ';Donor';
                } else {
                    return;
                }
            } else {            
                regCampaign = 'Donor';
            }
            reg.Campaign__c = regCampaign;
        }
        if (reg != NULL)
        {
            update reg;
        }
    }   
}

検索する特定のレコードがなければ (システムには、このエラーと一致する変更日を含む支払い情報レコードさえありません)、ここで何が失敗しているのかについての提案はありますか?

4

1 に答える 1

0

contactオブジェクトはdonation.Contact__cでもnullではありません。毎回新しい連絡先オブジェクトを作成したためです。

Contact reg = new Contact();

if (reg != NULL)
{
        update reg;
}    

上記の条件は常に実行されます。それがこのエラーが発生する方法です。

コードを次のように変更してください。

trigger SetContactDonorCampaign on Payment_Information__c (before insert,before update) {

for(Payment_Information__c donation : Trigger.new)
{
    Contact reg = null;
    if(donation.Contact__c != NULL)
    {
        reg = [SELECT id, Campaign__c FROM Contact WHERE Id = :donation.Contact__c];
        String regCampaign = '';
        if (reg.Campaign__c != NULL)
        {
            if (!reg.Campaign__c.contains('Donor'))
            {
              regCampaign = reg.Campaign__c + ';Donor';
            } else {
                return;
            }
        } else {            
            regCampaign = 'Donor';
        }
        reg.Campaign__c = regCampaign;
    }
    if (reg != NULL)
    {
        update reg;
    }
}   

}

于 2014-09-26T07:21:00.217 に答える