AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.12.2008, 09:31   #1  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Прошу прощения за запутанность вопроса. Спасибо всем, кто ответил.
Там должно быть
queryRun = new QueryRun(query); (без подчеркивания)
Считать сумму Qty сразу же в запросе query нельзя, т.к. ее подсчет зависит от некоторых условий, налагаемых позже.

Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical.
Старый 02.12.2008, 10:23   #2  
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).
Старый 02.12.2008, 10:40   #3  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Спасибо, Petergunn.
Насколько я понимаю, Ваш код считает сумму поля Qty для StatusIssue == OnOrder || StatusIssue == ReservPhysical.
Мне же, фактически, нужно 2 суммы Qty, чтобы отдельно их вывести в поля QtyOnOrder и QtyReservPhyical
Старый 02.12.2008, 10:43   #4  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
Цитата:
Сообщение от Silphidae Посмотреть сообщение
Спасибо, Petergunn.
Насколько я понимаю, Ваш код считает сумму поля Qty для StatusIssue == OnOrder || StatusIssue == ReservPhysical.
Мне же, фактически, нужно 2 суммы Qty, чтобы отдельно их вывести в поля QtyOnOrder и QtyReservPhyical
Там считаются суммы количеств в разрезе номенклатур и статусов расхода. Также на статус наложен фильтр. В теле цикла проверяете поле StatusIssue.
X++:
 switch(  InventTrans.StatusIssue )
        {
            case StatusIssue::OnOrder :
                //  код по обработке статуса StatusIssue::OnOrder
                break ;
            case StatusIssue::ReservPhysical :
                //  код по обработке статуса StatusIssue::StatusIssue::ReservPhysical
                break ;
        }
Возможно просто незаметна полоса прокрутки в сообщении Petergunn. Я не сразу заметил
Старый 02.12.2008, 10:48   #5  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от Silphidae Посмотреть сообщение
Спасибо, Petergunn.
Насколько я понимаю, Ваш код считает сумму поля Qty для StatusIssue == OnOrder || StatusIssue == ReservPhysical.
Мне же, фактически, нужно 2 суммы Qty, чтобы отдельно их вывести в поля QtyOnOrder и QtyReservPhyical
Вы их и получите в отдельности т.к. в query наложена группировка по ItemId + StatusIssue:
Результат запроса выглядит примерно так:
Item_1 - OnOrder - количество_1
Item_1 - ReservPhysical - количество_2
Item_2 - OnOrder - количество_3
Item_3 - ReservPhysical - количество_4
Старый 02.12.2008, 11:08   #6  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Спасибо большое. Разобрался, все работает.
Тему можно закрыть.
Старый 02.12.2008, 10:30   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Silphidae Посмотреть сообщение
Смысл сводился к тому, что в таблице InventTrans есть поля ItemId, StatusIssue и Qty, причем, может быть несколько записей с одинаковым значением ItemId. В запросе query на таблицу накладывается некоторый фильтр. И из результата query сначала нужно сосчитать сумму Qty в тех случаях, когда StatusIssue равно OnOrder, а затем когда StatusIssue равно ReservPhysical.
тогда понятно..
на чистом SQL, конечно, такие задачи на порядок проще решаются.

А здесь я вижу 2 варианта:
1. делать 2 квери (для каждого статуса)
2. завёсти 2 "mapа" ItemId->Qty
и дальше case (inventTrans.StatusIssue )
OnOrder: добавляем (или суммируем) в мап1 очередное кол-во по itemid
ReservPhysical: добавляем (или суммируем) в мап2 очередное кол-во по itemid
в итоге имеем мапы по всем номенклатурам с кол-вами по каждому статусу.
как-то так, надеюсь понятно выразился?
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
Простой QueryRun не работает miklenew DAX: Программирование 13 20.01.2009 14:17
OZKA's DAX Journal: Join между временной и постоянной таблицей через QueryRun. Blog bot DAX Blogs 12 14.01.2009 17:34
Вопрос по QueryBuildDataSource, QueryBuildRange и QueryRun Paul_ST DAX: Программирование 9 11.02.2004 17:13
Как же все-таки организованиы Query и QueryRun? VIS DAX: Программирование 4 03.07.2003 15:22

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:22.