Страница 1 из 2

Создание отчетов с наследованием

Добавлено: 17 апр 2015, 23:07
DmitryRu
Цель - создать 2 отчета, Parent и Child.
При изменении внешнего вида Parent необходимо, чтобы изменения подхватывал Child (без ручного труда).

Создал отчет ParentReport.mrt, сохранил его в формате .dll и .cs в том же каталоге.
В этом же каталоге создал отчет ChildReport.mrt (все сделано с помощью стандартного Designer.exe)

Далее, здесь http://www.stimulsoft.com/ru/documentat ... 0%B8%D0%B5 пишут:
Если необходимо использовать базовый отчет для создания новых отчетов в дизайнере, то следует добавить нижеприведенный код:
StiReport.ReportType = typeof(Reports.Report);
Куда его добавить, почему-то не написано. Код, кстати, на сегодня объявлен Deprecated.
Добавил данный код в текстовом редакторе в конструктор класса в файле ChildReport.mrt - есс-но, ничего не происходит. Т.е. компоненты из ParentReport не появляются в ChidReport.

Что я делаю не так?

Re: Создание отчетов с наследованием

Добавлено: 22 апр 2015, 10:56
Aleksey
Здравствуйте,
чтобы изменения подхватывал Child (без ручного труда).
Не могли бы вы более подробно описать задачу.

Уточните также что вы используете - дизайнер контрол в своем приложении или отдельно запускаемый дизайнер отчетов (standalone designer.exe)
Код, кстати, на сегодня объявлен Deprecated.
Перенесено:

Код: Выделить всё

StiOptions.Engine.BaseReportType = typeof(your_Report_type);
Спасибо.

Re: Создание отчетов с наследованием

Добавлено: 22 апр 2015, 12:03
DmitryRu
Мне надо создать много отчетов, у которых будет общая шапка (заголовок) и Footer.
Из чтения документации у меня было впечатление, что я могу наследовать отчеты, примерно как классы. При редактировании базового класса измененный функционал становится доступным его наследникам без дополнительных усилий.
Т.е. я создам базовый отчет, в котором нарисую заголовок отчета, создам DataSource, который обращается к данным БД для этого заголовка.
Создам у базового отчета переменные, которые общие у всех этих отчетов, создам функции, которые будут обращаться к этим переменным, чтобы можно было функции из базового отчета вызывать в наследниках.
И в дальнейшем, если заказчик захочет изменить логотип, или допустим, изменить логику вычисления, я мог бы подправить файл базового отчета один раз, затем перекомпилировать все отчеты, и во всех унаследованных отчетах появился бы новый логотип и моя измененная функция.

Пока я использую отдельно запускаемый дизайнер отчетов (standalone designer.exe) из комплекта поставки Stimulsoft, потому что я не понял из документации, что мне стоит для этих целей написать свое приложение.

Re: Создание отчетов с наследованием

Добавлено: 23 апр 2015, 12:29
HighAley
Здравствуйте, Дмитрий.

Из дизайнера можно сохранить отчёт в виде .cs файла или скомпилировать в сборку (dll). Если отчёт создаётся в коде, то его возможно сохранить с помощью метода SaveReportSourceCode() или как сборку с помощью метода Compile(string path).

Далее этот скомпилированный отчёт подключается к вашему проекту. Его можно указать как базовый класс для всех создаваемых отчётов с помощью следующего кода:

Код: Выделить всё

StiOptions.Engine.BaseReportType = typeof(Reports. YourBaseReport);
где Reports.YourBaseReport – название класса вашего базового отчёта.

В данном случае невозможно использовать Stand-Alone дизайнер. Необходимо создавать новый отчёт в коде и вызвать дизайнер с помощью метода Design().

Спасибо.

Re: Создание отчетов с наследованием

Добавлено: 04 авг 2015, 14:12
DmitryRu
Пытаюсь реализовать наследование отчетов.
Цель - чтобы можно было шапку и подвал у 50 отчетов править в одном месте, а не в 50 отчетах.

Создал обычным дизайнером базовый отчет, в котором разместил интересующие меня компоненты.
Я правильно понял, что этот базовый отчет надо в дизайнере сохранить командой "CSharp Classes for Inherited Reports (*.cs)"?
Эта команда создает класс вида:

Код: Выделить всё

    public class MyStiReport : Stimulsoft.Report.StiReport
    {
        
        public MyStiReport()
        {
            this.InitializeComponent();
            this.MasterReport = "<?xml version=\"1.0\" ...............</StiSerializer>";
        }
        
        #region StiReport Designer generated code - do not modify
        private void InitializeComponent()
        {
        }
        #endregion StiReport Designer generated code - do not modify
    }
Где в строке MasterReport описаны все созданные мной компоненты.

Далее, создал проект, копию вашего "Custom Designer".
Подключаю в этот проект только что сохраненный мною MyStiReport.
В проекте код:

Код: Выделить всё

            StiOptions.Engine.BaseReportType = typeof(Reports.MyStiReport);
            var report = new MyStiReport();
            report.Design();
