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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2007, 21:39   #1  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Регистрация: 02.04.2002
Адрес: Москва
Post Query и Map
А возможно ли использовать Map в Query? Что-то с ходу не получилось...

Можно ли такой код переписать, используя Query/QueryRun?
X++:
    CustVendTrans custVendTrans;
    VendTrans vendTrans;
;
    custVendTrans = vendTrans;

    while select AccountNum, sum(AmountMST) from custVendTrans
        group by AccountNum
    {
        print custVendTrans.AccountNum;
    }
Старый 20.11.2007, 21:56   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Query же и так динамический. Если нужно извратиться, сформируйте его интеллигентно, с использованием MappingsInfo_RU.
Старый 28.01.2013, 17:50   #3  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
А подробнее?
Столкнулась с такой ситуацией: Есть мап, и есть запрос с группировкой.
X++:
//запись информации в таблицу логов
void InsertLog(FactureJour_RU    _fJour,
               FactureTransLines _fTrans, //map сопоставляющий FactureTrans_RU
                                         //и аналогичную таблицу, где поля называются по-другому
               str               _calledFrom)
{
   FactureTransLines  factureTransLines=(_ftrans);
   ;

   this.FactureId           = _fJour.FactureId;
   this.RefTableId          = _ftrans.TableId;
// так  работает
   if (this.RefTableId == tableNum(FactureLines))
   {
    this.ZEU_LineAmountMST = (select firstonly  sum(ZEU_LineAmountMST)
                              from factureLines
                              where factureLines.ZEU_FactureId == _fjour.FactureId
                                 &&  factureLines.ZEU_Module   == _fjour.Module).ZEU_LineAmountMST;
   }
   else
   {
    this.ZEU_LineAmountMST = (select firstonly  sum(LineAmountMST)
                              from factureTrans_RU
                              where factureTrans_RU.FactureId == _fjour.FactureId
                                 &&  factureTrans_RU.Module   == _fjour.Module).LineAmountMST;
   }
//А так не работает. Ошибки нет, но запрос выдает нули
/*    this.ZEU_LineAmountMST = (select firstonly  sum(LineAmountMST)
                              from factureTransLines
                              where factureTransLines.FactureId == _fjour.FactureId
                                 &&  factureTransLines.Module   == _fjour.Module).LineAmountMST;
*/
   this.CalledFrom       = _calledFrom;

   this.insert();
}
Почему запрос на мапе работает неправильно?

И сопутствующий вопрос: Как правильно из запроса получить сразу 3 переменные, как-нибудь так (т.е. не выполняя запрос для каждой переменной):
X++:
[s1,s2,s3] = (select firstonly  sum( s1 ), sum( s2 ), sum( s3 )
                              from factureLines
                              where factureLines.ZEU_FactureId == _fjour.FactureId);

Последний раз редактировалось alicedr; 28.01.2013 в 18:32.
Старый 28.01.2013, 22:07   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Просто, таким образом селект не использует табличную переменную, определенную вами

Надо делать так
X++:
//запись информации в таблицу логов
void InsertLog(FactureJour_RU    _fJour,
               FactureTransLines _fTrans, //map сопоставляющий FactureTrans_RU
                                         //и аналогичную таблицу, где поля называются по-другому
               str               _calledFrom)
{
   FactureTransLines  factureTransLines=(_ftrans);
   ;

   this.FactureId           = _fJour.FactureId;
   this.RefTableId          = _ftrans.TableId;
   select firstonly  sum(LineAmountMST)
   from factureTransLines
   where factureTransLines.FactureId == _fjour.FactureId
       &&  factureTransLines.Module   == _fjour.Module;
   this.ZEU_LineAmountMST = factureTransLines.LineAmountMST;

   this.CalledFrom       = _calledFrom;

   this.insert();
}

