/Source/FR_DBSET.PAS

http://github.com/FastReports/FreeReport · Pascal · 202 lines · 151 code · 25 blank · 26 comment · 19 complexity · cfc5e32c86a4f74393b34abbd9458632 MD5 · raw file

  1. {*****************************************}
  2. { }
  3. { FastReport v2.3 }
  4. { Report DB dataset }
  5. { }
  6. { Copyright (c) 1998-99 by Tzyganenko A. }
  7. { }
  8. {*****************************************}
  9. unit FR_DBSet;
  10. interface
  11. {$I FR.inc}
  12. uses
  13. SysUtils, Windows, Messages, Classes, FR_DBRel, FR_DSet
  14. {$IFDEF IBO}
  15. , IB_Components
  16. {$ELSE}
  17. , DB
  18. {$ENDIF};
  19. type
  20. TfrDBDataSet = class(TfrDataset)
  21. private
  22. {$IFDEF IBO}
  23. FDataSet: TIB_DataSet;
  24. FDataSource: TIB_DataSource;
  25. {$ELSE}
  26. FDataSet: TDataSet;
  27. FDataSource: TDataSource;
  28. {$ENDIF}
  29. FOpenDataSource, FCloseDataSource: Boolean;
  30. FOnOpen, FOnClose: TNotifyEvent;
  31. FBookmark: TfrBookmark;
  32. FEof: Boolean;
  33. {$IFDEF IBO}
  34. procedure SetDataSet(Value: TIB_DataSet);
  35. procedure SetDataSource(Value: TIB_DataSource);
  36. {$ELSE}
  37. procedure SetDataSet(Value: TDataSet);
  38. procedure SetDataSource(Value: TDataSource);
  39. {$ENDIF}
  40. protected
  41. procedure Notification(AComponent: TComponent;
  42. Operation: TOperation); override;
  43. public
  44. constructor Create(AOwner: TComponent); override;
  45. procedure Init; override;
  46. procedure Exit; override;
  47. procedure First; override;
  48. procedure Next; override;
  49. procedure Open;
  50. procedure Close;
  51. function Eof: Boolean; override;
  52. function GetDataSet: TfrTDataSet;
  53. published
  54. property CloseDataSource: Boolean read FCloseDataSource write FCloseDataSource default False;
  55. {$IFDEF IBO}
  56. property DataSet: TIB_DataSet read FDataSet write SetDataSet;
  57. property DataSource: TIB_DataSource read FDataSource write SetDataSource;
  58. {$ELSE}
  59. property DataSet: TDataSet read FDataSet write SetDataSet;
  60. property DataSource: TDataSource read FDataSource write SetDataSource;
  61. {$ENDIF}
  62. property OpenDataSource: Boolean read FOpenDataSource write FOpenDataSource default True;
  63. property RangeBegin;
  64. property RangeEnd;
  65. property RangeEndCount;
  66. property OnCheckEOF;
  67. property OnClose: TNotifyEvent read FOnClose write FOnClose;
  68. property OnFirst;
  69. property OnNext;
  70. property OnOpen: TNotifyEvent read FOnOpen write FOnOpen;
  71. end;
  72. implementation
  73. uses FR_Class;
  74. type
  75. EDSError = class(Exception);
  76. constructor TfrDBDataSet.Create(AOwner: TComponent);
  77. begin
  78. inherited Create(AOwner);
  79. FOpenDataSource := True;
  80. end;
  81. procedure TfrDBDataSet.Notification(AComponent: TComponent; Operation: TOperation);
  82. begin
  83. inherited Notification(AComponent, Operation);
  84. if Operation = opRemove then
  85. if AComponent = FDataSource then
  86. FDataSource := nil
  87. else if AComponent = FDataSet then
  88. FDataSet := nil
  89. end;
  90. {$IFDEF IBO}
  91. procedure TfrDBDataSet.SetDataSet(Value: TIB_DataSet);
  92. {$ELSE}
  93. procedure TfrDBDataSet.SetDataSet(Value: TDataSet);
  94. {$ENDIF}
  95. begin
  96. FDataSet := Value;
  97. FDataSource := nil;
  98. end;
  99. {$IFDEF IBO}
  100. procedure TfrDBDataSet.SetDataSource(Value: TIB_DataSource);
  101. {$ELSE}
  102. procedure TfrDBDataSet.SetDataSource(Value: TDataSource);
  103. {$ENDIF}
  104. begin
  105. FDataSource := Value;
  106. if Value <> nil then
  107. FDataSet := nil;
  108. end;
  109. function TfrDBDataSet.GetDataSet: TfrTDataSet;
  110. begin
  111. if (FDataSource <> nil) and (FDataSource.DataSet <> nil) then
  112. Result := TfrTDataSet(FDataSource.DataSet)
  113. else if FDataSet <> nil then
  114. Result := TfrTDataSet(FDataSet)
  115. else
  116. begin
  117. raise EDSError.Create('Unable to open dataset ' + Name);
  118. Result := nil;
  119. end;
  120. end;
  121. procedure TfrDBDataSet.Init;
  122. begin
  123. Open;
  124. FBookmark := frGetBookmark(TfrTDataSet(GetDataSet));
  125. FEof := False;
  126. end;
  127. procedure TfrDBDataSet.Exit;
  128. begin
  129. if FBookMark <> frEmptyBookmark then
  130. begin
  131. if (FRangeBegin = rbCurrent) or (FRangeEnd = reCurrent) then
  132. frGotoBookmark(TfrTDataSet(GetDataSet), FBookmark);
  133. frFreeBookmark(TfrTDataSet(GetDataSet), FBookmark);
  134. end;
  135. FBookMark := frEmptyBookmark;
  136. Close;
  137. end;
  138. procedure TfrDBDataSet.First;
  139. begin
  140. if FRangeBegin = rbFirst then
  141. GetDataSet.First
  142. else if FRangeBegin = rbCurrent then
  143. frGotoBookmark(GetDataSet, FBookmark);
  144. FEof := False;
  145. inherited First;
  146. end;
  147. procedure TfrDBDataSet.Next;
  148. var
  149. b: TfrBookmark;
  150. begin
  151. FEof := False;
  152. if FRangeEnd = reCurrent then
  153. begin
  154. b := frGetBookmark(GetDataSet);
  155. if frIsBookmarksEqual(GetDataSet, b, FBookmark) then
  156. FEof := True;
  157. frFreeBookmark(GetDataSet, b);
  158. System.Exit;
  159. end;
  160. GetDataSet.Next;
  161. inherited Next;
  162. end;
  163. function TfrDBDataSet.Eof: Boolean;
  164. begin
  165. Result := inherited Eof or GetDataSet.Eof or FEof;
  166. end;
  167. procedure TfrDBDataSet.Open;
  168. begin
  169. if FOpenDataSource then GetDataSet.Open;
  170. if Assigned(FOnOpen) then FOnOpen(Self);
  171. end;
  172. procedure TfrDBDataSet.Close;
  173. begin
  174. if Assigned(FOnClose) then FOnClose(Self);
  175. if FCloseDataSource then GetDataSet.Close;
  176. end;
  177. end.