Пример реализации отчета на основе 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!

Добавить комментарий

Sidebar