* Initial version of fieldmap

This commit is contained in:
michael 2019-11-04 11:17:47 +00:00
parent 0bc30e88e8
commit 223e553de3

191
packages/fcl-db/fieldmap.pp Normal file
View File

@ -0,0 +1,191 @@
unit fieldmap;
{$mode objfpc}
{$H+}
interface
uses SysUtils, db;
{ ---------------------------------------------------------------------
TFieldMap
---------------------------------------------------------------------}
type
EFieldMap = Class(EDatabaseError);
{ TFieldMap }
TFieldMap = Class(TObject)
private
FDataset: TDataset;
FFreeDataset: Boolean;
FOldOnOpen : TDataSetNotifyEvent;
Protected
Procedure DoOnOpen(Sender : TDataset);
Function FindField(FN : String) : TField;
Function FieldByName(FN : String) : TField;
Public
Constructor Create(ADataset : TDataset; HookOnOpen : Boolean = False);
Destructor Destroy; override;
Procedure InitFields; virtual; abstract;
Procedure LoadObject(AObject : TObject); virtual;
Function GetFromField(F : TField; ADefault : Integer) : Integer; overload;
Function GetFromField(F : TField; ADefault : String) : String; overload;
Function GetFromField(F : TField; ADefault : Boolean) : Boolean; overload;
Function GetFromField(F : TField; ADefault : TDateTime) : TDateTime; overload;
Function GetFromField(F : TField; ADefault : Currency) : Currency; overload;
Function GetFromField(F : TField; ADefault : Double) : Double; overload;
Property Dataset : TDataset Read FDataset;
Property FreeDataset : Boolean Read FFreeDataset Write FFreeDataset;
end;
TFieldMapClass = Class of TFieldMap;
{ TParamMap }
TParamMap = Class(TObject)
private
FParams: TParams;
Protected
Function FindParam(FN : String) : TParam;
Function ParamByName(FN : String) : TParam;
Public
Constructor Create(AParams : TParams);
Procedure InitParams; virtual; abstract;
Procedure SaveObject(AObject : TObject); virtual; abstract;
Property Params : TParams Read FParams;
end;
implementation
resourcestring
SErrNoDataset = '%s: No dataset available.';
SErrNoParamsForParam = '%s: No params to search param "%s".';
SErrNoObjectToLoad = '%s: No object to load';
{ TParamMap }
function TParamMap.FindParam(FN: String): TParam;
begin
Result:=FParams.FindParam(FN);
{if (Result=Nil) then
Writeln(ClassName,' param ',FN,' not found');}
end;
function TParamMap.ParamByName(FN: String): TParam;
begin
If (FParams=Nil) then
Raise Exception.CreateFmt(SErrNoParamsForParam,[ClassName,FN]);
Result:=FParams.ParamByName(FN);
end;
constructor TParamMap.Create(AParams: TParams);
begin
FParams:=AParams;
InitParams;
end;
{ TFieldMap }
constructor TFieldMap.Create(ADataset: TDataset; HookOnOpen : Boolean = False);
begin
if (ADataset=Nil) then
Raise EFieldMap.CreateFmt(SErrNoDataset,[ClassName]);
FDataset:=ADataset;
if HookOnOpen then
begin
FOldOnOpen:=FDataset.AfterOpen;
FDataset.AfterOpen:=@DoOnOpen;
end;
if FDataset.Active then
InitFields;
end;
destructor TFieldMap.Destroy;
begin
if FFreeDataset then
FreeAndNil(FFreeDataset);
inherited Destroy;
end;
procedure TFieldMap.LoadObject(AObject: TObject);
begin
If (AObject=Nil) then
Raise EFieldMap.CreateFmt(SErrNoObjectToLoad,[ClassName]);
end;
function TFieldMap.FieldByName(FN: String): TField;
begin
Result:=FDataset.FieldByName(FN)
end;
procedure TFieldMap.DoOnOpen(Sender: TDataset);
begin
InitFields;
If Assigned(FOldOnOpen) then
FOldOnOpen(Sender);
end;
function TFieldMap.FindField(FN: String): TField;
begin
If (FDataset=Nil) then
Result:=Nil
else
Result:=FDataset.FindField(FN);
end;
function TFieldMap.GetFromField(F: TField; ADefault: Integer): Integer;
begin
If Assigned(F) then
Result:=F.AsInteger
else
Result:=ADefault;
end;
function TFieldMap.GetFromField(F: TField; ADefault: String): String;
begin
If Assigned(F) then
Result:=F.AsString
else
Result:=ADefault;
end;
function TFieldMap.GetFromField(F: TField; ADefault: Boolean): Boolean;
begin
If Assigned(F) then
begin
if (F is TStringField) then
Result:=(F.AsString='+')
else
Result:=F.AsBoolean
end
else
Result:=ADefault;
end;
function TFieldMap.GetFromField(F: TField; ADefault: TDateTime): TDateTime;
begin
If Assigned(F) then
Result:=F.AsDateTime
else
Result:=ADefault;
end;
function TFieldMap.GetFromField(F: TField; ADefault: Currency): Currency;
begin
If Assigned(F) then
Result:=F.AsFloat
else
Result:=ADefault;
end;
function TFieldMap.GetFromField(F: TField; ADefault: Double): Double;
begin
If Assigned(F) then
Result:=F.AsFloat
else
Result:=ADefault;
end;
end.