lazarus/components/dbexport/demo/simple/gendata.pp
2022-04-12 18:09:38 +10:00

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.