如何在没有 运行 新查询的情况下刷新 Siebel 中的数据?
How to refresh data in Siebel without running a new query?
我需要在 Siebel 中刷新一个小程序,而不是再次执行当前查询。这可能吗?
我的小程序有一个调用业务服务的自定义按钮。此服务执行一些操作,然后更新 BC 数据(使用 BC 的新实例 - 数据更改不会在屏幕上显示)。一切结束后,我需要刷新小程序,不仅要显示新数据,还要根据新数据启用或禁用我的自定义按钮。
到目前为止,我知道在 Siebel 中刷新数据的 4 种方法,但其中 none 完全符合我的需要:
RefreshBusComp。它重新加载整个 BC 并再次执行当前查询。如果不再满足查询条件,就会导致当前记录"disappearing"
RefreshRecord。它只重新加载当前记录,这在这种情况下更好。字段只读条件也被重新评估。但是,小程序 PreCanInvoke
事件没有再次触发,这意味着我的自定义按钮不会更新它们的 enabled/disabled 状态。
自己执行一个新查询。
使用 FINS Teller UI Navigation
service, method RefreshCurrentApplet
(Siebel 未记录...显然)。我认为这可能是答案,但它似乎完全像 RefreshBusComp
一样工作......它再次执行当前查询。
Siebel 7.8 中还有其他选项吗?
(如果不直接访问 HTML 控件与 Javascript 在 Siebel 外部,拜托...我不想弄得一团糟)。
澄清一下:我不关心Siebel是否需要再次查询数据库。我想它必须这样做。但是一个简单的select ... where row_id = '1-23456';
应该就够了,我不需要重新加载BC中的所有数据,只需要当前记录。
我不允许再次执行的是当前的BC级查询,用户可能已经或可能没有对其进行细化。为什么?这是一个例子:
- 用户执行以下查询来过滤数据:
[Status]='Pending'
。然后他选择其中一条记录,然后单击我的自定义按钮。
- 该按钮调用业务服务,执行一些操作并将记录状态更改为'Done'。
- 如果我再次执行当前查询(即
RefreshBusComp
,或FINS Teller UI Navigation
),它将重新加载所有状态为Pending 的记录。我的记录现在有另一个状态,所以它会从小程序中消失。那是我必须避免的。
Siebel 将在刷新期间再次 运行 最后 运行 查询,它没有将所选记录保留在 UI 中的选项。你在这里有一个独特的需求,你想通过用户定义的查询来显示当前选择的记录。您将使用一些脚本。
Get the row id of the current record.
Get the current searchspec. Function GetSearchExpr.
Concatenate a ' OR Id = "current rowid"' to the current search spec.
Run the new query.
如果当前搜索规范是“[Status] = 'Pending'”,新的搜索规范应该是“([Status] = 'Pending') OR Id='0-1234'”。这应该将修改后的记录保留在 UI 中,即使它的状态发生变化。
编辑:我怀疑 GetSearchExpr 方法在 Siebel 7.8 中不起作用,但我刚刚检查了一下,它是 documented。
扩展 Ranjith 的回答,这将是使其工作的小程序服务器脚本代码:
var bc = this.BusComp();
var currentId = bc.GetFieldValue("Id");
// Redefine the current query to ensure it doesn't exclude the current record
var expr = "(" + bc.GetSearchExpr() + ") OR [Id]='" + currentId + "'";
// Execute the expanded query
bc.ClearToQuery();
bc.SetSearchExpr(expr);
bc.ExecuteQuery(ForwardBackward);
// Position the cursor in the record we were
var isRecord = bc.FirstRecord();
while (isRecord && (bc.GetFieldValue("Id") != currentId)) {
isRecord = bc.NextRecord();
}
and then updates the BC data (using a new instance of the BC - the data changes won't be visible on screen). Once it all ends, I need to refresh the applet
您是否尝试过为其中一个字段设置 ImmediatePost = TRUE,您的 BC 正在更改?理论上,它会触发刷新,但我不确定,它会在当前上下文或现在的不同 BC 上工作,但这只是一个想法。
我需要在 Siebel 中刷新一个小程序,而不是再次执行当前查询。这可能吗?
我的小程序有一个调用业务服务的自定义按钮。此服务执行一些操作,然后更新 BC 数据(使用 BC 的新实例 - 数据更改不会在屏幕上显示)。一切结束后,我需要刷新小程序,不仅要显示新数据,还要根据新数据启用或禁用我的自定义按钮。
到目前为止,我知道在 Siebel 中刷新数据的 4 种方法,但其中 none 完全符合我的需要:
RefreshBusComp。它重新加载整个 BC 并再次执行当前查询。如果不再满足查询条件,就会导致当前记录"disappearing"
RefreshRecord。它只重新加载当前记录,这在这种情况下更好。字段只读条件也被重新评估。但是,小程序
PreCanInvoke
事件没有再次触发,这意味着我的自定义按钮不会更新它们的 enabled/disabled 状态。自己执行一个新查询。
使用
FINS Teller UI Navigation
service, methodRefreshCurrentApplet
(Siebel 未记录...显然)。我认为这可能是答案,但它似乎完全像RefreshBusComp
一样工作......它再次执行当前查询。
Siebel 7.8 中还有其他选项吗?
(如果不直接访问 HTML 控件与 Javascript 在 Siebel 外部,拜托...我不想弄得一团糟)。
澄清一下:我不关心Siebel是否需要再次查询数据库。我想它必须这样做。但是一个简单的select ... where row_id = '1-23456';
应该就够了,我不需要重新加载BC中的所有数据,只需要当前记录。
我不允许再次执行的是当前的BC级查询,用户可能已经或可能没有对其进行细化。为什么?这是一个例子:
- 用户执行以下查询来过滤数据:
[Status]='Pending'
。然后他选择其中一条记录,然后单击我的自定义按钮。 - 该按钮调用业务服务,执行一些操作并将记录状态更改为'Done'。
- 如果我再次执行当前查询(即
RefreshBusComp
,或FINS Teller UI Navigation
),它将重新加载所有状态为Pending 的记录。我的记录现在有另一个状态,所以它会从小程序中消失。那是我必须避免的。
Siebel 将在刷新期间再次 运行 最后 运行 查询,它没有将所选记录保留在 UI 中的选项。你在这里有一个独特的需求,你想通过用户定义的查询来显示当前选择的记录。您将使用一些脚本。
Get the row id of the current record.
Get the current searchspec. Function GetSearchExpr.
Concatenate a ' OR Id = "current rowid"' to the current search spec.
Run the new query.
如果当前搜索规范是“[Status] = 'Pending'”,新的搜索规范应该是“([Status] = 'Pending') OR Id='0-1234'”。这应该将修改后的记录保留在 UI 中,即使它的状态发生变化。
编辑:我怀疑 GetSearchExpr 方法在 Siebel 7.8 中不起作用,但我刚刚检查了一下,它是 documented。
扩展 Ranjith 的回答,这将是使其工作的小程序服务器脚本代码:
var bc = this.BusComp();
var currentId = bc.GetFieldValue("Id");
// Redefine the current query to ensure it doesn't exclude the current record
var expr = "(" + bc.GetSearchExpr() + ") OR [Id]='" + currentId + "'";
// Execute the expanded query
bc.ClearToQuery();
bc.SetSearchExpr(expr);
bc.ExecuteQuery(ForwardBackward);
// Position the cursor in the record we were
var isRecord = bc.FirstRecord();
while (isRecord && (bc.GetFieldValue("Id") != currentId)) {
isRecord = bc.NextRecord();
}
and then updates the BC data (using a new instance of the BC - the data changes won't be visible on screen). Once it all ends, I need to refresh the applet
您是否尝试过为其中一个字段设置 ImmediatePost = TRUE,您的 BC 正在更改?理论上,它会触发刷新,但我不确定,它会在当前上下文或现在的不同 BC 上工作,但这只是一个想法。