Пример реализации отчета на основе XMLExcelReport_RU в Dynamics AX 2012
Рассмотри реализацию отчета на основе класса XMLExcelReport_RU в Dynamics AX 2012.
Разберемся на примере простого отчета, в котором выводятся номер заказа на продажу и все коды номенклатур с их наименованиями. В конце отчета будет выводиться общее количество строк в заказе.
Для начала создадим шаблон в MS Excel для печатной формы:
Ячейке R1C2 дадим имя “SalesId”, R4C1 – “ItemId”, R4C2 – “ItemName”, R6C2 – “LineNum”.
Дадим имена диапазонам: Лист1!R1:R2 – “Header”, Лист1!R3 – “HeaderLine”, Лист1!R4 – “Body”, Лист1!R5:R6 – “Footer”.
Добавим готовый шаблон в АОТ в ресурсы назвав элемент XMLExcelReport_SalesTable.
Создадим класс XMLExcelReport_SalesTable:
class XMLExcelReport_SalesTable extends XMLExcelReport_RU { SalesId salesId; DialogField dfSalesId; SalesTable salesTable; SalesLine salesLine; #define.Header ('Header') #define.HeaderLine ('HeaderLine') #define.Body ('Body') #define.Footer ('Footer') #define.SalesId ('SalesId') #define.ItemId ('ItemId') #define.ItemName ('ItemName') #define.LineNum ('LineNum') }
При компиляции сразу появятся ошибки, которые информируют о необходимости реализации методов, объявленных в родительском классе как абстрактные. Там же к ним написаны комментарии. Всех их необходимо перекрыть.
Рассмотрим реализацию наиболее важных из них:
protected void initSectionMap() { this.addSection(#Header); this.addSection(#HeaderLine); this.addSection(#Body); this.addSection(#Footer); }
Здесь инициализируются именованные диапазоны, объявленные в шаблоне.
protected Filename templateName() { return resourceStr(XMLExcelReport_SalesTable); }
Наш шаблон в ресурсах.
protected void fillData(MSOfficeBookMark_RU _bookmark) { switch (_bookmark) { case #Header: this.fillHeader(); break; case #Body: this.fillBody(); break; case #Footer: this.fillFooter(); break; } }
Методы, которые будут вызываться при заполнении той или иной секции отчета.
protected void fillHeader() { this.insertValueToSection(#SalesId, salesId); }
Заполнение значений в заголовке отчета.
protected void fillBody() { this.insertValueToSection(#ItemId, salesLine.ItemId); this.insertValueToSection(#ItemName, salesLine.itemName()); }
Заполнение значений по строкам заказа.
protected void fillFooter() { this.insertValueToSection(#LineNum, salesTable::find(salesId).numberOfLines()); }
Заполнение значений в итоговой секции отчета.
protected void createReport() { this.initSectionMap(); this.setCurrentWorksheetNum(1, 1); this.execute(#Header); this.execute(#HeaderLine); while select * from salesLine where salesLine.SalesId == salesId { this.execute(#Body); } this.execute(#Footer); }
Метод, в котором описан сам процесс формирования всего отчета.
Посмотреть информацию о всех методах класса XMLExcelReport_RU можно здесь:
https://docs.microsoft.com/en-us/previous-versions/dynamics/ax-2012/application-classes/jj787925(v%3dax.60)
Comments
So empty here ... leave a comment!