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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.08.2009, 12:32   #1  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
Как работает queryRun
Доброго дня,

у меня имеет место странное поведение запроса. Ситуация следующая- есть код:
X++:
        q = new Query(inventSum_ds.queryRun().query());
        qbds = q.dataSourceTable(tablenum(InventDim));
        qbds.findRange(fieldnum(InventDim, InventLocationId)).value(_inventLocationId);
        qbds.findRange(fieldnum(InventDim, InventReserveCode)).value(_reserveCode);
 
        qr = new Queryrun(q);
        while(qr.next())
        {
            inventSumLocal = qr.get(tablenum(InventSum));            
        }
Query инициализируется долго, но в результате, если посмотреть профайлер SQL получается следующий результат:

SELECT
SUM(A.POSTEDQTY),SUM(A.POSTEDVALUE),SUM(A.PHYSICALVALUE),SUM(A.DEDUCTED),SUM(A.REGISTERED),SUM(A.RECEIVED),
SUM(A.PICKED),SUM(A.RESERVPHYSICAL),SUM(A.RESERVORDERED),SUM(A.ONORDER),SUM(A.ORDERED),SUM(A.ARRIVED),SUM(A.QUOTATIONRECEIPT),
SUM(A.QUOTATIONISSUE),SUM(A.PHYSICALINVENT),SUM(A.AVAILPHYSICAL),
SUM(A.AVAILORDERED),A.ITEMID,
B.INVENTCOLORID,B.INVENTLOCATIONID,B.INVENTBATCHID,B.WMSLOCATIONID,B.WMSPALLETID,B.INVENTSERIALID,B.INVENTGTDID_RU,
B.INVENTRESPPERS,B.INVENTPOSTINGPROFILE,B.INVENTDIMDEFECT,B.INVENTRESERVECODE
FROM INVENTSUM A,INVENTDIM B,WMSLOCATION C
WHERE((A.DATAAREAID='pld')AND((A.CLOSED=0)AND(A.ITEMID='000007')))AND((B.DATAAREAID='pld')AND
(((((B.INVENTLOCATIONID='1001')AND(B.INVENTRESERVECODE='All'))AND(B.INVENTCOLORID='Черный/бордо'))AND(B.INVENTDIMDEFECT='ОК'))AND(A.INVENTDIMID=B.INVENTDIMID)))AND
((C.DATAAREAID='pld')AND(((C.LOCATIONTYPE=0)AND(B.INVENTLOCATIONID=C.INVENTLOCATIONID))AND(B.WMSLOCATIONID=C.WMSLOCATIONID)))
GROUPBY
A.ITEMID,B.INVENTCOLORID,B.INVENTLOCATIONID,B.INVENTBATCHID,B.WMSLOCATIONID,B.WMSPALLETID,B.INVENTSERIALID,
B.INVENTGTDID_RU,B.INVENTRESPPERS,B.INVENTPOSTINGPROFILE,B.INVENTDIMDEFECT,B.INVENTRESERVECODE
ORDERBY
A.ITEMID,B.INVENTCOLORID,B.INVENTLOCATIONID,B.INVENTBATCHID,B.WMSLOCATIONID,B.WMSPALLETID,B.INVENTSERIALID,
B.INVENTGTDID_RU,B.INVENTRESPPERS,B.INVENTPOSTINGPROFILE,B.INVENTDIMDEFECT,B.INVENTRESERVECODE

Другими словами, складские остатки по заданному складу в ячейках хранения.
Проблема в том, что SQL query через queryAnalyzer или запрос переписанный через while select выдают одну строку, тогда как проход while(qr.next())выполняется два раза, хотя получаемые значения не изменяются. Что интересно, так это то, что в форме данный запрос отрабатывает правильно.

Возникает вопрос, как с этим бороться и как вообще работает queryRun.

Спасибо!
Старый 20.08.2009, 12:50   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от VORP Посмотреть сообщение
тогда как проход while(qr.next()) выполняется два раза, хотя получаемые значения не изменяются.
Я не понял фразу "хотя получаемые значения не изменяются".
Что касается строчки while(qr.next()) - она будет выполнена два раза:
= в первый раз будет возвращена истина, а qr будет спозиционирован на результирующую строку
= во-второй раз будет возвращена ложь, а значение qr - неопределено.

