Написание собственных движков баз данных
FastReport позволяет строить отчеты не только на основе данных, определенных в приложении. Вы также можете определить свои собственные источники данных (подключения к БД, таблицы, запросы) прямо в отчете. В комплекте с FastReport идут движки для ADO, BDE, IBX, DBX, FIB. Вы можете создать собственный движок и подключить его к FastReport.
На рисунке показана иерархия классов, предназначенных для создания движков баз данных. Зеленым цветом выделены компоненты нового движка.
Как видно, стандартный набор компонентов движка БД включает в себя Database, Table и Query. Вы можете реализовать все эти компоненты, или только некоторые из них (например, многие БД не имеют компонента типа Table). Также вы можете реализовать компоненты, не входящие в стандартный набор (например, аналог StoredProc).
Рассмотрим подробнее базовые классы.
TfrxDialogComponent
- базовый класс для всех невизуальных компонентов, которые могут быть помещены в отчет FastReport. В нем не определено каких-либо важных свойств и методов.
Класс TfrxCustomDatabase
является базовым для написания компонент типа TDatabase
.
TfrxCustomDatabase = class(TfrxDialogComponent)
protected
procedure SetConnected(Value: Boolean); virtual;
procedure SetDatabaseName(const Value: String); virtual;
procedure SetLoginPrompt(Value: Boolean); virtual;
procedure SetParams(Value: TStrings); virtual;
function GetConnected: Boolean; virtual;
function GetDatabaseName: String; virtual;
function GetLoginPrompt: Boolean; virtual;
function GetParams: TStrings; virtual;
public
procedure SetLogin(const Login, Password: String); virtual;
property Connected: Boolean read GetConnected write SetConnected default False;
property DatabaseName: String read GetDatabaseName write SetDatabaseName;
property LoginPrompt: Boolean read GetLoginPrompt write SetLoginPrompt default True;
property Params: TStrings read GetParams write SetParams;
end;
В классе определены следующие свойства:
Connected
– является ли подключение к БД активным;DatabaseName
– имя БД;LoginPrompt
– надо ли запрашивать пароль при поключении к БД;Params
– параметры подключения.
От данного класса наследуется компонент типа TDatabase. Для его реализации необходимо перекрыть все виртуальные методы и вынести нужные свойства в секцию published. Также необходимо добавить свойства, специфичные для вашего компонента.
Классы TfrxDataset
, TfrxCustomDBDataset
, TfrxDBDataset
обеспечивают функции доступа к данным. Ядро FastReport использует эти компоненты для навигации и обращения к полям набора данных. В данном случае они являются частью общей иерархии и не представляют интереса.
TfrxCustomDataSet
- базовый класс для компонентов БД, производных от TDataSet
. От этого класса наследуются компоненты - аналоги Query, Table, StoredProc. По сути, класс представляет собой обертку над TDataSet
.
TfrxCustomDataset = class(TfrxDBDataSet)
protected
procedure SetMaster(const Value: TDataSource); virtual;
procedure SetMasterFields(const Value: String); virtual;
public
property DataSet: TDataSet;
property Fields: TFields readonly;
property MasterFields: String;
property Active: Boolean;
property DBConnected: Boolean;
published
property Filter: String;
property Filtered: Boolean;
property Master: TfrxDBDataSet;
end;
В классе определены следующие свойства:
DataSet
- ссылка на внутренний объект типа TDataSet;Fields
- ссылка на DataSet.Fields;Active
- активен ли набор данных;DBConnected
– подключен ли набор данных к компоненту TfrxXXXDatabase;Filter
- выражение для фильтрации;Filtered
- активна ли фильтрация;Master
– ссылка на источник данных, являющийся основным. Применяется для связей типа master-detail.MasterFields
– список пар полей вида field1=field2. Применяется для связей типа master-detail.
TfrxCustomTable
- базовый класс для компонентов БД типа Table. Класс является оберткой над компонентом типа Table.
TfrxCustomTable = class(TfrxCustomDataset)
protected
function GetIndexFieldNames: String; virtual;
function GetIndexName: String; virtual;
function GetTableName: String; virtual;
procedure SetIndexFieldNames(const Value: String); virtual;
procedure SetIndexName(const Value: String); virtual;
procedure SetTableName(const Value: String); virtual;
published
property MasterFields;
property TableName: String read GetTableName write SetTableName;
property IndexName: String read GetIndexName write SetIndexName;
property IndexFieldNames: String read GetIndexFieldNames write SetIndexFieldNames;
end;
В классе определены следующие свойства:
TableName
– имя таблицы;IndexName
– имя индекса;IndexFieldNames
– имена индексных полей.
От данного класса наследуется компонент типа Table. Для его реализации необходимо определить недостающие свойства, как правило, Database
. Также необходимо перекрыть виртуальные методы из классов TfrxCustomDataset
, TfrxCustomTable
.
TfrxCustomQuery
- базовый класс для компонентов БД типа Query. Класс является оберткой над компонентом типа Query.
TfrxCustomQuery = class(TfrxCustomDataset)
protected
procedure SetSQL(Value: TStrings); virtual; abstract;
function GetSQL: TStrings; virtual; abstract;
public
procedure UpdateParams; virtual; abstract;
published
property Params: TfrxParams;
property SQL: TStrings;
end;
В классе определены свойства, общие для всех компонентов Query - SQL
и Params
. Т.к. разные компоненты Query имеют разную реализацию параметров (например, TParams
, TParameters
), свойство Params
имеет тип TfrxParams
и является оберткой над конкретным типом параметров.
В данном классе определены следующие методы:
SetSQL
- должен установить свойствоSQL
компонента типа Query;GetSQL
- должен вернуть свойствоSQL
компонента типа Query;UpdateParams
- должен скопировать значения параметров в компонент типа Query. Если компонент Query имеет параметры типаTParams
, то копирование осуществляется стандартной процедуройfrxParamsToTParams
.
Рассмотрим создание движка БД на примере IBX. Полный исходный текст движка можно найти в каталоге SOURCE\IBX. Здесь мы будем приводить выдержки из исходного текста с комментариями и некоторыми поправками.
Компоненты IBX, вокруг которых мы будем строить обертку - TIBDatabase
, TIBTable
, TIBQuery
. Соответственно, наши компоненты будут называться TfrxIBXDatabase
, TfrxIBXTable
, TfrxIBXQuery
.