function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
[Lindsey Kiken][Lindsey Kiken] 

Apex trigger deleting related list versus inserting new record

I have a case apex trigger that is supposed to add a new case team member when the OwnerId is changed. The goal is to have the new OwnerId be entered into the case team and to not alter the case team outside of the OwnerId change. Instead, the new OwnerID is being inserted into the Case Team and is deleting any Case Team Members that were previously in the Case Team, that should remain in the team during the insert, are being deleted.

Please see below for the code:
trigger CaseTeamMember_Owner_Update on Case (after update) {
    CaseTeamRole role = [select Name from CaseTeamRole where Name = 'Support Team']; 
    Map<ID,Schema.RecordTypeInfo> rt_Map = Case.sObjectType.getDescribe().getRecordTypeInfosById();  
    List<CaseTeamMember> members = new List<CaseTeamMember>();
   
    for (Case c: Trigger.new) {
        List<CaseTeamMember> mem=[Select id from CaseTeamMember where CaseTeamMember.MemberId=:trigger.new[0].OwnerId AND CaseTeamMember.ParentId=:trigger.new[0].Id];
            if(rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case') && mem.size()>0) {
                }
            
        else if(c.CreatedDate != System.now() && c.OwnerId != Trigger.oldMap.get(c.Id).OwnerId && rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case')) {
                members.add(new CaseTeamMember(
                    ParentID = c.Id,
                    MemberID = c.OwnerId,
                    TeamRoleID = role.Id            
                ));           
            }     
        }
    for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    } 
          
    if (!members.isEmpty()) {
        insert members;
    }  
}
Removing these line of codes:
for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    }
I am fairly certain the following line is causing this issue, but I am not knowledge enough to fix the code:
insert members;
Thoughts?
Best Answer chosen by [Lindsey Kiken]
[Lindsey Kiken][Lindsey Kiken]
I ended up getting the trigger to work as intended with the following code:
trigger CaseTeamMember_Owner_Update on Case (after update) {
    CaseTeamRole role = [select Name from CaseTeamRole where Name = 'Support Team']; 
    Map<ID,Schema.RecordTypeInfo> rt_Map = Case.sObjectType.getDescribe().getRecordTypeInfosById();  
    List<CaseTeamMember> members = new List<CaseTeamMember>();

    for (Case cas : Trigger.new) {
    // Access the "old" record by its ID in Trigger.oldMap
    Case oldCas = Trigger.oldMap.get(cas.Id);
    
    delete [SELECT id FROM CaseTeamMember WHERE MemberId =:oldCas.ContactId];
    }
      
    for (Case c: Trigger.new) {
        List<CaseTeamMember> mem=[Select id from CaseTeamMember where CaseTeamMember.MemberId=:trigger.new[0].OwnerId AND CaseTeamMember.ParentId=:trigger.new[0].Id];
            if(rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case') && mem.size()>0) {
                }
            
        else if(c.CreatedDate != System.now() && c.OwnerId != Trigger.oldMap.get(c.Id).OwnerId && rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case')) {
                members.add(new CaseTeamMember(
                    ParentID = c.Id,
                    MemberID = c.OwnerId,
                    TeamRoleID = role.Id            
                ));           
            }     
        }
/*
    for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    } 
*/          
    if (!members.isEmpty()) {
        insert members;
    }  
}

 

All Answers

Shashikant SharmaShashikant Sharma
Hi Lindsey,

Comment these lines putting them in between
/*    

*/

like
/*

for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    }

*/

Other than causing the delete these lines are not even following best practices for bulkified triggers .

Thanks
Shashikant
 
[Lindsey Kiken][Lindsey Kiken]
Hi Shashikant,

As per my initial comment: I have tried removing those lines of code, but entire Case Team is still being deleted upon insert of the new value. Any other thoughts?

Cheers,
Lindsey
Shashikant SharmaShashikant Sharma
Hi Lindsey,

I just tried in my org same code
1. With the code deleting - it delete the exiting case team member
2. With commenting the code deleting - it did not delete exiting case team member

Please make sure when you comment or remove code is saved to server. You could verify it by opening the trigger in separe window.

Let me know if you still face issue.


Thanks
Shashikant
[Lindsey Kiken][Lindsey Kiken]
Hi Shashikant,

Thank you for your advice on confirming that the code successfully saved on the server! Although I was able to click on "Quick Save" and have the button seemingly cycle through the saving action, the code did not appear to save the to server. Upon retest: yes, I can confirm that the existing Case Team records are now no longer deleting upon insert.

How would you recommend I update the code so that when the OwnerId is changed on the case, the old OwnerId value is removed from the Case Team?

Cheers,
Lindsey
Shashikant SharmaShashikant Sharma
In order to always confirm that code is saved once always go to class or trigger and click it so it opens in another window and confirm your changes are there in the code.

In order to test the owner change use paste this to your trigger and save:
 
