Инструкция по разработке типового отчета.
К инструкции прилагается проект-пример Galaktika.Kaustik.Reports.csproj. (В проекте код подробно комментированный)
Концепция типовых отчетов ЕАМ.
eXpressApp Framework поставляет модуль «Отчеты». Этот модуль позволяет легко проектировать и печатать отчеты. Отчеты представляют собой персистентные объекты, которые хранятся в базе данных, для этого используется класс ReportData. Модуль использует полный функционал «движка» - XtraReports Suite. Этот «движок» предоставляет дизайнер, который позволяет создавать, просматривать и настраивать отчеты. Источником данных служит любой персистентный класс со всеми его свойствами. Параметрами отчета могут выступать значения свойств.
Недостатки существующей архитектуры:
Параметры отчета нельзя сохранить в базе данных
В качества источника данных могут выступать только персистентные объекты. Нельзя разработать отчеты, для которых структуры конкретного персистентного объекта недостаточно.
Нельзя добавить какой либо специфический алгоритм для получения источника данных
Чтобы запустить разные печатные формы для одного источника данных, нужно каждый раз выполнять получение источника данных
Архитектура типовых отчетов ЕАМ максимально использует функциональность платформы eXpressApp Framework, но также позволяет:
Сохранять параметры отчета в базе данных
Создавать отчеты со специфической структурой данных
Предоставить возможность разрабатывать свой алгоритм заполнения источника данных
Создавать для одного источника данных несколько печатных форм
Предоставить возможность запускать несколько печатных форм на одном источнике данных, при этом получение данных выполняется 1 раз.
Классы архитектуры:
Класс
|
Базовый класс
|
Предназначение
|
StandartReportData
|
DevExpress.ExpressApp.Reports.ReportData
|
Персистентный объект для хранения печатной формы типового отчета
|
StandartReportDataSourceHelper
|
|
В момент обновления базы данных инициализирует объекты, которые будут использоваться для источника данных типовых отчетов.
|
StandartReportDataSourceObject
|
DevExpress.Persistent.BaseImpl.BaseObject
|
Базовый класс для описания источника данных типового отчета
|
StandartXafReport
|
DevExpress.ExpressApp.Reports.XafReport
|
Используется для отображения дизайнера и печатной формы типового отчета
|
StandartReportDataSourceObjectViewController
|
ViewController
|
Контроллер отвечает за отображение и формирование Типовых отчетов
|
Разработка типового отчета.
Для разработки нового отчета необходимо разработать ряд классов. Рассмотрим на примере отчета «Цены МЦ по данным последней закупки» (см проект-пример):
Galaktika.Kaustik.Module.DataSourceObjects. InventoriesPriceReport
Наследник от StandartReportDataSourceObject. Этот класс будет использоваться как источник для стандартного отчета XAF. Смысл в том, чтобы в одном персистентном объекте хранить параметры (нужно реализовать свойство ParametersObjectList), шаблоны (свойство ReportDataCollection) и структуру данных отчета (нужно реализовать свойство DataSourceCollection). В базе данных может храниться только один объект этого типа, он создается автоматически в момент обновления базы данных и его нельзя удалить (за это отвечает статический класс StandartReportDataSourceHelper). Так же класс отвечает за заполнение источника данных для отчета (нужно реализовать метод InitializeDataSourceCollectionCore).
Galaktika.Kaustik.Module.DataSourceObjects. InventoriesPriceReportParameter
Содержит перечень свойств, описывающих параметры отчета. В данном примере наследуется от класса EAMBaseReportParameters. Базовый класс имеет перечень параметров и виртуальный метод GetCriteria. Метод, согласно заданным параметрам, формирует CriteriaOperator. Данный критерий в дальнейшем используется для получения данных.
Galaktika.Kaustik.Module.DataSourceObjects. InventoriesPriceReportService
Реализует наполнение элементов детализации отчета, в данном примере создает список экземпляров класса InventoriesPriceReportSource.
Galaktika.Kaustik.Module.DataSourceObjects. InventoriesPriceReportSource.
Содержит перечень свойств, описывающих структуру данных, получаемых в отчете (Данные о дефектной ведомости)
Galaktika.Kaustik.Module.DataSourceObjects. InventoriesPriceReportSourceSpec
Содержит перечень свойств, описывающих структуру данных спецификации.
(Данные о материалах дефектной ведомости)
Получение данных для типового отчета.
Для получения данных из ЕАМ можно использовать множество способов. Самые распространенные это:
с помощью XPCollection http://documentation.devexpress.com/#XPO/clsDevExpressXpoXPCollectiontopic
с помощью XPQuery (Linq to XPO).
http://documentation.devexpress.com/#XPO/CustomDocument4060
При больших объемах информации рекомендуется использовать Linq to XPO. Т.к. XPCollection при загрузке данных получает всю информацию об объекте, что приводит к большому расходу оперативной памяти. А Linq to XPO позволяет отобрать только интересующую нас информацию. В классе InventoriesPriceReportService показан пример работы с Linq to XPO. В нашем примере по Дефектной ведомости отбираются только след. данные:
ExternalID, Oid, Код.
Особое внимание хочу уделить строке, где Метод AppendWhere позволяет применять критерий, полученный в классе параметров (CriteriaOperator) в XPQuery (другого способа я не нашел):
var repairLists = (IQueryable<�ЗаявкаНаРемонт>) new XPQuery<�ЗаявкаНаРемонт>(session). AppendWhere(converter, parameter.GetCriteria());
-
Получение данных из ERP.
Для работы с БД Галактика ERP были разработан ряд классов:
Galaktika.Kaustik.Utils.DataBase.IGalaktikaErpDbManager
Т.к. Галактика ERP может работать с разными СУБД, был разработан данный интерфейс. Он содержит ряд методов и свойств для работы с БД.
Galaktika.Kaustik.Utils.DataBase.GalaktikaErpDbManagerFactory
Фабрика в зависимости от строки соединения возвращает DbManager. В примере реализован DbManager только для MsSql.
Galaktika.Kaustik.Utils.DataBase.Sql.SqlGalaktikaErpDbManager
Это DbManager для работы с MsSql. Реализует интерфейс IGalaktikaErpDbManager. В частности метод GetInventoriesPrice, который делает запрос БД Галактика Erp и получает информормацию о ценах МЦ согласно данным последней закупки.
Если Вам необходимо разработать новый запрос в БД рекомендуется расширить интерфейс IGalaktikaErpDbManager нужным вам методом и реализовать данный метод в классе SqlGalaktikaErpDbManager.
Запрос данных erp с учетом данных eam.
Для того чтоб отобрать данные erp, с учетом уже отобранных данных eam, мы создаем в БД erp временную таблицу и с помощью Bulk Copy, заносим туда данные eam. Данная временная таблица участвует в запросе данных erp (см файл GetInventoriesPriceQuery.sql).
За создание временной таблицы отвечает метод CreateTempDbTable, за копирование данных отвечает метод BulkCopyTempDbTable (см. класс SqlGalaktikaErpDbManager)
Объединение данных erp и eam. Инициализация данных отчета.
После того как получили данные необходимо заполнить данные отчета. Создать список экземпляров InventoriesPriceReportSource, каждый из которых содержит список InventoriesPriceReportSourceSpec. (см. класс InventoriesPriceReportService)
Запуск отчета из меню Отчеты -> Типовые отчеты
Списковая форма Типовые отчеты. Здесь перечислены все «объекты-одиночки» наследники от StandartReportDataSourceObject:
Карточная форма типового отчета, закладка параметры. Здесь пользователь может работать с параметрами данного типового отчета: создавать новые, редактировать, удалять:
Карточная форма типового отчета, закладка шаблоны. Здесь пользователь может работать с шаблонами данного типового отчета: создавать новые, редактировать, удалять.
Карточная форма типового отчета, закладка Источник. Здесь пользователь может просмотреть и проанализировать сформированный источник данных не вызывая печатную форму.
Чтобы сформировать отчет, пользотваетелю достаточно выбрать нужные параметры, двойным кликом по параметру вызвать функцию получения данных, затем он может вызвать любое количество печатных форм для уже заполенного источника данных. Если шаблон помечен как основной, то он запустится автоматически.
Запуск отчета из карточки или списка объекта.
Для того чтобы отчет запустить из представления (View) какого либо персистентного объекта необходимо разработать контроллер (ViewController), с действием, которое будет выполнять запуск отчета. Действие должно иметь категорию (Category) “StandartReports”.
Рекомендуется создать базовый класс для ваших контроллеров (реализация данного класса есть в примере):
public partial class ShowInStandartReportViewController : ViewController
{
protected WinReportServiceController reportServiceController;
protected IObjectSpace reportObjectSpace;
protected override void OnActivated()
{
base.OnActivated();
reportObjectSpace = this.Application.CreateObjectSpace();
reportServiceController = this.Frame.GetController();
if (reportServiceController != null)
{
reportServiceController.CustomShowPreview += new EventHandler(reportServiceController_CustomShowPreview);
}
}
protected override void OnDeactivated()
{
reportObjectSpace = null;
if (reportServiceController != null)
{
reportServiceController.CustomShowPreview += new EventHandler(reportServiceController_CustomShowPreview);
reportServiceController = null;
}
base.OnDeactivated();
}
void reportServiceController_CustomShowPreview(object sender, CustomShowPreviewEventArgs e)
{
//устанавливаем для отчета ObjectSpace в котором получаются данные
e.Report.ObjectSpace = reportObjectSpace;
}
protected virtual void ExecuteStandartReport(Type dataSourceObjectType, object patameterObject)
{
//получаем singletone объект для отчета:
var standartReportDataSourceObject = (StandartReportDataSourceObject)reportObjectSpace.GetObjects(dataSourceObjectType)[0];
//устанавливаем текущие параметры:
standartReportDataSourceObject.ParametersObject = patameterObject;
//Загружаем данные:
standartReportDataSourceObject.InitializeDataSourceCollection();
foreach (var reportData in standartReportDataSourceObject.ReportDataCollection)
{
if (reportData.IsMain)
reportServiceController.ShowPreview(reportData);
}
}
}
Данный класс имеет метод ExecuteStandartReport, который и выполняет запуск.
Пример реализации наследника см. класс ДефектнаяВедомость_StandartReportViewController в примере.
Для пользователя, в списке или карточке, в тулбаре появится раздел типовые отчеты, в котором будет доступно ваше действие. В примере выделенные дефектные ведомости попадают в параметры отчета. И для них выводятся отчет о ценах МЦ.
|