serviceterritory 对象上的 salesforce 更新触发器
salesforce update trigger on serviceterritory object
我有以下要求,我是 SF 开发的新手,如果我的方法正确与否,需要帮助。
当 ServiceTerritory 对象发生任何更新时,如果 ServiceTerritory 的 Time_Zone__c 字段与用户对象 TimeZoneSidKey 字段不匹配,则使用用户对象 TimeZoneSidKey 字段更新 ServiceTerritory 对象 Time_Zone__c 字段。
- ServiceTerritory 对象:Center_Instructor_Contact__c 字段标记为联系人对象中的 ID 字段。
- 联系人对象:有 ID 字段和 AccountId 字段
- 用户对象:有 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;
}
}
}
我有以下要求,我是 SF 开发的新手,如果我的方法正确与否,需要帮助。
当 ServiceTerritory 对象发生任何更新时,如果 ServiceTerritory 的 Time_Zone__c 字段与用户对象 TimeZoneSidKey 字段不匹配,则使用用户对象 TimeZoneSidKey 字段更新 ServiceTerritory 对象 Time_Zone__c 字段。
- ServiceTerritory 对象:Center_Instructor_Contact__c 字段标记为联系人对象中的 ID 字段。
- 联系人对象:有 ID 字段和 AccountId 字段
- 用户对象:有 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;
}
}
}