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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.05.2011, 15:49   #1  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
? Пример кода в Х++ по сумме значений
Есть две связанные между собой таблицы RAssetTable и RAssetTrans, в RAssetTrans есть суммы амортизаций по каждому основному стредству живущему в RAssetTable.
Так вот, хочу понять как правильно написать код, чтобы все суммы амортизации из RAssetTrans сложить в одну сумму при чём по ToDate (по сегодня)
Далее эти данные выведу в екселевский отчёт, для этого оно и нужно.
Если у кого есть примеры такого кода, то буду признателен.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 12.05.2011, 16:05   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У вас вызывает затруднения написание самого SQL запроса? Вы можете приведите пример нужного вам запроса, как если бы он выглядел на стандартном SQL?

Пример из книги http://book.axforum.info/morphx.pdf
X++:
static void Intro_Select(Args _args)
{
    CustTable custTable;
    CustTrans custTrans;
    TransDate fromStartYear = systemdateget();
;
    while select custTable
        join custTrans
            where custTrans.accountNum == custTable.accountNum
                && custTrans.transDate >= fromStartYear
    {
        info(strfmt("%1, %2, %3", custTable.accountNum, custTrans.transDate, custTrans.voucher));
    }
}

Последний раз редактировалось S.Kuskov; 12.05.2011 в 16:17.
Старый 12.05.2011, 16:37   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mr.ZF Посмотреть сообщение
Да и в принципе, что за манера пошла, вопросом на вопрос отвечать, во всяком случае это не культурно. Если вы не хотите помоч, то зачем писать в эту тему.
Не обижайтесь, я задал уточняющие вопросы лишь для того что бы ответить на ваш вопрос с пользой для вас. Вопрос вы задали на форуме аксапты, вопрос задали про написание SQL запроса. Отсюда совершенно не очевидно спрашиваети ли вы вообще про написание SQL запроса или же стандартным SQL вы владете и трудности у вас возникают с его реализацией именно в аксапте.
Цитата:
Сообщение от mr.ZF Посмотреть сообщение
Если спросил, то сразу и понятно что я в этом нуб и хочу научиться, по этому и спрашиваю.
http://www.ozon.ru/context/detail/id/3270157/
Старый 12.05.2011, 16:47   #4  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
S.Kuskov
спасибо.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 12.05.2011, 16:27   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
А чем не устраивает стандартный отчёт "Баланс по ОС"?
Там есть замечательный класс RAssetReport, используйте его, если уж так надо именно в Excel выводить
__________________
С уважением,
Вячеслав

Последний раз редактировалось pitersky; 12.05.2011 в 16:29.
За это сообщение автора поблагодарили: ZornFire (1).
Старый 12.05.2011, 16:47   #6  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
А чем не устраивает стандартный отчёт "Баланс по ОС"?
Там есть замечательный класс RAssetReport, используйте его, если уж так надо именно в Excel выводить
Нужно, да при чём без шаблона. Класс действительно шорош, много методов с примерами, что мне пригодятся в дальнейшем. Спасибо.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 12.05.2011, 16:54   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mr.ZF Посмотреть сообщение
Так вот, хочу понять как правильно написать код, чтобы все суммы амортизации из RAssetTrans сложить в одну сумму при чём по ToDate (по сегодня)
Есть несколько критериев правильности.
самый правильный - это воспользоваться стандартными отчетами
правильный - воспользоваться стандартными классами. например, RAssetSumCalc_Trans

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

насколько я помню, аксапта 3.0 позволяет суммировать только тогда, когда во внешних селектах будут присутствовать агрегатные функции. т.е. в ax3.0 не работает код
X++:
select RAssetTable 
join sum(AmountCur) from RAssetTrans
where RAssetTrans.AccountNum == RAssetTable.AccountNum;
Название: 1.PNG
Просмотров: 1139

Размер: 16.5 Кб

попробуйте задать агрегатную функцию count(recid) для внешней таблицы.

X++:
select count(recid) from RAssetTable
join sum(AmountCur) from RAssetTrans
where RAssetTrans.AccountNum == RAssetTable.AccountNum;
=================
но все-таки правильно - это воспользоваться стандартным функционалом.
даже если запросов там будет больше.

