|  15.11.2005, 12:56 | #21 | 
| Участник | 
			
			Вы не поняли.  В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве). Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  15.11.2005, 12:57 | #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 ); Часто помогает. | 
|  | 
|  15.11.2005, 12:59 | #23 | 
| Участник | 
			
			что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
		 | 
|  | 
|  15.11.2005, 13:11 | #24 | 
| Участник |   Цитата: 
		
			Сообщение от AndyD
			
			 Вы не поняли.  В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве). Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId X++: fieldName = strFmt( "dimension[%1]", _dimensionNumber ); fieldId = fieldName2Id( tableNum(LedgerBalancesDimTrans), fieldId ); | 
|  | 
|  15.11.2005, 13:16 | #25 | 
| Участник | 
			
			А почему NOT, OR и AND, а не !, || и &&?
		 | 
|  | 
|  15.11.2005, 13:22 | #26 | 
| Участник | Цитата: 
		
			или это именно в value нельзя добавлять выражения с такими полями?
		
	 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  15.11.2005, 13:22 | #27 | 
| Участник | Цитата: 
		
			Сообщение от Peter Savintsev
			
			 А почему NOT, OR и AND, а не !, || и &&? | 
|  | 
|  15.11.2005, 13:23 | #28 | 
| Участник | Цитата: 
		
			Сообщение от AndyD
			
			 Да.        | 
|  | 
|  15.11.2005, 13:36 | #29 | 
| ---------------- | Цитата: 
		
			Сообщение от rkrivov
			
			 что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?) | 
|  | 
|  15.11.2005, 13:44 | #30 | 
| Дмитрий Ерин | 
			
			2 rkrivov: Развернувшаяся здесь дискуссия по поводу использования массивов полей в Range сама по себе интересна и познавательна... Но позволю себе еще раз обратить Ваше внимание на изначальную постановку задачи. Возможно, что Вы либо ошиблись при построении запроса, либо зря тратите время, ковыряясь в расширенных диапазонах, поскольку в таком виде задача решается стандартным путем. Процитирую свое сообщение: Цитата: 
		
			Сообщение от Ruff
			
			 ...сдается мне, что в Ваш запрос закралась какая-то бяка... Попытка оптимизировать (по правилу поглощения, кажется) условие: "(%2 != %1) && ((%2 == %1) || (!%1))" привела к следующему: "(%2 != %1) && (!%1)" Что по сути означает "первый параметр всегда пустой, а второй - всегда непустой". Может быть это именно то, что Вам и нужно, но зачем тогда такие сложные сравнения?  , последнюю строку можно преобразовать далее: "(%2) && (!%1)" или "(%2 != "") && (%1 == "")" Таким образом, остается просто добавить к запросу два простых Range с условиями (!"") и ("") соответственно (насколько я понимаю, это будут Dimension[i], причем из разных DataSource-ов). В любом случае добавить их "по одиночке" (в разные Range) не составит труда, и эти условия объединятся по И. Хотя, на самом деле мне кажется, что Вы что-то упустили при построении запроса, вряд ли все так просто   
				__________________   | 
|  | 
|  15.11.2005, 14:02 | #31 | 
| Участник | 
			
			2 Ruff Не получится сделать это (%1 == "") Хотя по поводу запроса я согласен 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  15.11.2005, 14:10 | #32 | 
| Дмитрий Ерин | Цитата: 
		
			Сообщение от AndyD
			
			 Не получится сделать это (%1 == "") Код: qbr.value(SysQuery::valueEmptyString()); | 
|  | 
|  15.11.2005, 14:16 | #33 | 
| Участник | 
			
			А что это за qbr? На какое поле и на какой датасоурс?
		 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  15.11.2005, 14:22 | #34 | 
| Дмитрий Ерин | 
			
			Честно говоря не вникал. Цитата из кода rkrivov: Цитата: 
		
			q = new Query(); qbds_lb = q.addDataSource(tableNum(LedgerBalancesDimTrans)); ... qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]")); | 
|  | 
|  19.12.2005, 13:11 | #35 | 
| Участник | Цитата: 
		
			Сообщение от AndyD
			
			 Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId qbr.value(queryValue("значение")); у меня вот так все отлично работает | 
|  | 
|  06.03.2007, 09:31 | #36 | 
| Участник | 
			
			Вопрос - решение по теме найдено? Поиск мне не дал ответ(честно искал), может за год есть вариант реализации сабжа? Как все таки решается проблема EDT массива в query? Подскажите. X++: qbd = q.addDataSource(tablenum(LedgerTrans)); qbd.addRange(fieldnum(LedgerTrans,RecId)).value(strfmt("(%1.Dimension[2] == 0234)",qbd.name())); | 
|  | 
|  06.03.2007, 10:09 | #37 | 
| Участник | 
			
			Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
		 | 
|  | 
|  06.03.2007, 10:36 | #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())); | 
|  | 
|  06.03.2007, 11:37 | #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 | 
|  | 
|  06.03.2007, 12:01 | #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 | |||
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |