【问题标题】:How to refresh data in Siebel without running a new query?如何在不运行新查询的情况下刷新 Siebel 中的数据?
【发布时间】:2017-03-10 07:15:17
【问题描述】:

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

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

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

  • RefreshBusComp。它重新加载整个 BC 并再次执行当前查询。如果它不再满足查询条件,这可能导致当前记录“消失”。

  • RefreshRecord。它只重新加载当前记录,在这种情况下更好。字段只读条件也被重新评估。但是,小程序PreCanInvoke 事件不会再次触发,这意味着我的自定义按钮不会更新其启用/禁用状态。

  • 自己执行一个新查询。

  • 使用FINS Teller UI Navigation service,方法RefreshCurrentApplet(Siebel 没有记录...显然)。我认为这可能是答案,但它的工作方式似乎与RefreshBusComp 完全一样......它再次执行当前查询。

Siebel 7.8 中还有其他选项吗?

(请不要在 Siebel 外部使用 Javascript 直接访问 HTML 控件……我不想弄得一团糟)。


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

我不能允许再次执行的是当前的 BC 级查询,它可能已被用户细化,也可能未被用户细化。为什么?这是一个例子:

  1. 用户执行以下查询来过滤数据:[Status]='Pending'。然后他选择其中一条记录,然后单击我的自定义按钮。
  2. 该按钮调用业务服务,该服务执行一些操作并将记录状态更改为“完成”。
  3. 如果我再次执行当前查询(即RefreshBusCompFINS Teller UI Navigation),它将重新加载所有状态为待处理的记录。我的记录现在有另一个状态,所以它会从小程序中消失。这是我必须避免的。

【问题讨论】:

  • 由于您所做的更改是在 BC 的另一个实例中进行的,您是否不必让第一个实例运行查询以将该数据带入小程序?我认为查询是非常需要的,没有它,引用它们的字段值、MVL 和计算字段将不会被刷新。问题是运行查询通常会将光标重置到小程序中的第一条记录。但是,FINS UI BS 在同一记录中保留了该上下文。所以光标不会再次跳转到第一条记录,所以应该比较理想。
  • 是的,Siebel 将不得不再次查询数据库,但一个简单的select ... where row_id = '1-xxx'; 就足够了(我猜RefreshRecord 就是这样做的)。我不关心数据库查询,我不能允许执行当前用户定义的查询。最大的问题不是光标位置。例如,用户可能已经根据[Status]='Pending' 过滤了数据,而我的BS 将记录状态更改为另一个值。如果再次执行整个查询,记录就会消失。

标签: siebel


【解决方案1】:

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

【讨论】:

  • 我想到了类似的东西,但真是一团糟!我想没有其他选择:(
【解决方案2】:

扩展 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();
}

【讨论】:

    【解决方案3】:

    然后更新 BC 数据(使用 BC 的新实例 - 数据更改不会在屏幕上显示)。一旦一切结束,我需要刷新小程序

    您是否尝试为其中一个字段设置 ImmediatePost = TRUE,您的 BC 正在改变?从理论上讲,它会触发刷新,但我不确定,它是否会在当前上下文或现在从不同的 BC 工作,但这只是一个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2017-07-17
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2018-03-24
      相关资源
      最近更新 更多