fieldmap.pp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. unit fieldmap;
  2. {$mode objfpc}
  3. {$H+}
  4. interface
  5. uses SysUtils, db;
  6. { ---------------------------------------------------------------------
  7. TFieldMap
  8. ---------------------------------------------------------------------}
  9. type
  10. EFieldMap = Class(EDatabaseError);
  11. { TFieldMap }
  12. TFieldMap = Class(TObject)
  13. private
  14. FDataset: TDataset;
  15. FFreeDataset: Boolean;
  16. FOldOnOpen : TDataSetNotifyEvent;
  17. Protected
  18. Procedure DoOnOpen(Sender : TDataset);
  19. Function FindField(FN : String) : TField;
  20. Function FieldByName(FN : String) : TField;
  21. Public
  22. Constructor Create(ADataset : TDataset; HookOnOpen : Boolean = False);
  23. Destructor Destroy; override;
  24. Procedure InitFields; virtual; abstract;
  25. Procedure LoadObject(AObject : TObject); virtual;
  26. Function GetFromField(F : TField; ADefault : Integer) : Integer; overload;
  27. Function GetFromField(F : TField; ADefault : String) : String; overload;
  28. Function GetFromField(F : TField; ADefault : Boolean) : Boolean; overload;
  29. Function GetFromField(F : TField; ADefault : TDateTime) : TDateTime; overload;
  30. Function GetFromField(F : TField; ADefault : Currency) : Currency; overload;
  31. Function GetFromField(F : TField; ADefault : Double) : Double; overload;
  32. Property Dataset : TDataset Read FDataset;
  33. Property FreeDataset : Boolean Read FFreeDataset Write FFreeDataset;
  34. end;
  35. TFieldMapClass = Class of TFieldMap;
  36. { TParamMap }
  37. TParamMap = Class(TObject)
  38. private
  39. FParams: TParams;
  40. Protected
  41. Function FindParam(FN : String) : TParam;
  42. Function ParamByName(FN : String) : TParam;
  43. Public
  44. Constructor Create(AParams : TParams);
  45. Procedure InitParams; virtual; abstract;
  46. Procedure SaveObject(AObject : TObject); virtual; abstract;
  47. Property Params : TParams Read FParams;
  48. end;
  49. implementation
  50. resourcestring
  51. SErrNoDataset = '%s: No dataset available.';
  52. SErrNoParamsForParam = '%s: No params to search param "%s".';
  53. SErrNoObjectToLoad = '%s: No object to load';
  54. { TParamMap }
  55. function TParamMap.FindParam(FN: String): TParam;
  56. begin
  57. Result:=FParams.FindParam(FN);
  58. {if (Result=Nil) then
  59. Writeln(ClassName,' param ',FN,' not found');}
  60. end;
  61. function TParamMap.ParamByName(FN: String): TParam;
  62. begin
  63. If (FParams=Nil) then
  64. Raise Exception.CreateFmt(SErrNoParamsForParam,[ClassName,FN]);
  65. Result:=FParams.ParamByName(FN);
  66. end;
  67. constructor TParamMap.Create(AParams: TParams);
  68. begin
  69. FParams:=AParams;
  70. InitParams;
  71. end;
  72. { TFieldMap }
  73. constructor TFieldMap.Create(ADataset: TDataset; HookOnOpen : Boolean = False);
  74. begin
  75. if (ADataset=Nil) then
  76. Raise EFieldMap.CreateFmt(SErrNoDataset,[ClassName]);
  77. FDataset:=ADataset;
  78. if HookOnOpen then
  79. begin
  80. FOldOnOpen:=FDataset.AfterOpen;
  81. FDataset.AfterOpen:=@DoOnOpen;
  82. end;
  83. if FDataset.Active then
  84. InitFields;
  85. end;
  86. destructor TFieldMap.Destroy;
  87. begin
  88. if FFreeDataset then
  89. FreeAndNil(FFreeDataset);
  90. inherited Destroy;
  91. end;
  92. procedure TFieldMap.LoadObject(AObject: TObject);
  93. begin
  94. If (AObject=Nil) then
  95. Raise EFieldMap.CreateFmt(SErrNoObjectToLoad,[ClassName]);
  96. end;
  97. function TFieldMap.FieldByName(FN: String): TField;
  98. begin
  99. Result:=FDataset.FieldByName(FN)
  100. end;
  101. procedure TFieldMap.DoOnOpen(Sender: TDataset);
  102. begin
  103. InitFields;
  104. If Assigned(FOldOnOpen) then
  105. FOldOnOpen(Sender);
  106. end;
  107. function TFieldMap.FindField(FN: String): TField;
  108. begin
  109. If (FDataset=Nil) then
  110. Result:=Nil
  111. else
  112. Result:=FDataset.FindField(FN);
  113. end;
  114. function TFieldMap.GetFromField(F: TField; ADefault: Integer): Integer;
  115. begin
  116. If Assigned(F) then
  117. Result:=F.AsInteger
  118. else
  119. Result:=ADefault;
  120. end;
  121. function TFieldMap.GetFromField(F: TField; ADefault: String): String;
  122. begin
  123. If Assigned(F) then
  124. Result:=F.AsString
  125. else
  126. Result:=ADefault;
  127. end;
  128. function TFieldMap.GetFromField(F: TField; ADefault: Boolean): Boolean;
  129. begin
  130. If Assigned(F) then
  131. begin
  132. if (F is TStringField) then
  133. Result:=(F.AsString='+')
  134. else
  135. Result:=F.AsBoolean
  136. end
  137. else
  138. Result:=ADefault;
  139. end;
  140. function TFieldMap.GetFromField(F: TField; ADefault: TDateTime): TDateTime;
  141. begin
  142. If Assigned(F) then
  143. Result:=F.AsDateTime
  144. else
  145. Result:=ADefault;
  146. end;
  147. function TFieldMap.GetFromField(F: TField; ADefault: Currency): Currency;
  148. begin
  149. If Assigned(F) then
  150. Result:=F.AsFloat
  151. else
  152. Result:=ADefault;
  153. end;
  154. function TFieldMap.GetFromField(F: TField; ADefault: Double): Double;
  155. begin
  156. If Assigned(F) then
  157. Result:=F.AsFloat
  158. else
  159. Result:=ADefault;
  160. end;
  161. end.