Глава 8. Создание табличных отчетов


Основные сведения

Отчеты создаются, как обычный отдельный прикладной модуль БД или являются частью другого модуля. Основное отличие разработки состоит в том, что нет необходимости создавать собственные классы, а следует воспользоваться стандартными возможностями класса 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 через запятую хранятся названия полей в результирующей таблице отчета, хранящих:
  1. ID объекта;
  2. класс объекта.

Заголовки для формируемой в процедуре 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 ##<имя таблицы>

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


Содержание Глоссарий Предыдущая Следующая