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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.01.2013, 10:50   #1  
ziva is offline
ziva
Иван Захаров
Злыдни
Лучший по профессии AXAWARD 2013
 
65 / 106 (4) +++++
Регистрация: 25.03.2005
AX 2009 Ошибка запроса с условием по полю Dimension[x]
Возможно здесь где-то уже пролетала такая ошибка ...
К сожалению, результат выполнения двух этих циклов разный.
Первый выдает инфолог, второй - нет.
Отличаются только указанием условия inventTable.Dimension[12]:

X++:
    VendInvoiceTrans    vendInvoiceTrans;
    InventTable         inventTable;
    ;

    while select forceliterals vendinvoiceTrans
        group by TableId
        where vendinvoiceTrans.Voucher == "Ю3РПН00710274"
    join inventTable
        group by Dimension[12]
        where inventTable.ItemId == vendinvoiceTrans.ItemId
           && inventTable.Dimension[12] != ''
    {
        info("1 - OK");
    }

    while select forceliterals vendinvoiceTrans
        group by TableId
        where vendinvoiceTrans.Voucher == "Ю3РПН00710274"
    join inventTable
        group by Dimension[12]
        where inventTable.ItemId == vendinvoiceTrans.ItemId
           && inventTable.Dimension[12]
    {
        info("2 - OK");
    }
А запросы на БД идут вот такие интересные.

В первом цикле - вполне корректный:

SELECT B.DIMENSION12_ FROM VENDINVOICETRANS A,INVENTTABLE B WHERE ((A.DATAAREAID=N'y31i') AND (A.VOUCHER=N'Ю3РПН00710274')) AND ((B.DATAAREAID=N'y31i') AND ((B.ITEMID=A.ITEMID) AND (B.DIMENSION12_<>' '))) GROUP BY B.DIMENSION12_ ORDER BY B.DIMENSION12_

А во втором - WTF?!

SELECT B.DIMENSION12_ FROM VENDINVOICETRANS A,INVENTTABLE B WHERE ((A.DATAAREAID=N'y31i') AND (A.VOUCHER=N'Ю3РПН00710274')) AND ((B.DATAAREAID=N'y31i') AND ((B.ITEMID=A.ITEMID) AND ((((((((((((((((((B.DIMENSION>' ') AND (B.DIMENSION2_>' ')) AND (B.DIMENSION3_>' ')) AND (B.DIMENSION4_>' ')) AND (B.DIMENSION5_>' ')) AND (B.DIMENSION6_>' ')) AND (B.DIMENSION7_>' ')) AND (B.DIMENSION8_>' ')) AND (B.DIMENSION9_>' ')) AND (B.DIMENSION10_>' ')) AND (B.DIMENSION11_>' ')) AND (B.DIMENSION12_>' ')) AND (B.DIMENSION13_>' ')) AND (B.DIMENSION14_>' ')) AND (B.DIMENSION15_>' ')) AND (B.DIMENSION16_>' ')) AND (B.DIMENSION17_>' ')) AND (B.DIMENSION18_>' ')))) GROUP BY B.DIMENSION12_ ORDER BY B.DIMENSION12_
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 19.01.2013, 12:27   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Т.е. компилятор не видит, что в условии указан отдельный элемент масива и проверяет на непустоту весь масив? Интересно! А не поможет заключение условия в обычные круглые скобки, вот так (inventTable.Dimension[12]) ?

offtop: А для чего вы делаете групировку по TableId?
Старый 19.01.2013, 21:07   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
offtop: А для чего вы делаете групировку по TableId?
Группировка нужна, чтобы выборка из первой таблицы не воспринималась бы как SELECT *, т.к. * несовместима с group by
__________________
Возможно сделать все. Вопрос времени
Старый 19.01.2013, 21:14   #4  
ziva is offline
ziva
Иван Захаров
Злыдни
Лучший по профессии AXAWARD 2013
 
65 / 106 (4) +++++
Регистрация: 25.03.2005
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Группировка нужна, чтобы выборка из первой таблицы не воспринималась бы как SELECT *, т.к. * несовместима с group by
Нее )) Это скорее привычка со времен AX3.0, чтобы она не ругалась на подобный запрос.
Проверил:
X++:
while select forceliterals vendinvoiceTrans
        where vendinvoiceTrans.Voucher == "Ю3РПН00710274"
    join inventTable
        group by Dimension[12]
        where inventTable.ItemId == vendinvoiceTrans.ItemId
           && (inventTable.Dimension[12])
получается следующий SQL-запрос:

SELECT B.DIMENSION12_ FROM VENDINVOICETRANS A,INVENTTABLE B WHERE ((A.DATAAREAID=N'3r') AND (A.VOUCHER=N'Ю3РПН00710274')) AND ((B.DATAAREAID=N'edat') AND ((B.ITEMID=A.ITEMID) AND ((((((((((((((((((B.DIMENSION>' ') AND (B.DIMENSION2_>' ')) AND (B.DIMENSION3_>' ')) AND (B.DIMENSION4_>' ')) AND (B.DIMENSION5_>' ')) AND (B.DIMENSION6_>' ')) AND (B.DIMENSION7_>' ')) AND (B.DIMENSION8_>' ')) AND (B.DIMENSION9_>' ')) AND (B.DIMENSION10_>' ')) AND (B.DIMENSION11_>' ')) AND (B.DIMENSION12_>' ')) AND (B.DIMENSION13_>' ')) AND (B.DIMENSION14_>' ')) AND (B.DIMENSION15_>' ')) AND (B.DIMENSION16_>' ')) AND (B.DIMENSION17_>' ')) AND (B.DIMENSION18_>' ')))) GROUP BY B.DIMENSION12_ ORDER BY B.DIMENSION12_

Так что, скобочки не помогли
Старый 20.01.2013, 20:33   #5  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Туда же - не так давно обнаружил, что конструкции типа:
where ljt.Dimension[1] == xxx и ljt.Dimension[0] = xxx
эквивалентны. Нашел при анализе кода, в котором номер аналитики передавался в запрос переменной. Как-то никогда не задумывался и не пробовал, что в запросе работает по-другому, чем в выражении присваивания типа ljt.Dimension[0] = "".

Более того, компилируются даже конструкции типа where ljt.Dimension[-5], и запрос падает уже на SQL сервере (даже не на AOS) с ошибкой. Вообще, это можно списать на лень разработчиков компилятора - отдельно проверять номер аналитики при его задании константой было в облом... "И так упадет".
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicscare: The New Social Network… Dimension Linking in Dynamics AX 2009 Blog bot DAX Blogs 0 24.08.2011 23:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
Dynamics AX: Managing Your Supply Chain Using Microsoft Dynamics AX 2009 - Book Review Blog bot DAX Blogs 0 31.03.2009 23:06
Dynamics AX: Business Intelligence in Dynamics AX 2009 (Part I) Blog bot DAX Blogs 0 26.06.2008 02:19

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

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

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