Иногда при помощи запроса нужно получить все строчки с пустой строкой. Например для того, чтобы показать в отчете все проводки с незаполненной аналитикой Отдел. Можно ли программным способом задать такой критерий? Очевидное, казалось бы, решение - указать в качестве критерия пустую строку - не работает. Почему?

Для работы с критериями Аксапта предлагает класс SysQuery. В частности, стоит обратить внимание на методы:

Метод value гарантировано возвратит правильный критерий для любого значения любого типа. Вы можете передать в метод строку (в т.ч. пустую), перечисление, число, дату и т.д. Посмотрите в этот метод, там все достаточно очевидно.

В рамках данного совета, надо отметить, что пустая строка в качестве аргумента для метода value('') обрабатывается специальным образом - возвращается значение метода valueEmptyString(). Внутри valueEmptyString все просто:


public static str valueEmptyString()
{
    return '\"\"';
}

Таким образом, для выбора пустых значений надо в качестве критерия указать SysQuery::valueEmptyString()

static void mazLedgerTransWithEmptyDepartment(Args _args)
{
    LedgerTrans lt;
    QueryBuildDataSource qbds;
    QueryBuildRange qbr;
    QueryRun qr;
    Query q;
; 
    q = new Query(querystr(LedgerTransAll));
    qbds = q.dataSourceTable(tablenum(LedgerTrans)); 
    qbr = qbds.addRange(fieldid2ext(fieldnum(LedgerTrans,dimension),
                        SysDimension::Department)); 
    qbr.value(SysQuery::valueEmptyString()); // Критерий по пустой строке!
    qr = new QueryRun(q);
    while(qr.next())
    {
        lt = qr.get(tablenum(LedgerTrans)); 
        // Вместо печати надо сделать что-либо полезное
        print strfmt('%1 %2 %3',lt.TransDate,lt.AccountNum,lt.AmountMST); 
    }
    pause; // пауза только для того, чтобы увидеть напечатанные результаты
}

Попробуем разобраться что же происходит. На самом деле в запросах имеются специальные символы. Чтобы эти символы не обрабатывались запросом, а вставлялись в критерий "как есть", необходимо перед таким специальным символом поставить обратную косую черту (\). В методе value() в качестве специальных символов указаны:

Что же происходит, когда указывается пустая строчка в качестве критерия? Если посмотреть в метод valueunnlimited(), то становится понятно, что пустая строка в критерии трактуется как отсутствие всяческих ограничений, имеено поэтому критерий не срабатывал.

Примечание: посмотрите на остальные методы класса. Обратите внимание на крайне полезный метод SysQuery::countTotal(). Этот метод можно использовать для работы с progress bar. Не думаю, что ради этого метода стоит писать отдельный совет.

 

Буду рад Вашим замечаниям и предложениям.
E-Mail: mazzy@mazzy.ru, Мазуркин Сергей