Рассмотри реализацию отчета на основе класса 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)
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!