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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.12.2008, 17:44   #1  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Вопрос про QueryRun
Здравствуйте, помогите, пожалуйста, с такой ситуацией.

Query query;
QueryBuildDataSource qbDS;
QueryBuildRange qbr;
query = new Query();
qbDS = query.addDataSource(tableNum(InventTrans));
qbDS.addSortField(fieldNum(InventTrans, ItemId));
qbDS.addRange(fieldNum(InventTrans, TransType)).value(SysQuery::value(InventTransType::Sales));
qbDS.orderMode(OrderMode::GroupBy);
qbDS.addSelectionField(fieldNum(InventTrans,Qty));
qbDS.addSelectionField(fieldNum(InventTrans,ItemId));
queryRun = new QueryRun(_query);
while (queryRun.next())
{
inventTrans = queryRun.get(tableNum(InventTrans));
здесь нужно написать запрос, который будет брать данные из inventTrans с некоторыми условиями и считать сумму по полю Qty
}
проблема в том, что нужно писать запрос не из таблицы InventTrans а из полученных запросом query данных. Если я делаю запрос над этими данными inventTrans, то они ломают весь цикл, так как функция get() берет последнее значение inventTrans (которое я модифицирую своим запросом) перед next().
Запутанно получилось.. Подскажите, как быть.
Старый 01.12.2008, 17:53   #2  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
Запутано.
А что у Вас за запрос _query?
Если он возвращает по одной записи из InventTrans, то почему-бы не сделать
X++:
 query = new Query(_query);
и на него накладывать небходимые группировки и условия?
Либо просто опишите - какого рода необходим запрос. Так будет понятнее
За это сообщение автора поблагодарили: Silphidae (1).
Старый 01.12.2008, 18:00   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Не понятно вообще.
Напишите лучше, что вам нужно получить целиком, или переформулируйте данный вопрос попонятнее.

Цитата:
проблема в том, что нужно писать запрос не из таблицы InventTrans а из полученных запросом query данных
Как это понимать? У вас уже есть ResultSet. Ещё раз из него запрос? Какой смысл?
Подправьте кверю, чтоб она сразу делала то что вам нужно.

Функция get() берет значение inventTrans из квери, из очередной полученной записи.
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Silphidae (1).
Старый 02.12.2008, 09:31   #4  
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   #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).
Старый 02.12.2008, 10:30   #6  
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
Старый 02.12.2008, 10:40   #7  
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   #8  
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   #9  
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   #10  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Спасибо большое. Разобрался, все работает.
Тему можно закрыть.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 09:29.