Цитата:
И сопутствующий вопрос: Как правильно из запроса получить сразу 3 переменные, как-нибудь так (т.е. не выполняя запрос для каждой переменной)
X++:
select sum( s1 ), sum( s2 ), sum( s3 )
from factureLines
where factureLines.ZEU_FactureId == _fjour.FactureId;
s1 = factureLines.s1;
s2 = factureLines.s2;
s3 = factureLines.s3;
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: alicedr (1).
Старый 29.01.2013, 15:24   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
а firstonly вместе с sum() точно правильно?
Старый 29.01.2013, 15:43   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от ice Посмотреть сообщение
а firstonly вместе с sum() точно правильно?
копипаст
не нужен он там, конечно
__________________
Axapta v.3.0 sp5 kr2
Старый 29.01.2013, 18:31   #7  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Согласна, firstonly там действительно не нужен

Усложняем задачу.
X++:
    //qbds = query.addDataSource(tablenum(FactureTrans_RU));
    qbds = query.addDataSource(tablenum(FactureTransLines)); //заменили на мап
    qbds.orderMode(OrderMode::GroupBy);

    qbds.addSelectionField(fieldnum(FactureTransLines, LineAmountMST), SelectionField::Sum);
    qbds.addRange(fieldnum(FactureTransLines, FactureId)).value(_factureJour.FactureId);
    qbds.addRange(fieldnum(FactureTransLines, Module)).value(SysQuery::value(_factureJour.Module));
 // и другие addRange
    qr = new QueryRun(query);
    while(qr.next())
    {
        factureTrans = qr.get(tablenum(FactureTransLines));
      //разные действия
   }
В цикл while не заходит, т.е. записей запрос не выдает.
Аналогичная конструкция с просто таблицей, а не мапом, работает.
Старый 29.01.2013, 18:53   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от alicedr Посмотреть сообщение
Согласна, firstonly там действительно не нужен

Усложняем задачу.
X++:
    //qbds = query.addDataSource(tablenum(FactureTrans_RU));
    qbds = query.addDataSource(tablenum(FactureTransLines)); //заменили на мап
    qbds.orderMode(OrderMode::GroupBy);

    qbds.addSelectionField(fieldnum(FactureTransLines, LineAmountMST), SelectionField::Sum);
    qbds.addRange(fieldnum(FactureTransLines, FactureId)).value(_factureJour.FactureId);
    qbds.addRange(fieldnum(FactureTransLines, Module)).value(SysQuery::value(_factureJour.Module));
 // и другие addRange
    qr = new QueryRun(query);
    while(qr.next())
    {
        factureTrans = qr.get(tablenum(FactureTransLines));
      //разные действия
   }
В цикл while не заходит, т.е. записей запрос не выдает.
Аналогичная конструкция с просто таблицей, а не мапом, работает.
а какой запрос покажет:
X++:
info(qbds.toString());
?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 29.01.2013, 18:55   #9  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Регистрация: 30.04.2008
Адрес: Copenhagen, Denmark
И какую из двух замапленных таблиц вы ожидаете квери должен кверить?
Старый 29.01.2013, 19:43   #10  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
362 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Мап не содержит данных, данные хранятся в таблицах. Поэтому запросы работают корректно, возвращают пусто.

Если вы хотите сделать с помощью query, то воспользуйтесь советом EVGL - использование объекта MappingsInfo_RU.

Посмотрите использование в стандарте метода MappingsInfo_RU::createMapWithFieldId.

В вашем случае будет примерно так :

X++:
Map  map = MappingsInfo_RU::createMapWithFieldId(_fTrans.TableId,tablenum(FactureTransLines));
;
...
qbds.query.addDataSource(_fTrans.tableId);
if (map.exists(fieldIdpname(FactureTransLines, FactureId)))
{
  qbds.addRange(map.lookup(fieldIdpname(FactureTransLines, FactureId))).value(_factureJour.FactureId)
}
...
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 29.01.2013 в 19:47.
За это сообщение автора поблагодарили: alicedr (1).
Теги
group by, map, query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
Dynamics AX: Map Object Sorting - a real issue Blog bot DAX Blogs 7 15.10.2008 12:02
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:38.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.