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 |
|