13.04.2017, 18:11 | #1 |
Участник
|
erconsult: Electronic Reporting (ER) Cookbook
Источник: http://erconsult.eu/blog/electronic-...g-er-cookbook/
============== The Electronic Reporting module in Dynamics 365 for Operations, previously known as General Electronic Reporting (GER) was one of the coolest application inventions in Dynamics AX7. Programmed apparently in my alma mater – the Dynamics development office in Moscow – this “ER” is a surprisingly powerful tool with an own in-built programming language for transformations. A consultant may configure any vendor payment format or any moderately complex GL export (such as the German GDPdU or French FEC) within days with literally no customizations, and test it in-place. Over the last year, I implemented the British BACS18, the Swiss DTA, the Spanish SEPA sub-format and the North American ACH outbound payment format. While the AX wiki is a good start, the best way to learn the tool is practice. Below are some transformation code snippets that may help you along the steep learning curve. Line counters In the payment files, there are often line numbers. The ER element “Counter” is intended to be used, but it is incremented on every occurrence in the format. I.e. the counter has a global context, and the same count may not be used more than once in a row. A total of records in a footer section is a special case: you may enumerate the lines with a Counter, then use a function of the Group by type over the data source to get a total count. With 2 concurrent counters you have no other choice but to use the [real numeric] use the journal line number, and convert it into an integer: NUMBERFORMAT(VALUE(model.Payments.PaymentIdentifications.SourceBusinessEntityDescription), "00000000000") Simple transformation formula examples Convert an amount into an amount with fixed 2 decimal places after the comma NUMBERFORMAT(model.Payments.InstructedAmount, "#.00") Remove the decimal separator, produce an amount in pence / cents REPLACE(NUMBERFORMAT(parameter,"0.00"), ".", "", false) Remove line breaks from the postal address without a regular expression, and truncate to 70 characters LEFT(REPLACE(model.Payments.Debtor.PostalAddress.AddressLine, "\n", " ", true), 70) Remove all non-numeric characters with a regular expression RIGHT(REPLACE(parameter, "[^0-9]", "", true),6) REPLACE(model.Payments.DebtorAccount.Identification.Number, "[^0-9]", "", true) Calculate a weighted check sum The below expression adds the 9th checksum digit to an US ABA routing number, should the user be entering only the significant 8 digits. The RIGHT(NUMBERFORMAT(10 – VALUE(), “#”, 1) is a crude implementation of modulo 10. CASE( LEN(parameter), 9, parameter, 8, parameter&RIGHT(NUMBERFORMAT(10-VALUE(RIGHT(NUMBERFORMAT( ((VALUE(MID(parameter, 1, 1))+VALUE(MID(parameter, 4, 1)))+VALUE(MID(parameter, 7, 1)))*3+ ((((VALUE(MID(parameter, 2, 1))+VALUE(MID(parameter, 5, 1)))+VALUE(MID(parameter, 8, 1)))*7+ VALUE(MID(parameter, 3, 1)))+VALUE(MID(parameter, 6, 1))), "#"), 1)), "#"), 1), RIGHT(parameter, 9)) Day number in a year (1-366) The British BACS18 format contained a date format that really made me suffer: for the 1st of February 2016 it expected “ 16032” where 32 was the day count from the 1st of January. The below code took me a while; it uses the Gregorian calendar formula and predates the fact that if you start counting months from March, the length of the months oscillates 31-30-31… CONCATENATE(" ", DATEFORMAT(parameter, "yy"), NUMBERFORMAT( ROUNDDOWN(275 * NUMBERVALUE(DATEFORMAT(parameter, "MM"),".","") / 9, 0) - (ROUNDDOWN( (NUMBERVALUE(DATEFORMAT(parameter, "MM"),".","") + 9) / 12, 0) * (1 + ROUNDDOWN( ((NUMBERVALUE(DATEFORMAT(parameter, "yyyy"),".","") – 4 * ROUNDDOWN (NUMBERVALUE(DATEFORMAT(parameter,"yyyy"),".","") / 4, 0) + 2) / 3), 0) ) )+ NUMBERVALUE(DATEFORMAT(parameter, "dd"),".","") - 30, "000")) Data model To master the file format, you must first learn the data model, the ER’s configurable abstraction layer over the Dynamics database. Outbound vendor payments use the Payment model. table {border-collapse: collapse;} th, td {border: 1px solid black; padding: 10px; text-align: left;}It provides generic payment attributes, AttributeModel nodePayment date (user parm or journal date)model.Payments.RequestedExecutionDateAmountmodel.Payments.InstructedAmountISO payment currency (journal line currency)model.Payments.CurrencyJournal line number (see Line counters)model.Payments.PaymentIdentifications.SourceBusinessEntityDescriptionPayment / Notemodel.Payments.PaymentsNotesVoucher+RecId (a unique line ID)model.Payments.PaymentIdentifications.EndToEndIdentificationDate of todaymodel.CreationDateTime our bank details, AttributeModel nodeOur name (company name)model.Payments.Debtor.NameOur full address (company address)model.Payments.Debtor.PostalAddress.AddressLineName of our bankmodel.Payments.DebtorAgent.NameOur bank account numbermodel.Payments.DebtorAccount.Identification.NumberOur IBANmodel.Payments.DebtorAccount.Identification.IBANRouting number of our bankmodel.Payments.DebtorAgent.RoutingNumberBIC of our bankmodel.Payments.CreditorAgent.BICFI and their (beneficiary) bank details: AttributeModel nodeTheir name (vendor’s name)model.Payments.Creditor.NameTheir full address (vendor’s payment address)model.Payments.Creditor.PostalAddress.AddressLineName of their bankmodel.Payments.CreditorAgent.NameTheir bank account numbermodel.Payments.CreditorAccount.Identification.NumberTheir IBANmodel.Payments.CreditorAccount.Identification.IBANRouting number of their bankmodel.Payments.CreditorAgent.RoutingNumberBIC of their bankmodel.Payments.CreditorAgent.BICFIThe post Electronic Reporting (ER) Cookbook appeared first on ER-Consult. Источник: http://erconsult.eu/blog/electronic-...g-er-cookbook/
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
17.04.2017, 14:07 | #2 |
Участник
|
Несколько вопросов к автору:
1. можно ли это использовать как полноценную замену отчетности - типа у нас есть требования десятка отчетов(типа накладных и т.п.). мы можем создать модель данных с необходимыми таблицами(что не очень сложно) и сделать так чтобы пользователи дальше уже сами делали эти отчеты? Как я понял это будет заполнение шаблонов Excel. соответственно интерфейсно хотелось бы чтобы это были кнопки на формах, по нажатию на которые открывался Excel. или все же это не настолько мощная утилита? 2. почему Day number in a year (1-366) было не сделать просто дисплей методом в АХ(использую функцию dayofYr()) . или это трудоемко? |
|
17.04.2017, 15:32 | #3 |
Участник
|
Цитата:
Сообщение от trud
1. можно ли это использовать как полноценную замену отчетности - типа у нас есть требования десятка отчетов(типа накладных и т.п.). мы можем создать модель данных с необходимыми таблицами(что не очень сложно) и сделать так чтобы пользователи дальше уже сами делали эти отчеты? Как я понял это будет заполнение шаблонов Excel. соответственно интерфейсно хотелось бы чтобы это были кнопки на формах, по нажатию на которые открывался Excel.
или все же это не настолько мощная утилита? Цитата:
И еще это потребовало бы изменения X++ кода и распространения его. Последний раз редактировалось belugin; 17.04.2017 в 15:53. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
17.04.2017, 16:22 | #4 |
Banned
|
Благодарю, добавить особо нечего. Кастомные методы стараюсь не использовать, до сих пор пришлось сделать только один: для перекодирования счетов ГК из одного плана в другой через Default consolidation account.
|
|
17.04.2017, 16:27 | #5 |
Участник
|
|
|
17.04.2017, 16:40 | #6 |
Участник
|
Цитата:
Так, в-принципе, отчеты формируются тем же OOXML и либо отдаются в браузер либо складываются в Document Management. Наверняка есть какие-то органичения по отношению к тому, что можно вытворить тем же способом через X++ но я их не назову так сразу. |
|
|
За это сообщение автора поблагодарили: trud (2). |
18.04.2017, 05:39 | #7 |
Участник
|
Цитата:
т.е. программист описывает 2 ентити - клиенты и проводки, пишет метод фильтрации. а пользователь уже делает себе отчет и шаблон. такие сценарии возможны? и есть что-нибудь подобное в стандарте? |
|
18.04.2017, 08:55 | #8 |
Участник
|
Да,
см. также Обзорное описание |
|
|
За это сообщение автора поблагодарили: Logger (3). |
21.04.2017, 16:28 | #9 |
Banned
|
Черт, в последней версии приложения появилась встроенная функция DAYOFYEAR. Столько красивой алгебры впустую...
|
|
|
За это сообщение автора поблагодарили: Logger (1). |
08.08.2017, 19:33 | #10 |
Участник
|
Не знаю как вы все, я вот этот GER совсем не понял и термины "easily" и "customizable" к нему по мне никак не применимы. Для отчетов проще привлечь таки программиста.
|
|
27.09.2017, 23:19 | #11 |
Боец
|
У меня два вопроса:
1. Можно лі сделать возможным передачу параметров прі вызове метода табліцы? 2. Можно лі как-то упростіть следуюшій сценарій: у нас есть таблица CompanyInfo, которая участвует во многих конфигурациях. При добавлении нового поля, приходится ручками пройтись по всем конфигам и протянуть это поле. Весьма трудоемко. Пример: некоторые партнеры предоставляют внешние решения для печати отчетов. На выходе аксапты им нужен XML, а дальше они его трансформируют куда-то еще, в PDF например. CompanyInfo присутсвует во всех отчетах. Добавление нового поля сулит кучу времени по перенастройке и тестированию этого огорода. Как эту проблему можно решить, позволяет ли архитектура это сделать? Пока на ум приходит написать сбоку кнопку, которая сделает это автоматически. Может есть более интересные варианты? Sorry for my font... Последний раз редактировалось DSPIC; 27.09.2017 в 23:22. Причина: Е nt |
|
28.09.2017, 00:01 | #12 |
Участник
|
думаю, что Макс Белугин может ответить на этот вопрос самым компетентным образом.
однако, сразу хочу сказать, что GER сейчас развивается очень мощно. поэтому для GER особенно важна версия системы. думаю, что стоит указать вплоть до билда. |
|
28.09.2017, 00:37 | #13 |
Banned
|
Кстати, если он так развивается, то что мешает добавить
DIV MOD и добавить целочисленный параметр 'scope' для независимой нумерации с помощью элемента Counter? |
|
28.09.2017, 01:09 | #14 |
Banned
|
Цитата:
Сообщение от DSPIC
У меня два вопроса:
1. Можно лі сделать возможным передачу параметров прі вызове метода табліцы? 2. Можно лі как-то упростіть следуюшій сценарій: у нас есть таблица CompanyInfo, которая участвует во многих конфигурациях. При добавлении нового поля, приходится ручками пройтись по всем конфигам и протянуть это поле. Весьма трудоемко. Пример: некоторые партнеры предоставляют внешние решения для печати отчетов. На выходе аксапты им нужен XML, а дальше они его трансформируют куда-то еще, в PDF например. CompanyInfo присутсвует во всех отчетах. Добавление нового поля сулит кучу времени по перенастройке и тестированию этого огорода. Как эту проблему можно решить, позволяет ли архитектура это сделать? Пока на ум приходит написать сбоку кнопку, которая сделает это автоматически. Может есть более интересные варианты? 2. Сделать метод типа CompanyInfo.toString() чтобы сериализовать все возможные поля, а потом реализовать функцию наподобие SPLIT(), но которая бы реагировала на символ-разделитель чтобы заново разбить на составные части. Последний раз редактировалось EVGL; 28.09.2017 в 01:16. |
|
|
За это сообщение автора поблагодарили: trud (4), mazzy (2). |
28.09.2017, 02:00 | #15 |
Боец
|
Версия
Installed product version : Microsoft Dynamics 365 for Operations (1611) Installed platform version : Update5 (7.0.4475.16165) Касательно 1-го вопроса. Нашел в коде заготовку, для передачи параметров в метод таблицы. Но то ли это только заготовка, то ли я неверное использую синтаксис в выражении. Вот кастомный метод на таблице, принимающий один стринговый параметр. Если указать параметр как на картинке, то валидатор не пропускает. Если без параметра, то позволяет сохранить Далее при запуске, естественно, имеем стек трейс, так как параметр в табличном методе обязательный. Валимся на этом методе Что тут видно - передача параметров таки предусмотрена, даже типы приводятся, и даже целых 5 штук можно передать (пять, Карл!)). Но каков должен быть синтаксис в редакторе формулы, чтобы они сюда дошли, пока не понятно и пока не хватает крови докопать. Последний раз редактировалось DSPIC; 28.09.2017 в 02:04. |
|
28.09.2017, 09:21 | #16 |
Участник
|
1) Корректный синтаксис для таблиц x.'method()'("Параметр")
2) Недавно добавили возможность вызова с неконстантными параметрами 71 https://fix.lcs.dynamics.com/Issue/R...&bugId=3851630 72 https://fix.lcs.dynamics.com/Issue/R...&bugId=3852876 |
|
|
За это сообщение автора поблагодарили: EVGL (2), DSPIC (17). |
28.09.2017, 09:27 | #17 |
Участник
|
Цитата:
Нельзя ли несколько отчетов строить на одной и той же модели? Если вы направите ваши вопросы в Yammer, то вопрос прочитает не только я, но и другие люди из нашей команды |
|
28.09.2017, 11:30 | #18 |
Участник
|
Цитата:
Сообщение от belugin
Если вы направите ваши вопросы в Yammer, то вопрос прочитает не только я, но и другие люди из нашей команды
Майкрософт меняет адреса и ссылки на своих ресурсах. Сильно опасаюсь, что и Яммер не минует чаша сия. Поэтому, если хотите оставить свои вопросы и ответы на долгое время, лучше написать здесь. 2. Думаю, что другим людям из команды можно и axforum почитать. Ведь никто не гарантирует от них ответы ни на яммере, ни на аксфоруме. А здесь своих пользователей все же больше. 3. Уводить дискуссию на другой ресурс - невежливо. Давайте обсуждать здесь. |
|
28.09.2017, 13:00 | #19 |
Участник
|
Я не увожу никого - просто информирую. Я ж не отказываюсь обсуждать тут. Более того, привожу ссылки на аксфорум если тут возникает вопрос, на который сам не могу ответить.
AxForum:
Yammer:
Последний раз редактировалось belugin; 28.09.2017 в 13:14. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
28.09.2017, 13:27 | #20 |
Участник
|
вежливо по отношению к остальным участникам axForum, конечно )
rss по тегу Добавлена фича: можно получать rss потоки по тегам. |
|
Теги |
electronic reporting, erconsult, ger |
|
|