|  | 
|  14.04.2008, 10:20 | #1 | 
| Участник | Не получается сформировать рендж с помощью strFmt Код: range = qbdsJoin.addRange(fieldnum(RPDocument, RecId));
range.value(strFmt('%1.Field1==%2&&(%1.Field2=="")', qbdsJoin.name(), NoYes::Yes));К примеру такой фокус уже не прокатывает Код: ((%1.SelectedDivergence==%2)&&(%1.SelectedSuperVisor==""))   | 
|  | 
|  14.04.2008, 10:45 | #2 | 
| MCITP |   
			
			Привет. Лучше всего если Вы: 1. Приведёте конкретный пример (который можно скопировать и проверить) 2. Конкретно приведёте текст ошибки "Аксапты". (А скорее СУБД, насколько я понимаю) 3. Проверите SQL, который идёт к базе, и если по нему проблема не понятна, то тоже можно его привести сюда. 4. Приведёте Версию Аксапты и СУБД. ЗЫ Это не конкретно по этому вопросу, а по любому подобному вопросу, если хотите получить ответ, то данные действия максимизируют вероятность его получения. Имхо. 
				__________________ Zhirenkov Vitaly | 
|  | 
|  14.04.2008, 10:54 | #3 | 
| Участник | 
			
			Таблица RPDocument поля: Field1 (NoYesId) Field2 (EmplId) при: Код: range.value(strFmt('%1.Field1==%2&&(%1.Field2=="")', qbdsJoin.name(), NoYes::Yes));Код: '((%1.SelectedDivergence==%2)&&(%1.SelectedSupeVisor==""))' SELECT * FROM ERG_RPDocument WHERE SalesPickingListJournalTable.PickingListId = ERG_RPDocument.PickingListId AND ((((ERG_RPDocument_1.SelectedDivergence==Да)&&(ERG_RPDocument_1.SelectedSupeVisor=="")))) Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 0 Ах3 MSSQL2008 вроде Последний раз редактировалось Dronas; 14.04.2008 в 10:57. | 
|  | 
|  14.04.2008, 11:18 | #4 | 
| MCITP |   
			
			Понимаете ли, обычно это занимает много времени, сочинять самому похожие примеры (которые всё равно будут не такие), тем более на какой-то загадочной таблице "RPDocument", которой у меня например нет.. Поэтому я и говорю, чтоб вы привели весь код, который не работает. Лучше всего если это будет тестовый пример на общеизвестных таблицах. Пока будете его делать, сорее всего и с проблемой разберётесь.  Ваш пример очень неполный, является частью какой-то другой квери. Бросается в глаза то, что "ERG_RPDocument_1" <> "ERG_RPDocument", а также отсутствие какого-бы то ни было "0"-ля в запросе, рядом с которым "Ожидается правая круглая скобка"... Именно поэтому и важен целостный пример в таких случаях. PS А вообще, зачем вам в дамнном случае эти дополнительные скобки, если не секрет? Этот случай наиболее правильно сделать 2-мя отдельными нормальными рэнждами, без всяких таких "извратов"... 
				__________________ Zhirenkov Vitaly | 
|  | 
|  14.04.2008, 11:21 | #5 | 
| Участник | Цитата: Цитата: 
		
			Сообщение от Dronas
			   при добавлении скобок X++: '((%1.SelectedDivergence==%2)&&(%1.SelectedSupeVisor==""))'SELECT * FROM ERG_RPDocument WHERE SalesPickingListJournalTable.PickingListId = ERG_RPDocument.PickingListId AND ((((ERG_RPDocument_1.SelectedDivergence==Да)&&(ERG_RPDocument_1.SelectedSupeVisor=="")))) Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 0 - кто там? - да ведь это же я! - кто "я"? "я" бывают разные!(с) м/ф про Винни-Пуха Так вот, AX3 тоже бывают разные  какая именно у вас версия ядра? | 
|  | 
|  14.04.2008, 11:36 | #6 | 
| MCITP |   Цитата: 
		
			... и ушло на SQL в исходном виде...
		
	  Ну мне так кажется... 
				__________________ Zhirenkov Vitaly | 
|  | 
|  14.04.2008, 11:47 | #7 | 
| Боец | 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)); } } | 
|  | 
|  14.04.2008, 12:01 | #8 | 
| Участник | 
			
			Замена NoYes на 0 или 1 спасла ситуацию
		 | 
