Siebel NextRecord方法没有移动到下一条记录

时间:2016-04-20 08:04:04

标签: siebel

我在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错误,它仍会在日志文件中显示两次活动(仅两次)。

可能导致此行为的原因是什么?

2 个答案:

答案 0 :(得分:2)

它似乎在业务组件"行动"你有一个可以为一个基本记录返回多个记录的连接,并且你使用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游标模式之间最重要且鲜为人知的区别。

答案 1 :(得分:1)

尝试更改该查询模式

bc.ExecuteQuery(ForwardOnly);

转发BackBackward。