mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-25 14:19:12 +02:00
188 lines
4.1 KiB
ObjectPascal
188 lines
4.1 KiB
ObjectPascal
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.
|
|
|