2012-08-05 187 views
0

假设我有两个对象
1.Account-标准对象[它有一个字段名STATUS_ Ç这是一个具有值选取列表INPROGRESS和闭合]
2.Client
_c - 定制对象[它也具有相同的字段名称Status_c,它是具有正在进行中并且正在进行中的值的选项列表]
Salesforce中:触发相关的列表上

并且Client_c已经查找到帐户名称,这意味着帐户具有客户端对象的相关列表。

我的问题是:
我想写一个触发器在那里,如果我把帐户状态为“关闭”我不能把客户端的状态为“关闭”,就应该客户对象上抛出一个错误消息,或者如果我把客户状态关闭我不能把帐户状态关闭,反之亦然。

任何人都可以帮我写一个触发器吗?

回答

1

从概念上讲,我认为你要做的是在这两个对象上设置验证规则。在Client_您的验证规则C应该很简单:TEXT(状态 _c)== '封闭' & & TEXT(Account_ c.Status _c)== '封闭'

更有趣的部分是如何当您将帐户移至关闭时,您可以确保没有任何相关项目已关闭。我倾向于在帐户上创建一个字段,用于跟踪相关项目的状态(复选框),基本上告诉我是否有效改变我的状态。在这种情况下,验证规则变得非常简单。为了设置该布尔值,我最终使用Client_C上的触发器,基本上只是在批次中修改客户端时考虑所有帐户(同时考虑插入,插入和删除):

SELECT Account__c.Id FROM Client__c WHERE Id =: Trigger.new OR Id =: Trigger.old 

然后创建一个所有帐户ID(在本例中为已命名帐户)的集合,然后运行查询以检索与这些Ids相关的所有客户端(在单个查询中以确保您不会遇到SOQL限制)。

SELECT Account__c.Id, Status__c FROM Client__c WHERE Account__c.Id =: accounts 

从这个结果,你会遍历所有条目,他们折腾成帐户ID其中值是客户端列表键入一个地图。完成后,运行一个查询,根据之前的“帐户”列表(这只是字符串列表,而不是实际帐户)获取所有帐户,随后遍历与该帐户关联的所有客户端,并且如果客户端被标记为已关闭,您将相应地更新该帐户的元数据。如果没有客户关闭,账户将被标记为这样。完成后,运行更新语句以更新您已修改的帐户列表。

+0

感谢您的回复......我可以使用总结和验证规则来满足上述要求,但我想在这种情况下使用触发器。 – 2012-08-08 11:31:59

+0

如果您纯粹需要触发器中的逻辑,则可以通过编程将错误添加到字段http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_context_variables.htm – 2012-08-09 01:20:48