我在Case Object上尝试了一个简单的触发器。在Case中有一个字段Hiring_Manager__c(查找用户)。在更新或插入案例时,必须使用案例所有者的Manager填充此字段。我创建了触发器如下。由于我只是尝试单个记录,因此没有批量化。 我可以看到在调试语句中正确填充的值。但它没有在记录中更新。
trigger HiringManagerupdate_case on Case (before insert,before update) {
Case updatedCaseRec= [select id,ownerId,Hiring_Manager__c,CaseNumber from case where id in :Trigger.new];
system.debug('Case Number'+updatedCaseRec.CaseNumber);
system.debug('Manager before updation'+updatedCaseRec.Hiring_Manager__c);
try{
User caseOwner = [Select Id,Name, ManagerId, Manager.Email From User Where Id = :updatedCaseRec.ownerId];
updatedCaseRec.Hiring_Manager__c=caseOwner.ManagerId;
}
Catch(DMLException de){
system.debug('Could not find Manager');
}
system.debug('Manager'+updatedCaseRec.Hiring_Manager__c);
}
我在开发人员论坛上得到了一个回复,其代码运行正常。
trigger HiringManagerupdate_case on Case (before insert,before update) {
for(Case cas :Trigger.new){
try{
User caseOwner = [Select Id,Name, ManagerId, Manager.Email From User Where Id = :cas.ownerId];
cas.Hiring_Manager__c=caseOwner.ManagerId;
}
Catch(DMLException de){
system.debug('Could not find Manager');
}
system.debug('Manager'+cas.Hiring_Manager__c);
}
我想知道
1)如果我只尝试更新一条记录,两种方法的逻辑差异?我在调试语句中填充值但不在屏幕上填充。
2)循环(第二种方法)中的select语句是否会影响调控器限制?
3)我们是否需要为before触发器显式调用update?我的理解是在before触发器的字段更新之后发生了保存和提交,因此更改将自动保存而不调用update语句。?
提前感谢。 尼莎
答案 0 :(得分:0)
1)如果您正在尝试访问触发before触发器的对象的记录,则必须迭代Trigger.new。您无法查询它,因为记录可能尚未在数据库中。
2)是的,它可以。对于要插入或更新的每个Case记录执行查询。如果您有1,000个此类案例,则查询将执行1,000次。
3)不,我们不需要为before触发器调用update。你的理解是正确的。