Показать сообщение отдельно
Старый 02.12.2008, 10:23   #5  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
GroupBy + Range
Цитата:
Сообщение от Silphidae Посмотреть сообщение
Считать сумму Qty сразу же в запросе query нельзя, т.к. ее подсчет зависит от некоторых условий, налагаемых позже.

Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical.
Судя по Вашему описанию сумму по StatusIssue наверное можно подсчитать в основном запросе если наложить группировку по этому полю и ограничить значения фильтрами по StatusIssue и ReservPhysical:
X++:
static void jbGroupByStatusIssue(Args _args)
{
    InventTrans             inventTrans ;
    QueryRun                queryRun    ;
    Query                   query = new Query() ;
    QueryBuildDataSource    qbdsInventTrans = query.addDataSource( tableNum( InventTrans ) ) ;
    ;

    qbdsInventTrans.orderMode( OrderMode::GroupBy ) ;
    qbdsInventTrans.addSortField( fieldNum(InventTrans, ItemId) ) ;
    qbdsInventTrans.addSelectionField( fieldNum( InventTrans, Qty), SelectionField::Sum ) ;

    queryRun = new QueryRun( query ) ;
    //  для примера - доп. условия налагаемые пользователем
    if( !queryRun.prompt() )
        return ;

    //  наложить группировку по inventTrans.StatusIssue и ограничить значения группировки
    queryRun.query().dataSourceTable(tableNum( InventTrans )).addSortField( fieldNum(InventTrans, StatusIssue ) );
    queryRun.query().dataSourceTable(tableNum( InventTrans )).addRange( fieldNum( InventTrans, StatusIssue ) ).value( SysQuery::value( StatusIssue::OnOrder ) ) ;
    queryRun.query().dataSourceTable(tableNum( InventTrans )).addRange( fieldNum( InventTrans, StatusIssue ) ).value( SysQuery::value( StatusIssue::ReservPhysical ) ) ;
    
    while( queryRun.next() )
    {
        inventTrans = queryRun.get( tableNum( InventTrans ) ) ;
        info( strfmt( "%1 (%2): %3", InventTrans.ItemId, InventTrans.StatusIssue, InventTrans.Qty ) ) ;

        switch(  InventTrans.StatusIssue )
        {
            case StatusIssue::OnOrder :
                //  код по обработке статуса StatusIssue::OnOrder
                break ;
            case StatusIssue::ReservPhysical :
                //  код по обработке статуса StatusIssue::StatusIssue::ReservPhysical
                break ;
        }
    }
}
За это сообщение автора поблагодарили: Silphidae (1).