我需要在Siebel中刷新applet,而不再执行当前查询。这有可能吗?
我的applet有一个调用业务服务的自定义按钮。此服务执行一些操作,然后更新BC数据(使用BC的新实例 - 数据更改将不会在屏幕上显示)。一旦完成,我需要刷新applet,不仅要显示新数据,还要根据新数据启用或禁用我的自定义按钮。
到目前为止,我知道在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级查询,该查询可能已经或可能没有被用户细化。为什么?这是一个例子:
[Status]='Pending'
。然后他选择其中一条记录,然后点击我的自定义按钮。RefreshBusComp
或FINS Teller UI Navigation
),它将重新加载状态为待定的所有记录。我的记录现在有另一个状态,因此它将从applet中消失。这就是我必须避免的。答案 0 :(得分:2)
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.
如果当前searchspec为“[Status] ='Pending'”,则新的searchspec应为“([Status] ='Pending')或Id ='0-1234'”。这应该将修改后的记录保留在UI中,即使它的状态发生了变化。
编辑:我怀疑GetSearchExpr方法在Siebel 7.8中不起作用,但我刚检查过,它是documented。
答案 1 :(得分:1)
扩展Ranjith的答案,这将是applet服务器脚本代码,使其工作:
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();
}
答案 2 :(得分:0)
然后更新BC数据(使用BC的新实例 - 数据更改将不会在屏幕上显示)。一旦结束,我需要刷新小程序
您是否尝试为其中一个字段设置ImmediatePost = TRUE,您的BC正在改变?从理论上讲,它会触发刷新,但我不确定,它是否可以从当前上下文或现在的不同BC中发挥作用,但这只是一个想法。