Спасибо отдельное землякам за тестовый пример, который и мне и автору видимо было лень писать.
Я тут с ним поигрался чуток:
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...