如何在没有 运行 新查询的情况下刷新 Siebel 中的数据?

How to refresh data in Siebel without running a new query?

我需要在 Siebel 中刷新一个小程序,而不是再次执行当前查询。这可能吗?

我的小程序有一个调用业务服务的自定义按钮。此服务执行一些操作,然后更新 BC 数据(使用 BC 的新实例 - 数据更改不会在屏幕上显示)。一切结束后,我需要刷新小程序,不仅要显示新数据,还要根据新数据启用或禁用我的自定义按钮。

到目前为止,我知道在 Siebel 中刷新数据的 4 种方法,但其中 none 完全符合我的需要:

Siebel 7.8 中还有其他选项吗?

(如果不直接访问 HTML 控件与 Javascript 在 Siebel 外部,拜托...我不想弄得一团糟)。


澄清一下:我不关心Siebel是否需要再次查询数据库。我想它必须这样做。但是一个简单的select ... where row_id = '1-23456';应该就够了,我不需要重新加载BC中的所有数据,只需要当前记录。

我不允许再次执行的是当前的BC级查询,用户可能已经或可能没有对其进行细化。为什么?这是一个例子:

  1. 用户执行以下查询来过滤数据:[Status]='Pending'。然后他选择其中一条记录,然后单击我的自定义按钮。
  2. 该按钮调用业务服务,执行一些操作并将记录状态更改为'Done'。
  3. 如果我再次执行当前查询(即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 上工作,但这只是一个想法。