В текущей версии 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». С помощью класса параметров и атрибутов данного класса можно указывать параметры отчета и их расположение внутри диалога выбора параметров, кроме этого можно написать методы для параметров, возвращающие специфические наборы значений параметра.
[ DataContractAttribute, SysOperationContractProcessingAttribute(classStr(SrsReportDataContractUIBuilder)), SysOperationGroupAttribute(“Customer”,”Настройки клиента”, “1”, FormArrangeMethod::Vertical) ] Class NewReportParams implements SysOperationValidatable { CustAccount custAccount; }
2. Метод описывающий параметр «CustAccount»
[ DataMemberAttribute(“CustAccount”), SysOperationGroupMemberAttribute(“Cust”), SysOperationDisplayOrderAttribute(“1”), SysOperationLabelAttribute(“Клиент”), SysOperationHelpTextAttribute(“Укажите код клиента”) ] Public CustAccount parmCustAccount(CustAccount _custAccount = custAccount) { ; custAccount = _custAccount; return custAccount; }
3. Класс провайдера нашего отчета:
Class NewReportDataProvider extends SrsReportDataProviderPreProcess { }
Для определения классов провайдера, также можно использовать класс SrsReportDataProviderBase. Отладка класса наследуемого от SrsReportDataProviderBase не возможна, по этому наша рекомендация использовать класс SrsReportDataProviderPreProcess, т.к. в нем возможна отладка AX2012, кроме отладки, данные классы различаются по использованию внутри них работы с наборами данных.
Класс SrsReportDataProviderBase позволяет работать с временными таблицами, в SrsReportDataProviderPreProcess необходимо использовать обычные таблицы с включенными свойствами CreatedBy и CreatetransactionId, как временные. Предварительно мы создали таблицу NewReportTableTmp с включенными свойствами CreatedBy и CreatedTransactionID
4. Определение класса провайдера с атрибутами (атрибуты указываются внутри конструкции «[ ]», через запятую).
[ SRSReportQueryAttribute(queryStr(QFromNewReport)), // запрос на набор данных SRSReportParameterAttribute(classStr(NewReportParams)) // класс параметров отчета ] Class NewReportDataProvider extends SrsReportDataProviderPreProcess { }
5. Метод возвращающий источник данных, необходимо пометить следующим атрибутом:
[ SRSReportDataSetAttribute(‘RetSalesTable’) ] Public NewReportTableTmp NewRecord() { NewReportTableTmp NewReportTableTmp; ; Select NewReportTableTmp where NewReportTableTmp.custAccount == ‘000022’; Return NewReportTableTmp; }
6. Далее перекрываем метод провайдера processReport(), он используется для заполнения созданной нами «временной» таблицы необходимыми нам данными, то есть в этом методе мы можем определить необходимый нам алгоритм выборки данных.
public void processReport() { NewReportTableTmp NewReportTableTmp; NewReportParams contract; Query q; QueryRun qr; ; NewReportTableTmp.setConnection(this.parmUserConnection()); contract = this.parmDataContract() as NewReportParams; q = this.parmQuery(); qr = new QueryRun(q); while ( qr.Next() ) { … // Заполняем нашу таблицу NewReportTableTmp } }
7. Создание класса отчета (предварительно в AX2012 через Visual Studio был создан отчет «NewReport» в котором в качестве источника данных выбран созданный нами провайдер):
Class NewReportControl extends SRSReportRunController { }
8. Метод main этого класса:
Public static void main (Args _args) { NewReportControl controller; ; Controller = new NewReportControl(); Controller.parmreportName(SsrsReportStr(NewReport, Report)); // какой отчет вызываем Controller.parmShowDialog(true); // диалог параметров отчета Controller.parmDialogCaption(“Шапка окна диалога”); // надпись в шапке окна диалога Controllrt.startOperation; // запуск отчета }
Используя выше описанные приемы, можно создавать очень гибкие параметры для отчетов и использовать наборы данных подготавливаемых «на лету». По сравнению со стандартной платформой построения отчетов MS Dynamics AX предыдущих версий, процесс создания дизайна отчетов стал проще и гибче, что позволяет сократить разработку нового отчета, не теряя времени на разработку и подгонку дизайна самого отчета.
Авторы статьи: Петров Евгений, Майстренко Олег
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.