Показать сообщение отдельно
Старый 14.04.2008, 13:00   #15  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Спасибо отдельное землякам за тестовый пример, который и мне и автору видимо было лень писать.

Я тут с ним поигрался чуток:
X++:
static void Job(Args _args)
{
    InventTable             inventTable;
    QueryRun                qr;
    Query                   query = new Query();
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr,qbr1,qbr2;
    str                     rangeValue;
    ;

    qbds = query.addDataSource(tablenum(InventTable));

    qbr  = qbds.addRange(fieldnum(InventTable, RecId));

    qbr1  = qbds.addRange(fieldnum(InventTable, ItemId));
    qbr2  = qbds.addRange(fieldnum(InventTable, PurchModel));


    rangeValue = strFmt('%1.ItemId=="%2" && %1.PurchModel==%3', qbds.name(), "01810_К093",  NoYes::No);
    qbr.value(rangeValue);
    info(qbds.toString());
    rangeValue = strFmt('%1.ItemId=="%2" && (%1.PurchModel==%3)', qbds.name(), "01810_К093",  NoYes::No);
    qbr.value(rangeValue);
    info(qbds.toString());
    rangeValue = strFmt('(%1.ItemId=="%2") && (%1.PurchModel==%3)', qbds.name(), "01810_К093",  NoYes::No);
    qbr.value(rangeValue);
    info(qbds.toString());
    rangeValue = strFmt('(%1.ItemId=="%2" && %1.PurchModel==%3)', qbds.name(), "01810_К093",  NoYes::No);
    qbr.value(rangeValue);
    info(qbds.toString());
    rangeValue = strFmt('((%1.ItemId=="%2") && (%1.PurchModel==%3))', qbds.name(), "01810_К093",  NoYes::No);
    qbr.value(rangeValue);
    info(qbds.toString());

    qbr.value("");
    qbr1.value(queryValue("01810_К093"));
    qbr2.value(queryValue(NoYes::No));
    info(qbds.toString());

    qr = new QueryRun(query);

    return;

    while (qr.next())
    {
        inventTable = qr.get(tablenum(InventTable));

        info(strFmt("%1 - %2", inventTable.ItemId, inventTable.PurchModel));
    }
}
Рекомендую и вам попробовать позапускать разные варианты.

Выводы, которые можно сразу заметить:
- В случае создания такого "сложного" рэнджа нужно всегда начинать его с открывающейся скобки, иначе получите
X++:
SELECT * FROM InventTable WHERE (((RecId = 0)))
, чем видимо и объяснялось то, что у автора "Так работало". На самом деле оно работало совсем не так.
- парсер действительно не парсит в таких рэнджах значения енумов, а только в обычных, "человеческих" рэнджах... А в этой ситуации всё-таки нужно указывать реальное цифровое значение енума.
- ситуация с тем, что внутренее название датасорсов для такого случая отличается, действительно имеет место в таких случаях:
X++:
SELECT * FROM InventTable WHERE (((InventTable_1.ItemId=="01810_К093")....
, что, правда, не мешает этому запросу нормально обрабатываться. (если остальное всё ОК)

PS запускал на 3.0 сп3 кр3
PS1 и, кстати, на этой версии нету функции "enum2int"

update: PS2 под "позапускать", я подразумеваю позапускать различные варианты указанных рэнджей в джобе на исполнение запроса (без return)... при этом включить трейс и отслеживать получающийся SQL...
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 14.04.2008 в 13:07.