mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 01:21:41 +01: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.
 | |
|  
 | 
