{******************************************}
{ }
{ FastReport VCL }
{ IBX enduser components }
{ }
{ Copyright (c) 1998-2021 }
{ by Fast Reports Inc. }
{ }
{******************************************}
unit frxIBXComponents;
interface
{$I frx.inc}
uses
Windows, Classes, frxClass, frxCustomDB, DB
{$IFDEF DELPHI20}
, IBX.IBDatabase, IBX.IBTable, IBX.IBQuery
{$ELSE}
, IBDatabase, IBTable, IBQuery
{$ENDIF}
, Variants
{$IFDEF QBUILDER}
, fqbClass
{$ENDIF};
type
{$IFDEF DELPHI16}
[ComponentPlatformsAttribute(pidWin32 or pidWin64)]
{$ENDIF}
///
/// The TfrxIBXComponents component allows the use of IBX data objects in
/// your report.
///
TfrxIBXComponents = class(TfrxDBComponents)
private
FDefaultDatabase: TIBDatabase;
FOldComponents: TfrxIBXComponents;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetDefaultDatabase(Value: TIBDatabase);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetDescription: String; override;
published
///
/// Link to the default database connection that will be used in the
/// report.
///
property DefaultDatabase: TIBDatabase read FDefaultDatabase write SetDefaultDatabase;
end;
///
/// The TfrxIBXDatabase component represents a database connection.
///
TfrxIBXDatabase = class(TfrxCustomDatabase)
private
FDatabase: TIBDatabase;
FTransaction: TIBTransaction;
function GetSQLDialect: Integer;
procedure SetSQLDialect(const Value: Integer);
protected
procedure SetConnected(Value: Boolean); override;
procedure SetDatabaseName(const Value: String); override;
procedure SetLoginPrompt(Value: Boolean); override;
procedure SetParams(Value: TStrings); override;
function GetConnected: Boolean; override;
function GetDatabaseName: String; override;
function GetLoginPrompt: Boolean; override;
function GetParams: TStrings; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
class function GetDescription: String; override;
procedure SetLogin(const Login, Password: String); override;
///
/// Reference to internal TIBDatabase object.
///
property Database: TIBDatabase read FDatabase;
published
property DatabaseName;
property LoginPrompt;
property Params;
///
/// SQL dialect used in the database.
///
property SQLDialect: Integer read GetSQLDialect write SetSQLDialect;
property Connected;
end;
///
/// The TfrxIBXTable represents a table.
///
TfrxIBXTable = class(TfrxCustomTable)
private
FDatabase: TfrxIBXDatabase;
FTable: TIBTable;
procedure SetDatabase(const Value: TfrxIBXDatabase);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetMaster(const Value: TDataSource); override;
procedure SetMasterFields(const Value: String); override;
procedure SetIndexFieldNames(const Value: String); override;
procedure SetIndexName(const Value: String); override;
procedure SetTableName(const Value: String); override;
function GetIndexFieldNames: String; override;
function GetIndexName: String; override;
function GetTableName: String; override;
public
constructor Create(AOwner: TComponent); override;
constructor DesignCreate(AOwner: TComponent; Flags: Word); override;
class function GetDescription: String; override;
procedure BeforeStartReport; override;
///
/// Reference to internal TIBTable object.
///
property Table: TIBTable read FTable;
published
///
/// Link to the database connection object. If this property is nil,
/// TfrxIBXComponents.DefaultDatabase is used.
///
property Database: TfrxIBXDatabase read FDatabase write SetDatabase;
end;
///
/// The TfrxIBXQuery component represents a query.
///
TfrxIBXQuery = class(TfrxCustomQuery)
private
FDatabase: TfrxIBXDatabase;
FQuery: TIBQuery;
procedure SetDatabase(const Value: TfrxIBXDatabase);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetMaster(const Value: TDataSource); override;
procedure SetSQL(Value: TStrings); override;
function GetSQL: TStrings; override;
public
constructor Create(AOwner: TComponent); override;
constructor DesignCreate(AOwner: TComponent; Flags: Word); override;
class function GetDescription: String; override;
procedure BeforeStartReport; override;
procedure UpdateParams; override;
{$IFDEF QBUILDER}
function QBEngine: TfqbEngine; override;
{$ENDIF}
///
/// Reference to internal TIBQuery object.
///
property Query: TIBQuery read FQuery;
published
///
/// Link to the database connection object. If this property is nil,
/// TfrxIBXComponents.DefaultDatabase is used.
///
property Database: TfrxIBXDatabase read FDatabase write SetDatabase;
end;
{$IFDEF QBUILDER}
TfrxEngineIBX = class(TfqbEngine)
private
FQuery: TIBQuery;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadTableList(ATableList: TStrings); override;
procedure ReadFieldList(const ATableName: string; var AFieldList: TfqbFieldList); override;
function ResultDataSet: TDataSet; override;
procedure SetSQL(const Value: string); override;
end;
{$ENDIF}
var
IBXComponents: TfrxIBXComponents;
implementation
uses
frxIBXRTTI,
{$IFNDEF NO_EDITORS}
frxIBXEditor,
{$ENDIF}
frxDsgnIntf, frxRes;
{ TfrxDBComponents }
constructor TfrxIBXComponents.Create(AOwner: TComponent);
begin
inherited;
FOldComponents := IBXComponents;
IBXComponents := Self;
end;
destructor TfrxIBXComponents.Destroy;
begin
if IBXComponents = Self then
IBXComponents := FOldComponents;
inherited;
end;
function TfrxIBXComponents.GetDescription: String;
begin
Result := 'IBX';
end;
procedure TfrxIBXComponents.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (AComponent = FDefaultDatabase) and (Operation = opRemove) then
FDefaultDatabase := nil;
end;
procedure TfrxIBXComponents.SetDefaultDatabase(Value: TIBDatabase);
begin
if (Value <> nil) then
Value.FreeNotification(Self);
if FDefaultDatabase <> nil then
FDefaultDatabase.RemoveFreeNotification(Self);
FDefaultDatabase := Value;
end;
{ TfrxIBXDatabase }
constructor TfrxIBXDatabase.Create(AOwner: TComponent);
begin
inherited;
FDatabase := TIBDatabase.Create(nil);
FTransaction := TIBTransaction.Create(nil);
FDatabase.DefaultTransaction := FTransaction;
Component := FDatabase;
end;
destructor TfrxIBXDatabase.Destroy;
begin
FTransaction.Free;
inherited;
end;
class function TfrxIBXDatabase.GetDescription: String;
begin
Result := frxResources.Get('obIBXDB');
end;
function TfrxIBXDatabase.GetConnected: Boolean;
begin
Result := FDatabase.Connected;
end;
function TfrxIBXDatabase.GetDatabaseName: String;
begin
Result := FDatabase.DatabaseName;
end;
function TfrxIBXDatabase.GetLoginPrompt: Boolean;
begin
Result := FDatabase.LoginPrompt;
end;
function TfrxIBXDatabase.GetParams: TStrings;
begin
Result := FDatabase.Params;
end;
function TfrxIBXDatabase.GetSQLDialect: Integer;
begin
Result := FDatabase.SQLDialect;
end;
procedure TfrxIBXDatabase.SetConnected(Value: Boolean);
begin
BeforeConnect(Value);
FDatabase.Connected := Value;
FTransaction.Active := Value;
end;
procedure TfrxIBXDatabase.SetDatabaseName(const Value: String);
begin
FDatabase.DatabaseName := Value;
end;
procedure TfrxIBXDatabase.SetLoginPrompt(Value: Boolean);
begin
FDatabase.LoginPrompt := Value;
end;
procedure TfrxIBXDatabase.SetParams(Value: TStrings);
begin
FDatabase.Params := Value;
end;
procedure TfrxIBXDatabase.SetSQLDialect(const Value: Integer);
begin
FDatabase.SQLDialect := Value;
end;
procedure TfrxIBXDatabase.SetLogin(const Login, Password: String);
begin
Params.Text := 'user_name=' + Login + #13#10 + 'password=' + Password;
end;
{ TfrxIBXTable }
constructor TfrxIBXTable.Create(AOwner: TComponent);
begin
FTable := TIBTable.Create(nil);
DataSet := FTable;
SetDatabase(nil);
inherited;
end;
constructor TfrxIBXTable.DesignCreate(AOwner: TComponent; Flags: Word);
var
i: Integer;
l: TList;
begin
inherited;
l := Report.AllObjects;
for i := 0 to l.Count - 1 do
if TObject(l[i]) is TfrxIBXDatabase then
begin
SetDatabase(TfrxIBXDatabase(l[i]));
break;
end;
end;
class function TfrxIBXTable.GetDescription: String;
begin
Result := frxResources.Get('obIBXTb');
end;
procedure TfrxIBXTable.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FDatabase) then
SetDatabase(nil);
end;
procedure TfrxIBXTable.SetDatabase(const Value: TfrxIBXDatabase);
begin
FDatabase := Value;
if Value <> nil then
FTable.Database := Value.Database
else if IBXComponents <> nil then
FTable.Database := IBXComponents.DefaultDatabase
else
FTable.Database := nil;
DBConnected := FTable.Database <> nil;
end;
function TfrxIBXTable.GetIndexFieldNames: String;
begin
Result := FTable.IndexFieldNames;
end;
function TfrxIBXTable.GetIndexName: String;
begin
Result := FTable.IndexName;
end;
function TfrxIBXTable.GetTableName: String;
begin
Result := FTable.TableName;
end;
procedure TfrxIBXTable.SetIndexFieldNames(const Value: String);
begin
FTable.IndexFieldNames := Value;
end;
procedure TfrxIBXTable.SetIndexName(const Value: String);
begin
FTable.IndexName := Value;
end;
procedure TfrxIBXTable.SetTableName(const Value: String);
begin
FTable.TableName := Value;
end;
procedure TfrxIBXTable.SetMaster(const Value: TDataSource);
begin
FTable.MasterSource := Value;
end;
procedure TfrxIBXTable.SetMasterFields(const Value: String);
begin
FTable.MasterFields := Value;
end;
procedure TfrxIBXTable.BeforeStartReport;
begin
SetDatabase(FDatabase);
end;
{ TfrxIBXQuery }
constructor TfrxIBXQuery.Create(AOwner: TComponent);
begin
FQuery := TIBQuery.Create(nil);
Dataset := FQuery;
SetDatabase(nil);
inherited;
end;
constructor TfrxIBXQuery.DesignCreate(AOwner: TComponent; Flags: Word);
var
i: Integer;
l: TList;
begin
inherited;
l := Report.AllObjects;
for i := 0 to l.Count - 1 do
if TObject(l[i]) is TfrxIBXDatabase then
begin
SetDatabase(TfrxIBXDatabase(l[i]));
break;
end;
end;
class function TfrxIBXQuery.GetDescription: String;
begin
Result := frxResources.Get('obIBXQ');
end;
procedure TfrxIBXQuery.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FDatabase) then
SetDatabase(nil);
end;
procedure TfrxIBXQuery.SetDatabase(const Value: TfrxIBXDatabase);
begin
FDatabase := Value;
if Value <> nil then
begin
FQuery.Database := Value.Database;
FQuery.Transaction := Value.FTransaction;
end
else if IBXComponents <> nil then
FQuery.Database := IBXComponents.DefaultDatabase
else
FQuery.Database := nil;
DBConnected := FQuery.Database <> nil;
end;
procedure TfrxIBXQuery.SetMaster(const Value: TDataSource);
begin
FQuery.DataSource := Value;
end;
procedure TfrxIBXQuery.SetSQL(Value: TStrings);
begin
FQuery.SQL := Value;
end;
function TfrxIBXQuery.GetSQL: TStrings;
begin
Result := FQuery.SQL;
end;
procedure TfrxIBXQuery.UpdateParams;
begin
if Assigned(FQuery.Database) then
frxParamsToTParams(Self, FQuery.Params);
end;
procedure TfrxIBXQuery.BeforeStartReport;
begin
SetDatabase(FDatabase);
end;
{$IFDEF QBUILDER}
function TfrxIBXQuery.QBEngine: TfqbEngine;
begin
Result := TfrxEngineIBX.Create(nil);
TfrxEngineIBX(Result).FQuery.Database := FQuery.Database;
end;
{$ENDIF}
{$IFDEF QBUILDER}
constructor TfrxEngineIBX.Create(AOwner: TComponent);
begin
inherited;
FQuery := TIBQuery.Create(Self);
end;
destructor TfrxEngineIBX.Destroy;
begin
FQuery.Free;
inherited;
end;
procedure TfrxEngineIBX.ReadFieldList(const ATableName: string;
var AFieldList: TfqbFieldList);
var
TempTable: TIBTable;
Fields: TFieldDefs;
i: Integer;
tmpField: TfqbField;
begin
AFieldList.Clear;
TempTable := TIBTable.Create(Self);
TempTable.Database := FQuery.Database;
TempTable.TableName := ATableName;
Fields := TempTable.FieldDefs;
try
try
TempTable.Active := True;
tmpField:= TfqbField(AFieldList.Add);
tmpField.FieldName := '*';
for i := 0 to Fields.Count - 1 do
begin
tmpField := TfqbField(AFieldList.Add);
tmpField.FieldName := Fields.Items[i].Name;
tmpField.FieldType := Ord(Fields.Items[i].DataType)
end;
except
end;
finally
TempTable.Free;
end;
end;
procedure TfrxEngineIBX.ReadTableList(ATableList: TStrings);
begin
ATableList.Clear;
FQuery.Database.GetTableNames(ATableList, ShowSystemTables);
end;
function TfrxEngineIBX.ResultDataSet: TDataSet;
begin
Result := FQuery;
end;
procedure TfrxEngineIBX.SetSQL(const Value: string);
begin
FQuery.SQL.Text := Value;
end;
{$ENDIF}
initialization
frxObjects.RegisterObject1(TfrxIBXDataBase, nil, '', {$IFDEF DB_CAT}'DATABASES'{$ELSE}''{$ENDIF}, 0, 60);
frxObjects.RegisterObject1(TfrxIBXTable, nil, '', {$IFDEF DB_CAT}'TABLES'{$ELSE}''{$ENDIF}, 0, 61);
frxObjects.RegisterObject1(TfrxIBXQuery, nil, '', {$IFDEF DB_CAT}'QUERIES'{$ELSE}''{$ENDIF}, 0, 62);
finalization
frxObjects.UnRegister(TfrxIBXDataBase);
frxObjects.UnRegister(TfrxIBXTable);
frxObjects.UnRegister(TfrxIBXQuery);
end.