Validation 如何保存具有验证规则的记录

Validation 如何保存具有验证规则的记录,validation,salesforce,Validation,Salesforce,我目前有一个验证规则,可以防止用户在记录状态完成时对其进行更改。仅当状态为“草稿”或“已注册”时,才允许用户进行更改 AND( TEXT(Current_Status__c) <> "Draft", TEXT(Current_Status__c) <> "Registered" ) 和( 文本(当前状态)“草稿”, 文本(当前状态)“已注册” ) 有一个新的要求,即即使记录状态已完成,也允许用户仅更新特定的选取列表值字段。如果我

我目前有一个验证规则,可以防止用户在记录状态完成时对其进行更改。仅当状态为“草稿”或“已注册”时,才允许用户进行更改

AND(
TEXT(Current_Status__c) <> "Draft",
TEXT(Current_Status__c) <> "Registered"
)
和(
文本(当前状态)“草稿”,
文本(当前状态)“已注册”
)
有一个新的要求,即即使记录状态已完成,也允许用户仅更新特定的选取列表值字段。如果我删除了验证规则,用户将能够更改页面布局中任何不起作用的字段

配置文件的对象设置为读取、创建和编辑。此对象是Opportunity的子对象,OWD由父对象控制

有没有关于如何解决这个问题的建议


提前感谢。

我们可以将您的规则重写为
ISPICKVAL(当前状态为“已完成”)
例如,看起来更干净一些。你的电话,你可以保持原样

因此,您需要的是类似于
ISPICKVAL(当前状态,Completed')&!已更改(某些选取列表)
。如果您要修改选择列表,它应该允许编辑通过

问题是它不会检查这是否是唯一的改变。用户可以作弊,修改10个字段,只要其中一个是选择列表,他们就会“背负”并保存OK

编写类似于
ISPICKVAL(当前状态,'Completed')&&!ISCHANGED(一些挑选列表)&(ISCHANGED(Field1_uuc)| ISCHANGED(Field2_uc)| ISCHANGED(Field3_uc))
。您必须向其中添加所有可编辑字段,每次创建新字段时都要对其进行更改。最终你会达到长度限制

如果这是您关心的问题,我知道有3种选择:

  • 请开发人员将您的逻辑重写为Apex触发器,然后它可以动态地遍历所有字段(使用“描述”调用来学习字段名或类似的内容)

  • 另一个技巧是只允许通过快速操作而不是普通的编辑页面编辑已完成的记录。在该操作中,您可以在字段预填充步骤中设置一些隐藏复选框,并且只有在设置了该复选框的情况下,您的验证才会允许保存。但是,无论如何,您都需要将其停用,否则旁路将变为永久自动启用

  • 如果对象上没有太多记录类型,一个常见的技巧是在完成时更改记录类型(工作流、process builder等)。并有另一个页面布局,除特殊选取列表外,所有字段都被锁定。它对UI更改足够有效,但如果您有代码和集成写入到对象中,则不会提供保护


我们可以将您的规则重写为
ISPICKVAL(当前状态为“已完成”)
例如,看起来更干净。不过,您的通话可以保持原样

因此,您需要的是类似于
ISPICKVAL(当前状态,'Completed')&&!ISCHANGED(某些拾取列表)
。如果您修改该拾取列表,它应该允许编辑通过

问题是它不会检查这是否是唯一的更改。用户可以作弊,修改10个字段,只要其中一个是选择列表,他们就会“背驮”并保存OK

编写诸如
ISPICKVAL(Current_Status___c,'Completed')&&&!ISCHANGED(Some_Picklist__c)&(ISCHANGED(Field1__c)| ISCHANGED(Field2__c)| ISCHANGED(Field3__c))
之类的验证非常痛苦。您必须添加所有可编辑字段,每次创建新字段时都要进行更改。最终您将达到长度限制

如果这是您关心的问题,我知道有3种选择:

  • 请开发人员将您的逻辑重写为Apex触发器,然后它可以动态地遍历所有字段(使用“描述”调用来学习字段名或类似的内容)

  • 另一个技巧是只允许通过快速操作而不是普通的编辑页面编辑已完成的记录。在该操作中,您可以在字段预填充步骤中设置一些隐藏复选框,并且只有在设置了该复选框的情况下,您的验证才会允许保存。但是,无论如何,您都需要将其停用,否则旁路将变为永久自动启用

  • 如果对象上没有太多记录类型,一个常见的技巧是在完成时更改记录类型(工作流、process builder等)。并有另一个页面布局,除特殊选取列表外,所有字段都被锁定。它对UI更改足够有效,但如果您有代码和集成写入到对象中,则不会提供保护