|  | 
|  14.04.2008, 12:05 | #9 | 
| Боец | 
			
			Правильно, ведь enum в SQL = это int => enum2int(NoYes::Yes). | 
|  | 
|  14.04.2008, 12:09 | #10 | 
| Участник | |
|  | 
|  14.04.2008, 12:13 | #11 | 
| Участник | 
			
			Единственное, что приходит в голову, это что, возможно, поле ERG_RPDocument.SelectedDivergence не типа NoYes, а какого-то другого   Был как-то раз аналогичный косяк с преобразованием значений enum'ов в запросах. | 
|  | 
|  14.04.2008, 12:19 | #12 | 
| Боец | 
			
			Однако, пар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)); } } | 
|  | 
|  14.04.2008, 12:50 | #13 | 
| Участник | 
			
			В ходе формирования запроса есть два этапа: 1) - формирование запроса на «внутреннем» аксаптовском SQL, в ходе которого для тех же enum-значений подставляются мнемонические обозначения - значения меток соовт. значений enum для текущего выбранного языка (в частности, для NoYes::Yes и русского языка подставится "Да" без кавычек); 2) преобразование запроса в "родной" SQL, который уже непосредтвенно отсылается на СУБД. На втором этапе парсер запросов преобразует enum-значения в запросе из текста меток в соотв. числовые значения, и именно это я имел в виду в первоначальном сообщении. Результаты второго этапа, очевидно, можно продемонстрировать только с помощью трассировки SQL-запросов. Если под примером подразумевалась строка X++: info(strFmt("%1 - %2", inventTable.ItemId, inventTable.PurchModel)); PS В привеленном примере я поменял код номенклатуры и включил литералы в запросе. | 
|  | 
|  14.04.2008, 13:53 | #14 | 
| Участник | Цитата: 
		
			Сообщение от gl00mie
			   1) - формирование запроса на «внутреннем» аксаптовском SQL, в ходе которого для тех же enum-значений подставляются мнемонические обозначения - значения меток соовт. значений enum для текущего выбранного языка (в частности, для NoYes::Yes и русского языка подставится "Да" без кавычек); 2) преобразование запроса в "родной" SQL, который уже непосредтвенно отсылается на СУБД. Внутри запроса хранится числовое представление енума. При визуализации (при вызове toString()) проверяется в каком виде этот енум попал в запрос (в виде числа, метки или названия значения) и в этом-же виде показывается. Эта информация хранится только для текущего экземпляра Query и, к примеру, при перепаковке запроса не сохраняется 
				__________________ Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 14.04.2008 в 13:59. | 
|  | 
|  14.04.2008, 13:00 | #15 | 
| 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. | 
|  | 
|  14.04.2008, 13:16 | #16 | 
| Участник | Цитата: 
		
			Сообщение от gl00mie
			   Единственное, что приходит в голову, это что, возможно, поле ERG_RPDocument.SelectedDivergence не типа NoYes, а какого-то другого   Был как-то раз аналогичный косяк с преобразованием значений enum'ов в запросах. | 
|  | 
|  14.04.2008, 12:08 | #17 | 
| Участник | 
			
			Замена NoYes на 0 или 1 спасла ситуацию    | 
|  | 
|  14.04.2008, 13:08 | #18 | 
| Боец | 
			
			Имелась ввиду не эта строчка. Строка с info(...) это только индикотор срабатывания запроса. Я имел ввиду строку: 1. Orig: rangeValue = strFmt("((ItemId==\"%1\") && (PurchModel==%2))", "B-R12", enum2int(NoYes::Yes)); 2. После Цитата: 
		
			Да ничего не правильно - парсер запросов в ядре должен сам переводить мнемонические обозначения значений енумов в числовые значения перед отправкой на SQL 
		
	 rangeValue = strFmt("((ItemId==\"%1\") && (PurchModel==\"%2\"))", "B-R12", NoYes::Yes); (убрали enum2int(..), поменяли формат) Согласен, что сис-ма по-хорошему должна проглотить, однако такой range не срабатывает (т.е. запрос ничего не возвращает), в чем и была причина неработоспособности запроса у Dronas. | 
|  | |
| За это сообщение автора поблагодарили: gl00mie (2). | |