Отчеты создаются, как обычный отдельный прикладной модуль БД или являются частью другого модуля. Основное отличие разработки состоит в том, что нет необходимости создавать собственные классы, а следует воспользоваться стандартными возможностями класса TDBOReport. Таким образом, необходимо программировать только серверную часть, не делая перекомпиляции исполняемого модуля. В модуле может быть несколько отчетов.
Отчет в ONTARIO1 представляет собой табличную форму с заголовками, формирование и форматирование которой производится определенной процедурой БД. Перед формированием отчет может запрашивать параметры, объявление и инициализация которых также производится процедурой БД. Таким образом, программирование табличных отчетов сводится к написанию кода серверных процедур. После формирования отчетной формы она может экспортироваться в MS Excel или непосредственно выведена на печать.
Создание отчета можно разделить на следующие этапы:
В соответствии с соглашением, процедуры следует именовать следующим образом:
rip<имя отчета> - процедура инициализации параметров и заголовков (rip - Report Initialization Procedure);
rr<имя отчета> - процедура формирования отчета (rr - Report Run).
Процедура инициализации состоит из двух секций:
Процедура имеет один обязательный параметр - @OID int. Значение поля No int при объявлении параметров явно задает порядок их появления в списке параметров клиентского приложения.
create procedure ripTestServer
@OID int
as
-- параметры
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, IntVal )
values ( @OID, @@SPID, 1, 'No', 0, 'Целое', 0 )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, StringVal )
values ( @OID, @@SPID, 2, 'Str', 1, 'Строка', 'это строка' )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, FloatVal )
values ( @OID, @@SPID, 3, 'Real', 2, 'Число', 0 )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, MoneyVal )
values ( @OID, @@SPID, 4, 'Money', 3, 'Валюта', $0 )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, DateVal )
values ( @OID, @@SPID, 5, 'Date1', 4, 'Дата', getdate() )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, IntVal, StringVal )
values ( @OID, @@SPID, 6, 'SubjectID', 5, 'Склад/подразделение',
0, 'Subjects,TDBOSubject' )
insert into RParams ( OID, SPID, No, ParamName, ParamType, ParamDescr, StringVal, IntVal )
values ( @OID, @@SPID, 7, 'List1', 6, 'Список',
'раз,два,три,четыре', 2 )
-- заголовки
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'No', 11, 'Целое' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'Str', 11, 'Строка' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'Real', 11, 'Число' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'Money', 11, 'Валюта' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'Date1', 11, 'Дата' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr, StringVal )
values ( @OID, @@SPID, 'Name', 12, 'Склад/подразделение',
'OID,BaseClass' )
insert into RParams ( OID, SPID, ParamName, ParamType, ParamDescr )
values ( @OID, @@SPID, 'List1', 11, 'Список' )
go
Параметр или заголовок заносятся в таблицу RParams оператором insert into, где в списке values(...) обязательно указаны параметры @OID, @@SPID. Имя параметра (ParamName) должно быть уникальным в пределах пространства имен данного отчета. Тип параметра (ParamType) задается целым числом:
Значение ParamType |
Константа в Delphi, соответствующая ParamType (описана в DBOConst.pas) |
Тип параметра |
Поле хранения в таблице RParams |
Примечание |
0 | VT_INTEGER | целое | IntVal | |
1 | VT_STRING | строка | StringVal | |
2 | VT_FLOAT | число | FloatVal | В поле StringVal может присутствовать маска формата для вывода числа |
3 | VT_MONEY | валюта | MoneyVal | В поле StringVal может присутствовать маска формата для вывода суммы |
4 | VT_DATE | дата | DateVal | |
5 | VT_OBJECT | ID объекта | IntVal | В StringVal заносим через запятую системное имя папки, хранящей объекты и наименование класса объектов |
6 | VT_LIST | выпадающий список значений | IntVal | в StringVal – названия пунктов
списка через запятую или точку с запятой, в IntVal – номер выбранного пункта и пункт “по умолчанию” (считая от нуля) |
11 | VT_HEADER | заголовок колонки таблицы | ParamName | В StringVal можно занести маску формата отображения (инициализирует свойство DisplayFormat колонки компонентов класса TDBGrid в клиентском приложении) для полей следующих типов: int, float, money, datetime |
12 | VT_DBO_HEADER | заголовок колонки таблицы, содержащей наименование объекта | ParamName | В StringVal через запятую
хранятся названия полей в результирующей
таблице отчета, хранящих:
|
Заголовки для формируемой в процедуре rr<имя отчета> таблицы отчета имеют ParamType 11 и 12 соответственно. В ParamDescr заносится заголовок колонки таблицы.
Процедура rr<имя отчета> запускается ядром только в том случае, когда после ввода параметров пользователь нажимает "ОК". Процедура имеет один обязательный параметр @OID, содержащий OID отчета, и выполняет три функции:
create procedure rrTestServer
@OID int
as
declare @SubjID int
select @SubjID = IntVal
from RParams
where OID = @OID and SPID = @@SPID and
ParamName = 'SubjectID' and ParamType = 5
select
BaseClass = Objs.BaseClass,
Name = Objs.Name,
OID = Objs.OID,
No = ( select IntVal from RParams
where OID = @OID
and SPID = @@SPID and ParamName = 'No' and ParamType = 0 ),
Str = ( select StringVal from RParams
where OID =
@OID and SPID = @@SPID and ParamName = 'Str' and ParamType = 1 ),
Real = ( select FloatVal from RParams
where
OID = @OID and SPID = @@SPID and ParamName = 'Real' and ParamType = 2 ),
Money = ( select MoneyVal from RParams
where OID = @OID and SPID = @@SPID and ParamName = 'Money' and ParamType = 3 ),
Date1 = ( select DateVal from RParams
where OID = @OID and SPID = @@SPID and ParamName = 'Date1' and ParamType = 4 ),
List1 = ( select IntVal from RParams
where OID = @OID and SPID = @@SPID and ParamName = 'List1' and ParamType = 6 )
from Objs
where OID = @SubjID
go
При формировании сложных отчетов имеет смысл создавать локальную временную результирующую таблицу (##<имя таблицы>) и заполнять ее в соответствии с алгоритмом. В конце процедуры следует выбрать ее содержимое:
select * from ##<имя таблицы>
Названия полей временной таблицы должны соответствовать названиям, ранее назначенным при объявлении заголовков в процедуре инициализации.