当至少一个联系人复选框为真时,帐户复选框标记为真

时间:2017-05-18 09:41:30

标签: salesforce apex

我们目前在联系人中有一个自定义复选框字段,如果他们是为该特定帐户调用的最佳人选,则我们将其设置为true。我想在帐户中创建一个复选框字段,如果它包含与标记为true的特定复选框的联系人,则会自动标记为true。

基本上,我想要一个名为“包含最佳联系人”的帐户复选框,当至少其中一个联系人将“最佳联系人”复选框标记为“真”时,该复选框标记为真。

2 个答案:

答案 0 :(得分:0)

通常,您的用例将是Master和Detail对象之间的Roll-Up字段的示例。但是,您无法将详细信息与Master对象联系起来 - 更不用说帐户了。

你有几个选择,但它们并不好 您需要创建一个Apex类来查询所有子Contact对象并相应地更新Account。最好通过Contact对象上的Update Trigger来更新父帐户。如果联系人记录符合条件,则使用“联系人”帐户字段中的“帐户ID”向帐户对象提交更新。

此处的警告是,这是有关联系人更新的额外DML语句。如果您对“联系人”执行任何批量活动,则可能会超出DML限制。但是,如果您正确定制触发器,则可以限制触发器中实际采取操作的方式和时间。最好的方法是,如果联系人有一个帐户,那么只能输入更新代码块,并且最好的联系人是"最好的联系人"复选框正在更改为" False" to" True" (您查看触发器中的旧值和新值以确定正在发生此更改。)

答案 1 :(得分:0)

如果您更喜欢不使用触发器的声明性解决方案,您可以使用流程构建器以及基于联系人的流程构建器中的流程来检查要检查的复选框并进行更改,这样您就不会处理已经处理过的记录和对于该操作,启动在AccountId中传递的流,如输入参数。该流程将查询已传入Id且未选中复选框的帐户,并执行更新或快速更新以选中该复选框。

您还必须执行逆流程构建器(同一流程构建器中的不同步骤或不同的流程,所有这些并不重要),您可以检查复选框是否未被选中并且是否已更改并启动不同的流(如果将复选框状态作为输入参数传递,则流程相同)。此其他流程将搜索已由Id检查复选框的帐户,如果找到,则可以搜索带有该标志的联系人,如果找不到,则更新帐户以取消选中该复选框。

但是要更新现有数据,您需要一些代码,这些代码可能需要进行批处理,具体取决于联系人设置了标记的记录数。

如果在流程构建器流程上禁用ischanged选项,则可以使用流程构建器和流程来执行以下操作来更新数据:

update [SELECT Id FROM Contact WHERE Flag__c = true];

将触发流程。否则你需要像

这样的东西
Set<Id> accountIds = new Set<Id>();
List<Account> accToUpdate = new List<Account>();
for(Contact c : [SELECT AccountId FROM Contact WHERE Flag__c = true]){
    if(!accountIds.contains(c.AccountId)){
        accToUpdate.add(new Account(Id = c.AccountId, Account_Flag__c = true));
        accountId.add(c.AccountId);
    }
}
update accToUpdate;