Показать сообщение отдельно
Старый 20.08.2009, 12:32   #1  
VORP is offline
VORP
Участник
Аватар для VORP
 
147 / 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.

Спасибо!