serviceterritory 对象上的 salesforce 更新触发器

salesforce update trigger on serviceterritory object

我有以下要求,我是 SF 开发的新手,如果我的方法正确与否,需要帮助。

当 ServiceTerritory 对象发生任何更新时,如果 ServiceTerritory 的 Time_Zone__c 字段与用户对象 TimeZoneSidKey 字段不匹配,则使用用户对象 TimeZoneSidKey 字段更新 ServiceTerritory 对象 Time_Zone__c 字段。

  1. ServiceTerritory 对象:Center_Instructor_Contact__c 字段标记为联系人对象中的 ID 字段。
  2. 联系人对象:有 ID 字段和 AccountId 字段
  3. 用户对象:有 AccountId 字段
public static void afterUpdate(List<ServiceTerritory> serviceTerritories, Map<Id, ServiceTerritory> oldRecords) {

Set<Id> recIds = new Set<Id>();
        for (ServiceTerritory record : serviceTerritories) {
            recIds.add(record.Id);
        }

Set<Id> STMembers = new Set<Id>();
        for (ServiceTerritory member : [SELECT Id, Center_Instructor_Contact__c FROM ServiceTerritory WHERE Id IN :recIds]) {
            STMembers.add(member.Center_Instructor_Contact__c);
        }

//Contact object : has ID field and AccountId field

Set<Id> ContactIDs = new Set<Id>();
for (Contact Cnt : [SELECT AccountId FROM Contact WHERE Id IN :STMembers]) {
            ContactIDs.add(Cnt.AccountId);
        }

//User Object : has AccountId field
Set<Id> UserIDs = new Set<Id>();
for (User Cnt : [SELECT AccountId, TimeZoneSidKey FROM User WHERE AccountId IN :ContactIDs]) {
            UserIDs.add(Cnt.AccountId);
        }
}

以及如果时区在对象之间不匹配时如何比较和更新 ServiceTerritory 对象的方法。

没有多少 Salesforce 实例可以访问使用 ServiceTerritory table 的“Field Service Lightning”。如果您注册免费的 Salesforce Developer Edition,它可能不会在那里存在。所以很难理解这个问题和帮助。另外,如果您写的是“用户对象:具有 AccountId 字段”,这听起来像是您在使用 Experience Cloud(以前称为社区),这会进一步缩小专家范围。

所以是Service Territory -> "up" to -> Contact -> "down" to (community) -> User

如果您使用的是社区用户,他们将在其中包含 AccountId 和 ContactId,无需通过 Account(事实上,您可能会以这种方式获得愚蠢的结果...如果不是帐户中的所有联系人都是 community-enabled, 如果它们是不同的时区怎么办...)

尝试类似的方法,但您必须进行大量试验。并将您的代码更改为 运行“更新前”,您将免费保存到数据库

List<ServiceTerritory> serviceTerritories; // passed to your function

Set<Id> contactIds = new Set<Id>();
for (ServiceTerritory st : serviceTerritories) {
    contactIds.add(st.Center_Instructor_Contact__c);
}
System.debug(contactIds);

// Grab all these Contacts and their community users (it's a related list so it'll be a subquery but really there will be at most one user
Map<Id, Contact> contacts = new Map<Id, Contact>([SELECT Id,
        (SELECT TimezoneSidKey FROM Users)
    FROM Contact
    WHERE Id IN :contactIds AND Id IN (SELECT ContactId FROM User)]);
    
// Loop again and check against "reference data"
for (ServiceTerritory st : serviceTerritories) {
    if(contacts.containsKey(st.Center_Instructor_Contact__c)){
        Contact c = contacts.get(st.Center_Instructor_Contact__c);
        System.debug(c);
        System.debug('comparing ' + st.Time_Zone__c + ' and ' + c.Users);
        if(st.Time_Zone__c != c.Users[0].TimezoneSidKey){
            System.debug('fixing ' + st.Id);
            st.Time_Zone__c = c.Users[0].TimezoneSidKey;
        }
    }
}