Показать сообщение отдельно
Старый 28.09.2009, 12:26   #1  
dynamax is offline
dynamax
Участник
 
62 / 11 (1) +
Регистрация: 28.09.2009
Статистика по каждому коду номенклатуры. Как правильно построить Query?
Добрый день, необходим совет.

дело в следующем: заказчик захотел форму в которой будет отображаться расход по подразделениям, центрам, целям (физически). Форма выглядит следующим образом:

Нажмите на изображение для увеличения
Название: DeartConsum.jpg
Просмотров: 291
Размер:	38.0 Кб
ID:	5180

У формы три DataSources: InventTrans, InventTransPosting, InventDim.

Я сделал на Datasource InventTrans методу SetupRange (посмотрел в smmActivities), вот код:

X++:
public void setupRanges()
{
    ;
    dsForInventTrans                    = InventTrans_ds.query().dataSourceTable(tablenum(InventTrans));


    if(!dsForInventDim)
    dsForInventDim                      = dsForInventTrans.addDataSource(tablenum(InventDim));
    else inventTrans_DS.query().dataSourceTable(tablenum(InventDim));
    dsForInventDim.relations(true);
    dsForInventDim.joinMode(JoinMode::ExistsJoin);

    if(!dsForInventTransPostingPhysical)
    dsForInventTransPostingPhysical     = dsForInventTrans.addDataSource(tablenum(inventTransPosting));
    else inventTrans_ds.query().dataSourceTable(tablenum(inventTransPosting));
    dsForInventTransPostingPhysical.relations(true);
    dsForInventTransPostingPhysical.joinMode(JoinMode::ExistsJoin);

    rangeForItemId          = SysQuery::findOrCreateRange(dsForInventTrans, fieldnum(InventTrans, itemId));
    rangePeriod            = SysQuery::findOrCreateRange(dsForInventTransPostingPhysical, fieldnum(InventTransPosting, TransDate));
}
executeQuery на етом же DataSource :

X++:
public void executeQuery()
{

    InventSum       inventSum;
    InventTable     inventTable;
    ;

    inventTrans_DS.setupRanges();

    // Enable/Disable ranges
    if (ItemId && department.value() == true)
    {
        rangeForItemId.enabled(true);
        rangePeriod.enabled(true);
        rangeForItemId.value(itemIdFilter);
        rangePeriod.value(SysQuery::range(StartDate, EndDate));

        dsForInventTrans.addSortField(fieldnum(inventTrans, itemId));
        dsForInventTrans.addSortField(fieldId2Ext(fieldnum(InventTransPosting, Dimension), 1));
        dsForInventTrans.orderMode(OrderMode::GroupBy);
    }
    super();    
}
и вот SQL-запрос, который формируется:

X++:
SELECT * FROM InventTrans GROUP BY InventTrans.ItemId ASC, InventTrans.InvoiceId ASC WHERE ((ItemId = N'M0001')) EXISTS JOIN * FROM InventDim WHERE InventTrans.inventDimId = InventDim.inventDimId EXISTS JOIN * FROM InventTransPosting WHERE InventTrans.InventTransId = InventTransPosting.InventTransId AND ((TransDate>={ts '2008-09-01 00:00:00.000'} AND TransDate<={ts '2009-09-28 00:00:00.000'}))
по каким-то причинам не происходит группировка по InventTransPosting.Dimension[1]. Если у кого-нибудь есть идеи, буду благодарен.


P.S. Группировка по Центру и Цели происходит таким-же образом? и как мне лучще всего выяснить Кол-во и Цену?