Открывается дизайнер, в нем видны элементы из MyStiReport, к сожалению, недоступные для редактирования. Допустим, у меня в отчетах есть параметр, обычно он называется "Начало отчетного периода", но в паре отчетов он называется "Отчетная дата". Было бы удобно в базовом отчете назвать параметр (Variable) так, как он называется в большинстве отчетов, а в паре нетипичных отчетов переименовать его.

А далее самое интересное - я сохраняю отчет в .mrt файл и вижу, что все определения компонентов объявлены в этом вновь сохраняемом файле явно, без всяких ссылок на MyStiReport.
Единственно, в секции кода, есть строка

Код: Выделить всё

    public class Report : Reports.MyStiReport
    {
    }
Которая появляется за счет StiOptions.Engine.BaseReportType = typeof(Reports.MyStiReport);

Однако, так как все компоненты не унаследованы, а скопированы из MyStiReport, я не достигаю того, чего хотел бы: если в шапке отчета что-то поменяется, то правка этой шапки в MyStiReport.cs мне ничего не даст - все 50 отчетов никак особо не связаны с этим файлом.
Т.е. у меня получилось не наследование отчетов, а просто какой-то одноразовый шаблон отчета.

Это фишка с "наследованием" так и задумана, или я что-то не правильно делаю?

Re: Создание отчетов с наследованием

Добавлено: 05 авг 2015, 08:11
Jan
Здравствуйте Дмитрий.
DmitryRu писал(а): Открывается дизайнер, в нем видны элементы из MyStiReport, к сожалению, недоступные для редактирования. Допустим, у меня в отчетах есть параметр, обычно он называется "Начало отчетного периода", но в паре отчетов он называется "Отчетная дата". Было бы удобно в базовом отчете назвать параметр (Variable) так, как он называется в большинстве отчетов, а в паре нетипичных отчетов переименовать его.
К сожалению, у наследованных отчетов, наследованные элементы менять нельзя.
DmitryRu писал(а): А далее самое интересное - я сохраняю отчет в .mrt файл и вижу, что все определения компонентов объявлены в этом вновь сохраняемом файле явно, без всяких ссылок на MyStiReport.
Это фишка с "наследованием" так и задумана, или я что-то не правильно делаю?
Не хватает еще одной строчки кода:

Код: Выделить всё

report.MasterReport = masterReport.SaveToString();
Ее нужно добавить перед вызовом дизайнера отчетов и перед построением отчета.

Спасибо.

Re: Создание отчетов с наследованием

Добавлено: 05 авг 2015, 17:30
DmitryRu
Пардон, а masterReport, это что за переменная?
Это так чтоли?

Код: Выделить всё

  var masterReport = new MyStiReport();
Пробовал и так, все равно все определения контролов просто копируются из MyStiReport.mrt в конечный файл, и все.

И, еще хочу понять следующее.
Этот класс, MyStiReport, мне надо сохранить изначально в каком формате?
CSharp Classes
или
CSharp Classes for Inherited Report?

Re: Создание отчетов с наследованием

Добавлено: 06 авг 2015, 08:55
DmitryRu
В общем, попытка использовать "второй способ наследования " отсюда
http://www.stimulsoft.com/ru/documentat ... oaches.htm
приводит к тому, о чем я и писал: при сохранении файла в формате .mrt все определения контролов копируются из файла "d:\\master-detail.mrt" в результирующий файл, и этот результирующий файл никак не связан со своим "предком"

Re: Создание отчетов с наследованием

Добавлено: 06 авг 2015, 09:02
HighAley
Здравствуйте, Дмитрий.

Если вы сохраните класс как CSharp Classes for Inherited Report, то текущий отчёт будет сохранён в поле MasterReport.
Стоит также заметить, что, если вы сохранили отчёт как класс, то вы уже не можете его открыть в дезайнере или загрузить в него другой шаблон отчёта (mrt-файл). Этот вариант подходит, если вы генерируете отчёт из кода.

Если вы всё же остановитесь на использовании шаблонов (mrt-файлов), то в мастер-отчёте вы пожете использовать переменные, которые созданы в основном отчёте. Нопример, если у вас есть в отчёте переменная ReportTitle, то в мастер-отчёте в загаловке вы межете написать {ReportTitle} не создавая там переменную.

Спасибо.

Re: Создание отчетов с наследованием

Добавлено: 06 авг 2015, 09:08
HighAley
Здравствуйте, Дмитрий.
DmitryRu писал(а):В общем, попытка использовать "второй способ наследования " отсюда
http://www.stimulsoft.com/ru/documentat ... oaches.htm
приводит к тому, о чем я и писал: при сохранении файла в формате .mrt все определения контролов копируются из файла "d:\\master-detail.mrt" в результирующий файл, и этот результирующий файл никак не связан со своим "предком"
Обычно сценарий использования мастер-отчёта следующий.
1. У вас есть мастер-отчёт, которы вы при необходимости меняете.
2. Есть основной отчёт, в который можт быть загружен мастер-отчёт. Его вы тоже изменяете по необходимости.
3. Перед построением отчета вы используете код из примера по ссылке для загрузки обновлённого мастер-отчёта. При этом все изменения применяются и вы получаете актуальную версию отчёта.

Спасибо.