File: gendata.pp

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (187 lines) | stat: -rw-r--r-- 4,212 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
Unit gendata;

{$mode objfpc}{$H+}

Interface

Uses Classes, SysUtils, DB, dbf;

Const
  DefFirstNamesFile = 'firstnames.txt';
  DefLastNamesFile  = 'lastnames.txt';
  DefPersonCount     = 10;
  DefDayCount        = 3;

Type 

  { TDatagenerator }

  TDatagenerator = Class(TObject)
  private
    FTID : Integer;
    FDayCount: Integer;
    FFirstNamesFile: String;
    FLastNamesFile: String;
    FOnProgress: TNotifyEvent;
    FOutputFile: String;
    FPersonCount: Integer;
    FStartDate: TDateTime;
    FDataset : TDataset;
    procedure DoTrack(No,ID : Integer; Const FN,LN: String; Const D,Tin,Tout : TDateTime);
    procedure DoPerson(ID : Integer; FN,LN : String);
  Protected
    Function CreateDataset : TDataset; virtual; abstract;
    Procedure CloseDataset; virtual;
    Property Dataset : TDataset Read FDataset Write FDataset;  

  Public
    Constructor Create;
    Procedure GenerateData;
    Property FirstNamesFile : String Read FFirstNamesFile Write FFirstNamesFile;
    Property LastNamesFile : String Read FLastNamesFile Write FLastNamesFile;
    Property OutputFile : String Read FOutputFile Write FOutputFile;
    Property StartDate : TDateTime Read FStartDate Write FStartDate;
    Property OnProgress : TNotifyEvent Read FOnProgress Write FOnPRogress;
    Property PersonCount : Integer Read FPersonCount Write FPersonCount;
    Property DayCount : Integer Read FDayCount Write FDayCount;
  end;
  
  { TDBFGenerator }

  TDBFGenerator = Class(TDataGenerator)
  Protected
    Function CreateDataset : TDataset; override;
  End;

Implementation
  

{ TDatagenerator }

constructor TDatagenerator.Create;
begin
  FFirstNamesFile:=DefFirstNamesFile;
  FLastNamesFile:=DefLastNamesFile;
  FPersonCount:=DefPersonCount;
  FDayCount:=DefDayCount;
  FStartDate:=EncodeDate(2005,9,1);
end;

procedure TDatagenerator.DoTrack(No,ID : Integer; Const FN,LN: String; Const D,Tin,Tout : TDateTime);

begin
  With Dataset do
    begin
    Append;
    FieldByName('TrackID').AsInteger:=No;
    FieldByName('PersonID').AsInteger:=ID;
    FieldByName('FirstName').AsString:=FN;
    FieldByName('LastName').AsString:=LN;
    FieldByName('DayOfWeek').AsInteger:=DayOfWeek(D);
    FieldByName('Date').AsDateTime:=D;
    FieldByName('TimeIn').AsDateTime:=TIn;
    FieldByName('TimeOut').AsDateTime:=TOut;
    Post;
    end;
end;

procedure TDatagenerator.DoPerson(ID : Integer; FN,LN : String);

Var
  D,TIn,Tout : TDateTime;
  I : Integer;

begin
  For I:=1 to DayCount do
    begin
    D:=FStartDate+I;
    // Entry
    TIn:=EncodeTime(8,30+Random(10)-10,Random(60),0);
    //  Exit
    Tout:=EncodeTime(17,30+Random(10)-10,Random(60),0);
    DoTrack((ID-1)*DayCount+I,ID,FN,LN,D,TIn,Tout);
    end;
  If Assigned(FOnProgress) then
    FOnProgress(Self);
end;

procedure TDatagenerator.CloseDataset;
begin
  FDataset.Close;
  FreeAndNil(FDataset);
end;

procedure TDatagenerator.GenerateData;

Var
  FN,LN : TStrings;
  PFN,PLN : String;
  F : Text;
  I : Integer;
  
begin
  FTID:=0;
  FDataset:=CreateDataset;
  Try
    Randomize;
    FN:=TStringList.Create;
    Try
      FN.LoadFromFile(UTF8ToAnsi(FFirstNamesFile));
      LN:=TStringList.Create;
      Try
        LN.LoadFromFile(UTF8ToAnsi(FLastNamesFile));
        Assign(F,FOutputFile);
        Rewrite(F);
        Try
          For I:=1 to PersonCount do
            begin
            PFN:=FN[Random(FN.Count)];
            PLN:=LN[Random(LN.Count)];
            DoPerson(I,PFN,PLN);
          end;
        Finally
          Close(F);
        end;
      Finally
        LN.Free;
      end;
    Finally
      FN.Free;
    end;
  Finally
    CLoseDataset;
  end;
end;

{ TDBFGenerator }

function TDBFGenerator.CreateDataset: TDataset;

Var
  DS : TDBF;

begin
  DS:=TDBF.Create(Nil);
  with DS.FieldDefs do
    begin
    Clear;
    Add('TrackID',ftInteger,0);
    Add('PersonID',ftInteger,0);
    Add('FirstName',ftString,30);
    Add('LastName',ftString,30);
    Add('DayOfWeek',ftSmallint,0);
    Add('Date',ftDate,0);
    Add('TimeIn',ftDateTime,0);
    Add('TimeOut',ftDateTime,0);
    end;
  DS.TableName:=OutputFile;
  DS.CreateTable;
  DS.Exclusive := true;
  DS.Open;
  DS.AddIndex('LastName', 'LastName', []);
  Result:=DS;

end;

end.