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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от mazzy Посмотреть сообщение
И все-таки лучшей версией была акс2009.
Согласен на все 100!
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 19.06.2017, 20:43   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
При генерации SQL, насколько я знаю, query использует имена источников данных, а не таблиц. просто если их явно не указывать, они генерируются автоматически
За это сообщение автора поблагодарили: mazzy (2).
Старый 19.06.2017, 21:23   #6  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Сейчас при изменении InventLocationType результат меняется. Сделал визуальную проверку выводимым данных. Фильтр накладывается верно.
За это сообщение автора поблагодарили: mazzy (2).
Старый 19.06.2017, 21:26   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
Фильтр накладывается верно.
Да. Тогда отлично. Тогда в акс4 работает правильно, просто в toString() отображаются неполная информация.
__________________
полезное на axForum, github, vk, coub.
Старый 19.06.2017, 21:36   #8  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Огромное спасибо. Не могу поставить благодарность под сообщением, так как сделал это уже под другим. Надо наверное пообщаться с администратором на эту тему
Старый 19.06.2017, 22:00   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Query из 7 таблиц
За это сообщение автора поблагодарили: mazzy (2).
Старый 19.06.2017, 22:08   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Цитата:
Сообщение от mazzy Посмотреть сообщение
аксапта не гарантирует, что query будет выполнен одним SQL-запросом.
очень часто аксапта разбивает выполнение Query на несколько SQL-запросов.

разбитие зависит от временных таблиц, кэшируемых таблиц, сложных запросов с невложенными связями, existJoin.
https://msdn.microsoft.com/en-us/library/bb314836.aspx

вполне вероятно, что аксапта разбила запрос на несколько.
Это тоже вроде обсуждалось.
И вроде было связано с версией SQL - что-то там происходило, когда в запросе участвуют много таблиц. Типа планы оптимизации не рассчитывались... или что-то вроде того.

Кстати, алиасы таблиц раньше по-другому генерились. Помню, что были первые буквы латинского алфавита A,B,C... А теперь Т1, Т2, Т3...
Цитата:
Сообщение от db Посмотреть сообщение
SELECT A.ITEMGROUPID,A.ITEMID,A.ITEMNAME,A.ITEMTYPE,A.PURCHMODEL,A.HEIGHT,A.WIDTH,A.SALESMODEL,
A.COSTGROUPID,A.REQGROUPID,A.PRIMARYVENDORID,A.NETWEIGHT,A.DEPTH,A.UNITVOLUME,A.BOMUNITID,A.DENSITY,
A.DEL_SCRAPTYPEID,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.DIMENSION5_,A.COSTMODEL,
A.USEALTITEMID,A.ALTITEMID,A.INTRACODE,A.BOMMANUALCONSUMP,A.BOMMANUALRECEIPT,
A.STOPEXPLODE,A.DEL_COVPERINVENTLOCATION,A.PHANTOM,A.INTRAUNIT,A.BOMLEVEL,A.BATCHNUMGROUPID,
A.AUTOREPORTFINISHED,A.ORIGCOUNTRYID,A.STATISTICSFACTOR,A.ALTCONFIGID,A.STANDARDCONFIGID,
A.DEL_CONFIGACTIVE,A.PRODPOOLID,A.PROPERTYID,A.ABCTIEUP,A.ABCREVENUE,A.ABCVALUE,A.ABCCONTRIBUTIONMARGIN,
A.COMMISSIONGROUPID,A.DEL_BARCODE,A.DEL_BARCODETYPE,A.CONFIGURABLE,A.SALESPERCENTMARKUP,
A.SALESCONTRIBUTIONRATIO,A.SALESPRICEMODELBASIC,A.MINAVERAGESETTLE,A.NAMEALIAS,A.PRODGROUPID,
A.PROJCATEGORYID,A.GROSSDEPTH,A.GROSSWIDTH,A.GROSSHEIGHT,A.STANDARDPALLETQUANTITY,A.QTYPERLAYER,
A.SORTCODE,A.CONFIGSIMILAR,A.SERIALNUMGROUPID,A.DIMGROUPID,A.MODELGROUPID,A.ITEMBUYERGROUPID,
A.TAXPACKAGINGQTY,A.DEL_TEMPLATE,A.WMSPALLETTYPEID,A.ORIGSTATEID,A.STOPEXPLODEPRICE,A.WMSPICKINGQTYTIME,
A.TARAWEIGHT,A.PACKAGINGGROUPID,A.SCRAPVAR,A.SCRAPCONST,A.ITEMDIMCOMBINATIONAUTOCREATE,
A.ITEMDIMCOSTPRICE,A.ITEMIDCOMPANY,A.PBAITEMCONFIGURABLE,A.PBAINVENTITEMGROUPID,
A.GROSSWEIGHT_RU,A.PACKING_RU,A.ASSETGROUPID_RU,A.ASSETID_RU,A.RECID,
B.ITEMID,B.MODULETYPE,B.UNITID,B.PRICE,B.PRICEUNIT,B.MARKUP,B.LINEDISC,B.MULTILINEDISC,B.ENDDISC,
B.QUANTITY,B.LOWESTQTY,B.HIGHESTQTY,B.TAXITEMGROUPID,B.BLOCKED,B.DELIVERYTIME,B.INVENTLOCATIONID,
B.MANDATORYINVENTLOCATION,B.STANDARDQTY,B.MARKUPGROUPID,B.PRICEDATE,B.PRICEQTY,B.ALLOCATEMARKUP,
B.OVERDELIVERYPCT,B.UNDERDELIVERYPCT,B.SUPPITEMGROUPID,B.CALENDARDAYS,B.INTERCOMPANYBLOCKED,
B.PRICESECCUR_RU,B.MARKUPSECCUR_RU,B.RECID,C.UNITID,C.TXT,C.UNITDECIMALS,C.UNITSYSTEM,C.CODEOKEI_RU,C.RECID
FROM INVENTTABLE A(NOLOCK) ,INVENTTABLEMODULE B(NOLOCK) ,UNIT C(NOLOCK)
WHERE (A.DATAAREAID=?)
AND ((B.DATAAREAID=?)
AND ((B.MODULETYPE=?)
AND (A.ITEMID=B.ITEMID)))
AND ((C.DATAAREAID=?)
AND (B.UNITID=C.UNITID))
ORDER BY A.DATAAREAID,A.ITEMID OPTION(FAST 9)
__________________
полезное на axForum, github, vk, coub.
Старый 06.09.2017, 19:37   #11  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Всем доброго дня. Столкнулся с подобной задачей, но теперь мне надо наложить условие И на одно и тоже поле таблицы. А именно примерно следующее:
X++:
qbr.value(strfmt('((%1 >= %2) && (%1 == %3))',
                fieldStr(myTable, TransDate), 
                tableParameters.DateFrom, 
                transDateFilter));
