Показать сообщение отдельно
Старый 19.06.2017, 20:09   #36  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Ларчик у меня открылся вот как. Изначально почитав http://www.axaptapedia.com/Expressions_in_query_ranges я использовал ExistsJoin. Потом спасибо S.Kuskov тип связи изменился на InnerJoin. И тогда встал вопрос, а почему структура query до сих пор такая? Почему бы не поднять InventLocation выше? Поднял и все заработало. Код который бил показан он тестовый и поэтому упрошенный. Сейчас рабочий код выглядит так
X++:
qbds = query.addDataSource(tablenum(InventTransferTable));

    qbds.orderMode(OrderMode::GroupBy);
    qbds.addSortField(fieldnum(InventTransferTable, TransferId));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTo));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdFrom));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdTransit));
    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater));
    qbds.addSortField(fieldnum(InventTransferTable, ReceiveDate));
    qbds.addSortField(fieldnum(InventTransferTable, TransferStatus));

    qbds.addSortField(fieldnum(InventTransferTable, InventLocationIdLater));

    if (fromDate && toDate)//Дата
    {
       qbds.addRange(fieldnum(InventTransferTable, ReceiveDate)).value(strfmt('%1..%2', fromDate, toDate));
    }

    if (receivedOnly)
    {
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received));
    }
    else
    {
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Shipped));
        qbds.addRange(fieldnum(InventTransferTable, TransferStatus)).value(QueryValue(InventTransferStatus::Received));
    }

    if (inventLocationId_From)//Отправлено Откуда
    {
        qbds.addRange(fieldnum(InventTransferTable, InventLocationIdFrom)).value(inventLocationId_From);
    }

    if (inventLocationId_To)//Отправлено Куда
    {
        qbds.addRange(fieldnum(InventTransferTable, InventLocationIdTo)).value(inventLocationId_To);
    }
    
    if (inventLocationType != InventLocationType::Standard)
    {
        qbdsInventLocationFrom = qbds.addDataSource(tablenum(InventLocation));
        qbdsInventLocationFrom.addLink(fieldNum(InventTransferTable, InventLocationIdFrom), fieldNum(InventLocation, InventLocationId));
        qbdsInventLocationFrom.joinMode(JoinMode::InnerJoin);
        qbdsInventLocationFrom.fetchMode(QueryFetchMode::One2One);

        qbdsInventLocationTo = qbds.addDataSource(tableNum(InventLocation));
        qbdsInventLocationTo.addLink(fieldNum(InventTransferTable, InventLocationIdTo), fieldNum(InventLocation, InventLocationId));
        qbdsInventLocationTo.joinMode(JoinMode::InnerJoin);
        qbdsInventLocationTo.fetchMode(QueryFetchMode::One2One);

        qbrDataAreaId = qbdsInventLocationTo.addRange(fieldNum(InventLocation, DataAreaId));
        qbrDataAreaId.value(strFmt('((%1.%3 == %4) || (%2.%3 == %4))',
            qbdsInventLocationFrom.name(),
            qbdsInventLocationTo.name(),
            fieldStr(InventLocation, InventLocationType),
            any2int(inventLocationType)));
    }

    qbds1 = qbds.addDataSource(tablenum(InventTransferLine));
    qbds1.addLink(fieldnum(InventTransferTable, TransferId), fieldnum(InventTransferLine , TransferId));
    qbds1.joinMode(JoinMode::InnerJoin);
    qbds1.orderMode(OrderMode::GROUPBY);
    qbds1.fetchMode(QueryFetchMode::One2One);
    qbds1.addSortField(fieldnum(InventTransferLine, ItemId));
    qbds1.addSortField(fieldnum(InventTransferLine, Out_ItemId));
    qbds1.addSortField(fieldnum(InventTransferLine, QtyTransfer));

    qbds2 = qbds1.addDataSource(tableNum(InventSum));
    qbds2.addLink(fieldnum(InventTransferLine, ItemId), fieldNum(InventSum, ItemId));
    qbds2.joinMode(joinMode::InnerJoin);
    qbds2.orderMode(OrderMode::GROUPBY);
    qbds2.fetchMode(QueryFetchMode::One2One);
    qbds2.addSortField(fieldnum(InventSum, ItemId));
    qbds2.addSelectionField(fieldnum(InventSum, ReservPhysical), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, PostedQty), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Received), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Deducted), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Registered), SelectionField::SUM);
    qbds2.addSelectionField(fieldnum(InventSum, Picked), SelectionField::SUM);

    qbds2.addRange(fieldnum(InventSum, Closed)).value(SysQuery::value(NoYes::No));

    qbds2.addRange(fieldNum(InventSum, PhysicalInvent)).value("> 0");

    queryRun = new QueryRun(query);
За это сообщение автора поблагодарили: mazzy (2).