Как хранить отчеты FastReport .Net в базе данных

28.02.2016

Обычно отчеты хранятся в одном месте, но в отдельных файлах. С ростом количества файлов появляются сложности в структурировании, поиске. Размышляя на эту тему, я наткнулся на одно очень интересное свойство объекта Report – ReportSourceString. В этом свойстве хранится весь шаблон отчета в строковом виде.

Исходя из этого, есть возможность хранить шаблоны отчета в любой базе данных. Мы получаем возможность хранить все отчеты в одном месте. …

Чтобы сохранять отчеты в базу данных, нам потребуется написать собственные методы сохранения и загрузки отчета.  Итак, приступим.

Прежде всего, создаем базу данных для хранения отчетов. Я использовал MS Access.

Таблица имеет следующую структуру:

Имя поля

Тип данных

id

Счетчик

Name

Текстовый

Template

Поле MEMO

 Создаем приложение WindowsForms. Добавляем подключение к нашей базе данных. На форме размещаем кнопку, компоненты DataSet, BindingSource и Report.

 

 

Забегая вперед, скажу, что нам потребуется диалоговая форма, на которой мы будем задавать имя отчета при сохранении/загрузке:

 

Для кнопок необходимо задать свойство DialogResult в соответствии с их названием.

Переходим к программированию. Используем следующие библиотеки FastReports:

1
2
3
4
5
using FastReport;
 
using FastReport.Utils;
 
using FastReport.Design;

 И создаем экземпляр диалоговой формы:

1
public SaveLoadForm form2 = new SaveLoadForm();

 Создаем обработчик события сохранения отчета:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void cmdSave_CustomAction(object sender, EventArgs e)
 
 {
 
 ReportsDataSet.ReportsRow row;
 
 row = reportsDataSet1.Reports.NewReportsRow();
 
 if (form2.ShowDialog() == DialogResult.OK)
 
 {
 
 row.Name = form2.ReportName;
 
 row.Template = report1.ReportResourceString;
 
 this.reportsDataSet1.Reports.Rows.Add(row);
 
 ReportsDataSetTableAdapters.ReportsTableAdapter adapter = new ReportsDataSetTableAdapters.ReportsTableAdapter();
 
 adapter.Update(reportsDataSet1.Reports);
 
 }
 
 }

  Здесь, мы создаем новую строку в таблице отчетов. Затем запускаем диалоговую форму. В форме будет вводиться имя отчета. Полю Name присваиваем значение из текстового поля диалоговой формы. А в поле Template записываем шаблон отчета в текстовом виде.

После этого, посредством адаптера, сохраняем изменения в таблице.

Теперь создаем обработчик события загрузки отчета:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void cmdOpen_CustomAction(object sender, EventArgs e)
 
 {
 
 if (form2.ShowDialog() == DialogResult.OK)
 
 {
 
 for (int i = 1; i < reportsDataSet1.Reports.Rows.Count; i++)
 
 if (reportsDataSet1.Reports[i].Name == form2.ReportName)
 
 {
 
 report1.ReportResourceString = reportsDataSet1.Reports[i].Template.ToString();
 
 }
 
 Designer designer = sender as Designer;
 
 
 
 designer.SetModified(this, "EditData");
 
 }
 
 }

 Мы также вызываем диалоговую форму. В цикле ищем отчет с именем, соответствующем введенному в текстовом поле. Из поля Template отчет загружается в свойство ReportResourceString. Затем, для отображения изменений, обновляется дизайнер.

Итак, мы написали два обработчика. Теперь, нужно перехватить стандартные обработчики событий и подставить наши.

1
2
3
4
5
6
7
8
9
 private void DesignerSettings_DesignerLoaded(object sender, EventArgs e)
 
 {
 
 (sender as Designer).cmdSaveAs.CustomAction += new EventHandler(cmdSave_CustomAction);
 
 (sender as Designer).cmdOpen.CustomAction += new EventHandler(cmdOpen_CustomAction);
 
 }

 Как видно, мы перехватываем событие сохранения и загрузки отчета, подставив пользовательские обработчики.

На событие нажатия кнопки в главной форме добавляем следующий код:

1
2
3
4
5
6
7
8
9
 private void DesignBtn_Click(object sender, EventArgs e)
 
 { 
 
 Config.DesignerSettings.DesignerLoaded += DesignerSettings_DesignerLoaded;
 
 report1.Design(); 
 
 }

 Переопределяем обработчик загрузки дизайнера отчетов.

Таким образом, мы создали приложение, которое позволяет сохранять и загружать отчеты в базу данных MS Access. Вы можете организовать хранение отчетов в любой удобной базе данных благодаря свойству отчета ReportSourceString.

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.