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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.10.2006, 14:34   #1  
Jarad is offline
Jarad
Участник
 
3 / 10 (1) +
Регистрация: 30.06.2006
Вопрос по Query с агрегатной функцией
Пытаюсь написать запрос типа:
Код:
select SUM(IT.CostAmountPosted)
from INVENTTRANS IT
inner join InventDim InvDim ON InvDim.InventDimId = IT.InventDimId
where (IT.DateFinancial >= '20060901') AND (IT.DateFinancial <= '20060930')AND (IT.StatusReceipt = 1)
]
Query делал в таком вот виде:
Код:
 
qbd = queryExt.addDataSource(tableNum(InventTrans));
qbd.addSelectionField(fieldNum(InventTrans ,CostAmountPosted),SelectionField::Sum) ;
qbd.addRange(fieldNum(InventTrans, DateFinancial)).value(SysQuery::range(bMth,eMth));
qbd.addRange(fieldNum(InventTrans, StatusReceipt)).value(Enum2Str(StatusReceipt::Purchased));
qbd.orderMode(OrderMode::GroupBy);

qbd = queryExt.dataSourceTable(tableNum(InventTrans)).addDataSource(tableNum(InventDim));
   qbd.addLink(fieldNum(InventTrans,InventDimId),fieldNum(InventDim,InventDimId));
   qbd.joinMode(JoinMode::InnerJoin);
   qbd.fetchMode(QueryFetchMode::One2Many);
   qbd.addSortField(fieldNum(InventDim, InventDimId));
   qbd.orderMode(OrderMode::GroupBy);
Но в этом случае группировка будет идти по полю InventDim.InventDimId, и результатом будет не одна общая сумма, а сгрупированые по этому полю. Если же не указать qbd.addSortField, то вобще выскакиевает ошибка... Нужно ли указівать какое то поле в addSortField и каким образом?
Старый 28.10.2006, 16:29   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Честно говоря, не совсем понятно, зачем вы join-ите дополнительно InventDim, если она не учавствует никак в фильтрации или группировке.

Но решить вашу проблему можно очень просто.
Добавить поле выбора на таблицу InventDim:

вместо этого:
X++:
    qbd.addLink(fieldNum(InventTrans,InventDimId),fieldNum(InventDim,InventDimId));
    qbd.joinMode(JoinMode::InnerJoin);
    qbd.fetchMode(QueryFetchMode::One2Many);
    qbd.addSortField(fieldNum(InventDim, InventDimId));
    qbd.orderMode(OrderMode::GroupBy);
вставляем вот это:
X++:
    qbd.relations(true);
    qbd.addSelectionField(fieldNum(InventDim, InventDimId), SelectionField::Max);
Успехов!
Старый 28.10.2006, 17:27   #3  
ALES is offline
ALES
Участник
Злыдни
 
220 / 45 (2) +++
Регистрация: 11.08.2004
Цитата:
Сообщение от Jarad Посмотреть сообщение
Нужно ли указівать какое то поле в addSortField и каким образом?
Есть такое поле tableId..когда список выбора должен быть пуст, помогает))
Старый 30.10.2006, 12:31   #4  
Jarad is offline
Jarad
Участник
 
3 / 10 (1) +
Регистрация: 30.06.2006
Спасибо, помогает.
Просто меня интересовала сама специфика решения такого вопроса, запрос - прсто часть задачи, и на InventDim и фильтры накладываться будут и еще джойниться таблицы.
А с помощью обычного select запрос такого типа реализуется? Что то типа:
X++:
select SUM(CostAmountPosted) from invTrans
        join invDim .... 
        where .....
Старый 30.10.2006, 12:37   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Jarad Посмотреть сообщение
Спасибо, помогает.
Просто меня интересовала сама специфика решения такого вопроса, запрос - прсто часть задачи, и на InventDim и фильтры накладываться будут и еще джойниться таблицы.
А с помощью обычного select запрос такого типа реализуется? Что то типа:

