Я все-таки настаиваю на обязательности связки
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(InventSum, itemId));
qbdsSum.addSelectionField(fieldnum(InventSum, itemId));
qbdsSum.addSelectionField(fieldnum(InventSum, PostedQty), Selectionfield::Sum);
qbdsSum.addSelectionField(fieldnum(InventSum, PostedValue), Selectionfield::Sum);
qbdsDim = qbdsSum.addDataSource(tableNum(InventDim));
qbdsDim.orderMode(OrderMode::GroupBy);
qbdsDim.addSortField(fieldnum(InventDim, inventDimId));
qbdsDim.addSortField(fieldnum(InventDim, inventSerialId));
qbdsDim.addSelectionField(fieldnum(InventDim, inventDimId));
qbdsDim.addSelectionField(fieldnum(InventDim, inventSerialId));
qbdsDim.joinMode(JoinMode::InnerJoin);
qbdsDim.fetchMode(0);
qbdsDim.addLink(fieldNum(InventSum, inventDimId), fieldNum(InventDim, inventDimId));
qbdsDim.addRange(fieldNum(InventDim, inventSerialId)).value(SysQuery::valueNotEmptyString());
qbdsSerial = qbdsDim.addDataSource(tableNum(InventSerial));
qbdsSerial.orderMode(OrderMode::GroupBy);
qbdsSerial.addSortField(fieldNum(InventSerial, ProdDate));
qbdsSerial.addSelectionField(fieldNum(InventSerial, ProdDate));
qbdsSerial.joinMode(JoinMode::InnerJoin);
qbdsSerial.fetchMode(0);
qbdsSerial.addLink(fieldNum(InventDim, InventSerialId), fieldNum(InventSerial, InventSerialId));
qbrItemSerial = qbdsSerial.addRange(fieldNum(InventSerial, itemId));
qbrItemSerial.value(strfmt("(%1) = %2.%3", fieldstr(InventSerial, itemId), qbdsSum.name(), fieldstr(InventSum, itemId)));
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)