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 предыдущих версий, процесс создания дизайна отчетов стал проще и гибче, что позволяет сократить разработку нового отчета, не теряя времени на разработку и подгонку дизайна самого отчета.
 
 
 
Авторы статьи: Петров Евгений, Майстренко Олег

 

 

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

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


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

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

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

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

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


Подписка

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

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


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