0
votes

I was trying out a simple trigger on Case Object.There is a field Hiring_Manager__c (looks up to User) in Case .On update or insert of a case, this field has to be populated with the Case Owner's Manager.I created the trigger as follows.It is not bulkified as I was just trying out for a single record. I could see the value getting populated correctly in debug statements.But it is not updated on the record.

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); 

}

I got a reply for this in developer's forum with a code that works fine.

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);

}

I would like to know

1)Difference in logic in both the approaches if I am trying to update only a single record?Mine is populating the value in debug statement but not on screen.

2)Will the select statement inside the loop (of second approach)affect governor limit?

3)Do we need to explicitly call update for before triggers? My understanding is the save and commit happens after the field update for before triggers and hence the changes will be saved automatically without calling update statement.?

Thank in advance. Nisha

1

1 Answers

0
votes

1) If you are trying to access the record(s) for the object which fired a before trigger, you must iterate over Trigger.new. You cannot query for it because the record(s) may not be in the database yet.

2) Yes it could. The query executes for every Case record being inserted or updated. If you have 1,000 such Cases, the query executes a 1,000 times.

3) No, we do not need to call update for before triggers. Your understanding is correct.