All pastes #496638 Raw Edit

Untitled

public text v1 · immutable
·published 2007-05-19 11:01 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;
    ListBox1: TListBox;
    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
      if IndexOf('Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString) = -1 then
      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;
      mySQLQuery1.Next;
    end;
  end;

  ClientDataSet1.CreateDataSet;
  ClientDataSet1.Open;

  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('Tid').AsDateTime := CurrDato;

      // Finn det laveste intervallet for dette tidspunktet
      mySQLQuery1.First;
      J := mySQLQuery1.FieldByName('idVald').AsInteger;
      while not mySQLQuery1.EOF do
      begin
        Funn := False;
        while (mySQLQuery1.FieldByName('idVald').AsInteger = J) and (not Funn) and (not mySQLQuery1.EOF) do
        begin
          if (CurrDato >= mySQLQuery1.FieldByName('Startdato').AsFloat) and (CurrDato <= mySQLQuery1.FieldByName('Sluttdato').AsFloat) then
          begin
            FieldByName('Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger := mySQLQuery1.FieldByName('Stangantall').AsInteger;
            Funn := True;
          end
          else
            FieldByName('Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger := 0;
          mySQLQuery1.Next;
        end;
        while (J = mySQLQuery1.FieldByName('idVald').AsInteger) and (not mySQLQuery1.EOF) do
          mySQLQuery1.Next;
        J := mySQLQuery1.FieldByName('idVald').AsInteger;
      end;
      Post;
    end;
    CurrDato := IncHour(CurrDato);
  end;

  mySQLQuery1.SQL.Text := 'SELECT V.idVald, F.idFiskekort, F.Starttid, F.Sluttid, K.Stangbruk '+
'FROM Fiskekort F, Korttype K, Vald V '+
'WHERE F.idKorttype=K.idKorttype AND K.idVald=V.idVald 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'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger := ClientDataSet1.FieldByName('Brukt'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger+1;
      ClientDataSet1.Post;
      ClientDataSet1.Next;
    end;

    mySQLQuery1.Next;
  end;

  mySQLQuery1.SQL.Text := 'SELECT V.idVald, V.Vald FROM Vald V, Salgsstedgodkjenning S, Utsalgssted U WHERE V.idVald=S.idVald AND S.idUtsalgssted=U.idUtsalgssted AND S.Aktiv=True AND U.idUtsalgssted = 1 ORDER BY Vald';
  mySQLQuery1.Open;
  mySQLQuery1.First;
  while not mySQLQuery1.EOF do
  begin
    Min := 1000;
    with ClientDataSet1 do
    begin
      First;
      while not EOF do
      begin
        Edit;
        FieldByName('Ledig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger := FieldByName('Tilgjengelig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger - FieldByName('Brukt'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger;
        Post;
        if FieldByName('Ledig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger < Min then
          Min := FieldByName('Ledig'+mySQLQuery1.FieldByName('idVald').AsString).AsInteger;
        Next;
      end;
    end;
    ListBox1.Items.Add(mySQLQuery1.FieldByName('Vald').AsString+' ('+IntToStr(Min)+')');
    mySQLQuery1.Next;
  end;
end;

end.