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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2017, 21:26   #41  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,637 / 3264 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от smailik Посмотреть сообщение
Фильтр накладывается верно.
Да. Тогда отлично. Тогда в акс4 работает правильно, просто в toString() отображаются неполная информация.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.06.2017, 21:36   #42  
smailik is offline
smailik
Участник
Аватар для smailik
 
148 / 38 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Огромное спасибо. Не могу поставить благодарность под сообщением, так как сделал это уже под другим. Надо наверное пообщаться с администратором на эту тему
Старый 19.06.2017, 22:00   #43  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,637 / 3264 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
поговорите с администратором. )
но лучше начните использовать АОТ для 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.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 19.06.2017 в 22:18.
Старый 19.06.2017, 22:00   #44  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2014
 
3,095 / 1518 (57) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Query из 7 таблиц
За это сообщение автора поблагодарили: mazzy (2).
Старый 19.06.2017, 22:08   #45  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,637 / 3264 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от 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)
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.06.2017, 22:24   #46  
dim-gin is offline
dim-gin
Участник
 
2 / 14 (1) ++
Регистрация: 15.04.2014
Если брать исходный текст с Query, то можно попробовать указать fetch mode 1:1 явно у всех DS (кроме первого, разумеется).

Если я правильно понял задачу, требуется что-то типа такого:
X++:
    Query                   q;
    QueryBuildDataSource    qbdsIJT, qbdsIJTr, qbdsIL,
                            qbdsIT;
    QueryBuildRange         qbr;
    QueryRun                qr;
    
    ;

    q = new Query();

    // смысл group by мне непонятен
    qbdsIJT = q.addDataSource(tablenum(InventJournalTable));
//    qbdsIJT.orderMode(OrderMode::GroupBy);
    qbdsIJT.addSelectionField(fieldNum(InventJournalTable, JournalId), SelectionField::Database);
    qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationId), SelectionField::Database);
    qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationIdTo), SelectionField::Database);
    qbdsIJT.addRange(fieldnum(InventJournalTable, JournalNameId)).value('ПРС');

    qbdsIJTr = qbdsIJT.addDataSource(tablenum(InventJournalTrans));
    qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventTransId), SelectionField::Database);
    qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, ItemId), SelectionField::Database);
    qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventDimId), SelectionField::Database);
    qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, Qty), SelectionField::Database);
    qbdsIJTr.relations(true);
    qbdsIJTr.joinMode(JoinMode::InnerJoin);
//    qbdsIJTr.orderMode(OrderMode::GROUPBY);
    qbdsIJTr.fetchMode(QueryFetchMode::One2One);

    qbdsIT = qbdsIJTr.addDataSource(tableNum(InventTable));
    qbdsIT.relations(true);
    qbdsIT.addSelectionField(fieldNum(InventTable, ItemName), SelectionField::Database);
    qbdsIT.addSelectionField(fieldNum(InventTable, ItemGroupId), SelectionField::Database);
    qbdsIT.joinMode(joinMode::InnerJoin);
//    qbdsItl.orderMode(OrderMode::GROUPBY);
    qbdsIT.fetchMode(QueryFetchMode::One2One);

    // можно объединить 2 DS в одну конструкцию
    qbdsIT = qbdsIJT.addDataSource(tableNum(InventLocation));
    qbdsIT.fetchMode(QueryFetchMode::One2One);
    qbdsIT.joinMode(JoinMode::ExistsJoin);
    qbdsIT.relations(false);
    // это на самом деле relation
    qbr = qbdsIT.addRange(fieldNum(InventLocation, InventLocationId));
    qbr.value(strFmt('(%1.%2 = %4.%5) || (%1.%3 = %4.%5)',
        qbdsIJT.name(), fieldStr(InventJournalTable, InventLocationId), fieldStr(InventJournalTable, InventLocationIdTo),
        qbdsIT.name(), fieldStr(InventLocation, InventLocationId)) );
    // прочие условия (на справочник складов)
    //qbdsIT.addRange(fieldNum(...

    // проверка, что не потерялся какой-нибудь DS
    qr = new QueryRun(q);
    if (qr.next())
        info(strFmt('%1 %2 %3',
            qr.get(tableNum(InventJournalTable)).(fieldNum(InventJournalTable, JournalId)),
            qr.get(tableNum(InventJournalTrans)).(fieldNum(InventJournalTrans, InventTransId)),
            qr.get(tableNum(InventTable)).(fieldNum(InventTable, ItemName))
            ));

    info('DAX query: '+qbdsIJT.toString());
    info(strFmt('Query qty: %1', SysQuery::qrCount(new QueryRun(q))));
