新增记录时如何通过触发器创建picklist字段值?含跨对象Apex代码方案
同对象新增记录时通过触发器设置Picklist值
这种场景直接在before insert触发器中处理即可,before insert阶段的字段修改不需要额外调用DML操作就能直接写入新增的记录,性能最优。
- 实现逻辑:在触发器中遍历新增的记录,根据业务规则给Picklist字段赋值合法的可选值即可,注意赋值必须和该Picklist字段预设的可选值完全匹配(大小写、字符都要一致,否则会报错)。
代码示例(假设针对Account对象,新增时给CustomerPriority__cPicklist字段赋值):
trigger AccountBeforeInsert on Account (before insert) { for(Account acc : Trigger.new) { // 示例规则:年营收大于100万的客户优先级设为High,否则为Medium if(acc.AnnualRevenue != null && acc.AnnualRevenue > 1000000) { acc.CustomerPriority__c = 'High'; } else { acc.CustomerPriority__c = 'Medium'; } } }
跨对象新增记录时为另一对象设置Picklist值的实现
这种场景需要在after insert触发器中处理,因为只有原对象记录插入完成后才能拿到记录Id,用于关联新创建的目标对象记录。
- 实现注意点:
- 要做bulk化处理,避免循环里执行DML操作
- 赋值Picklist值前建议先校验可选值合法性,避免部署后因为Picklist可选值调整出现运行时错误
- 注意处理关联关系的必填字段
代码示例(假设在Contact对象新增记录后,自动创建对应的Task记录,并给Task的StatusPicklist字段赋值):
基础触发器实现
trigger ContactAfterInsert on Contact (after insert) { List<Task> taskList = new List<Task>(); for(Contact con : Trigger.new) { Task newTask = new Task(); newTask.Subject = '跟进新客户联系人'; newTask.WhoId = con.Id; // 给Task的Status Picklist字段赋值为'Not Started' newTask.Status = 'Not Started'; newTask.ActivityDate = Date.today().addDays(3); taskList.add(newTask); } if(!taskList.isEmpty()) { insert taskList; } }
符合最佳实践的分层实现(逻辑抽离到处理类)
触发器部分:
trigger ContactAfterInsert on Contact (after insert) { if(Trigger.isAfter && Trigger.isInsert) { ContactTriggerHandler.createFollowupTasks(Trigger.new); } }
处理类部分:
public class ContactTriggerHandler { public static void createFollowupTasks(List<Contact> newContactList) { List<Task> taskList = new List<Task>(); for(Contact con : newContactList) { Task t = new Task( WhoId = con.Id, Subject = '新联系人跟进', Status = 'Not Started', Priority = 'Normal', ActivityDate = Date.today().addDays(3) ); taskList.add(t); } if(!taskList.isEmpty()) { insert taskList; } } }
注意:所有Picklist的赋值必须和该字段在对象设置中定义的API名称完全一致,如果是受限Picklist,赋值不在可选范围内的值会触发DML报错。
内容的提问来源于stack exchange,提问作者Nishant Chauhan
相关产品推荐
相关产品推荐