Все это дело происходит на форме. Вверху формы фильтр по дате (transDateFilter). Есть таблица параметров (tableParameters). Суть вот в чем, мне нужно на форме отображать записи которые больше или равны дате из параметров и при этом соответствуют фильтру вверху формы, если он указан конечно.
На данный момент получаю ошибку "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 23."
Если перед strfmt добавить SysQuery::value, то ошибки нет, но и данных нет. Прошу совета как реализовать необходимую задачу.
Старый 07.09.2017, 09:14   #12  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
qbr.value(strfmt('((%1 >= %2) && (%1 == %3))',
                fieldStr(myTable, TransDate), 
                tableParameters.DateFrom, 
                transDateFilter));
На данный момент получаю ошибку "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 23."
Причина ошибки - неверное строковое представление даты. В следующий раз используйте date2StrXpp(), как в примере у dim-gin.
__________________
// no comments
За это сообщение автора поблагодарили: smailik (2).
Старый 06.09.2017, 19:49   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
равенство одним символом =, а не двумя
http://axapta.mazzy.ru/lib/search/
__________________
полезное на axForum, github, vk, coub.
Старый 06.09.2017, 19:52   #14  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
На ошибку это не повлияло.
Когда заработает надо поизучать этот вопрос http://www.axaptapedia.com/Expressions_in_query_ranges тут "=="

Последний раз редактировалось smailik; 06.09.2017 в 19:55.
За это сообщение автора поблагодарили: mazzy (2).
Старый 06.09.2017, 20:54   #15  
andrewK is offline
andrewK
Участник
 
45 / 22 (1) +++
Регистрация: 03.11.2005
По это же ссылке приведен пример работы с датой в Query:
X++:
queryBuildRange.value(strFmt('(ModifiedDate > %1)', Date2StrXpp(01\01\2000)));
Старый 06.09.2017, 21:02   #16  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Проблема не с обычным фильтром, а с условием И по одному и тому же полю
Старый 06.09.2017, 22:25   #17  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
1. А почему нельзя одно из условий отбросить в самом приложении (а не перекладывать эту функцию на БД)?
2. Даже если и нельзя, то, объединив уже предложенные советы, получаем перевариваемый вариант (2009, трёшка):
X++:
    Query                   q;
    QueryBuildDataSource    qbds;
    QueryRun                qr;
    EmplTable   empl;
    str         sRange;
    int         iCnt;
    ;

    q = new Query();
    qbds = q.addDataSource(tableNum(EmplTable));
    sRange = strFmt('(%1.%2 >= %3) && (%1.%2 = %4)',
                qbds.name(), fieldStr(EmplTable, PayEmploymentDate_RU), date2StrXpp(01\09\2017), date2StrXpp(today()));
    //info(sRange);
    qbds.addRange(fieldNum(EmplTable, PayEmploymentDate_RU)).value(sRange);
    //info(qbds.toString());
    qr = new QueryRun(q);
    while (qr.next())
        iCnt++;
        
    info(int2str(iCnt));
За это сообщение автора поблагодарили: smailik (2), dech (2).
Старый 06.09.2017, 23:20   #18  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Огромное спасибо. Заработался. За сегодняшнюю дату то у меня записей нет. Система правильно делала что показывала пустоту.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 02:20.