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

Приведем простой пример. В базе данных есть таблица, к которой обращаются отчеты. По мере накопления данных таблица сильно увеличилась в размерах, и решено разбить ее на две — с архивными и текущими данными. А в отчетах подразумевалось, что все данные находятся в одной таблице, и придется заниматься трудоемкой работой по их переделке и развертыванию новых версий.

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

В системе отчетов SAP Business Objects предусмотрен такой промежуточный уровень в виде юниверсов, к которым могут обращаться отчеты Crystal Reports и Web Intelligence. В BIRT ничего подобного не предусмотрено, но в качестве промежуточного уровня можно использовать, например, хранимые процедуры в SQL Server и Oracle или табличные функции в PostgreSQL.

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

Вначале создадим хранимую процедуру в нашей базе данных HR01 на SQL Server, к которой мы уже подключались. Код на создание хранимой процедуры будет совсем-совсем простой:

create proc uspProc01 as select * from hr.Employees

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

Затем нам нужно создать источник данных (Data Source). При этом источник данных типа JDBC Database Connection for Query Builder нам не подойдет, нужен обязательно JDBC Data Source. Создаем его пошагово:

  1. В окне Data Explorer щелкаем правой кнопкой мыши по контейнеру Data Sources, выбираем New Data Source (Новый источник данных) и в предложенном списке типов источников данных выбираем JDBC Data Source (см. рис. 3.4.2.1)

Рис. 3.4.2.1 Создание источника данных JDBC для работы с хранимыми процедурами в отчетах BIRT

2. На экране Create a Data Source (Создать источник данных) нажимаем на кнопку Manage Drivers (Управление драйверами) — см. рис. 3.4.2.2.

Рис. 3.4.2.2 Настройка драйвера JDBC для работы с хранимыми процедурами в отчете BIRT

3 . В открывшемся окне Manage JDBC Drivers (Управление драйверами JDBC) на вкладке JAR files нажмите на кнопку Add и добавьте файл JAR (см. рис. 3.4.2.3) В моем случае это будет файл драйвера JDBC для SQL Server sqljdbc4-4.0.jar, скачанный с репозитария Maven. На вкладке Drivers можно убедиться, что добавлен драйвер com.microsoft.sqlserver.jdbc.SQLServerDriver и присвоить ему понятное имя, а можно этого и не делать.

Рис. 3.4.2.3 Выбор файла JAR для драйвера JDBC

4. Нажимаем на кнопку OK, возвращаемся в окно Create a new data source и заполняем в нем свойства Data Source (см. рис. 3.4.2.4).

Рис. 3.4.2.4 Настройка свойств источника данных JDBC для работы с хранимыми процедурами

Рекомендуется нажать на кнопку Test Connection и проверить, проходит ли подключение. После этого — Finish, и источник данных JDBC для SQL Server создан.

6. Дальше нужно создать специфический Data Set. Щелкаем правой кнопкой мыши по контейнеру Data Sets, в контекстном меню выбираем New Data Set, в окне New Data Set выбираем свежесозданный Data Source, а списке ниже выбираем SQL Stored Procedure Query (см. рис. 3.4.2.5).

Рис. 3.4.2.5 Создание источника данных для хранимой процедуры в отчете BIRT

7 . На следующем экране, который называется Query (см. рис. 3.4.2.6) нужно написать код для вызова хранимой процедуры (или сгенерировать его, найдя хранимую процедуру в списке слева).

Рис. 3.4.2.6 Код для вызова хранимой процедуры из отчета BIRT

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

{call dbo.uspProc01(?,?);1}

где знаки вопроса как и раз означают параметры входящей процедуры.

8. После того, как код на вызов хранимой процедуры создан, нажимаем на кнопку Finish и попадаем на экран Output Columns (см. рис.  3.4.2.7) На этом экране можно просмотреть информацию о столбцах, которые возвращаются в наборе результатов хранимой процедуры, и при необходимости отредактировать информацию для каждого столбца: уточнить тип данных, присвоить псевдоним и т. п.

Рис. 3.4.2.7 Экран Output Parameters при создании Stored Procedure Data Set в BIRT

Заметим, что некоторые хранимые процедуры могут возвращать более одного набора результатов. Для таких хранимых процедур можно выбрать конкретный возвращаемый набор результатов, который будет использоваться в этом Data Set. Это делается на вкладке Settings.

8. На экране Computed Columns (см. рис. 3.4.2.8) можно добавить в набор возвращаемых хранимой процедурой данных один или несколько вычисляемых столбцов, используя выражения и функции BIRT;

Рис. 3.4.2.8 Экран Computed Columns в мастере создания источника данных для работы с хранимыми процедурами в BIRT

9. На экране Parameters (см. рис. 3.4.2.9) можно определить параметры для Data Set и привязать их к параметрам отчета.

Рис. 3.4.2.9 Экран Parameters свойств набора данных BIRT для работы с хранимыми процедурами

10. На экране Filters (см. рис. 3.4.2.10) можно настроить фильтры, которые будут ограничивать данные, возвращаемые Data Set.

Рис. 3.4.2.10 Экран Filters свойств Data Set в BIRT

11. На экране Property Binding (см. рис. 3.4.2.11) можно написать выражение, которое будет динамически менять свойства Data Set.

Рис. 3.4.2.11 Окно Property Binding (Привязка свойств) для набора данных BIRT, работающего с хранимой процедурой

Обратим внимание на то, что, в отличие от Data Set для работы с запросами, в Data Set для хранимых процедур на этом экране предусмотрено два дополнительных параметра:

  • Query Timeout тайм-аут для выполнения хранимой процедуры (можно определить и динамически, при помощи выражения). При превышения тайм-аута BIRT будет считать, что хранимую процедуру выполнить не удалось;

  • Row Fetch Size — максимальный размер возвращаемой строки в наборе данных. Можно использовать в качестве «предохранителя».

12. На экране Settings (Настройки см. рис. 3.4.2.12) можно настроить три важных параметра:

Рис. 3.4.2.12 Экран Settings свойств набора данных для работы с хранимыми процедурами в BIRT

  • Fetch all rows from data source (Получить все строки с источника данных) — возможность настроить получение не всех строк с источника данных, а только определенного их количества (например, 100). Очень полезно для отладки отчета (только нужно при передаче на продакшн не забыть этот параметр убрать);

  • Result Set Selection (Выбор набора результатов)если хранимая процедура возвращает несколько наборов данных (например, в ней предусмотрено несколько SELECT), то при помощи этого параметра можно выбрать, какой именно набор данных будет использоваться в этом Data Set;

  • Locale of Character Set Values (Кодировка символьных значений)возможность указать конкретный язык для строковых значений Data Set. Может пригодиться при настройке сортировки;

  • Ordering of Null Values (Порядок пустых значений при сортировке) — возможность определить, будут ли пустые значения считаться наименьшими, наибольшими или вообще игнорироваться.

13. На экране Output Parameters можно просмотреть информацию об исходящих параметрах хранимой процедуры (если таковые для нее предусмотрены), а на экране Preview Results — возвращаемые хранимой процедурой данные.

Все, набор данных для работы с хранимой процедурой создан. Можно приступать к размещению полученных данных в отчете.

Перейти к следующему разделу