All pastes #496591 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-19 10:09 UTC
rendered paste body
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.