unit kortberegning;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, mySQLDbTables, DB, DBClient;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
ClientDataSet1: TClientDataSet;
mySQLDatabase1: TmySQLDatabase;
mySQLQuery1: TmySQLQuery;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
Button1: TButton;
DataSource2: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses DateUtils;
var
FormatSettings: TFormatSettings;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Timer, I, J, Min: Integer;
Startdato, CurrDato: TDateTime;
Funn: Boolean;
begin
with FormatSettings do
begin
DateSeparator := '-';
TimeSeparator := ':';
ShortDateFormat := 'yyyy-mm-dd';
LongDateFormat := 'yyyy-mm-dd';
ShortTimeFormat := 'hh:nn:ss';
LongTimeFormat := 'hh:nn:ss';
end;
mySQLQuery1.SQL.Text := 'SELECT S.idStangunntak, S.Stangantall, V.idVald, V.Vald, S.Startdato, S.Sluttdato, S.Sluttdato-S.Startdato AS Intervall '+
'FROM Vald V, Stangunntak S, Salgsstedgodkjenning G, Utsalgssted U '+
'WHERE V.idVald=S.idVald AND (("2007-08-12" BETWEEN S.Startdato AND S.Sluttdato) OR ("2007-08-15" BETWEEN S.Startdato AND S.Sluttdato)) AND V.idVald=G.idVald AND G.idUtsalgssted=U.idUtsalgssted AND G.Aktiv=True AND U.idUtsalgssted=1 '+
'ORDER BY idVald, Sluttdato-Startdato';
mySQLQuery1.Open;
with ClientDataSet1.FieldDefs do
begin
with AddFieldDef do
begin
Name := 'Tid';
DataType := ftDateTime;
end;
mySQLQuery1.First;
while not mySQLQuery1.EOF do
begin
try
Find()
Find('Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString);
except
on EDatabaseError do
begin
with AddFieldDef do
begin
Name := 'Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString;
DataType := ftInteger;
end;
with AddFieldDef do
begin
Name := 'Brukt'+mySQLQuery1.FieldByName('idVald').AsString;
DataType := ftInteger;
end;
with AddFieldDef do
begin
Name := 'Ledig'+mySQLQuery1.FieldByName('idVald').AsString;
DataType := ftInteger;
end;
end;
end;
mySQLQuery1.Next;
end;
end;
ClientDataSet1.CreateDataSet;
ClientDataSet1.Open;
ShowMessage('Fortsett');
Startdato := StrToDateTime('2007-08-12 00:00:00', FormatSettings);
CurrDato := Startdato;
Timer := HoursBetween(StrToDateTime('2007-08-15 00:00:00', FormatSettings), StrToDateTime('2007-08-12 00:00:00', FormatSettings));
for I := 0 to Timer-1 do
begin
with ClientDataSet1 do
begin
Append;
FieldByName('idVald').AsInteger := 1;
FieldByName('Tid').AsDateTime := CurrDato;
// Finn det laveste intervallet for dette tidspunktet
mySQLQuery1.First;
Funn := False;
while not (mySQLQuery1.EOF or Funn) do
begin
if (CurrDato >= mySQLQuery1.FieldByName('Startdato').AsFloat) and (CurrDato <= mySQLQuery1.FieldByName('Sluttdato').AsFloat) then
begin
FieldByName('Tilgjengelig').AsInteger := mySQLQuery1.FieldByName('Stangantall').AsInteger;
Funn := True;
end
else
FieldByName('Tilgjengelig').AsInteger := 0;
mySQLQuery1.Next;
end;
Post;
end;
CurrDato := IncHour(CurrDato);
end;
mySQLQuery1.SQL.Text := 'SELECT F.idFiskekort, F.Starttid, F.Sluttid, K.Stangbruk '+
'FROM Fiskekort F, Korttype K '+
'WHERE F.idKorttype=K.idKorttype AND K.Stangbruk>0 AND ((F.Starttid >= "2007-08-12 00:00:00" AND F.Starttid < "2007-08-15 00:00:00") OR (F.Sluttid > "2007-08-12 00:00:00" AND F.Sluttid <= "2007-08-15 00:00:00"))';
mySQLQuery1.Open;
Startdato := StrToDateTime('2007-08-12 00:00:00', FormatSettings);
mySQLQuery1.First;
while not mySQLQuery1.EOF do
begin
ClientDataSet1.First;
if mySQLQuery1.FieldByName('Starttid').AsDateTime > Startdato then
ClientDataSet1.RecNo := HoursBetween(mySQLQuery1.FieldByName('Starttid').AsDateTime, Startdato)+1;
I := HoursBetween(mySQLQuery1.FieldByName('Sluttid').AsDateTime, mySQLQuery1.FieldByName('Starttid').AsDateTime);
for J := 0 to I-1 do
begin
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('Brukt').AsInteger := ClientDataSet1.FieldByName('Brukt').AsInteger+1;
ClientDataSet1.Post;
ClientDataSet1.Next;
end;
mySQLQuery1.Next;
end;
Min := 1000;
with ClientDataSet1 do
begin
First;
while not EOF do
begin
Edit;
FieldByName('Ledige').AsInteger := FieldByName('Tilgjengelig').AsInteger - FieldByName('Brukt').AsInteger;
Post;
if FieldByName('Ledige').AsInteger < Min then
Min := FieldByName('Ledige').AsInteger;
Next;
end;
end;
Caption := 'Minst '+IntToStr(Min)+' ledige kort';
end;
end.