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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2017, 20:09   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Ларчик у меня открылся вот как. Изначально почитав http://www.axaptapedia.com/Expressions_in_query_ranges я использовал ExistsJoin. Потом спасибо S.Kuskov тип связи изменился на InnerJoin. И тогда встал вопрос, а почему структура query до сих пор такая? Почему бы не поднять InventLocation выше? Поднял и все заработало. Код который бил показан он тестовый и поэтому упрошенный. Сейчас рабочий код выглядит так
X++:
qbds = query.addDataSource(tablenum(InventTransferTable));

    qbds.orderMode(OrderMode::GroupBy);
    qbds.addSortField(fieldnum(InventTransferTable, TransferId));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTo));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdFrom));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTransit));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater));
    qbds.addSortField(fieldnum(InventTransferTable, ReceiveDate));
    qbds.addSortField(fieldnum(InventTransferTable, TransferStatus));

    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater));

    if (fromDate && toDate)//Дата
    {
       qbds.addRange(fieldnum(InventTransferTable, ReceiveDate)).value(strfmt('%1..%2', fromDate, toDate));
    }

    if (receivedOnly)
    {
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received));
    }
    else
    {
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Shipped));
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received));
    }

    if (inventLocationId_From)//Отправлено Откуда
    {
        qbds.addRange(fieldnum(InventTransferTable, InventLocationIdFrom)).value(inventLocationId_From);
    }

    if (inventLocationId_To)//Отправлено Куда
    {
        qbds.addRange(fieldnum(InventTransferTable, InventLocationIdTo)).value(inventLocationId_To);
    }
    
    if (inventLocationType != InventLocationType::Standard)
    {
        qbdsInventLocationFrom = qbds.addDataSource(tablenum(InventLocation));
        qbdsInventLocationFrom.addLink(fieldNum(InventTransferTable, InventLocationIdFrom), fieldNum(InventLocation, InventLocationId));
        qbdsInventLocationFrom.joinMode(JoinMode::InnerJoin);
        qbdsInventLocationFrom.fetchMode(QueryFetchMode::One2One);

        qbdsInventLocationTo = qbds.addDataSource(tableNum(InventLocation));
        qbdsInventLocationTo.addLink(fieldNum(InventTransferTable, InventLocationIdTo), fieldNum(InventLocation, InventLocationId));
        qbdsInventLocationTo.joinMode(JoinMode::InnerJoin);
        qbdsInventLocationTo.fetchMode(QueryFetchMode::One2One);

        qbrDataAreaId = qbdsInventLocationTo.addRange(fieldNum(InventLocation, DataAreaId));
        qbrDataAreaId.value(strFmt('((%1.%3 == %4) || (%2.%3 == %4))',
            qbdsInventLocationFrom.name(),
            qbdsInventLocationTo.name(),
            fieldStr(InventLocation, InventLocationType),
            any2int(inventLocationType)));
    }

    qbds1 = qbds.addDataSource(tablenum(InventTransferLine));
    qbds1.addLink(fieldnum(InventTransferTable, TransferId), fieldnum(InventTransferLine , TransferId));
    qbds1.joinMode(JoinMode::InnerJoin);
    qbds1.orderMode(OrderMode::GROUPBY);
    qbds1.fetchMode(QueryFetchMode::One2One);
    qbds1.addSortField(fieldnum(InventTransferLine, ItemId));
    qbds1.addSortField(fieldnum(InventTransferLine, Out_ItemId));
    qbds1.addSortField(fieldnum(InventTransferLine, QtyTransfer));

    qbds2 = qbds1.addDataSource(tableNum(InventSum));
    qbds2.addLink(fieldnum(InventTransferLine, ItemId), fieldNum(InventSum, ItemId));
    qbds2.joinMode(joinMode::InnerJoin);
    qbds2.orderMode(OrderMode::GROUPBY);
    qbds2.fetchMode(QueryFetchMode::One2One);
    qbds2.addSortField(fieldnum(InventSum, ItemId));
    qbds2.addSelectionField(fieldnum(InventSum, ReservPhysical), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, PostedQty), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Received), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Deducted), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Registered), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Picked), SelectionField::SUM);

    qbds2.addRange(fieldnum(InventSum, Closed)).value(SysQuery::value(NoYes::No));

    qbds2.addRange(fieldNum(InventSum, PhysicalInvent)).value("> 0");

    queryRun = new QueryRun(query);
За это сообщение автора поблагодарили: mazzy (2).
Старый 19.06.2017, 20:32   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
Код который бил показан он тестовый и поэтому упрошенный.
это понятно и нормально.

про код тоже понятно.
но проблема то не решена. в скобках у вас по прежнему названия датасорсов, а в самом тексте запроса используются названия таблиц.

аксапта не проверяет синтаксис внутри скобок. поэтому и не выдает ошибки.
но с точки зрения SQL запрос будет синтаксически неверным.

Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
        qbrDataAreaId = qbdsInventLocationTo.addRange(fieldNum(InventLocation, DataAreaId));
        qbrDataAreaId.value(strFmt('((%1.%3 == %4) || (%2.%3 == %4))',
            qbdsInventLocationFrom.name(),
            qbdsInventLocationTo.name(),
            fieldStr(InventLocation, InventLocationType),
            any2int(inventLocationType)));
    }
вы точно сейчас получаете ожидаемый результат?
__________________
полезное на axForum, github, vk, coub.
Старый 19.06.2017, 22:00   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
поговорите с администратором. )
но лучше начните использовать АОТ для query вместо простыней кода.

и всегда экранируйте значение перед тем как записать range.value.
вот так категорически неправильно:
X++:
value(inventLocationId_From)
вот так - правильно:
X++:
value(SysQuery::value(inventLocationId_From))
разницу вы почувствуете, когда пользователь додумается поставить запятую, восклицательный, вопросительный знаки в код.
или любые друге спец.символы. http://axapta.mazzy.ru/lib/search/

=========================
Цитата:
Сообщение от smailik Посмотреть сообщение
я использовал ExistsJoin. Потом спасибо S.Kuskov тип связи изменился на InnerJoin. ... Почему бы не поднять InventLocation выше?
промоделировал в акс2012.
в общем старая добрая проблема с множественным Exist Join в нескольких подчиненных таблицах воспроизводится и в самых распоследних билдах акс2012.

Если есть несколько подчиненных таблиц с Exist Join и InnerJoin, то возникает ошибка при создании SQL-запроса. Независимо от положения подчиненных таблиц, от group by и прочих факторов.

=========================
Господи, хорошо то как в старой версии!
И все-таки лучшей версией была акс2009.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 19.06.2017 в 22:18.
Старый 07.09.2017, 11:28   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от mazzy Посмотреть сообщение
И все-таки лучшей версией была акс2009.
Согласен на все 100!
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Query для HcmPosition (запрос по таблице, соссылкой на себя же) Music DAX: Программирование 9 07.07.2016 14:54
emeadaxsupport: Microsoft Dynamics AX general performance analysis scripts page 5 Blog bot DAX Blogs 0 01.09.2014 14:11
Вложенный запрос SQL с помощью великого Query user_ax DAX: Программирование 9 07.10.2013 14:00
like запрос с использованием query Vadik Shiryakoff DAX: Программирование 7 13.03.2006 12:05

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:41.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.