| 
			
			 | 
		#21 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы не поняли.  
		
		
		
		
		
		
			В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве). Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#22 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от oblin
			
			 
Вместо 
		
	queryExression = strfmt("((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ''))))", ds1, ds2 ); Попробуйте queryExression = strfmt('((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ""))))', ds1, ds2 ); Часто помогает.  | 
| 
	
 | 
| 
			
			 | 
		#23 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#24 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 Цитата: 
	
		
			Сообщение от AndyD
			
			 
Вы не поняли.  
		
	В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве). Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId X++: fieldName = strFmt( "dimension[%1]", _dimensionNumber ); fieldId = fieldName2Id( tableNum(LedgerBalancesDimTrans), fieldId );  | 
| 
	
 | 
| 
			
			 | 
		#25 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А почему NOT, OR и AND, а не !, || и &&?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#26 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			или это именно в value нельзя добавлять выражения с такими полями?
		
	 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#27 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Peter Savintsev
			
			 
А почему NOT, OR и AND, а не !, || и &&? 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#28 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от AndyD
			
			 
Да. 
		
	     ![]()  
		 | 
| 
	
 | 
| 
			
			 | 
		#29 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от rkrivov
			
			 
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?) 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#30 | 
| 
			
			 Дмитрий Ерин 
		
			
	 | 
	
	
	
		
		
		
		 
			
			2 rkrivov: 
		
		
		
		
		
		
			Развернувшаяся здесь дискуссия по поводу использования массивов полей в Range сама по себе интересна и познавательна... Но позволю себе еще раз обратить Ваше внимание на изначальную постановку задачи. Возможно, что Вы либо ошиблись при построении запроса, либо зря тратите время, ковыряясь в расширенных диапазонах, поскольку в таком виде задача решается стандартным путем. Процитирую свое сообщение: Цитата: 
	
		
			Сообщение от Ruff
			
			 
...сдается мне, что в Ваш запрос закралась какая-то бяка... Попытка оптимизировать (по правилу поглощения, кажется) условие: 
		
	"(%2 != %1) && ((%2 == %1) || (!%1))" привела к следующему: "(%2 != %1) && (!%1)" Что по сути означает "первый параметр всегда пустой, а второй - всегда непустой". Может быть это именно то, что Вам и нужно, но зачем тогда такие сложные сравнения?  , последнюю строку можно преобразовать далее:"(%2) && (!%1)" или "(%2 != "") && (%1 == "")" Таким образом, остается просто добавить к запросу два простых Range с условиями (!"") и ("") соответственно (насколько я понимаю, это будут Dimension[i], причем из разных DataSource-ов). В любом случае добавить их "по одиночке" (в разные Range) не составит труда, и эти условия объединятся по И. Хотя, на самом деле мне кажется, что Вы что-то упустили при построении запроса, вряд ли все так просто  
		
				__________________ 
		
		
		
		
	 
			 | 
| 
	
 | 
| 
			
			 | 
		#31 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			2 Ruff 
		
		
		
		
		
		
			Не получится сделать это (%1 == "") Хотя по поводу запроса я согласен 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#32 | 
| 
			
			 Дмитрий Ерин 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от AndyD
			
			 
Не получится сделать это (%1 == "") 
		
	Код: qbr.value(SysQuery::valueEmptyString());  | 
| 
	
 | 
| 
			
			 | 
		#33 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А что это за qbr? На какое поле и на какой датасоурс?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#34 | 
| 
			
			 Дмитрий Ерин 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Честно говоря не вникал. Цитата из кода rkrivov: 
		
		
		
		
		
		
		
	Цитата: 
	
		
			q = new Query(); 
qbds_lb = q.addDataSource(tableNum(LedgerBalancesDimTrans)); ... qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]"));  | 
| 
	
 | 
| 
			
			 | 
		#35 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от AndyD
			
			 
Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId 
		
	qbr.value(queryValue("значение")); у меня вот так все отлично работает  | 
| 
	
 | 
| 
			
			 | 
		#36 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вопрос - решение по теме найдено? 
		
		
		
		
		
		
		
	Поиск мне не дал ответ(честно искал), может за год есть вариант реализации сабжа? Как все таки решается проблема EDT массива в query? Подскажите. X++: qbd = q.addDataSource(tablenum(LedgerTrans)); qbd.addRange(fieldnum(LedgerTrans,RecId)).value(strfmt("(%1.Dimension[2] == 0234)",qbd.name()));  | 
| 
	
 | 
| 
			
			 | 
		#37 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#38 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			 Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
		
	 
X++: qbd = q.addDataSource([color=blue]tablenum[/color](LedgerTrans)); qbd.addRange([color=blue]fieldnum[/color](LedgerTrans,RecId)).value(strfmt([color=red]"((%1.Dimension[2] == 0234) || (%1.Dimension[2] == 34) && (%1.Dimension[1] == 4))"[/color],qbd.name()));  | 
| 
	
 | 
| 
			
			 | 
		#39 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Если условия OR накладываются на значания только одного поля, то можно обойтись без расширенных запросов 
		
		
		
		
		
		
			X++: qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("0234"); qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("34"); qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 1)).value("4"); 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#40 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от AndyD
			 
 
			Если условия OR накладываются на значания только одного поля, то можно обойтись без расширенных запросов 
		
	X++: qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("0234"); qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("34"); qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 1)).value("4"); X++: value(strfmt("(%1.Dimension[2] == 0234)",qbd.name()X++: qbds = q.addDataSource(tableNum(EmplTrans_RU)); qbds2 = qbds.addDataSource(tableNum(LedgerTrans)); qbds2.addLink(fieldnum(EmplTrans_RU,TransDate),fieldnum(LedgerTrans,TransDate)); qbds2.addLink(fieldnum(EmplTrans_RU,Voucher),fieldnum(LedgerTrans,Voucher)); qbds2.addLink(fieldnum(EmplTrans_RU,LedgerAccount),fieldnum(LedgerTrans,AccountNum)); qbr = qbd2.addRange(fieldnum(LedgerTrans,RecId)); qbr.value( strfmt( "(((%1.AmountMST > 0) && (%2.Dimension[1] == 11)) ||"+ " ((%1.AmountMST < 0) && (%2.Dimension[2] == 21)) ||"+ " ((%1.Dimension[3] == 6) && (%2.Dimension[3] == 51)) )" ,qbd.name(),qbd2.name() ) );  | 
| 
	
 | 
| Теги | 
| query, программно, фильтр, запрос (query) | 
| 
	
	 | 
	
		
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| Вопрос по Query с агрегатной функцией | 11 | |||
| Вопрос про Query | 5 | |||
| Вопрос по query и join | 2 | |||
| Вопрос по запросу (query) | 2 | |||
| Вопрос знатокам QBE и Query в AXAPTA | 6 | |||
		
  |