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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.07.2004, 13:29   #1  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Query и exists join с group by
Добрый день!

Возникла такая задача: есть некий журнал изменения состояний объектов StatesLog. В нем несколько полей, в том числе: поле-идентификатор объекта (ObjectId), поле с кодом состояния (StateId), поле даты изменения состояния (ChgDate). Состояния каждого объекта меняются не чаще 1 раза в сутки. Необходимо сделать режим отображения только текущих состояний объектов, но отображать при этом все поля журнала.
Что сделал я: попытался присоединить StatesLog к самой себе по exists join, линк по полям ObjectId и ChgDate, с установленной группировкой по ObjectId и выбором максимума по ChgDate. Вот код метода init():
PHP код:
    QueryBuildDatasource qbds;

    
super();
    
qbds StatesLog_Q.dataSourceTable(tableNum(StatesLog)).addDataSource(tableNum(StatesLog));
    
qbds.joinMode(JoinMode::ExistsJoin);
    
qbds.fetchMode(0);
    
qbds.addLink(fieldNum(StatesLogChgDate),     fieldNum(StatesLogChgDate));
    
qbds.addLink(fieldNum(StatesLogObjectId), fieldNum(StatesLogObjectId));
    
qbds.addSelectionField(fieldNum(StatesLogChgDate), SelectionField::Max);
    
qbds.addSelectionField(fieldNum(StatesLogObjectId));
    
qbds.orderMode(OrderMode::GroupBy);
    
qbds.addSortField(fieldNum(StatesLogObjectId)); 
АХАРТА генерит правильный запрос на Х++, но при переводе его в SQL зачем-то добавляет лишнюю внешнюю группировку по ObjectId, используя при этом алиас из внутреннего запроса, на что SQL ругается со словами "Не знаю такого алиаса или таблицы". Т.е. видно, что в запросе присутствуют две абсолютно одинаковые фразы group by, во внутреннем и внешнем запросе.

1. Как вы думаете, почему так происходит и как это побороть?
2. Может быть, есть другой способ решить задачу? Не забываем, что нужно отображать все поля журнала. Группировку по всем полям не предлагать, с этим есть проблемы, т.к. я привел упрощенный вариант задачи.

АХАРТА 3.0СП2

Спасибо
__________________
Андрей.
Старый 15.07.2004, 14:49   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Попробуй убрать
PHP код:
qbds.addSortField(fieldNum(StatesLogObjectId)); 
Старый 15.07.2004, 14:58   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Не знаю, как это выразить через Query...
PHP код:
    while select statesLog1
    notexists join statesLog2
            where statesLog2
.ObjectId == statesLog1.ObjectId &&
                  
statesLog2.ChgDate  >  statesLog1.ChgDate 
Старый 15.07.2004, 15:12   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
2 Raz:
Нельзя убрать, это команда, как раз создающая выражение "group by ObjectId". Мне же нужно сгруппировать по объектам.
__________________
Андрей.
Старый 15.07.2004, 16:18   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Андрей,
а как должен выглядеть на SQL запрос с EXISTS?
Старый 16.07.2004, 12:46   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Чтой-то я сам не могу догнать, как это может выглядеть на SQL. Похоже, через EXISTS никак; по крайней мере то, что я попытался набросать на SQL, не сработало.
Ну что-ж, спасибо всем, потратившим свое время на это дело
__________________
Андрей.
Старый 21.07.2004, 16:41   #7  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Talking Умный совет :-)
Нарисуй вьюху с группировкой по ObjectId и агрегирующей функцией MAX(ChgDate) и вот эту вьюху с StatesLog в своем query и вяжи. Правильно то, что просто!
__________________
Бесты и регарды!
Старый 21.07.2004, 19:12   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Реально работает, спасибо!
Не привык еще к этим новшествам, вьюхам всяким, после 2.5
__________________
Андрей.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с Exists Join Logger DAX: Программирование 28 28.04.2010 02:54
axStart: Cannot mix old-style sorting with new-style Group By or Order By on a query. Blog bot DAX Blogs 0 06.11.2008 12:05
Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице gl00mie DAX: Программирование 10 14.02.2007 13:22
Вопрос по query и join tischenko DAX: Программирование 2 20.07.2005 13:05

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

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

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