20.08.2009, 12:32 | #1 |
Участник
|
Как работает 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)); } 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 |
Участник
|
Цитата:
Что касается строчки while(qr.next()) - она будет выполнена два раза: = в первый раз будет возвращена истина, а qr будет спозиционирован на результирующую строку = во-второй раз будет возвращена ложь, а значение qr - неопределено. внутрь цикла while(qr.next()) { ... } Аксапта зайдет только один раз. |
|
20.08.2009, 13:03 | #3 |
Участник
|
под получаемыми значениями имеются ввиду таблицы - inventSum, inventDim, WMSLocation. То есть как бы выбирается то же самое(хотя может быть что он просто не переходит по рекордсету?). Обычно это происходит на последней строке рекордсета.
В том то и есть дело что два раза возвращается true, и внутрь цикла заходит два раза. |
|
20.08.2009, 13:47 | #5 |
Участник
|
Цитата:
А в QA вы неправильно запрос переписали. Смотрите в отладчике Аксапты. Барабашки нет. |
|
20.08.2009, 14:27 | #6 |
Участник
|
Маззи, на самом деле иногда в Аксапте такое бывает.
Опишу пример когда у нас воспроизводился такой глюк, возможно у автора темы похожая ситуация. Делаем коррекцию проводок. Периодические операции - Закрытие и коррекция - Проводки По кнопке выбор Аксапта предлагает задать 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 | #7 |
Участник
|
Неисповедимы пути твои...
Может быть, может быть... У меня ни разу не было. Тьфу-тьфу-тьфу. |
|
20.08.2009, 15:43 | #8 |
Талантливый разгвоздяй
|
Logger, если это и правда глюк, то почему бы в Microsoft официальный запрос не отправить?
|
|
20.08.2009, 15:52 | #9 |
Участник
|
Да, действительно, queryRun инициализируется на форме, и на одном из датасорсов к нему добавляются таблицы через exists join.
При копировании query копируются оба запроса и при прохождении второй раз через qr.next() выполняется запрос с existsJoin - открывается второй курсор. Спасибо большое! |
|
20.08.2009, 16:09 | #10 |
Участник
|
|
|
20.08.2009, 21:27 | #11 |
Участник
|
Да, проверьте плз и отпишитесь здесь. Спасибо
|
|
20.08.2009, 22:09 | #12 |
MCITP
|
VORP, Logger
а X++: .fetchMode(QueryFetchMode::One2One); это, конечно, то тоже самое что тут описывалось и не факт, что поможет, но вдруг? определённое сходство в симптомах просматривается...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Logger (2). |
24.08.2009, 14:51 | #13 |
Участник
|
Цитата:
Сообщение от ZVV
VORP, Logger
а X++: .fetchMode(QueryFetchMode::One2One); это, конечно, то тоже самое что тут описывалось и не факт, что поможет, но вдруг? определённое сходство в симптомах просматривается... QueryFetchMode::One2One и QueryFetchMode::One2Many работает одинаково. |
|
Теги |
query, queryrun, баг, запрос (query), crm2011 |
|
|