Avatar billede itognet Nybegynder
24. juni 2003 - 15:51 Der er 12 kommentarer

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;
Avatar billede borrisholt Novice
24. juni 2003 - 16:05 #1
Jeg tror det her kan det samme :

procedure TForm1.Button1Click(Sender: TObject);
var
  StartTime, EndTime, TmpTime : TDateTime;
  Nat, Dag : Double;
begin
  StartTime := StrToTime(DBEdit34.Text);
  EndTime  := StrToTime(DBEdit57.Text);

  if EndTime > GetAsTime('2000') then
    TmpTime  := GetAsTime('2000')
  else
    TmpTime := EndTime;

  Dag := TmpTime - StartTime;
  StartTime := GetAsTime('2000');
  Nat := Abs( EndTime - StartTime);
end;


Jens B
Avatar billede itognet Nybegynder
24. juni 2003 - 16:21 #2
hehe - hvad er det lige for en unit der skal bruges for at få GetAsTime til at virke ?
Avatar billede borrisholt Novice
24. juni 2003 - 16:23 #3
UPS :

Function GetAsTime (strTime : String) : TDateTime;
begin
  Insert(TimeSeparator, strTime, 2);
  Result := StrToTime(strTime);

end;
Avatar billede itognet Nybegynder
24. juni 2003 - 16:52 #4
Jeg kan ikke helt finde ud af, hvad outputet er -
for mine outputs bliver fra 20:00 - 22:00 i float form.

dag = -0,75
nat =  0,83
Avatar billede itognet Nybegynder
24. juni 2003 - 16:58 #5
ups - skal jo bare lave en timetostring - og ikke float -
Avatar billede itognet Nybegynder
24. juni 2003 - 17:07 #6
hmm kan ikke få outputtet til at passe
hvis jeg skriver starttid = 18:00 sluttid = 21:00
så skulle dag være = 2 og nat = 1
men dag bliver = 16:00:00 og nat bliver = 19:00:00
Avatar billede borrisholt Novice
24. juni 2003 - 17:11 #7
Kigger på det i morgen.

Kan du ikke maile mig nogle start og slut tidspunkter ...

Jens B
Avatar billede itognet Nybegynder
24. juni 2003 - 17:30 #8
eksempler:

23:59 minutter er det længste stræk.

06:00 - 19:59 kaldes for dag.
20:00 - 05:59 kaldes for nat.

19:00 - 01:00 =  5 timer nat. 1 timer dag.
23:00 - 01:00 =  2 timer nat. 0 timer dag.
19:00 - 07:00 = 10 timer nat. 2 timer dag.
05:00 - 11:00 =  1 timer nat, 5 timer dag.

8-)
Avatar billede borrisholt Novice
25. juni 2003 - 11:30 #9
prøv den her :

procedure TForm1.BeregnTider(Start, Stop: TDateTime; var Dag, Nat: Integer);
  Function JbRound(const Value : Double) : Integer;
  begin
    Result := Trunc(Value + 0.5);
  end;
  Function ConvertToHoures(Const Time : TDateTime) : Integer;
  begin
    Result := JbRound(24 * Time);
  end;
var
  Tmp : TDateTime;
begin
  Dag := 0;
  Nat := 0;

  Tmp := Max(DagStart, Start);

  if (Start < DagStart) then
    Nat := ConvertToHoures(DagStart - Start);

  if (Tmp >= DagStart) and (Tmp < NatStart) then
  begin
    Dag := ConvertToHoures(Min(NatStart, Stop) - Tmp);
    if Dag < 0 then
      Dag := 14;
  end;

  if (Stop >= NatStart) then
    Nat := Nat + ConvertToHoures(Stop- NatStart);

  if (Stop < DagStart) then
  begin
    Nat := Nat + ConvertToHoures(MidNight - NatStart);
    Nat := Nat + ConvertToHoures(Stop);
  end;
end;


Jens B
Avatar billede itognet Nybegynder
15. juli 2003 - 10:54 #10
hej borrisholt.

har haft lidt ferie, derfor ingen kommentarerer her.

Funktionen Max beklager den sig over. - sikker en ud har glemt :)
Avatar billede borrisholt Novice
15. juli 2003 - 10:58 #11
Den ligger i math
Avatar billede borrisholt Novice
26. juli 2003 - 19:56 #12
Sker der snart noget her ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester