dbftoolsunit.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. unit DBFToolsUnit;
  2. {$IFDEF FPC}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. Classes, SysUtils, toolsunit,
  8. db, Dbf;
  9. type
  10. { TDBFDBConnector }
  11. TDBFDBConnector = class(TDBConnector)
  12. protected
  13. procedure CreateNDatasets; override;
  14. procedure CreateFieldDataset; override;
  15. procedure DropNDatasets; override;
  16. procedure DropFieldDataset; override;
  17. Function InternalGetNDataset(n : integer) : TDataset; override;
  18. Function InternalGetFieldDataset : TDataSet; override;
  19. public
  20. function GetTraceDataset(AChange : Boolean) : TDataset; override;
  21. end;
  22. { TDbfTraceDataset }
  23. TDbfTraceDataset = class(Tdbf)
  24. protected
  25. procedure SetCurrentRecord(Index: Longint); override;
  26. procedure RefreshInternalCalcFields(Buffer: PChar); override;
  27. procedure InternalInitFieldDefs; override;
  28. procedure CalculateFields(Buffer: PChar); override;
  29. procedure ClearCalcFields(Buffer: PChar); override;
  30. end;
  31. implementation
  32. procedure TDBFDBConnector.CreateNDatasets;
  33. var countID,n : integer;
  34. begin
  35. for n := 0 to MaxDataSet do
  36. begin
  37. with TDbf.Create(nil) do
  38. begin
  39. FilePath := dbname;
  40. TableName := 'fpdev_'+inttostr(n)+'.db';
  41. FieldDefs.Add('ID',ftInteger);
  42. FieldDefs.Add('NAME',ftString,50);
  43. CreateTable;
  44. Open;
  45. if n > 0 then for countId := 1 to n do
  46. begin
  47. Append;
  48. FieldByName('ID').AsInteger := countID;
  49. FieldByName('NAME').AsString := 'TestName'+inttostr(countID);
  50. // Explicitly call .post, since there could be a bug which disturbs
  51. // the automatic call to post. (example: when TDataset.DataEvent doesn't
  52. // work properly)
  53. Post;
  54. end;
  55. if state = dsinsert then
  56. Post;
  57. Close;
  58. Free;
  59. end;
  60. end;
  61. end;
  62. procedure TDBFDBConnector.CreateFieldDataset;
  63. var i : integer;
  64. begin
  65. with TDbf.Create(nil) do
  66. begin
  67. FilePath := dbname;
  68. TableName := 'fpdev_field.db';
  69. FieldDefs.Add('ID',ftInteger);
  70. FieldDefs.Add('FSTRING',ftString,10);
  71. FieldDefs.Add('FSMALLINT',ftSmallint);
  72. FieldDefs.Add('FINTEGER',ftInteger);
  73. // FieldDefs.Add('FWORD',ftWord);
  74. FieldDefs.Add('FBOOLEAN',ftBoolean);
  75. FieldDefs.Add('FFLOAT',ftFloat);
  76. // FieldDefs.Add('FCURRENCY',ftCurrency);
  77. // FieldDefs.Add('FBCD',ftBCD);
  78. FieldDefs.Add('FDATE',ftDate);
  79. // FieldDefs.Add('FTIME',ftTime);
  80. FieldDefs.Add('FDATETIME',ftDateTime);
  81. FieldDefs.Add('FLARGEINT',ftLargeint);
  82. CreateTable;
  83. Open;
  84. for i := 0 to testValuesCount-1 do
  85. begin
  86. Append;
  87. FieldByName('ID').AsInteger := i;
  88. FieldByName('FSTRING').AsString := testStringValues[i];
  89. FieldByName('FSMALLINT').AsInteger := testSmallIntValues[i];
  90. FieldByName('FINTEGER').AsInteger := testIntValues[i];
  91. FieldByName('FBOOLEAN').AsBoolean := testBooleanValues[i];
  92. FieldByName('FFLOAT').AsFloat := testFloatValues[i];
  93. ShortDateFormat := 'yyyy-mm-dd';
  94. FieldByName('FDATE').AsDateTime := StrToDate(testDateValues[i]);
  95. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  96. Post;
  97. end;
  98. Close;
  99. end;
  100. end;
  101. procedure TDBFDBConnector.DropNDatasets;
  102. var n : integer;
  103. begin
  104. for n := 0 to MaxDataSet do
  105. DeleteFile(ExtractFilePath(dbname)+PathDelim+'fpdev_'+inttostr(n)+'.db');
  106. end;
  107. procedure TDBFDBConnector.DropFieldDataset;
  108. begin
  109. DeleteFile(ExtractFilePath(dbname)+PathDelim+'fpdev_field.db');
  110. end;
  111. function TDBFDBConnector.InternalGetNDataset(n: integer): TDataset;
  112. begin
  113. Result := TDbf.Create(nil);
  114. with (result as TDbf) do
  115. begin
  116. FilePath := dbname;
  117. TableName := 'fpdev_'+inttostr(n)+'.db';
  118. end;
  119. end;
  120. function TDBFDBConnector.InternalGetFieldDataset: TDataSet;
  121. begin
  122. Result := TDbf.Create(nil);
  123. with (result as TDbf) do
  124. begin
  125. FilePath := dbname;
  126. TableName := 'fpdev_field.db';
  127. end;
  128. end;
  129. function TDBFDBConnector.GetTraceDataset(AChange: Boolean): TDataset;
  130. var ADS, AResDS : TDbf;
  131. begin
  132. ADS := GetNDataset(AChange,15) as TDbf;
  133. AResDS := TDbfTraceDataset.Create(nil);
  134. AResDS.FilePath:=ADS.FilePath;
  135. AResDs.TableName:=ADS.TableName;
  136. Result:=AResDS;
  137. end;
  138. { TDbfTraceDataset }
  139. procedure TDbfTraceDataset.SetCurrentRecord(Index: Longint);
  140. begin
  141. DataEvents := DataEvents + 'SetCurrentRecord' + ';';
  142. inherited SetCurrentRecord(Index);
  143. end;
  144. procedure TDbfTraceDataset.RefreshInternalCalcFields(Buffer: PChar);
  145. begin
  146. DataEvents := DataEvents + 'RefreshInternalCalcFields' + ';';
  147. inherited RefreshInternalCalcFields(Buffer);
  148. end;
  149. procedure TDbfTraceDataset.InternalInitFieldDefs;
  150. var i : integer;
  151. IntCalcFieldName : String;
  152. begin
  153. // To fake a internal calculated field, set it's fielddef InternalCalcField
  154. // property to true, before the dataset is opened.
  155. // This procedure takes care of setting the automatically created fielddef's
  156. // InternalCalcField property to true. (works for only one field)
  157. IntCalcFieldName:='';
  158. for i := 0 to FieldDefs.Count -1 do
  159. if fielddefs[i].InternalCalcField then IntCalcFieldName := FieldDefs[i].Name;
  160. inherited InternalInitFieldDefs;
  161. if IntCalcFieldName<>'' then with FieldDefs.find(IntCalcFieldName) do
  162. begin
  163. InternalCalcField := True;
  164. end;
  165. end;
  166. procedure TDbfTraceDataset.CalculateFields(Buffer: PChar);
  167. begin
  168. DataEvents := DataEvents + 'CalculateFields' + ';';
  169. inherited CalculateFields(Buffer);
  170. end;
  171. procedure TDbfTraceDataset.ClearCalcFields(Buffer: PChar);
  172. begin
  173. DataEvents := DataEvents + 'ClearCalcFields' + ';';
  174. inherited ClearCalcFields(Buffer);
  175. end;
  176. initialization
  177. RegisterClass(TDBFDBConnector);
  178. end.