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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2004, 17:38   #1  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
Не удается разобраться с query
Нужно получить данные из SalesPickingListJournalLine сгруппировать по ItemId, получить сумму по InventQty и вывести в отчет:
- - ItemGroup (из InventTable)
- - ItemId - - Name - - Qty

Практически то что нужно и получил, но появились дублирующие строки:

- - ItemId1 - - Name1 - - Qty1
- - ItemGroup1
- - ItemId1 - - Name1 - - Qty1
- - ItemId2 - - Name2 - - Qty2
- - ItemGroup2
- - ItemId2 - - Name2 - - Qty2

как от них избавиться?

PHP код:
   qbd query.dataSourceTable(tableNum(SalesPickingListJournalLine));
   
qbd.orderMode(OrderMode::GroupBy);
    
qbd.addSortField(fieldNum(SalesPickingListJournalLineItemId));
    
qbd.addSortField(fieldNum(SalesPickingListJournalLineName));
    
qbd.addSelectionField(fieldNum(SalesPickingListJournalLine,InventQty), SelectionField::Sum);
    
qbi qbd.addDataSource(tableNum(InventTable));
    
qbi.relations(true);
    
qbi.joinMode(JoinMode::INNERJOIN);
    
qbi.fetchMode(0);

    
qr = new QueryRun(element.query());
    while (
qr.next())
    {
        
_tmp qr.get(TableNum(SalesPickingListJournalLine));
        
_tmpGr qr.get(TableNum(InventTable));
        
ItemId _tmp.ItemId;
        
ItemName _tmp.Name;
        
ItemGroup _tmpGr.ItemGroupId;
        
qty num2str(_tmp.InventQty12223);
        
element.execute(1);
    } 
Старый 07.05.2004, 10:11   #2  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
И еще один вопрос вдогонку.
Не удается вытащить поля _tmp, например, _tmp.ItemId,
если по Itemid не было сделано каких либо операций (addSortField или SelectionField::Sum). С чем это связано?
Старый 07.05.2004, 11:08   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Посмотри запрос, который формирует Аксапта к SQL серверу - это помогает понять, что происходит.
Перед qr = .. можно добавить info(qbd.toString());
Старый 07.05.2004, 11:20   #4  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
Цитата:
Изначально опубликовано Wamr
Посмотри запрос, который формирует Аксапта к SQL серверу - это помогает понять, что происходит.
Перед qr = .. можно добавить info(qbd.toString());
У axapta свой синтаксис, прогнать через Query analyzer такой запрос не удается, а через обозреватель таблицы запрос можно проверить только для этой же таблицы.
С виду же все вроде правильно:
SELECT SUM(InventQty) FROM SalesPickingListJournalLine WHERE ((SalesId = ZKZ000226 OR SalesId = ZKZ000227)) JOIN * FROM InventTable GROUP BY InventTable.ItemGroupId ASC WHERE SalesPickingListJournalLine.Itemid = InventTable.ItemId
Старый 07.05.2004, 11:23   #5  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
Впрочем я похоже сильно протормозил - все в порядке, данные выбираются те что надо не понятно только почему я не могу их вытащить - мой второй вопрос. Не подскажите в чем дело?
Старый 07.05.2004, 11:48   #6  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Не знаю - вот этот код у меня лично все вытаскивает.

Во-первых между таблицами запроса нет relation в AOT поэтому лучше пользоваться
AddLink.

Во-вторых: вы агрегируете поля первого источника данных, а пытаетесь взять одно из полей второго, а где его агрегация ?

querybuildDATASOURCE QBD, qbi;
query query = NEW QUERY();
QUERYRUN qr;
SalesPickingListJournalLine _TMP;
INVENTTABLE _tmpGr;
ItemId ItemId;
ItemName ItemName;
ItemGroupiD ItemGroup;
STR 10 QTY;
;


qbd = query.adddatasource(tableNum(SalesPickingListJournalLine));
qbd.orderMode(OrderMode::GroupBy);
qbd.addSortField(fieldNum(SalesPickingListJournalLine, ItemId));
qbd.addSortField(fieldNum(SalesPickingListJournalLine, Name));
qbd.addSelectionField(fieldNum(SalesPickingListJournalLine,InventQty), SelectionField::Sum);

qbi = qbd.addDataSource(tableNum(InventTable));
//qbi.relations(true);
qbi.addLink(fieldNum(SalesPickingListJournalLine, itemid), fieldNum(inventTable, itemid));
qbi.joinMode(JoinMode::INNERJOIN);
qbi.fetchMode(0);
qbi.orderMode(OrderMode::GroupBy);
qbi.addSortField(fieldNum(inventTable, ItemGroupId));

qr = new QueryRun(query);
while (qr.next())
{
_tmp = qr.get(TableNum(SalesPickingListJournalLine));
_tmpGr = qr.get(TableNum(InventTable));
ItemId = _tmp.ItemId;
ItemName = _tmp.Name;
ItemGroup = _tmpGr.ItemGroupId;
qty = num2str(_tmp.InventQty, 12, 2, 2, 3);

info(ItemId);
info(ItemName);
info(ItemGroup);
info(qty);
info('-----------------------------');
}
Старый 07.05.2004, 12:23   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Изначально опубликовано Pegiy
И еще один вопрос вдогонку.
Не удается вытащить поля _tmp, например, _tmp.ItemId,
если по Itemid не было сделано каких либо операций (addSortField или SelectionField::Sum). С чем это связано?
В SQL при использовании GROUP BY нельзя получить данные, которые не входят в список агрегирующих полей (addSortField) или функций (SelectionField).
Так что Аксапта тут не виновата
Старый 11.05.2004, 16:14   #8  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
[QUOTE]Изначально опубликовано andreynikolai
Не знаю - вот этот код у меня лично все вытаскивает.

Во-первых между таблицами запроса нет relation в AOT поэтому лучше пользоваться
AddLink.

Вот здесь не совсем понятно.
Ведь я настраиваю связь в Query отчета, указываю по каким полям. Все равно надо строить связь?

Во-вторых: вы агрегируете поля первого источника данных, а пытаетесь взять одно из полей второго, а где его агрегация ?

Да, потерял при копировании. Конечно же она там есть


И все-таки ваш запрос у меня не работает, точнее работает но не группируют так как хотелось бы мне - по ItemGroupId, а внутри группы по ItemId. C подсчтетом суммы для ItemId.

И если не затруднит. Еще вот такой вопрос:
Если я хочу вызвать отчет из диалога с возможностью фильтрации по опрделенным полям, я перекрываю метод dialog() класса откуда идет вызов отчета?
Старый 11.05.2004, 16:48   #9  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Как работает связка класс-отчет (версия 2.5) можно посмотреть
на стандартном примере.

Класс VendBalanceTurnoverRegister_RU (оборотно-сальдовая ведемость по поставщику).
Старый 11.05.2004, 16:49   #10  
Pegiy is offline
Pegiy
Участник
 
159 / 10 (1) +
Регистрация: 22.04.2003
Цитата:
Изначально опубликовано Pegiy

И все-таки ваш запрос у меня не работает, точнее работает но не группируют так как хотелось бы мне - по ItemGroupId, а внутри группы по ItemId. C подсчтетом суммы для ItemId.
Опс, прошу прощения. Все разобрался, все нормально.

Остался вопрос только фильтрации пользователем - как ей управлять, полями и значениями по умолчанию
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
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, compare two fields (by link) Maxim Gorbunov DAX in English 0 22.03.2006 12:04
Проблема с составлением Query axaLearner DAX: Программирование 10 01.12.2005 15:00

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

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

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