click fraud detection

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

Дата публикации: 24.10.2012

В текущей версии 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.  
  3. DataContractAttribute,
  4.  
  5. SysOperationContractProcessingAttribute(classStr(SrsReportDataContractUIBuilder)),
  6.  
  7. SysOperationGroupAttribute(“Customer”,”Настройки клиента”,1, FormArrangeMethod::Vertical)
  8.  
  9. ]
  10.  
  11. Class NewReportParams implements SysOperationValidatable
  12.  
  13. {
  14.  
  15. CustAccount custAccount;
  16.  
  17. }

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

  1. [
  2.  
  3. DataMemberAttribute("CustAccount"),
  4.  
  5. SysOperationGroupMemberAttribute("Cust"),
  6.  
  7. SysOperationDisplayOrderAttribute("1"),
  8.  
  9. SysOperationLabelAttribute("Клиент"),
  10.  
  11. SysOperationHelpTextAttribute("Укажите код клиента")
  12.  
  13. ]
  14.  
  15. Public CustAccount parmCustAccount(CustAccount _custAccount = custAccount)
  16.  
  17. {
  18.  
  19. ;
  20.  
  21. custAccount = _custAccount;
  22.  
  23. return custAccount;
  24.  
  25. }

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

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

 

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

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

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

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

  1. [
  2.  
  3. SRSReportDataSetAttribute(‘RetSalesTable’)
  4.  
  5. ]
  6.  
  7. Public NewReportTableTmp NewRecord()
  8.  
  9. {
  10.  
  11. NewReportTableTmp NewReportTableTmp;
  12.  
  13. ;
  14.  
  15. Select NewReportTableTmp where NewReportTableTmp.custAccount ==000022;
  16.  
  17.  
  18.  
  19. Return NewReportTableTmp;
  20.  
  21. }

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

  1. public void processReport()
  2.  
  3. {
  4.  
  5. NewReportTableTmp NewReportTableTmp;
  6.  
  7. NewReportParams contract;
  8.  
  9. Query q;
  10.  
  11. QueryRun qr;
  12.  
  13.  
  14.  
  15. ;
  16.  
  17.  
  18.  
  19. NewReportTableTmp.setConnection(this.parmUserConnection());
  20.  
  21. contract = this.parmDataContract() as NewReportParams;
  22.  
  23. q = this.parmQuery();
  24.  
  25. qr = new QueryRun(q);
  26.  
  27.  
  28.  
  29. while ( qr.Next() )
  30.  
  31. {
  32.  
  33.  
  34. // Заполняем нашу таблицу NewReportTableTmp
  35.  
  36. }
  37.  
  38.  
  39.  
  40. }

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

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

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

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

 

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

 

 

Акция "Тест-драйв Сопровождения"

Попробуй сопровождение АХ до подписания договора!


Узнать подробнее

Другие записи в блоге

04.05.2017
Теперь можно задавать переменные класса как статические. Семантика точно такая же, как в C#, а именно: все экземпляры класса смогут использовать такой элемент, и, если один класс установит значение,...
18.04.2017
С самой первой версии Axapta переменные, объявленные в классе, имели уровень доступа protected. В AX7 по умолчанию уровень доступа остается таким же, но его уже можно изменить на public или private....
27.03.2017
Начиная уже с первой версии, разработчики Axapta страдали от ограничения в 40 знаков при описании типов, таких как классы, таблицы, расширенные типы данных, и даже при описании методов и полей....

Подпишитесь на блог

Все интересные статьи нашего блога на Вашем почтовом ящике!


Подписка

Служба контроля качества сервиса

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


Письмо директору