我正在尝试创建一个业务服务,该服务将根据作为输入给它的状态返回记录计数。
"状态"字段是一个静态选择列表字段。下面是我的Siebel脚本。
function getRecordsCount (Inputs, Outputs)
{
var count=0;
try
{
var bo = TheApplication().GetBusObject(Inputs.GetProperty("boname"));
var bc = bo.GetBusComp(Inputs.GetProperty("bcname"));
var LOVText = TheApplication().InvokeMethod("LookupValue",Inputs.GetProperty("lovType"),Inputs.GetProperty("Status"));
with (bc)
{
ClearToQuery();
SetSearchSpec("Status","'"+LOVText+"'");
ExecuteQuery(ForwardOnly);
count = CountRecords();
}
bc = null;
bo = null;
}
catch (e)
{
throw (e);
}
finally
{
Outputs.SetProperty("Count",count);
}
}
根据您的picklist是如何构建的,您可能需要使用以下规范:
bc.SetSearchSpec("Status", "='" + status + "'");
这也可能是可见性问题。运行代码的用户可能无法看到这210条记录。你可以这样解决:
bc.SetViewMode(AllView);
如果你想确定发生了什么,你可以在你的专用厚客户端中启用SQL假脱机跟踪,并检查它正在执行的实际查询…或者,你可以去任何服务请求applet和查询自己使用语法[Status] = 'Active'
,或[Status] = 'ActiveLovText'
(替换ActiveLovText
为LookupValue返回的任何)。
同样,在你的代码中有一些你可以改进的地方:
- 在这种情况下,不需要转义单引号。
- 如果你捕捉到一个异常,只是再次抛出它,你什么也没做。你也可以直接删除这些行。
- 您将
count
值存储在您的PropertySet中的finally
块中,您甚至可以在变量初始化之前到达CC_6块。要么用初始值声明它,要么将SetProperty
行放在其他地方。另一方面,您应该使用finally
块来清除使用过的对象,例如bc
和bo
。您在try
块中这样做,这意味着如果有异常则不会这样做。在这种情况下,这并不重要,但这总是好的做法。
考虑到所有这些,代码应该是这样的:
function ReturnStatusCount (Inputs, Outputs)
{
var bo:BusObject; // Remove the ":BusObject" and ":BusComp" parts if
var bc:BusComp; // they give you any trouble
try {
var status = Inputs.GetProperty("Status");
var lovText = TheApplication().InvokeMethod("LookupValue", Inputs.GetProperty("lovType"), status);
bo = TheApplication().GetBusObject(Inputs.GetProperty("boname"));
bc = bo.GetBusComp(Inputs.GetProperty("bcname"));
bc.ClearToQuery();
bc.SetViewMode(AllView);
bc.SetSearchSpec("Status", "='" + status + "'"); // status, or lovText maybe
bc.ExecuteQuery(ForwardOnly);
Outputs.SetProperty("Count", bc.CountRecords());
} finally {
bc = null;
bo = null;
}
}