dbcoll.pp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. unit DBColl;
  2. interface
  3. uses db, classes, sysutils;
  4. { ---------------------------------------------------------------------
  5. TFieldMap
  6. ---------------------------------------------------------------------}
  7. type
  8. { TFieldMap }
  9. TFieldMap = Class(TObject)
  10. private
  11. FDataset: TDataset;
  12. Protected
  13. Function FindField(FN : String) : TField;
  14. Function FieldByName(FN : String) : TField;
  15. Public
  16. Constructor Create(ADataset : TDataset); virtual;
  17. Procedure InitFields; virtual; abstract;
  18. Procedure LoadObject(AObject: TObject); virtual; abstract;
  19. Function GetFromField(F : TField; ADefault : Integer) : Integer; overload;
  20. Function GetFromField(F : TField; ADefault : String) : String; overload;
  21. Function GetFromField(F : TField; ADefault : Boolean) : Boolean; overload;
  22. Function GetFromField(F : TField; ADefault : TDateTime) : TDateTime; overload;
  23. Function GetFromField(F : TField; ADefault : Double) : Double; overload;
  24. Function GetFromField(F : TField; ADefault : Currency) : Currency; overload;
  25. Property Dataset : TDataset Read FDataset;
  26. end;
  27. TFieldMapClass = Class of TFieldMap;
  28. EDBCollection = Class(Exception);
  29. { TDBCollectionItem }
  30. TDBCollectionItem = Class(TCollectionItem)
  31. Protected
  32. Procedure LoadFromMap(F : TFieldMap); virtual;
  33. Class Function FieldMapClass: TFieldMapClass; virtual; abstract;
  34. Public
  35. Procedure LoadFromDataset(ADataset : TDataset);
  36. end;
  37. { TDBCollection }
  38. TDBCollection = Class(TCollection)
  39. Protected
  40. Function AddDBItem : TDBCollectionItem;
  41. Procedure DoLoadFromFieldMap(Map : TFieldMap); virtual;
  42. Public
  43. Procedure LoadFromDataset(Dataset : TDataset);
  44. end;
  45. implementation
  46. resourcestring
  47. SErrNoDatasetForField = '%s: no dataset to search field %s in.';
  48. { TFieldMap }
  49. constructor TFieldMap.Create(ADataset: TDataset);
  50. begin
  51. FDataset:=ADataset;
  52. InitFields;
  53. end;
  54. function TFieldMap.FieldByName(FN: String): TField;
  55. begin
  56. If (FDataset=Nil) then
  57. begin
  58. Raise EDBCollection.CreateFmt(SErrNoDatasetForField,[ClassName,FN]);
  59. result := nil;
  60. end
  61. else
  62. Result:=FDataset.FieldByName(FN);
  63. end;
  64. function TFieldMap.FindField(FN: String): TField;
  65. begin
  66. If (FDataset=Nil) then
  67. Result:=Nil
  68. else
  69. Result:=FDataset.FindField(FN);
  70. end;
  71. function TFieldMap.GetFromField(F: TField; ADefault: Integer): Integer;
  72. begin
  73. If Assigned(F) then
  74. Result:=F.AsInteger
  75. else
  76. Result:=ADefault;
  77. end;
  78. function TFieldMap.GetFromField(F: TField; ADefault: String): String;
  79. begin
  80. If Assigned(F) then
  81. Result:=F.AsString
  82. else
  83. Result:=ADefault;
  84. end;
  85. function TFieldMap.GetFromField(F: TField; ADefault: Boolean): Boolean;
  86. begin
  87. If Assigned(F) then
  88. begin
  89. if (F is TStringField) then
  90. Result:=(F.AsString='+')
  91. else
  92. Result:=F.AsBoolean
  93. end
  94. else
  95. Result:=ADefault;
  96. end;
  97. function TFieldMap.GetFromField(F: TField; ADefault: TDateTime): TDateTime;
  98. begin
  99. If Assigned(F) then
  100. Result:=F.AsDateTime
  101. else
  102. Result:=ADefault;
  103. end;
  104. function TFieldMap.GetFromField(F: TField; ADefault: Double): Double;
  105. begin
  106. If Assigned(F) then
  107. Result:=F.AsFloat
  108. else
  109. Result:=ADefault;
  110. end;
  111. function TFieldMap.GetFromField(F: TField; ADefault: Currency): Currency;
  112. begin
  113. If Assigned(F) then
  114. Result:=F.AsCurrency
  115. else
  116. Result:=ADefault;
  117. end;
  118. { TDBCollection }
  119. function TDBCollection.AddDBItem: TDBCollectionItem;
  120. begin
  121. Result:=Add as TDBCollectionItem;
  122. end;
  123. procedure TDBCollection.DoLoadFromFieldMap(Map: TFieldMap);
  124. Var
  125. I : TDBCollectionItem;
  126. begin
  127. While Not Map.Dataset.EOF do
  128. begin
  129. I:=AddDBItem;
  130. try
  131. I.LoadFromMap(Map);
  132. Except
  133. I.Free;
  134. Raise;
  135. end;
  136. Map.Dataset.Next;
  137. end;
  138. end;
  139. procedure TDBCollection.LoadFromDataset(Dataset: TDataset);
  140. Var
  141. M : TFieldMap;
  142. begin
  143. M:=TDBCollectionItem(ItemClass).FieldMapClass.Create(Dataset);
  144. Try
  145. DoLoadFromFieldMap(M);
  146. finally
  147. M.Free;
  148. end;
  149. end;
  150. { TDBCollectionItem }
  151. procedure TDBCollectionItem.LoadFromMap(F: TFieldMap);
  152. begin
  153. F.LoadObject(Self);
  154. end;
  155. procedure TDBCollectionItem.LoadFromDataset(ADataset: TDataset);
  156. Var
  157. M : TFieldMap;
  158. begin
  159. M:=FieldMapClass.Create(ADataset);
  160. Try
  161. LoadFromMap(M);
  162. Finally
  163. M.Free;
  164. end;
  165. end;
  166. end.