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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.04.2008, 15:56   #1  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
Суммы по двум таблицам
Всем привет!
Есть задача посчитать суммы в двух связанных(1:n) таблицах сгруппировав их по полю.
такой запрос приводит к неправильному результату, т.е. суммы в первой таблице считаются несколько раз (сколько записей во второй):
X++:
while select sum(LineAmount) from Table1 
	group by Table1.ItemId
	join sum(Qty), sum(CostAmount) from Table2 
		where Table1.Id = Table2.Id
как правильно можно посчитать одним запросом?
Старый 02.04.2008, 16:17   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
По-моему, никак. Делайте вложенными циклами...
__________________
Zhirenkov Vitaly
Старый 03.04.2008, 11:39   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
X++:
static void JobTest(Args _args)
{
    InventTrans         InventTrans;
    InventJournalTrans  InventJournalTrans;
    ;
    select sum(Qty), count(RecId) from InventTrans group by TransRefId
    join sum(Qty), sum(CostAmount) from InventJournalTrans
    where InventJournalTrans.InventTransId == InventTrans.InventTransId
       && InventJournalTrans.JournalId     == "СЖ00546541";

    info(strfmt("%1   %2   %3    %4",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.CostAmount));
}
Результат:
-9 720,00 2 -9 720,00 -57 639,60
Старый 03.04.2008, 12:09   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
2 raz: Извини, но пример "ни о чём" в контексте имеющегося вопроса.
В приведённом примере связь похоже 1 к 1-му. А нужно 1 ко многим. И группировка должна быть на "таблице-шапке".

Вот пример raz, не работающий на правильных данных и мой вариант решения исходной задачи:
X++:
static void ZVVJobTest(Args _args)
{
    InventTrans         InventTrans;
    InventJournalTrans  InventJournalTrans, InventJournalTransIn;
    ;

    // Журнал "УЗЖ001779"
    // В нём одна строка с кол-вом 10 (цена 20, сумма 200)
    // По ней 2 проводки с кол-вом 5 в каждой

    select sum(Qty), count(RecId) from InventTrans group by TransRefId
    join sum(Qty), sum(CostAmount), count(RecId) from InventJournalTrans
    where InventJournalTrans.InventTransId == InventTrans.InventTransId
       && InventJournalTrans.JournalId     == "УЗЖ001779";

    info(strfmt("Неверно! Проводка: %1   %2   Строка: %3    %4   %5",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.RecId, InventJournalTrans.CostAmount));

    while Select sum(Qty), sum(CostAmount), count(RecId) from InventJournalTrans
        group by ItemId
        where InventJournalTrans.JournalId     == "УЗЖ001779"
    {

        // Второй Джоин строк журнала для демонстрации общего случая, когда нет группируемого поля во второй таблице
        //  (возможно в некотрых случаях по смыслу он и не нужен!)
        select sum(Qty), count(RecId) from InventTrans
           join count(recid) from InventJournalTransIn
            where InventJournalTransIn.InventTransId    == InventTrans.InventTransId
               && InventJournalTransIn.JournalId     == "УЗЖ001779"
               && InventJournalTransIn.ItemId           == InventJournalTrans.ItemId;

        info(strfmt("Верно! Проводка: %1   %2   Строка: %3    %4   %5",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.RecId, InventJournalTrans.CostAmount));
    }
}
Результат:
Неверно! Проводка: 10,00 2 Строка: 20,00 2 400,00
Верно! Проводка: 10,00 2 Строка: 10,00 1 200,00
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 03.04.2008 в 12:13. Причина: Сорри, ошибка закралась в коде :)
Старый 03.04.2008, 14:50   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
к сожалению исходная задача вложенными запросами не решается, тк запрос создается динамически, приведенный мной пример лишь частный случай, сам запрос можетбыть гораздо сложней (множество группировок, джойнов, фильтров)
Старый 03.04.2008, 16:37   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Ну боюсь, что тем не менее придётся что-то менять в вашей динамике.
В аксапте одним запросом вы такое не сможете изобразить. По крайней мере, мне в голову ничего не приходит.
В оракле ещё можно было бы через аналитические функции выкрутиться, но и то, это получится такой навороченный и нечитаемый селект в вашем случае "(множество группировок, джойнов, фильтров) "...
__________________
Zhirenkov Vitaly
Старый 09.04.2008, 13:01   #7  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от ice Посмотреть сообщение
Всем привет!
... как правильно можно посчитать одним запросом?
Если в аксапте, то только через вьюху со своими плюсами и минусами...
Старый 09.04.2008, 13:10   #8  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от vallys Посмотреть сообщение
Если в аксапте, то только через вьюху со своими плюсами и минусами...
вьюха не поддерживает более одного джойна к таблице
Старый 09.04.2008, 14:23   #9  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от ice Посмотреть сообщение
вьюха не поддерживает более одного джойна к таблице
Не понял.
Я имел в виду что запрос вида
Код:
select ... 
from Table1, (select id, ... from Table2 group by id) as Table2
where Table1.id = Tablt2.id
[group by ...]
в аксапте одним запросом можно реализовать только с помощью вьюхи, которая будет представлять собой подзапрос с группировкой.
Вот только на практике зачастую это лишнее...
Старый 09.04.2008, 14:32   #10  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от vallys Посмотреть сообщение
в аксапте одним запросом можно реализовать только с помощью вьюхи, которая будет представлять собой подзапрос с группировкой.
Вот только на практике зачастую это лишнее...
В стандартных вьюхах нет параметра OrderMode насколько я помню
Старый 09.04.2008, 14:43   #11  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от MironovI Посмотреть сообщение
В стандартных вьюхах нет параметра OrderMode насколько я помню
За-то есть свойство Aggregation у полей вьюхи
Старый 09.04.2008, 15:10   #12  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от vallys Посмотреть сообщение
За-то есть свойство Aggregation у полей вьюхи
Ага, точно, ну тогда это вариант.. если глюки вьюх не беспокоят
Старый 10.04.2008, 11:40   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Ага, точно, ну тогда это вариант.. если глюки вьюх не беспокоят
Цитата:
тк запрос создается динамически, приведенный мной пример лишь частный случай, сам запрос можетбыть гораздо сложней (множество группировок, джойнов, фильтров)
Ну да, вариант, при условии, что вьюхи будут создаваться динамически для каждой новой динамической потребности. Ну можно конечно проверять, что похожая вью уже есть и можно её использовать. А если нет, то создавать новую...