В трёшке и 2009й работает. В примере объекты заменены на скл.журналы, но конструкция та же.

P.S. В стандарте, конечно же, нет полей со складами в шапке скл.журналов, добавлены вручную.

Пока строчил, уже всё порешали)))

Последний раз редактировалось dim-gin; 19.06.2017 в 22:28. Причина: опоздал с сообщением
За это сообщение автора поблагодарили: mazzy (2), smailik (1), alex55 (1).
Старый 19.06.2017, 22:32   #47  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,637 / 3264 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
group by там похоже, потому что они что-то считают (судя по промелькнувшему SysQuery::count)
похоже просто код не полный.

да, проблема как раз в нескольких existsJoin в подчиненных таблицах.
с одним existsJoin никаких проблем

Цитата:
Сообщение от dim-gin Посмотреть сообщение
X++:
    // можно объединить 2 DS в одну конструкцию
    qbdsIT = qbdsIJT.addDataSource(tableNum(InventLocation));
    qbdsIT.fetchMode(QueryFetchMode::One2One);
    qbdsIT.joinMode(JoinMode::ExistsJoin);
    qbdsIT.relations(false);
    // это на самом деле relation
    qbr = qbdsIT.addRange(fieldNum(InventLocation, InventLocationId));
    qbr.value(strFmt('(%1.%2 = %4.%5) || (%1.%3 = %4.%5)',
        qbdsIJT.name(), fieldStr(InventJournalTable, InventLocationId), fieldStr(InventJournalTable, InventLocationIdTo),
        qbdsIT.name(), fieldStr(InventLocation, InventLocationId)) );
    // прочие условия (на справочник складов)
чё-то стрёмно такой workaruond применять.
опять же скорее всего, нам не все условия показали, а только самое тривиальное.

и если условия в ТЗ будут углублены и расширены (а они будут углублены)
то такой маневр будет оооочень сильно мешать.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.06.2017, 22:44   #48  
dim-gin is offline
dim-gin
Участник
 
2 / 14 (1) ++
Регистрация: 15.04.2014
2 mazzy:
Да, это не самое элегантное решение. Но разве исходные 2 exists join'а с OR намного проще в выполнении для БД? Или Вы подразумеваете другой смысл под словом "мешать"?

Последний раз редактировалось dim-gin; 19.06.2017 в 22:45. Причина: опечатка
Старый 19.06.2017, 23:00   #49  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,637 / 3264 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
для БД не проще.
мешать будет человеку.

если сейчас условие упаковать в один existJoin, то с появлением новых условий на склады, условие придется делать все более навороченным и сильно непонятным и для программиста, и для пользователя.

пользователь появляется поскольку часто готовый query может оказаться в стандартном диалоге, где пользователь может его подправить. даже опытный пользователь повесится. придется делать этот range::Locked. а затем придумывать обходные пути чтобы таки как-то разрешить.

да, из кода видно, что в данном случае разработчики не парятся с критериями, а используют диалог с единственным значением для фильтра в каждом range. и хорошо, если это значение можно подставить из выпадающего списка )))

но рано или поздно они могут захотеть таки перейти на полноценные критерии вместо единственного значения.

этот workaround сделает любое расширение условия по складам очень нетривиальным и сложным.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
За это сообщение автора поблагодарили: dim-gin (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 18:56.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.