0

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 是主要的。

如果您阅读到这里并最终提出我的问题,感谢您的耐心等待:

  1. 有没有办法在不使用 eScript 和 BC.IsNewRecordPending 方法的情况下处理 PreWrite 事件并确定它是否是新记录?

  2. 如何获取新创建记录的连接字段的值,尤其是在 PreWriteRecord 事件处理程序中?

它是 Siebel 8.1

更新:我找到了问题第一部分的答案。现在对我来说似乎很简单,我想知道我最初是怎么做到的。这是解决方案。

  1. 在 PreWriteRecord 上触发的创建运行时事件。指定对 Data Validation Manager 业务服务的调用。
  2. 在 DVM 中创建规则集和条件为的规则

NOT(BCHasRows("机会", "机会", "[Id]='"+[Id]+"'", "AllView"))

而已。我们正在搜索具有相同行 ID 的记录。如果是新记录,则数据库中应该没有任何内容(请记住我们在 PreWriteRecord 处理程序中)并且函数返回 FALSE。如果我们正在更新某些行,那么我们得到 TRUE。使用 NOT 反转结果,我们使 DVM 为新记录引发错误。

至于我的问题的第二部分归功于@RanjithR,他建议使用 PickMap 来填充连接字段(见下文)。我已经检查了该方法,并且至少在您有适当的 PickMap 时它可以正常工作。

4

1 回答 1

1

我们 Siebel 开发人员已使用脚本来正确确定记录是否为新记录。您可以尝试的一种非脚本方式是在 BusComp NewRecord 事件期间使用 RuntimeEvents 设置配置文件属性,然后在 PreWrite 事件中检查该记录是否为新记录。但是,用户总是有可能撤消记录,这些情况很棘手。

另一种选择,尝试调用 BC Method:IsNewRecordPending from RunTime 事件。我没试过这个。

对于查询的第二部分,我认为您可以使用 PickMap 轻松解决您的问题。

在 Opportunity BC 上,当您选择 Account 时,只需再添加一个选择图以从 Account 中选择 Locked 标志并将其设置到 Opportunity BC 上的相应字段。当用户选择帐户时,他也会选择锁定标志,您的脚本将在 PreWriteRecord 中运行。

我可以建议另一种解决方案,我还没有尝试过。

创建新记录时,字段 ModificationNumber 将设置为 0。每次修改时,ModificationNumber 将增加 1。

设置 DataValidationManager 规则集,从商机 BC 上的 Account 字段的 PreSetFieldValue 事件触发它。检查 LockFlag = Y AND (ModificationNumber IS NULL OR ModificationNumber = 0)) 并抛出错误。创建新记录时,DVM 应该抛出错误。

同样,最佳实践说不要使用 ModNumbers。您可以设置 ProfileAttribute 来发出 NewRecord 信号,然后在 DVM 中使用该属性。但是请记住在 WriteRecord 和 UndoRecord 中清除 ProfileAttribute 的值。

让我们知道它是怎么回事!

于 2013-12-12T07:36:12.987 回答