Да уж... "Красота"...
__________________
Zhirenkov Vitaly
Старый 10.04.2008, 11:58   #14  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
Всем большое спасибо за участие!
Проблему решил с использованием временной таблицы
Старый 10.04.2008, 14:42   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
зачем временная таблица? лучше используйте класс KeySum
__________________
полезное на axForum, github, vk, coub.
Старый 10.04.2008, 15:21   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,740 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
зачем временная таблица? лучше используйте класс KeySum
отчет очень сложный, и временная таблица уже использовалась для хранения собранных данных, просто добавил в ней количество записей
Старый 25.04.2008, 12:59   #17  
polygris is offline
polygris
Участник
AxAssist
MCBMSS
 
272 / 67 (3) ++++
Регистрация: 14.06.2005
Адрес: Киев
а что собственно делает класс KeySum?
Старый 28.04.2008, 15:53   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от polygris Посмотреть сообщение
а что собственно делает класс KeySum?
Сохраняет и модифицирует набор чисел, позволяя обращаться к каждому из них по "ключу". Т.е. не просто по номеру (как в массиве), но по некоему идентификатору. Как правило, символьному, но тип идентификатора может быть любым. В частности, и числом.

При этом, имеется возможность (при желании) упорядочивать элементы набора по значению ключа, а также подсчитывать итоговую сумму всех числовых данных.

Также можно организовать хранение "многомерных" чисел. Т.е. каждое "число" может представляться контейнером из набора чисел.

Основной метод inventSum.updateNow() прибавляет к указанному элементу указанное значение.

Используется для хранения промежуточных результатов расчета и "накопительных" значений. В смысле суммы, получающейся в результате прогона некоего цикла, где сумма увеличивается на значение, вычисляемое в теле цикла.
За это сообщение автора поблагодарили: Qaz Qwerty (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Расхождение суммы проводки по поставщику и сопоставленной суммы petr DAX: Функционал 2 15.10.2008 23:31
Алгоритм расчета общей суммы kashperuk DAX: Программирование 31 05.09.2007 22:37
Запрос по двум таблицам fialka DAX: Программирование 17 15.12.2006 14:36
Корректировка суммы налога в закупке ymv2000 DAX: Функционал 4 26.10.2006 09:19
Группировка по двум и более таблицам rrkrivov DAX: Программирование 2 27.12.2004 07:29

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

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

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