确定PreWriteRecord事件处理程序中的新记录并检查已连接字段的值

时间:2013-12-11 21:20:52

标签: oracle event-handling crm siebel escript

帐户BC中有自定义字段“锁定标志”,即在S_ORG_EXT_X表中。使用join to above table在Opportunity BC中提供此字段。连接规范如下:Opportunity.Account Id = Account.Id。创建新商机时始终会填充帐户ID。要求是对于机会BC中新创建的记录,如果“锁定标志”等于“Y”,那么我们不应该允许创建记录,我们应该显示自定义错误消息。

我最初的提议是使用调用Data Validation Manager业务服务的运行时事件,其中评估验证规则并显示错误消息。假设我们必须决定是否写入记录,只要WriteRecord已经将行提交到数据库,逻辑就应放在PreWriteRecord事件处理程序中。

主要问题是如何确定它是新记录还是更新记录。我们有WriteRecordNew和WriteRecordUpdated运行时事件,但它们在实际写入记录后被触发,因此它不会阻止用户保存记录。我的下一个方法是使用eScript:在BusComp_PreWriteRecord服务器脚本中编写自定义代码,并调用BC的方法IsNewRecordPending来确定它是否是新记录,然后检查标志并在需要时显示错误消息。

但不幸的是,我面临着另一个问题。对于新创建的机会记录,不会填充已加入字段“锁定标志”。请记住,我们正在讨论BC Opportunity,并且字段位于S_ORG_EXT_X表中。当我们创造新机会时,我们选择它所属的帐户。因此它可重现:OpportunityBC.GetFieldValue(“Lock Flag”)为新创建的记录返回null,并返回先前保存的记录的正确值。对于新创建的机会,我们必须重新查询BC以查看填充的“锁定标志”。如果我们想在创建记录后立即显示连接的字段值,我找到了几个文件,包括Oracle's recomendation来使用PreDefaultValue属性。我发现的最合适的表达式是Parent:BCName.FieldName,但事实并非如此,因为活跃的BO是机会,机会BC是主要的。

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

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

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

  3. 是Siebel 8.1

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

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

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

      就是这样。我们正在搜索同一行ID的记录。如果它是新记录,那么数据库中应该没有任何东西(记住我们在PreWriteRecord处理程序中)并且函数返回FALSE。如果我们更新某行,那么我们得到TRUE。使用NOT反转结果我们使DVM引发新记录的错误。

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

1 个答案:

答案 0 :(得分:1)

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

另一个选项,尝试从RunTime事件调用BC方法:IsNewRecordPending。我没试过这个。

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

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

我可以再提出另一种解决方案,我还没试过。

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

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

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

告诉我们它是怎么回事!