【问题标题】:Siebel NextRecord method is not moving to the next recordSiebel NextRecord 方法未移动到下一条记录
【发布时间】:2016-08-12 18:13:37
【问题描述】:

我在我们的 Siebel 7.8 应用程序中发现了一个非常奇怪的行为。这是业务服务的一部分:

var bo:BusObject;
var bc:BusComp;

try {
    bo = TheApplication().GetBusObject("Service Request");
    bc = bo.GetBusComp("Action");
    bc.InvokeMethod("SetAdminMode", "TRUE");
    bc.SetViewMode(AllView);
    bc.ClearToQuery();
    bc.SetSearchSpec("Status", "='Unscheduled' OR ='Scheduled' OR ='02'");
    bc.ExecuteQuery(ForwardOnly);
    var isRecord = bc.FirstRecord();
    while (isRecord) {
        log("Processing activity '" + bc.GetFieldValue("Id") + "'");
        bc.SetFieldValue("Status", "03");
        bc.WriteRecord();
        isRecord = bc.NextRecord();
    }
} catch (e) {
    log("Exception: " + e.message);
} finally {
    bc = null;
    bo = null;
}

在日志文件中,我们得到如下内容:

Processing activity '1-23456'
Processing activity '1-56789'
Processing activity '1-ABCDE'
Processing activity '1-ABCDE'

Exception: The selected record has been modified by another user since it was retrieved.
Please continue. (SBL-DAT-00523)

因此,基本上,它会处理来自 BC 的一些记录,然后,显然是随机的,它“卡住”了。这就像 NextRecord 调用没有执行,而是再次处理相同的记录。

如果我删除 SetFieldValue 和 WriteRecord 以避免 SBL-DAT-00523 错误,它仍然会在日志文件中显示某些活动两次(仅两次)。

什么可能导致这种行为?

【问题讨论】:

    标签: siebel


    【解决方案1】:

    看起来在业务组件“Action”中,您有可以为一个基本记录返回多条记录的联接,并且您使用 ForwardOnly 模式来查询 BC。

    假设,例如,在表 S_EVT_ACT 中有一条记录,其中自定义列 X_PHONE_NUMBER = '12345678',而表 S_CONTACT 中有两条记录,其中列“MAIN_PH_NUM”等于相同的值“12345678”。因此,当您像这样使用 SQL 连接这两个表时:

    SELECT T1.* FROM SIEBEL.S_EVT_ACT T1, SIEBELS_CONTACT T2
    WHERE T1.X_PHONE_NUMBER = T2.MAIN_PH_NUM
    

    因此,您将获得两条具有相同 T1.ROW_ID 的记录。

    在 eScript 中使用 ForwardOnly 游标模式时会发生完全相同的情况,在这种情况下,Siebel 只会获取数据库返回的所有内容。这就是为什么在 ForwardOnly 模式下查询业务组件时迭代业务组件是一个大错误的原因。您应该改用 ForwardBackward 模式,因为在这种情况下,Siebel 将排除重复记录(对于普通 UI 查询也是如此,因为它也在 ForwardBackward 模式下执行)。

    实际上这是 ForwardOnly 和 ForwardBackward 光标模式之间最重要且鲜为人知的区别。

    【讨论】:

    • 嗯,这……难以置信,即使对 Siebel 来说也是如此。 谢谢!!一百万年我都想不通。
    【解决方案2】:

    尝试更改该查询模式

    bc.ExecuteQuery(ForwardOnly);

    向前向后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多