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;
    }
}
Другие вопросы по тегам