1Unit gendata; 2 3{$mode objfpc}{$H+} 4 5Interface 6 7Uses Classes, SysUtils, DB, dbf; 8 9Const 10 DefFirstNamesFile = 'firstnames.txt'; 11 DefLastNamesFile = 'lastnames.txt'; 12 DefPersonCount = 10; 13 DefDayCount = 3; 14 15Type 16 17 { TDatagenerator } 18 19 TDatagenerator = Class(TObject) 20 private 21 FTID : Integer; 22 FDayCount: Integer; 23 FFirstNamesFile: String; 24 FLastNamesFile: String; 25 FOnProgress: TNotifyEvent; 26 FOutputFile: String; 27 FPersonCount: Integer; 28 FStartDate: TDateTime; 29 FDataset : TDataset; 30 procedure DoTrack(No,ID : Integer; Const FN,LN: String; Const D,Tin,Tout : TDateTime); 31 procedure DoPerson(ID : Integer; FN,LN : String); 32 Protected 33 Function CreateDataset : TDataset; virtual; abstract; 34 Procedure CloseDataset; virtual; 35 Property Dataset : TDataset Read FDataset Write FDataset; 36 37 Public 38 Constructor Create; 39 Procedure GenerateData; 40 Property FirstNamesFile : String Read FFirstNamesFile Write FFirstNamesFile; 41 Property LastNamesFile : String Read FLastNamesFile Write FLastNamesFile; 42 Property OutputFile : String Read FOutputFile Write FOutputFile; 43 Property StartDate : TDateTime Read FStartDate Write FStartDate; 44 Property OnProgress : TNotifyEvent Read FOnProgress Write FOnPRogress; 45 Property PersonCount : Integer Read FPersonCount Write FPersonCount; 46 Property DayCount : Integer Read FDayCount Write FDayCount; 47 end; 48 49 { TDBFGenerator } 50 51 TDBFGenerator = Class(TDataGenerator) 52 Protected 53 Function CreateDataset : TDataset; override; 54 End; 55 56Implementation 57 58 59{ TDatagenerator } 60 61constructor TDatagenerator.Create; 62begin 63 FFirstNamesFile:=DefFirstNamesFile; 64 FLastNamesFile:=DefLastNamesFile; 65 FPersonCount:=DefPersonCount; 66 FDayCount:=DefDayCount; 67 FStartDate:=EncodeDate(2005,9,1); 68end; 69 70procedure TDatagenerator.DoTrack(No,ID : Integer; Const FN,LN: String; Const D,Tin,Tout : TDateTime); 71 72begin 73 With Dataset do 74 begin 75 Append; 76 FieldByName('TrackID').AsInteger:=No; 77 FieldByName('PersonID').AsInteger:=ID; 78 FieldByName('FirstName').AsString:=FN; 79 FieldByName('LastName').AsString:=LN; 80 FieldByName('DayOfWeek').AsInteger:=DayOfWeek(D); 81 FieldByName('Date').AsDateTime:=D; 82 FieldByName('TimeIn').AsDateTime:=TIn; 83 FieldByName('TimeOut').AsDateTime:=TOut; 84 Post; 85 end; 86end; 87 88procedure TDatagenerator.DoPerson(ID : Integer; FN,LN : String); 89 90Var 91 D,TIn,Tout : TDateTime; 92 I : Integer; 93 94begin 95 For I:=1 to DayCount do 96 begin 97 D:=FStartDate+I; 98 // Entry 99 TIn:=EncodeTime(8,30+Random(10)-10,Random(60),0); 100 // Exit 101 Tout:=EncodeTime(17,30+Random(10)-10,Random(60),0); 102 DoTrack((ID-1)*DayCount+I,ID,FN,LN,D,TIn,Tout); 103 end; 104 If Assigned(FOnProgress) then 105 FOnProgress(Self); 106end; 107 108procedure TDatagenerator.CloseDataset; 109begin 110 FDataset.Close; 111 FreeAndNil(FDataset); 112end; 113 114procedure TDatagenerator.GenerateData; 115 116Var 117 FN,LN : TStrings; 118 PFN,PLN : String; 119 F : Text; 120 I : Integer; 121 122begin 123 FTID:=0; 124 FDataset:=CreateDataset; 125 Try 126 Randomize; 127 FN:=TStringList.Create; 128 Try 129 FN.LoadFromFile(UTF8ToAnsi(FFirstNamesFile)); 130 LN:=TStringList.Create; 131 Try 132 LN.LoadFromFile(UTF8ToAnsi(FLastNamesFile)); 133 Assign(F,FOutputFile); 134 Rewrite(F); 135 Try 136 For I:=1 to PersonCount do 137 begin 138 PFN:=FN[Random(FN.Count)]; 139 PLN:=LN[Random(LN.Count)]; 140 DoPerson(I,PFN,PLN); 141 end; 142 Finally 143 Close(F); 144 end; 145 Finally 146 LN.Free; 147 end; 148 Finally 149 FN.Free; 150 end; 151 Finally 152 CLoseDataset; 153 end; 154end; 155 156{ TDBFGenerator } 157 158function TDBFGenerator.CreateDataset: TDataset; 159 160Var 161 DS : TDBF; 162 163begin 164 DS:=TDBF.Create(Nil); 165 with DS.FieldDefs do 166 begin 167 Clear; 168 Add('TrackID',ftInteger,0); 169 Add('PersonID',ftInteger,0); 170 Add('FirstName',ftString,30); 171 Add('LastName',ftString,30); 172 Add('DayOfWeek',ftSmallint,0); 173 Add('Date',ftDate,0); 174 Add('TimeIn',ftDateTime,0); 175 Add('TimeOut',ftDateTime,0); 176 end; 177 DS.TableName:=OutputFile; 178 DS.CreateTable; 179 DS.Exclusive := true; 180 DS.Open; 181 DS.AddIndex('LastName', 'LastName', []); 182 Result:=DS; 183 184end; 185 186end. 187 188