我刚刚收到了一个开发人员脚本异常电子邮件,其中包含我在生产环境中获得的触发器:
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,这有点烦人。触发器本身只识别何时创建Payment_Information__c记录并填充查找Contact__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;
}
}
}
如果没有要查找的特定记录(系统甚至没有包含与此错误匹配的修改日期的付款信息记录),是否有关于此处失败的任何建议?
答案 0 :(得分:0)
联系对象即使是捐赠也不为空.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;
}
}
}