trigger CaseTeamMember_Owner_Update on Case (after update) {
    CaseTeamRole role = [select Name from CaseTeamRole where Name = 'Support Team']; 
    Map<ID,Schema.RecordTypeInfo> rt_Map = Case.sObjectType.getDescribe().getRecordTypeInfosById();  
    List<CaseTeamMember> members = new List<CaseTeamMember>();
   
    for (Case c: Trigger.new) {
        List<CaseTeamMember> mem=[Select id from CaseTeamMember where CaseTeamMember.MemberId=:trigger.new[0].OwnerId AND CaseTeamMember.ParentId=:trigger.new[0].Id];
            if(rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case') && mem.size()>0) {
                }
            
        else if(c.CreatedDate != System.now() && c.OwnerId != Trigger.oldMap.get(c.Id).OwnerId && rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case')) {
                members.add(new CaseTeamMember(
                    ParentID = c.Id,
                    MemberID = c.OwnerId,
                    TeamRoleID = role.Id            
                ));           
            }     
        }

/* 
   for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    } 
  */
        
    if (!members.isEmpty()) {
        insert members;
    }  
}

In order to test
1. Create a Case 
2. Verify that there is a Case Team Member Added
3. Change the Owner to some other user
4. Verify that there is a Case Team Member for changed Owner and Existing is not deleted

Thanks
Shashikant
[Lindsey Kiken][Lindsey Kiken]
Hi Shashikant,

My goal is to have Case Team Member record that has a MemberId that matches the old OwnerId value be deleted upon the completion of this trigger. Any idea how I can code that in place of what I originally had (of which was not working)?

Cheers,
Lindsey
[Lindsey Kiken][Lindsey Kiken]
I ended up getting the trigger to work as intended with the following code:
trigger CaseTeamMember_Owner_Update on Case (after update) {
    CaseTeamRole role = [select Name from CaseTeamRole where Name = 'Support Team']; 
    Map<ID,Schema.RecordTypeInfo> rt_Map = Case.sObjectType.getDescribe().getRecordTypeInfosById();  
    List<CaseTeamMember> members = new List<CaseTeamMember>();

    for (Case cas : Trigger.new) {
    // Access the "old" record by its ID in Trigger.oldMap
    Case oldCas = Trigger.oldMap.get(cas.Id);
    
    delete [SELECT id FROM CaseTeamMember WHERE MemberId =:oldCas.ContactId];
    }
      
    for (Case c: Trigger.new) {
        List<CaseTeamMember> mem=[Select id from CaseTeamMember where CaseTeamMember.MemberId=:trigger.new[0].OwnerId AND CaseTeamMember.ParentId=:trigger.new[0].Id];
            if(rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case') && mem.size()>0) {
                }
            
        else if(c.CreatedDate != System.now() && c.OwnerId != Trigger.oldMap.get(c.Id).OwnerId && rt_map.get(c.recordTypeID).getName().containsIgnoreCase('Support Case')) {
                members.add(new CaseTeamMember(
                    ParentID = c.Id,
                    MemberID = c.OwnerId,
                    TeamRoleID = role.Id            
                ));           
            }     
        }
/*
    for (Case cas: Trigger.new) {
        List<CaseTeamMember> memdelete = [Select Id from CaseTeamMember where MemberId=:Trigger.oldMap.get(cas.Id).OwnerId];
        delete memdelete;
    } 
*/          
    if (!members.isEmpty()) {
        insert members;
    }  
}

 
This was selected as the best answer
Shashikant SharmaShashikant Sharma
Hi Lindsey,

Now I understand that what you want s to delete the Case Team member on this case but not on the other cases.

TO achieve it replace the commented code with this code.
 
Map<Id, List<CaseTeamMember>> mapCaseIdToCaseTeamMembers = new Map<Id, List<CaseTeamMember>>();    
    for( CaseTeamMember cm : [Select Id, ParentID, MemberId from CaseTeamMember where ParentID  =: Trigger.new And TeamRoleID =: role.Id]) {
    
        List<CaseTeamMember> listCM = new List<CaseTeamMember>();
        if( mapCaseIdToCaseTeamMembers.containsKey( cm.ParentID  )) {
            listCM = mapCaseIdToCaseTeamMembers.get( cm.ParentID  );
        }
        listCM.add(cm);
        mapCaseIdToCaseTeamMembers.put( cm.ParentID, listCM );
    }
    List<CaseTeamMember> memdelete = new List<CaseTeamMember>();
    for (Case cas: Trigger.new) {
        if( Trigger.isUpdate ) {
            Id oldOwnerId = Trigger.oldMap.get(cas.Id).OwnerId;
            if( mapCaseIdToCaseTeamMembers.containsKey( cas.Id)) {
                for( CaseTeamMember cm : mapCaseIdToCaseTeamMembers.get( cas.Id) ) {
                    if( cm.ParentID == cas.Id && oldOwnerId == cm.MemberId ) {
                        memdelete.add( cm );
                    }
                }
            }
        }
    } 
    if( memdelete.size() > 0 ) {
        delete memdelete;
    }

Let me know if you face issues with it.

Thanks
Shashikant