внутрь цикла while(qr.next()) { ... } Аксапта зайдет только один раз.
__________________
полезное на axForum, github, vk, coub.
Старый 20.08.2009, 13:03   #3  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
под получаемыми значениями имеются ввиду таблицы - inventSum, inventDim, WMSLocation. То есть как бы выбирается то же самое(хотя может быть что он просто не переходит по рекордсету?). Обычно это происходит на последней строке рекордсета.

В том то и есть дело что два раза возвращается true, и внутрь цикла заходит два раза.
Старый 20.08.2009, 13:47   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от VORP Посмотреть сообщение
В том то и есть дело что два раза возвращается true, и внутрь цикла заходит два раза.
Значит у вас две строки в результате.
А в QA вы неправильно запрос переписали.

Смотрите в отладчике Аксапты.
Барабашки нет.
__________________
полезное на axForum, github, vk, coub.
Старый 20.08.2009, 22:09   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
VORP, Logger
а
X++:
.fetchMode(QueryFetchMode::One2One);
не пробовали добавлять в квери?
это, конечно, то тоже самое что тут описывалось и не факт, что поможет, но вдруг? определённое сходство в симптомах просматривается...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Logger (2).
Старый 24.08.2009, 14:51   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от ZVV Посмотреть сообщение
VORP, Logger
а
X++:
.fetchMode(QueryFetchMode::One2One);
не пробовали добавлять в квери?
это, конечно, то тоже самое что тут описывалось и не факт, что поможет, но вдруг? определённое сходство в симптомах просматривается...
В Ax3.0 KR3 попробовал - не влияет.
QueryFetchMode::One2One и QueryFetchMode::One2Many работает одинаково.
Старый 20.08.2009, 14:27   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Маззи, на самом деле иногда в Аксапте такое бывает.
Опишу пример когда у нас воспроизводился такой глюк, возможно у автора темы похожая ситуация.

Делаем коррекцию проводок.
Периодические операции - Закрытие и коррекция - Проводки
По кнопке выбор Аксапта предлагает задать Query которым она отберет проводки для коррекции.
Если в этот query добавить по схеме n:1 таблицу "Картотека номенклатуры", то тогда каждая отбираемая проводка придет 2 раза. Что неправильно, так как добавляемый датасорс добавляется как Exists join.

Чтобы обойти этот глюк пришлось в методе
\Classes\InventAdjTransactSelect\run\
добавить в тело цикла проверку
X++:
            if (!queryRun.changed(tablenum(InventTrans),1))
            {
                continue;
            }
За это сообщение автора поблагодарили: mazzy (2), lev (2), VORP (1), Kabardian (3).
Старый 20.08.2009, 14:46   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Маззи, на самом деле иногда в Аксапте такое бывает.
Неисповедимы пути твои...

Может быть, может быть...
У меня ни разу не было. Тьфу-тьфу-тьфу.
__________________
полезное на axForum, github, vk, coub.
Старый 20.08.2009, 15:43   #10  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Logger, если это и правда глюк, то почему бы в Microsoft официальный запрос не отправить?
Старый 20.08.2009, 16:09   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Logger, если это и правда глюк, то почему бы в Microsoft официальный запрос не отправить?
Надо будет.
Правда сперва лучше проверить что в Ax2009 воспроизводится.
Старый 20.08.2009, 15:52   #12  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
Да, действительно, queryRun инициализируется на форме, и на одном из датасорсов к нему добавляются таблицы через exists join.
При копировании query копируются оба запроса и при прохождении второй раз через qr.next() выполняется запрос с existsJoin - открывается второй курсор.

Спасибо большое!
Старый 20.08.2009, 21:27   #13  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да, проверьте плз и отпишитесь здесь. Спасибо
Теги
query, queryrun, баг, запрос (query), crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
Простой QueryRun не работает miklenew DAX: Программирование 13 20.01.2009 14:17
OZKA's DAX Journal: Join между временной и постоянной таблицей через QueryRun. Blog bot DAX Blogs 12 14.01.2009 17:34
как работает QueryRun.reset() ??? 6apcyk DAX: Программирование 1 08.10.2005 22:10
Как же все-таки организованиы Query и QueryRun? VIS DAX: Программирование 4 03.07.2003 15:22

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

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

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