19.06.2017, 22:24 | #11 |
Участник
|
Если брать исходный текст с Query, то можно попробовать указать fetch mode 1:1 явно у всех DS (кроме первого, разумеется).
Если я правильно понял задачу, требуется что-то типа такого: X++: Query q; QueryBuildDataSource qbdsIJT, qbdsIJTr, qbdsIL, qbdsIT; QueryBuildRange qbr; QueryRun qr; ; q = new Query(); // смысл group by мне непонятен qbdsIJT = q.addDataSource(tablenum(InventJournalTable)); // qbdsIJT.orderMode(OrderMode::GroupBy); qbdsIJT.addSelectionField(fieldNum(InventJournalTable, JournalId), SelectionField::Database); qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationId), SelectionField::Database); qbdsIJT.addSelectionField(fieldNum(InventJournalTable, InventLocationIdTo), SelectionField::Database); qbdsIJT.addRange(fieldnum(InventJournalTable, JournalNameId)).value('ПРС'); qbdsIJTr = qbdsIJT.addDataSource(tablenum(InventJournalTrans)); qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventTransId), SelectionField::Database); qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, ItemId), SelectionField::Database); qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, InventDimId), SelectionField::Database); qbdsIJTr.addSelectionField(fieldNum(InventJournalTrans, Qty), SelectionField::Database); qbdsIJTr.relations(true); qbdsIJTr.joinMode(JoinMode::InnerJoin); // qbdsIJTr.orderMode(OrderMode::GROUPBY); qbdsIJTr.fetchMode(QueryFetchMode::One2One); qbdsIT = qbdsIJTr.addDataSource(tableNum(InventTable)); qbdsIT.relations(true); qbdsIT.addSelectionField(fieldNum(InventTable, ItemName), SelectionField::Database); qbdsIT.addSelectionField(fieldNum(InventTable, ItemGroupId), SelectionField::Database); qbdsIT.joinMode(joinMode::InnerJoin); // qbdsItl.orderMode(OrderMode::GROUPBY); qbdsIT.fetchMode(QueryFetchMode::One2One); // можно объединить 2 DS в одну конструкцию qbdsIT = qbdsIJT.addDataSource(tableNum(InventLocation)); qbdsIT.fetchMode(QueryFetchMode::One2One); qbdsIT.joinMode(JoinMode::ExistsJoin); qbdsIT.relations(false); // это на самом деле relation qbr = qbdsIT.addRange(fieldNum(InventLocation, InventLocationId)); qbr.value(strFmt('(%1.%2 = %4.%5) || (%1.%3 = %4.%5)', qbdsIJT.name(), fieldStr(InventJournalTable, InventLocationId), fieldStr(InventJournalTable, InventLocationIdTo), qbdsIT.name(), fieldStr(InventLocation, InventLocationId)) ); // прочие условия (на справочник складов) //qbdsIT.addRange(fieldNum(... // проверка, что не потерялся какой-нибудь DS qr = new QueryRun(q); if (qr.next()) info(strFmt('%1 %2 %3', qr.get(tableNum(InventJournalTable)).(fieldNum(InventJournalTable, JournalId)), qr.get(tableNum(InventJournalTrans)).(fieldNum(InventJournalTrans, InventTransId)), qr.get(tableNum(InventTable)).(fieldNum(InventTable, ItemName)) )); info('DAX query: '+qbdsIJT.toString()); info(strFmt('Query qty: %1', SysQuery::qrCount(new QueryRun(q)))); P.S. В стандарте, конечно же, нет полей со складами в шапке скл.журналов, добавлены вручную. Пока строчил, уже всё порешали))) Последний раз редактировалось dim-gin; 19.06.2017 в 22:28. Причина: опоздал с сообщением |
|
|
За это сообщение автора поблагодарили: mazzy (2), smailik (1), alex55 (1). |