AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2005, 12:56   #21  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вы не поняли.
В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве).
Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д

Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 12:57   #22  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Цитата:
Сообщение от 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  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
Старый 15.11.2005, 13:11   #24  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
?
Цитата:
Сообщение от AndyD
Вы не поняли.
В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве).
Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д

Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
Но ведь следующие строки отрабатывают:
X++:
fieldName = strFmt( "dimension[%1]", _dimensionNumber );
fieldId = fieldName2Id( tableNum(LedgerBalancesDimTrans), fieldId );
все отрабатывает... или это именно в value нельзя добавлять выражения с такими полями?
Старый 15.11.2005, 13:16   #25  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
А почему NOT, OR и AND, а не !, || и &&?
Старый 15.11.2005, 13:22   #26  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
или это именно в value нельзя добавлять выражения с такими полями?
Да.
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 13:22   #27  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Цитата:
Сообщение от Peter Savintsev
А почему NOT, OR и AND, а не !, || и &&?
Это просто как вариант... но не то и не другое не прокатывает... ибо не работает с такими полями как dimension[2]
Старый 15.11.2005, 13:23   #28  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Цитата:
Сообщение от AndyD
Да.
Старый 15.11.2005, 13:36   #29  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Сообщение от rkrivov
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
addDataSource(tableNum(LedgerBalancesDimTrans), "LedgerBalancesDimTrans1");
Старый 15.11.2005, 13:44   #30  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 Ruff
Не получится сделать это (%1 == "")

Хотя по поводу запроса я согласен
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 14:10   #32  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от AndyD
Не получится сделать это (%1 == "")
Почему? А как же
Код:
  qbr.value(SysQuery::valueEmptyString());
?
Старый 15.11.2005, 14:16   #33  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А что это за qbr? На какое поле и на какой датасоурс?
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 14:22   #34  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Честно говоря не вникал. Цитата из кода 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  
latvik is offline
latvik
Участник
 
74 / 13 (1) ++
Регистрация: 27.05.2004
Адрес: Moscow, YS
Цитата:
Сообщение от AndyD
Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
qbr = qbds.addRange(fieldid2ext(fieldnum(RassetTrans,dimension),1));
qbr.value(queryValue("значение"));


у меня вот так все отлично работает
Старый 06.03.2007, 09:31   #36  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Вопрос - решение по теме найдено?
Поиск мне не дал ответ(честно искал), может за год есть вариант реализации сабжа?

Как все таки решается проблема 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  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
Старый 06.03.2007, 10:36   #38  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Цитата:
Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
вариант устраивает для простого фильтра на одно поле, но нужна реализация запроса по сложнее, включающая операторы,наприме "OR" и т.п., что то типа:

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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если условия 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  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Цитата:
Сообщение от 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");
Спасибо. Но дело в том, что задача не в реализации конкретного случая, а в возможности реализации именно расширенного запроса использующего EDT массив. Я понимаю есть альтернативное решение (и мне его продемонстрировали), но есть желание получить запрос именно вида

X++:
value(strfmt("(%1.Dimension[2] == 0234)",qbd.name()
поясню почему, может возникнуть запрос,связывающий несколько таблиц и в котором участвует оператор "OR", и реализовать этот запрос в расширенном виде было бы удобнее. Например (взято из головы, не пеняте на логику, просто возможность реализации):

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 с агрегатной функцией Jarad DAX: Программирование 11 31.10.2006 21:10
Вопрос про Query 6apcyk DAX: Программирование 5 16.11.2005 19:08
Вопрос по query и join tischenko DAX: Программирование 2 20.07.2005 13:05
Вопрос по запросу (query) Александр_1975 DAX: Программирование 2 23.01.2004 17:35
Вопрос знатокам QBE и Query в AXAPTA Maxim Gorbunov DAX: Программирование 6 27.12.2002 13:19
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:06.