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