Udregn timer - kan det gøre smartere ? evt. i SQL ?
Hej er den stolte ejer som har produceret dette stykke kode, men jeg er lidt i tvivl om det egentlig bare kan gøre MEGET nemmere.Det hele proceduren gør er at tage et starttidspunkt og et sluttidspunkt og beregne tiden imellem. Men også om tiden er mellem 0600-2000 eller 2000-0600
Min udvidelse vil være at det er variable tider, samt måske 4 tider i stedet for 2 tider.
Hvis du har ideer, forslag, spørgsmål, eller lign. er du velkommen til at svare.
Hvis du kan bruge koden er det også helt fint.
------------------------
procedure TForm1.UdregnTimer;
var
Hour, Min, Sec, MSec : Word;
StartHour, StartMin, StartSec, StartMSec: Double;
SlutHour, SlutMin, SlutSec, SlutMSec: Double;
Nat, Dag : Double;
begin
if (DM.VagtplanSource.DataSet.State = dsEdit) or
(DM.VagtplanSource.DataSet.State = dsInsert) then
begin
if (DM.VagtplanSource.DataSet.FieldByName('STARTTID').AsString <> '') AND
(DM.VagtplanSource.DataSet.FieldByName('SLUTTID').AsString <> '') then
begin
DecodeTime(StrToTime(DBEdit34.Text), Hour, Min, Sec, MSec);
StartHour := Hour; StartMin := Min;
DecodeTime(StrToTime(DBEdit57.Text), Hour, Min, Sec, MSec);
SlutHour := Hour; SlutMin := Min;
//-----
// DAG: 0600 - 2000
// NAT: 2000 - 0600
// Convert everything to minutes
// 0600 = 360 min
// 2000 = 1200 min
// 2400 = 1440 min
Nat := 0; Dag := 0;
StartMin := (StartHour * 60) + StartMin;
SlutMin := (SlutHour * 60) + SlutMin;
// situation 1: 0001-2359 (no day break)
If StartMin < SlutMin then
begin
// 0001-0600
// tested found ok
if (StartMin < 360) and (SlutMin < 360) then
Nat := Nat + (SlutMin - StartMin)
else
if (StartMin < 360) and (SlutMin >= 360) then
Nat := Nat + (360 - StartMin);
// 2000-2400
// tested found ok
if (SlutMin >= 1200) and (StartMin >= 1200) then
Nat := Nat + (SlutMin - StartMin)
else
if (SlutMin >= 1200) and (StartMin < 1200) then
Nat := Nat + (SlutMin - 1200);
// 0600-2000
// tested found ok
if (StartMin >= 360) and (StartMin < 1200) and (SlutMin <= 1200) then
Dag := Dag + (SlutMin - StartMin)
else
if (SlutMin >= 360) and (SlutMin < 1200) and (StartMin < 360) then
Dag := Dag + (SlutMin - 360)
else
if (StartMin >= 360) and (StartMin < 1200) and (SlutMin > 1200) then
Dag := Dag + (1200 - StartMin)
else
if (StartMin <= 360) and (SlutMin >= 1200) then
Dag := 1200 - 360;
end;
// situation 2: 2359-2358 (we have a day break)
// ((24*60) - StartMin + Slutmin) / 60
//tested OK
If StartMin > SlutMin then
begin
if (StartMin > 1200) and (SlutMin >= 1200) then
begin
Nat := Nat + 1440 - StartMin;
Nat := Nat + 360;
Dag := 1200 - 360;
Nat := Nat + SlutMin - 1200;
end;
if (StartMin >= 1200) and (SlutMin < 1200) and (SlutMin > 360) then
begin
Nat := Nat + 1440 - StartMin;
Nat := Nat + 360;
Dag := Dag + SlutMin - 360;
end;
if (StartMin >= 1200) and (SlutMin <= 360) then
begin
Nat := Nat + 1440 - StartMin;
Nat := Nat + SlutMin;
end;
if (StartMin > 360) and (StartMin < 1200) and (SlutMin >= 360) and (SlutMin < 1200) then
begin
Nat := Nat + 1440 - 1200;
Nat := Nat + 360;
Dag := Dag + 1200 - StartMin;
Dag := Dag + SlutMin - 360;
end;
if (StartMin > 360) and (StartMin < 1200) and (SlutMin <= 360) then
begin
Nat := 1440 - 1200;
Dag := 1200 - StartMin;
Nat := Nat + SlutMin;
end;
if (StartMin <= 360) and (SlutMin < 360) then
begin
Nat := 1440 - 1200;
Dag := 1200 - 360;
Nat := Nat + 360 - StartMin + SlutMin;
end;
end;
// if (Dag/60 = 0) and (Nat/60 = 0) then
// MessageDlg('Der er måske en fejl i time udregningen, skriv start og slut tid ned!', mtWarning, [mbOK], 0);
DM.VagtplanSource.DataSet.FieldByName('TIMER_DAG').AsFloat := Dag / 60;
DM.VagtplanSource.DataSet.FieldByName('TIMER_NAT').AsFloat := Nat / 60;
end;
end;
end;
