Siebel eScript: метод CountRecords() выдает "0" в качестве результата для каждого входного значения
Я пытаюсь создать бизнес-сервис, который будет возвращать количество записей (действий) в бизнес-компоненте Action в соответствии со статусом, заданным для него.
Поле "Состояние" является полем статического списка выбора. Итак, если я предоставлю "Active" в качестве ввода, он должен вернуть некоторое число (в моем случае 210) в качестве вывода. Но для каждого входного результата ноль (0). В чем может быть проблема? Ниже мой Siebel eScript.
function ReturnStatusCount (Inputs, Outputs)
{
var status="";
var count;
try
{
status=Inputs.GetProperty("Status");
var bo = TheApplication().GetBusObject("Action");
var bc = bo.GetBusComp("Action");
var LOVText = TheApplication().InvokeMethod("LookupValue","EVENT_STATUS",status);
with (bc)
{
ClearToQuery();
SetSearchSpec("Status","\'"+LOVText+"\'");
ExecuteQuery(ForwardOnly);
count = CountRecords();
}
bc = null;
bo = null;
}
catch (e)
{
throw (e);
}
finally
{
Outputs.SetProperty("Count",count);
}
}
1 ответ
В зависимости от того, как ваш список выбора построен, вам может понадобиться использовать эту спецификацию вместо этого:
bc.SetSearchSpec("Status", "='" + status + "'");
Это также может быть проблемой видимости. Пользователь, выполняющий код, может не иметь видимости для этих 210 записей. Вы можете решить это с помощью этого:
bc.SetViewMode(AllView);
Если вы хотите быть уверены в том, что происходит, вы можете либо включить трассировку буфера SQL в своем выделенном толстом клиенте и проверить фактический запрос, который он выполняет... либо вы можете перейти к любому апплету запроса на обслуживание и запросить себя, используя синтаксис [Status] = 'Active'
, или же [Status] = 'ActiveLovText'
(замена ActiveLovText
за то, что LookupValue возвращается).
Кроме того, есть несколько вещей, которые вы можете улучшить в своем коде:
- В этом случае нет необходимости избегать ваших одинарных кавычек.
"'"
Это хорошо. - Если вы поймали исключение и просто выбросили его снова, вы ничего не делаете. Вы можете просто удалить эти строки.
- Вы храните
count
значение в вашем PropertySet вfinally
блок, который вы могли бы достичь даже до инициализации переменной. Либо объявите его с начальным значением, либо поместите свой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", "EVENT_STATUS", status);
bo = TheApplication().GetBusObject("Action");
bc = bo.GetBusComp("Action");
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;
}
}