Показать сообщение отдельно
Старый 02.11.2007, 19:38   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Извратится-то можно, только по сравнению с прямым перебром Range любые способы не дают 100% гарантии верного ответа.

Ну, например, можно прочитать строку сформированного запроса и подсчитать количество неких последовательностей символов, которые будут соответствовать пустым условиям.

X++:
static void Job_QueryRangeEmpty(Args _args)
{
    Query       query;

    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;

    int         nextI,
                qtyEmpty;
    str         strQuery,
                strQueryExtract;
    ;

#localmacro.emptyValue1
    "= )"
#endmacro
#localmacro.emptyValue2
    "=)"
#endmacro

    // Тестовый Query для проверки
    query = new Query();
    qbds = query.addDataSource(tablenum(InventTable));

    // Одиночные условия
    for (nextI = 1; nextI <= 1 ; nextI++)
    {
        qbr = qbds.addRange(fieldNum(InventTable, ItemId));
        qbr.value(queryValue(''));
    }

    // Диапазон значений
    qbr.value(queryRange('',''));


    // Подсчет количества пустых условий
    strQuery = query.dataSourceNo(1).tostring();
    info(strQuery);
    strQueryExtract = global::strReplace(strQuery,#emptyValue1,"");
    qtyEmpty = (strLen(strQuery)-strLen(strQueryExtract)) / strLen(#emptyValue1);
    strQueryExtract = global::strReplace(strQuery,#emptyValue2,"");
    qtyEmpty += (strLen(strQuery)-strLen(strQueryExtract)) / strLen(#emptyValue2);

    info(strFmt("пустых условий %1", qtyEmpty));
}
Хотя заведомо понятно, что подобный код будет работать только при определенных значениях Range.

По моему, проще написать универсальный код перебора всех Range во всех DataSource.