Account BC,即S_ORG_EXT_X表中有自定义字段“Lock Flag”。该字段在商机 BC 中可用,使用上表的连接。联接规范如下:Opportunity.Account Id = Account.Id。创建新机会时始终填充帐户 ID。要求是对于机会 BC 中新创建的记录,如果“锁定标志”等于“Y”,那么我们不应该允许创建记录,我们应该显示自定义错误消息。
我最初的建议是使用调用数据验证管理器业务服务的运行时事件,在该服务中评估验证规则并显示错误消息。假设我们必须决定是否写入记录,只要 WriteRecord 已经将行提交到数据库,逻辑就应该放在 PreWriteRecord 事件处理程序中。
主要问题是如何确定它是新记录还是更新记录。我们有 WriteRecordNew 和 WriteRecordUpdated 运行时事件,但它们在实际写入记录后被触发,因此它不会阻止用户保存记录。我的下一个方法是使用 eScript:在 BusComp_PreWriteRecord 服务器脚本中编写自定义代码并调用 BC 的方法 IsNewRecordPending 以确定它是否是新记录,然后检查标志并在需要时显示错误消息。
但不幸的是,我面临另一个问题。新创建的机会记录不会填充该连接字段“锁定标志”。请记住,我们正在谈论 BC Opportunity 并且字段放置在 S_ORG_EXT_X 表中。当我们创建新机会时,我们会选择它所属的帐户。所以它是可重现的: OpportunityBC.GetFieldValue("Lock Flag") 为新创建的记录返回 null 并为之前保存的记录返回正确的值。对于新创建的机会,我们必须重新查询 BC 以查看填充的“锁定标志”。我找到了几个文档,包括Oracle 的推荐如果我们想在创建记录后立即显示连接字段值,请使用 PreDefaultValue 属性。我找到的最合适的表达式是 Parent: BCName.FieldName 但事实并非如此,因为活动 BO 是 Opportunity 而 Opportunity BC 是主要的。
如果您阅读到这里并最终提出我的问题,感谢您的耐心等待:
有没有办法在不使用 eScript 和 BC.IsNewRecordPending 方法的情况下处理 PreWrite 事件并确定它是否是新记录?
如何获取新创建记录的连接字段的值,尤其是在 PreWriteRecord 事件处理程序中?
它是 Siebel 8.1
更新:我找到了问题第一部分的答案。现在对我来说似乎很简单,我想知道我最初是怎么做到的。这是解决方案。
- 在 PreWriteRecord 上触发的创建运行时事件。指定对 Data Validation Manager 业务服务的调用。
- 在 DVM 中创建规则集和条件为的规则
NOT(BCHasRows("机会", "机会", "[Id]='"+[Id]+"'", "AllView"))
而已。我们正在搜索具有相同行 ID 的记录。如果是新记录,则数据库中应该没有任何内容(请记住我们在 PreWriteRecord 处理程序中)并且函数返回 FALSE。如果我们正在更新某些行,那么我们得到 TRUE。使用 NOT 反转结果,我们使 DVM 为新记录引发错误。
至于我的问题的第二部分归功于@RanjithR,他建议使用 PickMap 来填充连接字段(见下文)。我已经检查了该方法,并且至少在您有适当的 PickMap 时它可以正常工作。