Основы создания SSRS отчетов в Axapta (AX 2012)

Category: Статьи Post Date: 31.03.2020

В текущей версии Axapta, а именно Dynamics AX 2012 (далее AX2012) вся отчетность строится на базе MS Sql Server Reporting Services (SSRS), использование старой техники создания отчетов возможно, но не желательно, а создание отчетов в AX2012 на базе SSRS не совсем тривиально. Для помощи начинающим разработчикам мы и решили написать небольшую статью, описывающую минимально необходимые действия для создания отчета на базе SSRS.

Кроме создания отчета в среде Visual Studio, необходимо создать набор управляющих классов в AX2012 для разрабатываемого нами отчета. После создания нового отчета в среде Visual Studio необходимо определить тип источника данных. Источники данных, в основном, используются двух типов Query – используются Query AX2012 и ReportDataProvider. Использование источника данных Query не предполагает каких-либо дополнительных действий, кроме определения самого запроса, если нужному набору данных не удовлетворяет ни один из существующих запросов. При использовании типа источника данных ReportDataProvider все становится не так прозрачно, именно о такой реализации мы и расскажем ниже.

Для реализации отчета с типом источника данных ReportDataProvider, необходимо создать класс наследующий интерфейс от класса SysOperationValidatable и заполнить необходимые атрибуты этого класса. Атрибуты классов и методов, это новые конструкции в AX2012, они указываются перед определением класса или метода. Кроме этого класса необходимо создать класс «контроллер» нашего отчета, он должен быть наследником класса SRSReportRunController.

Пример для нашего случая:

1. Сначала определим класс для параметров нашего отчета с атрибутами (атрибуты указываются внутри конструкции «[ ]», через запятую), новый класс должен наследовать интерфейс системного класса «SysOperationValidatable». С помощью класса параметров и атрибутов данного класса можно указывать параметры отчета и их расположение внутри диалога выбора параметров, кроме этого можно написать методы для параметров, возвращающие специфические наборы значений параметра.

  1. [
  2. DataContractAttribute,
  3. SysOperationContractProcessingAttribute(classStr(SrsReportDataContractUIBuilder)),
  4. SysOperationGroupAttribute(“Customer”,”Настройки клиента”, “1”, FormArrangeMethod::Vertical)
  5. ]
  6. Class NewReportParams implements SysOperationValidatable
  7. {
  8. CustAccount custAccount;
  9. }

2. Метод описывающий параметр «CustAccount»

  1. [
  2. DataMemberAttribute(“CustAccount”),
  3. SysOperationGroupMemberAttribute(“Cust”),
  4. SysOperationDisplayOrderAttribute(“1”),
  5. SysOperationLabelAttribute(“Клиент”),
  6. SysOperationHelpTextAttribute(“Укажите код клиента”)
  7. ]
  8. Public CustAccount parmCustAccount(CustAccount _custAccount = custAccount)
  9. {
  10. ;
  11. custAccount = _custAccount;
  12. return custAccount;
  13. }

3. Класс провайдера нашего отчета:

  1. Class NewReportDataProvider extends SrsReportDataProviderPreProcess
  2. {
  3. }

 

Для определения классов провайдера, также можно использовать класс SrsReportDataProviderBase. Отладка класса наследуемого от SrsReportDataProviderBase не возможна, по этому наша рекомендация использовать класс SrsReportDataProviderPreProcess, т.к. в нем возможна отладка AX2012, кроме отладки, данные классы различаются по использованию внутри них работы с наборами данных.

Класс SrsReportDataProviderBase позволяет работать с временными таблицами, в SrsReportDataProviderPreProcess необходимо использовать обычные таблицы с включенными свойствами CreatedBy и CreatetransactionId, как временные. Предварительно мы создали таблицу NewReportTableTmp с включенными свойствами CreatedBy и CreatedTransactionID

4. Определение класса провайдера с атрибутами (атрибуты указываются внутри конструкции «[ ]», через запятую).

  1. [
  2. SRSReportQueryAttribute(queryStr(QFromNewReport)), // запрос на набор данных
  3. SRSReportParameterAttribute(classStr(NewReportParams)) // класс параметров отчета
  4. ]
  5. Class NewReportDataProvider extends SrsReportDataProviderPreProcess
  6. {
  7. }

5. Метод возвращающий источник данных, необходимо пометить следующим атрибутом:

  1. [
  2. SRSReportDataSetAttribute(‘RetSalesTable’)
  3. ]
  4. Public NewReportTableTmp NewRecord()
  5. {
  6. NewReportTableTmp NewReportTableTmp;
  7. ;
  8. Select NewReportTableTmp where NewReportTableTmp.custAccount == ‘000022’;
  9. Return NewReportTableTmp;
  10. }

 

6. Далее перекрываем метод провайдера processReport(), он используется для заполнения созданной нами «временной» таблицы необходимыми нам данными, то есть в этом методе мы можем определить необходимый нам алгоритм выборки данных.

  1. public void processReport()
  2. {
  3. NewReportTableTmp NewReportTableTmp;
  4. NewReportParams contract;
  5. Query q;
  6. QueryRun qr;
  7. ;
  8. NewReportTableTmp.setConnection(this.parmUserConnection());
  9. contract = this.parmDataContract() as NewReportParams;
  10. q = this.parmQuery();
  11. qr = new QueryRun(q);
  12. while ( qr.Next() )
  13. {
  14. // Заполняем нашу таблицу NewReportTableTmp
  15. }
  16. }

 

7. Создание класса отчета (предварительно в AX2012 через Visual Studio был создан отчет «NewReport» в котором в качестве источника данных выбран созданный нами провайдер):

  1. Class NewReportControl extends SRSReportRunController
  2. {
  3. }

 

8. Метод main этого класса:

  1. Public static void main (Args _args)
  2. {
  3. NewReportControl controller;
  4. ;
  5. Controller = new NewReportControl();
  6. Controller.parmreportName(SsrsReportStr(NewReport, Report)); // какой отчет вызываем
  7. Controller.parmShowDialog(true); // диалог параметров отчета
  8. Controller.parmDialogCaption(“Шапка окна диалога”); // надпись в шапке окна диалога
  9. Controllrt.startOperation; // запуск отчета
  10. }

Используя выше описанные приемы, можно создавать очень гибкие параметры для отчетов и использовать наборы данных подготавливаемых «на лету». По сравнению со стандартной платформой построения отчетов MS Dynamics AX предыдущих версий, процесс создания дизайна отчетов стал проще и гибче, что позволяет сократить разработку нового отчета, не теряя времени на разработку и подгонку дизайна самого отчета.

Авторы статьи: Петров Евгений, Майстренко Олег

Подписывайтесь на канал @d365neti в Telegram

Подписаться

Добавить комментарий