|
@@ -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.
|
|
|
+
|