Показать сообщение отдельно
Старый 04.04.2006, 14:57   #11  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Я все-таки настаиваю на обязательности связки InventSerial.itemId = InventSum.itemId по той причине, что в таблице InventSerial уникальность поддерживается совокупностью полей ItemId и inventSerialId, и предлагаю свой вариант решения:

PHP код:
    Query                   query;
    
QueryRun                qr;
    
QueryBuildDataSource    qbdsSum;
    
QueryBuildDataSource    qbdsDim;
    
QueryBuildDataSource    qbdsSerial;
    
QueryBuildRange         qbrItemSerial;
    ;

    
query       =   new Query();
    
qbdsSum     =   query.addDataSource(tableNum(InventSum));
    
qbdsSum.orderMode(OrderMode::GroupBy);
    
qbdsSum.addSortField(fieldnum(InventSumitemId));
    
qbdsSum.addSelectionField(fieldnum(InventSumitemId));
    
qbdsSum.addSelectionField(fieldnum(InventSumPostedQty), Selectionfield::Sum);
    
qbdsSum.addSelectionField(fieldnum(InventSumPostedValue), Selectionfield::Sum);

    
qbdsDim     =   qbdsSum.addDataSource(tableNum(InventDim));
    
qbdsDim.orderMode(OrderMode::GroupBy);
    
qbdsDim.addSortField(fieldnum(InventDiminventDimId));
    
qbdsDim.addSortField(fieldnum(InventDiminventSerialId));
    
qbdsDim.addSelectionField(fieldnum(InventDiminventDimId));
    
qbdsDim.addSelectionField(fieldnum(InventDiminventSerialId));
    
qbdsDim.joinMode(JoinMode::InnerJoin);
    
qbdsDim.fetchMode(0);
    
qbdsDim.addLink(fieldNum(InventSuminventDimId), fieldNum(InventDiminventDimId));
    
qbdsDim.addRange(fieldNum(InventDiminventSerialId)).value(SysQuery::valueNotEmptyString());

    
qbdsSerial  =   qbdsDim.addDataSource(tableNum(InventSerial));
    
qbdsSerial.orderMode(OrderMode::GroupBy);
    
qbdsSerial.addSortField(fieldNum(InventSerialProdDate));
    
qbdsSerial.addSelectionField(fieldNum(InventSerialProdDate));
    
qbdsSerial.joinMode(JoinMode::InnerJoin);
    
qbdsSerial.fetchMode(0);
    
qbdsSerial.addLink(fieldNum(InventDimInventSerialId), fieldNum(InventSerialInventSerialId));
    
qbrItemSerial qbdsSerial.addRange(fieldNum(InventSerialitemId));
    
qbrItemSerial.value(strfmt("(%1) = %2.%3"fieldstr(InventSerialitemId), qbdsSum.name(), fieldstr(InventSumitemId)));

    
qr = new QueryRun(query);
    while (
qr.next())
    {
        
// тут обработка результатов запроса...
    

Примечание: Так как я меня в таблице InventSerial не оказалось поля AdvertAction, я заменил его на ProdDate, но сути это не меняет.

А вот что выдал трассировщик SQL по этому вопросу:
Код:
SELECT SUM(A.POSTEDQTY),SUM(A.POSTEDVALUE),A.ITEMID,B.INVENTDIMID,B.INVENTSERIALID,C.PRODDATE FROM INVENTSUM A,INVENTDIM B,INVENTSERIAL C WHERE (A.DATAAREAID='zkr') AND ((B.DATAAREAID='zkr') AND ( NOT ((B.INVENTSERIALID=' ')) AND (A.INVENTDIMID=B.INVENTDIMID))) AND ((C.DATAAREAID='zkr') AND ((C.ITEMID=A.ITEMID) AND (B.INVENTSERIALID=C.INVENTSERIALID))) GROUP BY A.ITEMID,B.INVENTDIMID,B.INVENTSERIALID,C.PRODDATE ORDER BY A.ITEMID,B.INVENTDIMID,B.INVENTSERIALID,C.PRODDATE OPTION(FAST 16)