Показать сообщение отдельно
Старый 19.06.2017, 22:24   #46  
dim-gin is offline
dim-gin
Участник
 
41 / 30 (2) +++
Регистрация: 15.04.2014
Адрес: СПб
Если брать исходный текст с 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))));
В трёшке и 2009й работает. В примере объекты заменены на скл.журналы, но конструкция та же.

P.S. В стандарте, конечно же, нет полей со складами в шапке скл.журналов, добавлены вручную.

Пока строчил, уже всё порешали)))

Последний раз редактировалось dim-gin; 19.06.2017 в 22:28. Причина: опоздал с сообщением
За это сообщение автора поблагодарили: mazzy (2), smailik (1), alex55 (1).