Показать сообщение отдельно
Старый 20.11.2008, 11:10   #16  
Peppi is offline
Peppi
Участник
 
31 / 11 (1) +
Регистрация: 22.10.2008
Исходный запрос:
X++:
while select RecId, CostAmountPosted, CostAmountAdjustment, Qty,
                     DatePhysical, Direction from searchInventTrans
            where searchInventTrans.DatePhysical  <= endDate                            &&
                  inventTable.ItemId              == searchInventTrans.ItemId           &&
                  searchInventTrans.Direction     != InventDirection::None              &&
                  searchInventTrans.StatusIssue   != StatusIssue::OnOrder               &&
                  searchInventTrans.StatusIssue   != StatusIssue::Picked                &&
                  searchInventTrans.StatusIssue   != StatusIssue::ReservOrdered         &&
                  searchInventTrans.StatusIssue   != StatusIssue::ReservPhysical        &&
                  searchInventTrans.StatusIssue   != StatusIssue::QuotationIssue        &&
                  searchInventTrans.StatusReceipt != StatusReceipt::Registered          &&
                  searchInventTrans.StatusReceipt != StatusReceipt::Arrived             &&
                  searchInventTrans.StatusReceipt != StatusReceipt::QuotationReceipt    &&
                  searchInventTrans.StatusReceipt != StatusReceipt::Ordered
        {
            ...
        }
