dbftoolsunit.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. FieldByName('FDATE').AsDateTime := StrToDate(testDateValues[i], 'yyyy/mm/dd', '-');
  94. FieldByName('FLARGEINT').AsLargeInt := testLargeIntValues[i];
  95. Post;
  96. end;
  97. Close;
  98. end;
  99. end;
  100. procedure TDBFDBConnector.DropNDatasets;
  101. var n : integer;
  102. begin
  103. for n := 0 to MaxDataSet do
  104. DeleteFile(ExtractFilePath(dbname)+PathDelim+'fpdev_'+inttostr(n)+'.db');
  105. end;
  106. procedure TDBFDBConnector.DropFieldDataset;
  107. begin
  108. DeleteFile(ExtractFilePath(dbname)+PathDelim+'fpdev_field.db');
  109. end;
  110. function TDBFDBConnector.InternalGetNDataset(n: integer): TDataset;
  111. begin
  112. Result := TDbf.Create(nil);
  113. with (result as TDbf) do
  114. begin
  115. FilePath := dbname;
  116. TableName := 'fpdev_'+inttostr(n)+'.db';
  117. end;
  118. end;
  119. function TDBFDBConnector.InternalGetFieldDataset: TDataSet;
  120. begin
  121. Result := TDbf.Create(nil);
  122. with (result as TDbf) do
  123. begin
  124. FilePath := dbname;
  125. TableName := 'fpdev_field.db';
  126. end;
  127. end;
  128. function TDBFDBConnector.GetTraceDataset(AChange: Boolean): TDataset;
  129. var ADS, AResDS : TDbf;
  130. begin
  131. ADS := GetNDataset(AChange,15) as TDbf;
  132. AResDS := TDbfTraceDataset.Create(nil);
  133. AResDS.FilePath:=ADS.FilePath;
  134. AResDs.TableName:=ADS.TableName;
  135. Result:=AResDS;
  136. end;
  137. { TDbfTraceDataset }
  138. procedure TDbfTraceDataset.SetCurrentRecord(Index: Longint);
  139. begin
  140. DataEvents := DataEvents + 'SetCurrentRecord' + ';';
  141. inherited SetCurrentRecord(Index);
  142. end;
  143. procedure TDbfTraceDataset.RefreshInternalCalcFields(Buffer: PChar);
  144. begin
  145. DataEvents := DataEvents + 'RefreshInternalCalcFields' + ';';
  146. inherited RefreshInternalCalcFields(Buffer);
  147. end;
  148. procedure TDbfTraceDataset.InternalInitFieldDefs;
  149. var i : integer;
  150. IntCalcFieldName : String;
  151. begin
  152. // To fake a internal calculated field, set it's fielddef InternalCalcField
  153. // property to true, before the dataset is opened.
  154. // This procedure takes care of setting the automatically created fielddef's
  155. // InternalCalcField property to true. (works for only one field)
  156. IntCalcFieldName:='';
  157. for i := 0 to FieldDefs.Count -1 do
  158. if fielddefs[i].InternalCalcField then IntCalcFieldName := FieldDefs[i].Name;
  159. inherited InternalInitFieldDefs;
  160. if IntCalcFieldName<>'' then with FieldDefs.find(IntCalcFieldName) do
  161. begin
  162. InternalCalcField := True;
  163. end;
  164. end;
  165. procedure TDbfTraceDataset.CalculateFields(Buffer: PChar);
  166. begin
  167. DataEvents := DataEvents + 'CalculateFields' + ';';
  168. inherited CalculateFields(Buffer);
  169. end;
  170. procedure TDbfTraceDataset.ClearCalcFields(Buffer: PChar);
  171. begin
  172. DataEvents := DataEvents + 'ClearCalcFields' + ';';
  173. inherited ClearCalcFields(Buffer);
  174. end;
  175. initialization
  176. RegisterClass(TDBFDBConnector);
  177. end.