Этот документ описывает, как разработать отчет PersonsReport в простом XAF-приложении. Следуйте пошаговым инструкциям и внимательно изучайте пояснения. Вы можете скачать готовый Solution, описанный в данной статье.

Создайте кросс-платформенное XAF-приложение. Назовите его XafariReportsSample. В Solution Explorer перейдите к модулю XafariReportsSample.Module и запустите Module Designer. Добавьте класс Person из сборки DevExpress.Persistent.BaseImpl.

Обеспечьте наличие данных в таблице Person. Перекройте метод UpdateDatabaseAfterUpdateSchema() класса XafariReportsSample.Module.DatabaseUpdate. Updater. Воспользуйтесь следующим кодом.

 

public override void UpdateDatabaseAfterUpdateSchema()

{

    base.UpdateDatabaseAfterUpdateSchema();

 

    var personMary = ObjectSpace.FindObject<Person>(CriteriaOperator.Parse("FirstName == 'Mary' && LastName == 'Tellitson'"));

    if (personMary == null)

    {

        personMary = ObjectSpace.CreateObject<Person>();

        personMary.FirstName = "Mary";

        personMary.LastName = "Tellitson";

        personMary.Email = "mary_tellitson@md.com";

        personMary.Birthday = new DateTime(1980, 11, 27);

    }

 

    var personJohn = ObjectSpace.FindObject<Person>(CriteriaOperator.Parse("FirstName == 'John' && LastName == 'Nilsen'"));

    if (personJohn == null)

    {

        personJohn = ObjectSpace.CreateObject<Person>();

        personJohn.FirstName = "John";

        personJohn.LastName = "Nilsen";

        personJohn.Email = "john_nilsen@md.com";

        personJohn.Birthday = new DateTime(1981, 10, 3);

    }

}

 

Запустите приложение и убедитесь в его работоспособности.

Добавьте к приложению функциональность Xafari.Arms. Это потребуется, чтобы организовать взаимодействие пользователя с системой отчетности. Добавьте также XafariReportsArmModule в XafariReportsSampleModule.

Добавьте к приложению следующие модули системы отчетности:

Добавьте сборки DevExpress.Images, Devexpress.ExpressApp.Images, Xafari.Images к проектам приложения (windows и web). Это обеспечит корректное отображение всех графических изображений.

Теперь можно перейти непосредственно к реализации отчета PersonsReport. Необходимо реализовать источник данных, параметры отчета, алгоритм наполнения источника данных.

Добавьте класс PersonsReportDataSource в XafariReportsSample.Module. Разместите в нем следующий код (см. файл PersonsReportDataSource.cs):

 

using System.Collections.Generic;

using DevExpress.Persistent.BaseImpl;

using Xafari.Reports;

 

namespace XafariReportsSample.Module

{

    public class PersonsReportDataSource : XafariReportDataSourceBase

    {

        public string Caption { get; set; }

        public IList<Person> Persons { get; set; }

    }

}

 

Добавьте класс PersonsReportParameters в XafariReportsSample.Module. Разместите в нем следующий код (см. файл PersonsReportParameters.cs):

 

using DevExpress.ExpressApp.DC;

using Xafari.Reports;

 

namespace XafariReportsSample.Module

{

    [DomainComponent, XafDisplayName("Persons report parameters")]

    public interface PersonsReportParameters : XafariReportParametersBase

    {

        string Filter { get; set; }

    }

}

 

Добавьте класс PersonsReportDataMiner в XafariReportsSample.Module. Разместите в нем следующий код (см. файл PersonsReportDataMiner.cs):

 

using DevExpress.Data.Filtering;

using DevExpress.Persistent.BaseImpl;

using Xafari;

using Xafari.Reports;

 

namespace XafariReportsSample.Module

{

    public class PersonsReportDataMiner : DataMinerOperationBase

    {

        public override XafariReportDataSourceBase GetDataOfReport(object reportParameters)

        {

            var parameters = (PersonsReportParameters) reportParameters;

            var dataSource = new PersonsReportDataSource()

            {

                Caption = parameters.Name

            };

            

            var objectSpace = XafariModule.Application.CreateObjectSpace();

            if (!string.IsNullOrEmpty(parameters.Filter))

            {

                dataSource.Persons = objectSpace.GetObjects<Person>(CriteriaOperator.Parse(parameters.Filter));

            }

            else

            {

                dataSource.Persons = objectSpace.GetObjects<Person>();

            }

            

            return dataSource;

        }

    }

}

 

Файловые отчеты Xafari требуют также реализовать генератор файлового отчета. Для других типов отчетов он не понадобится. Добавьте класс PersonsReportFileGenerator в XafariReportsSample.Module. Разместите в нем следующий код (см. файл PersonsReportFileGenerator.cs):

 

using System.IO;

using System.Text;

using Xafari.Reports.File;

 

namespace XafariReportsSample.Module

{

    public class PersonsReportFileGenerator : XafariFileReportGenerator<PersonsReportDataSource, PersonsReportParameters>

    {

        protected override void GenerateCore()

        {

            var stream = GetStream("PersonsBirthday.txt");

            var writer = new StreamWriter(stream, Encoding.UTF8);

            writer.WriteLine("=== {0} ===", DataSource.Caption);

            foreach (var person in DataSource.Persons)

            {

                writer.WriteLine("{0}, {1}", person.FullName, person.Birthday);

            }

            writer.Flush();

        }

    }

}

 

Реализуйте класс отчета, который будет "знать" свои источник данных, параметры и алгоритм наполнения. Добавьте класс PersonsReport в XafariReportsSample.Module. Разместите в нем следующий код (см. файл PersonsReport.cs):

 

using DevExpress.ExpressApp.DC;

using DevExpress.Persistent.Base;

using Xafari.Reports;

 

namespace XafariReportsSample.Module

{

    [XafDisplayName("Persons report"), ImageName("BO_Person")]

    public class PersonsReport : XafariReport<PersonsReportDataSource, PersonsReportParameters, PersonsReportDataMiner> {}

}

 

Ввиду того, что класс параметров отчета является Domain Component, то необходимо его зарегистрировать. Перекройте метод Setup модуля XafariReportsSampleModule так, как это сделано ниже:

        

public override void Setup(XafApplication application)

        {

            base.Setup(application);

            XafTypesInfo.Instance.RegisterEntity("PersonsReportParameters", typeof(PersonsReportParameters));

        }

 

Теперь необходимо обеспечить взаимодействие конечного пользователя с отчетом. Для этого добавим несколько элементов в систему навигации Xafari ARM.

Вызовите Model Editor для проекта XafariReportsSample.Module. Перейдите к узлу Xafari|ArmDesign|Arms и добавьте новый узел Arm, установите для своййства Сaption значение "Reports".

Добавьте новый узел типа View в Reports. Установите для свойства View значение "XafariReportInfo_ListView". Установите для свойства Caption значение "Administration".

Добавьте новый узел типа Xafari Report в Reports. Установите для свойства Report значение "PersonsReport". Установите для свойства Caption значение "Administration".

Перейдите к узлу View|...|PersonsReportParameters_DetailView и при необходимости кастомизируйте Layout.

Запустите приложение. Создайте параметры отчета и шаблоны отчета, сгенерируйте отчет.