Меняю на
X++:
        qbds.addSelectionField(fieldnum(InventTrans,RecId));
        qbds.addSelectionField(fieldnum(InventTrans,CostAmountPosted));
        qbds.addSelectionField(fieldnum(InventTrans,CostAmountAdjustment));
        qbds.addSelectionField(fieldnum(InventTrans,Qty));
        qbds.addSelectionField(fieldnum(InventTrans,DatePhysical));
        qbds.addSelectionField(fieldnum(InventTrans,Direction));
        qbds.addRange(fieldnum(InventTrans,DatePhysical)).value(strFmt('<%1', queryValue(endDate)));
        qbds.addRange(fieldnum(InventTrans,ItemId)).value(inventTable.ItemId);
        qbds.addRange(fieldnum(InventTrans,Direction)).value(SysQuery::valueNot(InventDirection::None));
        qbds.addRange(fieldnum(InventTrans,StatusIssue)).value(strFmt("!%1, !%2, !%3, !%4, !%5"
                                                                    ,any2int(StatusIssue::OnOrder)
                                                                    ,any2int(StatusIssue::Picked)
                                                                    ,any2int(StatusIssue::ReservOrdered)
                                                                    ,any2int(StatusIssue::ReservPhysical)
                                                                    ,any2int(StatusIssue::QuotationIssue)));
        qbds.addRange(fieldnum(InventTrans,StatusReceipt)).value(strFmt("!%1, !%2, !%3, !%4"
                                                                    ,any2int(StatusReceipt::Registered)
                                                                    ,any2int(StatusReceipt::Arrived)
                                                                    ,any2int(StatusReceipt::QuotationReceipt)
                                                                    ,any2int(StatusReceipt::Ordered)));
 
        while (qr.next
        {
            searchInventTrans=qr.get(tablenum(InventTrans));
            ...
        }
Результат выполнения получается верный, но долго выполняется. Попыталась профайлером посмотреть запрос к бд - не поняла, в оригинале формируется такая строка:
X++:
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 nvarchar(8),@P2 datetime,@P3 nvarchar(42),@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 int,@P10 int,@P11 int,@P12 int,@P13 int',N'SELECT 
A.RECID,A.COSTAMOUNTPOSTED,A.COSTAMOUNTADJUSTMENT,A.QTY,A.DATEPHYSICAL,A.DIRECTION FROM INVENTTRANS A WHERE (([email="DATAAREAID=@P1"]DATAAREAID=@P1[/email]) AND ((((((((((((DATEPHYSICAL<[email="=@P2"]=@P2[/email]) AND ([email="ITEMID=@P3"]ITEMID=@P3[/email])) AND 
(DIRECTION<>@P4)) AND (STATUSISSUE<>@P5)) AND (STATUSISSUE<>@P6)) AND (STATUSISSUE<>@P7)) AND (STATUSISSUE<>@P8)) AND (STATUSISSUE<>@P9)) AND (STATUSRECEIPT<>@P10)) AND (STATUSRECEIPT<>@P11)) AND 
(STATUSRECEIPT<>@P12)) AND (STATUSRECEIPT<>@P13)))',@p5 output,@p6 output,@p7 output,N'dat','Nov 25 2005 12:00:00:000AM',N'DPI-01',0,6,3,5,4,7,3,4,6,5
select @p1, @p2, @p5, @p6, @p7
что похоже на правду,
а при измененном запросе:
X++:
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 nvarchar(8)',N'SELECT 
A.ITEMGROUPID,A.ITEMID,A.ITEMNAME,A.ITEMTYPE,A.PURCHMODEL,A.HEIGHT,A.WIDTH,A.SALESMODEL,A.DEL_COSTGROUPID,A.REQGROUPID,A.EPCMANAGER,A.PRIMARYVENDORID,A.NETWEIGHT,A.DEPTH,A.UNITVOLUME,A.BOMUNITID,A.DENSITY,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.COSTMODEL,A.USEALTITEMID,A.ALTITEMID,A.INTRACODE,A.PRODFLUSHINGPRINCIP,A.PBAITEMAUTOGENERATED,A.BOMMANUALRECEIPT,A.STOPEXPLODE,A.PHANTOM,A.INTRAUNIT,A.BOMLEVEL,A.BATCHNUMGROUPID,A.AUTOREPORTFINISHED,A.ORIGCOUNTRYREGIONID,A.STATISTICSFACTOR,A.ALTCONFIGID,A.STANDARDCONFIGID,A.PRODPOOLID,A.PROPERTYID,A.ABCTIEUP,A.ABCREVENUE,A.ABCVALUE,A.ABCCONTRIBUTIONMARGIN,A.COMMISSIONGROUPID,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.WMSPALLETTYPEID,A.ORIGSTATEID,A.DEL_STOPEXPLODEPRICE,A.WMSPICKINGQTYTIME,A.TARAWEIGHT,A.PACKAGINGGROUPID,A.SCRAPVAR,A.SCRAPCONST,A.STANDARDINVENTCOLORID,A.STANDARDINVENTSIZEID,A.ITEMDIMCOMBINATIONAUTOCREATE,A.ITEMDIMCOSTPRICE,A.ITEMIDCOMPANY,A.ALTINVENTSIZEID,A.ALTINVENTCOLORID,A.FORECASTDMPINCLUDE,A.PALLETTAGGING,A.ITEMTAGGINGLEVEL,A.FISCALLIFOAVOIDCALC,A.FISCALLIFONORMALVALUE,A.FISCALLIFOGROUP,A.FISCALLIFONORMALVALUECALC,A.BOMCALCGROUPID,A.PBAITEMCONFIGURABLE,A.PBAINVENTITEMGROUPID,A.PBAHIDEDIALOG,A.PBAHIDEAPPROVAL,A.PBAAUTOSTART,A.PBAMANDATORYCONFIG,A.PACKING_RU,A.ASSETGROUPID_RU,A.ASSETID_RU,A.INTRASTATEXCLUDE_LT,A.INTRASTATWEIGHT_CZ,A.INTRASTATPROCID_CZ,A.PKWIUCODE_PL,A.SADRATECODE_PL,A.RECVERSION,A.RECID 
FROM INVENTTABLE A WHERE ([email="DATAAREAID=@P1"]DATAAREAID=@P1[/email]) ORDER BY A.DATAAREAID,A.ITEMID',@p5 output,@p6 output,@p7 output,N'dat'
select @p1, @p2, @p5, @p6, @p7
Почему выбираются все поля из INVENTTABLE ?