Siebel NextRecord 方法不移动到下一条记录
Siebel NextRecord method is not moving to the next record
我在我们的 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 的一些记录,然后,显然是随机的,它 "gets stuck"。这就像 NextRecord
调用没有被执行,而是再次处理相同的记录。
如果我删除 SetFieldValue 和 WriteRecord 以避免 SBL-DAT-00523 错误,它仍会在日志文件中两次(仅两次)显示某些活动。
是什么导致了这种行为?
尝试更改该查询模式
bc.ExecuteQuery(ForwardOnly);
前进后退。
看起来在业务组件 "Action" 中,您有可以 return 一条基本记录的多个记录的联接,并且您使用 ForwardOnly 模式查询 BC。
假设,例如,在 table S_EVT_ACT 中您有一条记录带有自定义列 X_PHONE_NUMBER = '12345678' 并且您在 table 中有两条记录 S_CONTACT,列 'MAIN_PH_NUM' 等于相同的值“12345678”。因此,当您像这样使用 SQL 加入这两个 table 时:
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 只会获取数据库 returned 的所有内容。这就是为什么在 ForwardOnly 模式下查询业务组件时迭代它是一个大错误的原因。您应该改用 ForwardBackward 模式,因为在这种情况下,Siebel 将排除重复记录(对于正常的 UI 查询也是如此,因为它也在 ForwardBackward 模式下执行)。
实际上,这是 ForwardOnly 和 ForwardBackward 游标模式之间最重要但鲜为人知的区别。
我在我们的 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 的一些记录,然后,显然是随机的,它 "gets stuck"。这就像 NextRecord
调用没有被执行,而是再次处理相同的记录。
如果我删除 SetFieldValue 和 WriteRecord 以避免 SBL-DAT-00523 错误,它仍会在日志文件中两次(仅两次)显示某些活动。
是什么导致了这种行为?
尝试更改该查询模式
bc.ExecuteQuery(ForwardOnly);
前进后退。
看起来在业务组件 "Action" 中,您有可以 return 一条基本记录的多个记录的联接,并且您使用 ForwardOnly 模式查询 BC。
假设,例如,在 table S_EVT_ACT 中您有一条记录带有自定义列 X_PHONE_NUMBER = '12345678' 并且您在 table 中有两条记录 S_CONTACT,列 'MAIN_PH_NUM' 等于相同的值“12345678”。因此,当您像这样使用 SQL 加入这两个 table 时:
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 只会获取数据库 returned 的所有内容。这就是为什么在 ForwardOnly 模式下查询业务组件时迭代它是一个大错误的原因。您应该改用 ForwardBackward 模式,因为在这种情况下,Siebel 将排除重复记录(对于正常的 UI 查询也是如此,因为它也在 ForwardBackward 模式下执行)。
实际上,这是 ForwardOnly 和 ForwardBackward 游标模式之间最重要但鲜为人知的区别。