=================
кстати, ax2009 вполне работает с обоими запросами.
__________________
полезное на axForum, github, vk, coub.
Старый 13.05.2011, 08:31   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
попробуйте задать агрегатную функцию count(recid) для внешней таблицы.
Я обычно в таких случаях "выворачиваю" запрос так чтобы внешней оказалась та таблица по которой задана агрегатная функция. Тем более в данном примере дополнительные таблицы нужны разве что для фильтрации (поле AssetStandardId есть непосредствено в таблице проводок RAssetTrans)
X++:
static void Job15(Args _args)
{
    TextBuffer text = new TextBuffer();
    RAssetTrans RAssetTrans;
    RAssetTable RAssetTable;
    TransDate _transDate = 31\01\2011;
    ;

    while select sum(AmountMST) from RAssetTrans
    group by AccountNum, AssetStandardId, AssetTransType
    where 
        RAssetTrans.TransDate <= _transDate
//    exists join RAssetTable
//    where
//        RAssetTable.AccountNum == RAssetTrans.AccountNum
    {
        text.appendText(strfmt("%1\t%2\t%3\t%4\n",
                         RAssetTrans.AccountNum,
                         RAssetTrans.AssetStandardId,
                         RAssetTrans.AssetTransType, 
                         RAssetTrans.AmountMST));
    }
    
    text.toClipboard();
}
И ещё. Если выбирать суммы в валюте (AmountCUR), то не плохо было бы ещё выбрать и саму валюту (CurrencyCode). Если суммы нужны в основной валюте то выбирать нужно поле AmountMST.
За это сообщение автора поблагодарили: ZornFire (1).
Старый 12.05.2011, 17:00   #9  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Я забыл указать версию системы. Извиняюсь. MS Dynamics AX 4.0
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 12.05.2011, 17:08   #10  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
mazzy,
а куда в итоге попадает значение суммы?
и как будет правильно вывести её в отчёт?
обычно после всех квери я делаю вот так:
Цитата:
str appendToBuffer(RAssetTable _rAssetTable,
RAssetStandards _rAssetStandards,
RAssetTrans _rAssetTrans)
{
str s;
;
s = strfmt("%1", _rAssetTable.AccountNum);
s += "\t";
s += strfmt("%1", _rAssetTable.Name);
s += "\t";
s += strfmt("%1", _rAssetStandards.AssetStandardId);
s += "\t";
s += strfmt("%1", _rAssetTrans.TransDate);
s += "\t";
Как тогда вывести общую сумму всх сумм амортизаций?
Я именно к этому моменту хочу прийти.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов

Последний раз редактировалось ZornFire; 12.05.2011 в 17:15.
Старый 12.05.2011, 17:21   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
понятно.
1.
только не формируйте так строку. чем меньше строковых операций сложений - тем лучше.
2.
у вас каша в голове по поводу типов проводок и по поводу дат.
все-таки настойчиво советую воспользоваться стандартным функционалом.

X++:
static void Job15(Args _args)
{
    TextBuffer text = new TextBuffer();
    RAssetTable RAssetTable ;
    RAssetStandards RAssetStandards;
    RAssetTrans RAssetTrans;
    TransDate _transDate = 31\01\2011;

    while select count(recid) from RAssetTable
    group by AccountNum
    join count(recid) from RAssetStandards
    group by assetStandardId
    where RAssetStandards.AssetId == RAssetTable.AccountNum
    join sum(AmountCur) from RAssetTrans
    group by AssetTransType
    where RAssetTrans.AccountNum == RAssetTable.AccountNum
       && RAssetTrans.assetStandardId == RAssetStandards.assetStandardId
       && RAssetTrans.TransDate <= _transDate
    {
        text.appendText(strfmt("%1\t%2\t%3\t%4\n",
                         RAssetTable.AccountNum,RAssetStandards.assetStandardId,
                         RAssetTrans.AssetTransType, RAssetTrans.AmountCur));
    }
    text.toClipboard();

}
обратите внимание, что внутри запроса с агрегатными функциями определены только поля, заданные в списке group by и в агрегатных функциях.

Примечание: никогда(!) не группируйте по наименованию, чтобы получить наименование. Лучше сделайте отдельный запрос.

==================
щас напишу код для работы со стандартным функционалом.
__________________
полезное на axForum, github, vk, coub.
Старый 12.05.2011, 17:28   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
код для работы со стандартным функционалом.
X++:
static void Job16(Args _args)
{
    TextBuffer text = new TextBuffer();
    RAssetTable RAssetTable;
    RAssetStandards RAssetStandards;
    RAssetSumCalc_Trans sumCalc;

    TransDate _transDate = 31\01\2011;

    while select RAssetTable
    join RAssetStandards
    where RAssetStandards.AssetId == RAssetTable.AccountNum
    {
        sumCalc = RAssetSumCalc_Trans::newAssetPeriod(RAssetTable.AccountNum,RAssetStandards.assetStandardId,_transDate);

        text.appendText(strfmt("%1\t%2\t%3\t%4\n",
                         RAssetTable.AccountNum,RAssetStandards.assetStandardId,
                         sumCalc.depreciationValue(), sumCalc.acquisitionTotal())); // и другие методы, которые выдают нужные суммы
    }
    text.toClipboard();
}
обратите внимнаие! поскольку нет агрегатных функций и нет списка выбираемых полей, то внутри запроса доступны ВСЕ поля.
(но об этом и пишут в книжках, которые вам советовали почитать)
__________________
полезное на axForum, github, vk, coub.
Старый 12.05.2011, 17:39   #13  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
mazzy,
я не могу воспользоваться стандартным функционалом, так как мне поставлена задача разработать аналог, попутно пополняя свои знания
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 12.05.2011, 17:55   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mr.ZF Посмотреть сообщение
mazzy,
я не могу воспользоваться стандартным функционалом, так как мне поставлена задача разработать аналог, попутно пополняя свои знания
тогда все равно разберитесь со стандартным функционалом и поймите как он устроен.
чтобы не забыть ни одного важного для функционала поля.
например, вы забыли про тип проводки. а там могут быть закупка, амортизация, выбытие, сдача в аренду и т.п.
__________________
полезное на axForum, github, vk, coub.
Старый 12.05.2011, 18:13   #15  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Если уж поставлена задача разработать аналог, то неплохо бы услышать, чем не устраивает стандарт (если, конечно, это не тестовая задача для обучения)
__________________
С уважением,
Вячеслав
Старый 12.05.2011, 18:16   #16  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
Если уж поставлена задача разработать аналог, то неплохо бы услышать, чем не устраивает стандарт (если, конечно, это не тестовая задача для обучения)
Да, Вы правы, это именно для моего обучения. Задача от моего руководителя.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
Старый 13.05.2011, 07:08   #17  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
А стандартный класс расчета балансовых показателей ОС RAssetSumCalc чем не угодил ?

P.S. Я тормоз - не увидел, что сие для обучения ...
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 13.05.2011, 08:49   #18  
rootx is offline
rootx
Участник
 
28 / 18 (1) ++
Регистрация: 17.02.2008
Ну вот что типа того выводит суммы амортизации по каждому Осу

X++:
 while  select sum(AmountMST),  AccountNum from   rassettrans    group by   AccountNum
    where    rassettrans.TransDate >=   fromdate   //Выбираем все проводки по ОС  за период из таблицы RassetTrans
          &&  rassettrans.TransDate <=   todate
          &&  rassettrans.AssetTransType == RAssetTransType::Depreciation       // Тип проводки = Амортизация
          &&  rassettrans.assetStandardId == AssetStandard
    {
                  Select *from rassettable1
                     where rassettable1.AccountNum ==  rAssetTable.AccountNum;
 
                  this.SendToExcel("A"+int2str(ranges),rassettrans.AccountNum);
                  this.SendToExcel("B"+int2str(ranges),rAssetTable1.Name);
                  this.SendToExcel("C"+int2str(ranges),num2str(rassettrans.AmountMST,10,2,2,0));
                  this.SendToExcel("D"+int2str(ranges),enum2str(rassettrans.AssetTransType));
                  this.SendToExcel("H"+int2str(ranges),rassettrans.Dimension[1]);
 
 
   }
Но лучше конечно использовать стандартные классы RassetSumCalc там есть всё

Последний раз редактировалось rootx; 13.05.2011 в 08:57.
За это сообщение автора поблагодарили: ZornFire (1).
Старый 13.05.2011, 10:24   #19  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Коллеги, человеку дали тестовую задачу. Не стоит полностью расписывать здесь её решение - это приведёт к тому, что даже полностью самостоятельный код принимающим будет оцениваться на копи-паст. И в результате, даже если человек хорошо разобрался - он может получить второе задание под предлогом "а ты всё с axforum взял".
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: lev (1).
Старый 13.05.2011, 10:34   #20  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
Коллеги, человеку дали тестовую задачу. Не стоит полностью расписывать здесь её решение - это приведёт к тому, что даже полностью самостоятельный код принимающим будет оцениваться на копи-паст. И в результате, даже если человек хорошо разобрался - он может получить второе задание под предлогом "а ты всё с axforum взял".

Вы и lev безусловно правы, одноко помощь коллег из форума помогает мне научиться и понять алгоритм кода, копи-паст это зло, я им стараюсь не пользоваться
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов

Последний раз редактировалось ZornFire; 13.05.2011 в 10:39.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Последовательная замена множества уникальных значений на другие без возникновения дубликатов gl00mie DAX: Программирование 23 24.11.2010 15:05
Нужен пример кода для Аксы 3 zZ_TOP_Zz DAX: Программирование 3 28.06.2007 17:34
проблема с настройкой штрихового кода Nic DAX: Функционал 4 27.12.2004 09:04
QueryRange: отбор по сумме значений belugin DAX: Программирование 1 06.08.2004 16:44

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

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

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