|
12.05.2011, 15:49 | #1 |
MS Dynamics AX 2012 R3
|
Пример кода в Х++ по сумме значений
Есть две связанные между собой таблицы RAssetTable и RAssetTrans, в RAssetTrans есть суммы амортизаций по каждому основному стредству живущему в RAssetTable.
Так вот, хочу понять как правильно написать код, чтобы все суммы амортизации из RAssetTrans сложить в одну сумму при чём по ToDate (по сегодня) Далее эти данные выведу в екселевский отчёт, для этого оно и нужно. Если у кого есть примеры такого кода, то буду признателен.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
12.05.2011, 16:05 | #2 |
Участник
|
У вас вызывает затруднения написание самого 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 |
Участник
|
Цитата:
Цитата:
|
|
12.05.2011, 16:47 | #4 |
MS Dynamics AX 2012 R3
|
S.Kuskov
спасибо.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
12.05.2011, 16:27 | #5 |
северный Будда
|
А чем не устраивает стандартный отчёт "Баланс по ОС"?
Там есть замечательный класс RAssetReport, используйте его, если уж так надо именно в Excel выводить
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 12.05.2011 в 16:29. |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
12.05.2011, 16:47 | #6 |
MS Dynamics AX 2012 R3
|
Нужно, да при чём без шаблона. Класс действительно шорош, много методов с примерами, что мне пригодятся в дальнейшем. Спасибо.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
12.05.2011, 16:54 | #7 |
Участник
|
Цитата:
самый правильный - это воспользоваться стандартными отчетами правильный - воспользоваться стандартными классами. например, RAssetSumCalc_Trans но, насколько я понимаю, вы хотите получить суммы одним запросом. это не совсем правильно с логической точки зрения, а также с точки зрения дальнейшей поддержки. но зато будет одни быстрый SQL-запрос. насколько я помню, аксапта 3.0 позволяет суммировать только тогда, когда во внешних селектах будут присутствовать агрегатные функции. т.е. в ax3.0 не работает код X++: select RAssetTable join sum(AmountCur) from RAssetTrans where RAssetTrans.AccountNum == RAssetTable.AccountNum; попробуйте задать агрегатную функцию count(recid) для внешней таблицы. X++: select count(recid) from RAssetTable join sum(AmountCur) from RAssetTrans where RAssetTrans.AccountNum == RAssetTable.AccountNum; но все-таки правильно - это воспользоваться стандартным функционалом. даже если запросов там будет больше. ================= кстати, ax2009 вполне работает с обоими запросами. |
|
13.05.2011, 08:31 | #8 |
Участник
|
Я обычно в таких случаях "выворачиваю" запрос так чтобы внешней оказалась та таблица по которой задана агрегатная функция. Тем более в данном примере дополнительные таблицы нужны разве что для фильтрации (поле 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(); } |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
12.05.2011, 17:00 | #9 |
MS Dynamics AX 2012 R3
|
Я забыл указать версию системы. Извиняюсь. MS Dynamics AX 4.0
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
12.05.2011, 17:08 | #10 |
MS Dynamics AX 2012 R3
|
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 |
Участник
|
понятно.
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(); } Примечание: никогда(!) не группируйте по наименованию, чтобы получить наименование. Лучше сделайте отдельный запрос. ================== щас напишу код для работы со стандартным функционалом. |
|
12.05.2011, 17:28 | #12 |
Участник
|
код для работы со стандартным функционалом.
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(); } (но об этом и пишут в книжках, которые вам советовали почитать) |
|
12.05.2011, 17:39 | #13 |
MS Dynamics AX 2012 R3
|
mazzy,
я не могу воспользоваться стандартным функционалом, так как мне поставлена задача разработать аналог, попутно пополняя свои знания
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
12.05.2011, 17:55 | #14 |
Участник
|
Цитата:
чтобы не забыть ни одного важного для функционала поля. например, вы забыли про тип проводки. а там могут быть закупка, амортизация, выбытие, сдача в аренду и т.п. |
|
12.05.2011, 18:13 | #15 |
северный Будда
|
Если уж поставлена задача разработать аналог, то неплохо бы услышать, чем не устраивает стандарт (если, конечно, это не тестовая задача для обучения)
__________________
С уважением, Вячеслав |
|
12.05.2011, 18:16 | #16 |
MS Dynamics AX 2012 R3
|
Да, Вы правы, это именно для моего обучения. Задача от моего руководителя.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
13.05.2011, 07:08 | #17 |
Мрачный тип
|
А стандартный класс расчета балансовых показателей ОС RAssetSumCalc чем не угодил ?
P.S. Я тормоз - не увидел, что сие для обучения ...
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
13.05.2011, 08:49 | #18 |
Участник
|
Ну вот что типа того выводит суммы амортизации по каждому Осу
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]); } Последний раз редактировалось rootx; 13.05.2011 в 08:57. |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
13.05.2011, 10:24 | #19 |
северный Будда
|
Коллеги, человеку дали тестовую задачу. Не стоит полностью расписывать здесь её решение - это приведёт к тому, что даже полностью самостоятельный код принимающим будет оцениваться на копи-паст. И в результате, даже если человек хорошо разобрался - он может получить второе задание под предлогом "а ты всё с axforum взял".
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: lev (1). |
13.05.2011, 10:34 | #20 |
MS Dynamics AX 2012 R3
|
Цитата:
Сообщение от pitersky
Коллеги, человеку дали тестовую задачу. Не стоит полностью расписывать здесь её решение - это приведёт к тому, что даже полностью самостоятельный код принимающим будет оцениваться на копи-паст. И в результате, даже если человек хорошо разобрался - он может получить второе задание под предлогом "а ты всё с axforum взял".
Вы и lev безусловно правы, одноко помощь коллег из форума помогает мне научиться и понять алгоритм кода, копи-паст это зло, я им стараюсь не пользоваться
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 13.05.2011 в 10:39. |
|