|
![]() |
#1 |
Участник
|
Замена NoYes на 0 или 1 спасла ситуацию
|
|
![]() |
#2 |
Боец
|
Правильно, ведь enum в SQL = это int
=> enum2int(NoYes::Yes). |
|
![]() |
#3 |
Участник
|
|
|
![]() |
#4 |
Участник
|
Единственное, что приходит в голову, это что, возможно, поле ERG_RPDocument.SelectedDivergence не типа NoYes, а какого-то другого
![]() |
|
![]() |
#5 |
Боец
|
Однако, парcер не переводит NoYes::Yes в 1.
Продемонстрируйте на примере, где InventTable.PurchModel точно NoYes X++: static void Job(Args _args) { InventTable inventTable; QueryRun qr; Query query = new Query(); QueryBuildDataSource qbds; QueryBuildRange qbr; str rangeValue; ; qbds = query.addDataSource(tablenum(InventTable)); qbr = qbds.addRange(fieldnum(InventTable, RecId)); rangeValue = strFmt("((ItemId==\"%1\") && (PurchModel==%2))", "B-R12", enum2int(NoYes::Yes)); qbr.value(rangeValue); qr = new QueryRun(query); while (qr.next()) { inventTable = qr.get(tablenum(InventTable)); info(strFmt("%1 - %2", inventTable.ItemId, inventTable.PurchModel)); } } |
|
![]() |
#6 |
Участник
|
В ходе формирования запроса есть два этапа: 1) - формирование запроса на «внутреннем» аксаптовском SQL, в ходе которого для тех же enum-значений подставляются мнемонические обозначения - значения меток соовт. значений enum для текущего выбранного языка (в частности, для NoYes::Yes и русского языка подставится "Да" без кавычек); 2) преобразование запроса в "родной" SQL, который уже непосредтвенно отсылается на СУБД. На втором этапе парсер запросов преобразует enum-значения в запросе из текста меток в соотв. числовые значения, и именно это я имел в виду в первоначальном сообщении. Результаты второго этапа, очевидно, можно продемонстрировать только с помощью трассировки SQL-запросов.
Если под примером подразумевалась строка X++: info(strFmt("%1 - %2", inventTable.ItemId, inventTable.PurchModel)); ![]() PS В привеленном примере я поменял код номенклатуры и включил литералы в запросе. |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от gl00mie
![]() 1) - формирование запроса на «внутреннем» аксаптовском SQL, в ходе которого для тех же enum-значений подставляются мнемонические обозначения - значения меток соовт. значений enum для текущего выбранного языка (в частности, для NoYes::Yes и русского языка подставится "Да" без кавычек); 2) преобразование запроса в "родной" SQL, который уже непосредтвенно отсылается на СУБД.
Внутри запроса хранится числовое представление енума. При визуализации (при вызове toString()) проверяется в каком виде этот енум попал в запрос (в виде числа, метки или названия значения) и в этом-же виде показывается. Эта информация хранится только для текущего экземпляра Query и, к примеру, при перепаковке запроса не сохраняется
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 14.04.2008 в 13:59. |
|
![]() |
#8 |
Участник
|
Цитата:
Теряется фильтр из-за того, что не задан label если бы "внутри" запросов все было так кошерно, то откуда бы взялась завязка на метку значения enum? Мне кажется, одной визуализацией это объяснить сложно. |
|
![]() |
#9 |
MCITP
|
![]()
Спасибо отдельное землякам за тестовый пример, который и мне и автору видимо было лень писать.
![]() Я тут с ним поигрался чуток: 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. |
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от gl00mie
![]() Единственное, что приходит в голову, это что, возможно, поле ERG_RPDocument.SelectedDivergence не типа NoYes, а какого-то другого
![]() |
|