【发布时间】:2011-11-10 04:50:47
【问题描述】:
我有一个自定义对象。有诸如month_c、Project_c、contact_c 和role_c 等字段的组合确定记录是唯一的。
我可以在插入前写一个触发器来检查是否已经存在任何具有相同组合的记录。我想问的问题是
如何使插入停止。一旦我发现已经有记录,那么它不应该插入记录。它不需要抛出/显示错误。
谢谢
普雷迪
【问题讨论】:
标签: salesforce apex-code
我有一个自定义对象。有诸如month_c、Project_c、contact_c 和role_c 等字段的组合确定记录是唯一的。
我可以在插入前写一个触发器来检查是否已经存在任何具有相同组合的记录。我想问的问题是
如何使插入停止。一旦我发现已经有记录,那么它不应该插入记录。它不需要抛出/显示错误。
谢谢
普雷迪
【问题讨论】:
标签: salesforce apex-code
虽然其他人已经用更好的解决方案回答了这个问题(通常非代码解决方案对系统的最终用户来说更灵活),但阻止插入特定记录的答案是在该记录的字段中添加错误.
例如,如果我要插入帐户,我可能会有这样的情况:
for(Account sAcct : trigger.new)
{
if(sAcct.Name == 'DeniedAccount')
{
sAcct.Name.addError('This is a denied account.');
}
}
另一种方法是创建一个扩展Exception 的类,然后抛出该异常类的一个新实例,这将阻止处理传递给触发器的所有记录而不是特定记录。
【讨论】:
几天前,我发现了一个非常有用且简单的解决方案(在ForceTree.com 文章中),它使我不必编写触发器。它允许您使用工作流规则和自定义字段组合字段以检查唯一性。
这是一个演练: http://www.forcetree.com/2010/07/unique-field-combination-in-salesforce.html
【讨论】:
我在 Salesforce 中有类似的情况。它是通过创建一个字段来处理的,该字段包含一个由保证唯一性所需的所有值组成的值(在您的情况下,month_c、Project_c、contact_c 和 role_c)。然后选择该字段的“唯一”复选框。重复项现在将被放入垃圾箱。
就我而言,这个新字段由外部程序填写(并推送到 Salesforce)。在您的情况下,您需要在触发器中填写值。我认为这比在触发器中执行 SOQL 查询更有效,但我没有进行任何检查来确认这一点。
【讨论】: