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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2005, 12:44   #1  
oblin is offline
oblin
Участник
 
2 / 10 (1) +
Регистрация: 14.02.2005
Адрес: Москва
Вместо

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

Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 13:11   #4  
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 нельзя добавлять выражения с такими полями?
Старый 19.12.2005, 13:11   #5  
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("значение"));


у меня вот так все отлично работает
Старый 15.11.2005, 12:59   #6  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
Старый 15.11.2005, 13:36   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Сообщение от rkrivov
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
addDataSource(tableNum(LedgerBalancesDimTrans), "LedgerBalancesDimTrans1");
Старый 15.11.2005, 13:16   #8  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 124 (5) +++++
Регистрация: 14.12.2001
А почему NOT, OR и AND, а не !, || и &&?
Старый 15.11.2005, 13:22   #9  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Цитата:
Сообщение от Peter Savintsev
А почему NOT, OR и AND, а не !, || и &&?
Это просто как вариант... но не то и не другое не прокатывает... ибо не работает с такими полями как dimension[2]
Старый 15.11.2005, 13:22   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
или это именно в value нельзя добавлять выражения с такими полями?
Да.
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 13:23   #11  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Цитата:
Сообщение от AndyD
Да.
Старый 15.11.2005, 14:02   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
2 Ruff
Не получится сделать это (%1 == "")

Хотя по поводу запроса я согласен
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 14:10   #13  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от AndyD
Не получится сделать это (%1 == "")
Почему? А как же
Код:
  qbr.value(SysQuery::valueEmptyString());
?
Старый 15.11.2005, 14:16   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
А что это за qbr? На какое поле и на какой датасоурс?
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2005, 14:22   #15  
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]"));
Старый 06.03.2007, 09:31   #16  
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   #17  
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   #18  
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   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 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   #20  
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, время: 06:25.