X++:

select SUM(CostAmountPosted) from invTrans
join invDim ....
where .....


Нет.
Нельзя одновременно выбирать и агрегатные поля и обычные.
Получите точно такую же ошибку:
Код:
    InventTrans IT;
    InventDim   InvDim;
    ;
    select SUM(CostAmountPosted)
    from IT
    join InvDim
    where InvDim.InventDimId == IT.InventDimId &&
    IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) &&  IT.StatusReceipt == 1;
Старый 30.10.2006, 12:53   #6  
Morpheus is offline
Morpheus
Участник
Аватар для Morpheus
Соотечественники
 
602 / 167 (7) ++++++
Регистрация: 30.03.2005
Адрес: Київ-København-Düsseldorf
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Нет.
Нельзя одновременно выбирать и агрегатные поля и обычные.
Можно использовать maxof() или minof() для этих целей!
Старый 30.10.2006, 12:55   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Morpheus Посмотреть сообщение
Можно использовать maxof() или minof() для этих целей!
См. пост выше.
Цитата:
Сообщение от kashperuk Посмотреть сообщение
вставляем вот это:

X++:

qbd.relations(true);
qbd.addSelectionField(fieldNum(InventDim, InventDimId), SelectionField::Max);




Успехов!
Старый 30.10.2006, 16:13   #8  
Jarad is offline
Jarad
Участник
 
3 / 10 (1) +
Регистрация: 30.06.2006
Попробовал реализовать запрос через выражение select
X++:
 select Sum(CostAmountPosted) from invTrans
        join maxof(InventDimId) from invDim
        where (invDim.inventDimId == invTrans.inventDimId) &&
        (invTrans.DateFinancial >= bMth) && (invTrans.DateFinancial <= eMth) &&  
        (invTrans.StatusReceipt == StatusReceipt::Purchased);
т.е. если использовать вместо поля выборки в приджойненой таблице тот же maxof(), то получаем тот же самый результат?
Старый 30.10.2006, 16:31   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Именно.
Это же на самом деле одно и то же, что и через QueryBuild*
Старый 30.10.2006, 16:49   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну, вообще-то, можно еще exists join сделать
X++:
    select SUM(CostAmountPosted)
    from IT
    where IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) &&  IT.StatusReceipt == 1
    exists join InvDim
    where InvDim.InventDimId == IT.InventDimId;
только условия выборки разнести
__________________
Axapta v.3.0 sp5 kr2
Старый 31.10.2006, 19:35   #11  
ALES is offline
ALES
Участник
Злыдни
 
220 / 45 (2) +++
Регистрация: 11.08.2004
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Нет.
Нельзя одновременно выбирать и агрегатные поля и обычные.
Получите точно такую же ошибку:
Код:
    InventTrans IT;
    InventDim   InvDim;
    ;
    select SUM(CostAmountPosted)
    from IT
    join InvDim
    where InvDim.InventDimId == IT.InventDimId &&
    IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) &&  IT.StatusReceipt == 1;
Можно только осторожно
Вот так напишите и будет вам счастье
Код:
    select SUM(CostAmountPosted)
    from IT
    join tableId from InvDim
    where InvDim.InventDimId == IT.InventDimId...
Старый 31.10.2006, 21:10   #12  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Еще можно добавлять группировку по полям, по которым идет фильтрация, например StatusIssue
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Очередной вопрос про Query rkrivov DAX: Программирование 45 16.10.2013 19:16
Сортировка по полю с агрегатной функцией Lucky13 DAX: Программирование 10 19.10.2005 18:02
Вопрос по query и join tischenko DAX: Программирование 2 20.07.2005 13:05
Вопрос по запросу (query) Александр_1975 DAX: Программирование 2 23.01.2004 17:35
Вопрос знатокам QBE и Query в AXAPTA Maxim Gorbunov DAX: Программирование 6 27.12.2002 13:19

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

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

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