Создание SSRS отчета в Microsoft Dynamics 365 FO

Category: Статьи Post Date: 22.04.2020

Привет, друзья, сегодня я покажу вам процесс создания и изменения SSRS отчета в D365FO. Перед тем как начать, убедитесь, что вы создали новую модель для разработки, поскольку мы будем использовать подход расширения при создании отчета, так как такой подход позволяет добавлять функциональные возможности к существующим элементам модели и исходному коду.

Возвращаясь к теме этой статьи – разработке отчетов SSRS в D365. Напомню, что в D365FO нет изменений в построении отчета ни на основе query, ни на основе RDP. Единственное изменение – вы должны использовать расширения для стандартных отчетов. Если вы разрабатываете новый отчет на основе своих таблиц, то в этом случае никаких отличий нет.

Итак, в этом блоге я пошагово покажу как кастомизировать существующий отчет SSRS в D365, используя подход, основанный на расширении (extensions).

 

Шаг 1: На первом шаге создадим новую модель. Ниже приведены шаги по созданию новой модели.

Перейдите в меню VS: Dynamics 365 > Model Management > Create model:

Укажите имя модели и другую информацию:

В Select package, создайте новый пакет, чтобы ваша модель была скомпилирована в отдельную сборку.

Теперь выберете все пакеты, которые требуются для вашей модели. Вы можете потом обновить их или добавить другие параметры модели, через Model management (убедитесь, что указаны все необходимые пакеты для вашей модели).

После того как вышеуказанные шаги будут выполнены, на финальном окне, вы можете установить флажок, чтобы сделать созданную модель, моделью по умолчанию для ваших новых проектов (также поменять модель можно в свойствах проекта).

После того, как модель будет создана, мы займемся нашей основной разработкой используя созданную модель.

Шаг 2: Создадим новый проект в Visual Studio,

Перейдите в меню File > New > Project:

Выберете Dynamics 365 > Unified Operations, задайте подходящее имя для вашего проекта и нажмите OK:

После создания проекта, убедитесь, что модель, созданная на первом шаге, выбрана для проекта, как видно на снимке экрана ниже (вы также можете указать модель перейдя в свойства проекта и выбрав соответствующую модель)

Шаг 3: Сдублируйте существующий отчет в созданный проект (для демонстрации я буду изменять отчет по заказам на покупку):

Дублируем PurchPurchaseOrderReport из Application explorer > AOT > Reports > PurchPurchaseOrder как показано ниже на скриншоте:

Переименуем отчет и укажем для него подходящее имя.

 

Шаг 4: Изменим дизайн отчета в соответствии с требованиями:

Шаг 5: Создадим новый Extension class который расширяет класс контроллера стандартного отчета.

Создадим класс для загрузки модифицированного дизайна отчета

class PurchPurchaseOrderControllerExt extends PurchPurchaseOrderController

{

public static PurchPurchaseOrderControllerExt construct()

{

return new PurchPurchaseOrderControllerExt();

}

}

Добавляем main метод который будет ссылаться на модифицированный дизайн отчета (вы можете просто скопировать метод main из стандартного отчета и добавить ссылку на новый класс контроллера)

public static void main(Args _args)

{

SrsReportRunController          formLetterController = PurchPurchaseOrderControllerExt::construct();

PurchPurchaseOrderControllerExt    controller;

 

if (TradeFormHelper::isCalledFromForm(_args, formStr(VendPurchOrderJournalListPage)))

{

_args.record(VendPurchOrderJour::findRecId(_args.record().RecId));

}

controller = formLetterController;

controller.initArgs(_args, ssrsReportStr(AXPPurchPurchaseOrder,Report));

if(classIdGet(_args.caller()) == classNum(PurchPurchOrderJournalPrint))

{

formLetterController.renderingCompleted+= eventhandler(purchPurchOrderJournalPrint::renderingCompleted);

}

formLetterController.startOperation();

}

Я столкнулся с проблемой, которая заключалась в том, что новый дизайн отчета не отображался даже после создания extension класса, который был связан с новым дизайном отчета. После анализа проблемы я нашел способ как ее решить. Нужно добавить следующий метод:

protected void outputReport()

{

SRSCatalogItemName  reportDesign;

reportDesign = ssrsReportStr(AXPPurchPurchaseOrder,Report);

this.parmReportName(reportDesign);

this.parmReportContract().parmReportName(reportDesign);

formletterReport.parmReportRun().settingDetail().parmReportFormatName(reportDesign);

super();

}

Шаг 6 (дополнительно): Этот шаг для случая, когда вам необходимо изменить источник данных отчета, то есть, если вы добавили, новые поля в источник данных отчета или вам нужно изменить уже собранные данные во временной таблице.

Для примера давайте рассмотрим случай, когда нам нужно добавить новое поле, например «Terms and conditions» в заголовок отчета. Для этого мы создадим расширение для временной таблицы:

Перейдите в Application explorer> AOT> Data model> Tables:

Добавим требуемое поле в расширение временной таблицы:

  1. Теперь перейдите к отчету и сбросьте датасет отчета, для обновления только что добавленного столбца в дизайне отчета.
  2. Чтобы добавить логику в коде для заполнения добавленного поля, создайте новый класс обработчик отчета:

Для примера, я создал класс:

class AXPPurchPurchaseOrderHandler

{

}

Теперь у нас есть два разных способа заполнения данных в классе обработчике отчета:

 

  1. Добавить событие на вставку записи во временную таблицу.

Применяйте этот подход для построчных вычислений. Ниже я привел реализацию этого подхода, которая решает поставленную задачу.

 [DataEventHandlerAttribute(tableStr(PurchPurchaseOrderHeader), DataEventType::Inserting)]

public static void PurchPurchaseOrderHeaderInsertEvent(Common c, DataEventArgs e)

{

PurchPurchaseOrderHeader    tempTable = c;

FormLetterRemarks           formLetterRemarks;

formLetterRemarks = formLetterRemarks::find(‘en-us’, FormTextType::PurchPurchaseOrder);

tempTable.TermsAndConditions = formLetterRemarks.Txt;

}

  1. Добавить пост обработчик.

Применяйте этот подход для групповой вставки, которая использует один проход для получения результирующего набора из стандартного отчета.

[PostHandlerFor(classStr(PurchPurchaseOrderDP), methodstr(PurchPurchaseOrderDP, processReport))]

public static void TmpTablePostHandler(XppPrePostArgs arguments)

{

PurchPurchaseOrderDP dpInstance = arguments.getThis() as PurchPurchaseOrderDP;

PurchPurchaseOrderHeader tmpTable = dpInstance.getPurchPurchaseOrderHeader();

FormLetterRemarks           formLetterRemarks;

ttsbegin;

while select forUpdate tmpTable

{

formLetterRemarks = formLetterRemarks::find(‘enus’, FormTextType::PurchPurchaseOrder);

tempTable.TermsAndConditions = FormLetterRemarks.Txt;

tmpTable.update();

}

ttscommit;

}

Шаг 7: Создайте расширение для существующего элемента меню (menu item):

  1. Перейдите в Application Explorer> AOT> User interface> Menu items> output> PurchPurchaseOrder > Сreate extension.

Убедитесь, что свойство Object установлено в значениеPurchPurchaseOrderControllerExt для запуска нашего решения

На этом все по кастомизации отчета SSRS в D365, теперь мы можем проверить нашу доработку, запустив отчет.

Надеюсь, эта статья будет полезна для вас, друзья, следите за появлением новых статей по D365.

Оригинал статьи доступен по ссылке.

Подписывайтесь на канал @d365neti в Telegram

Подписаться

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