Autor |
Beitrag |
JCHenri
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 14.12.11 16:40
Hallo,
brauche kurz eure hilfe.
In einem Betriebsdatenerfassungs Programm muss ich die Laufzeit eines Arbeiters berechnen. (Programm wurde in Delphi 6 Pro geschrieben)
Ich benötige die Laufzeit zwischen Anfang- und Endzeit, abzüglich seiner Pausen die im System hinterlegt sind.
Pausenzeiten sind in einer Oracle Datenbank im folgendem Format hinterlegt:
START ENDE BREAK
900 915 0.25
1215 1245 0.45
(Start und Endewert ist eine Zahl und die Pause in Industrieminuten)
Wie berechne ich nun die Zeit in Minuten, wenn der Arbeiter von 8Uhr bis 13.30Uhr gearbeitet hat?
Hat jemand vielleicht eine Idee?
Gruß
JCHernri
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Mi 14.12.11 16:52
Wenn es alles am selben Tag ist, kannst du das ganze doch einfach umrechnen.
900 - 915 (steht wohl für 9:00 bis 9:15)
1215 - 1245 (steht wohl für 12:15 bis 12:45)
Dann würde ich das erstmal in Stunden umrechnen;
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Start: 900 div 100 -> 9 Std. 900 mod 100 -> 0 Min.
Ende: 915 div 100 -> 9 Std. 915 mod 100 -> 15 Min.
Pause: 0,25
Start = 9 * 60 + 0; Ende = 9 * 60 + 15; Pause = 0,25 * 60; |
|
|
JCHenri 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 14.12.11 16:59
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Es ist alle am selben Tag.
Die Frage war wie ich die Zeit berechne, wenn jemand von 8 Uhr bis 13.30Uhr gearbeitet hat!
Oder der nächste von 9.20 bis 12:55Uhr?
|
|
Lemmy
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Mi 14.12.11 18:17
hi,
keinen Plan wo du die Start und Endzeit her bekommst, aber die Differenz rechstes Du aus wie überall anders auch:
Endzeit-Startzeit
Einziges Problem: eine Stunde hat 60 Min und keine 100 Min - also alles umrechnen:
DecodeTime(); die Stunden und Minuten als Ganzzahl ausgeben, dann umrechnen:
Start=Starth+Startminute/60
s. auch Industrieminute: de.wikipedia.org/wiki/Industrieminute
|
|
JCHenri 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 15.12.11 09:04
Hi,
Start- und Endzeit bekomme ich aus der Oracle 9.1 Datenbank mit einer SQL abfrage.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function getDauer(Person : String):Integer; Var Ora : TOracleQuery; I : Integer; Begin Ora := TOracle.Create; With Ora.SQL do Begin Add('Select Round((SYSDATE - A.StartOperation)*24*60) Dauer'); Add('from relODCAssign A'); Add('Where A.Personnr = '+''''+Person+''''); end; Ora.Execute; I := Ora.Field['DAUER'].asInteger; Ora.Free;
result := I; end; |
Als Ergebnis bekomme ich die Verbrauchte Zeit in Minuten.
So weit so gut. Mein Problem sind die Pausen der Person, die nicht dazu gerechnet werden dürfen.
Gemäß seines Zeitmodels hat er 15 Minuten Pause von 9 Uhr bis 9.15Uhr und 30 Minuten von 12.15Uhr bis 12.45Uhr
Wenn z.b. StartOperation 8 Uhr wahr und SysDate 13Uhr ist, dann müsste die funktion 45 minuten abziehen.
Währe StartOperation 10 Uhr und SysDate 13Uhr , dann dürfte die funktion nur 30 minuten abziehen.
Wie überprüfe ich die Zeitraum ob die Pausen enthalten sind?
Die Königsdisziplin währes es natürlich, die funktion direkt in der SQL Abfrage zu integrieren.
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 15.12.11 11:36
Was genau möchtest du wissen?
Ob er zwischen 9:00 und 10:00 gearbeitet hat, damit ihm eine Pause von 15 Minuten zusteht?
Wenn er durchgehend arbeitet, also von 8:00 bis 12:00 z.B., dann wäre das relativ einfach. Wenn er jedoch auch ausstempeln kann (Raucherpausen) und daher verschiedene Zeitsegmente existieren, wird's gleich etwas schwieriger.
Gehen wir daher einfach mal davon aus, dass er von 8:00 bis 12:00 durcharbeitet, dann könntest du einfach prüfen, ob BeginnArbeit <= EndePausendefinition und EndeArbeit >= AnfangPausendefinition, also ob 08:00 <= 09:15 und 12:00 >= 09:00. Ist in diesem Fall wahr, also sollte er 15 Minuten Pause genommen haben.
Oder verstehe ich deine Anforderungen falsch?
Zuletzt bearbeitet von baka0815 am Do 15.12.11 11:37, insgesamt 1-mal bearbeitet
|
|
JCHenri 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 15.12.11 15:18
>>Was genau möchtest du wissen?
Wie soll in Delphi die Funktion aussehen, Laufzeit - Pausen der Person ?
Die Laufzeit habe ich schon und brauche noch die berechnete Pausenzeit in einer function...
>>Ob er zwischen 9:00 und 10:00 gearbeitet hat, damit ihm eine Pause von 15 Minuten zusteht?
Hier müssten ihm 15 Minuten von der Laufzeit abgezogen werden.
|
|
Blup
      
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Do 22.12.11 16:55
Die Pausen die zu berücksichtigen sind:
Quelltext 1: 2: 3:
| select von, bis from t_pausenzeiten where (von < :arbeitszeit_bis) and (bis > :arbeitszeit_von) |
Im Programm für Überlappungen Arbeitsbeginn/Ende mit Pausenbeginn/Ende:
Delphi-Quelltext 1: 2: 3:
| if von < arbeitszeit_von then von := arbeitszeit_von; if bis > arbeitszeit_bis then bis := arbeitszeit_bis; pausenzeit = bis - von; |
Falls die Arbeitszeit über mehrere Tage geht, müssen der erste, der letzte und die Tage dazwischen getrennt berücksichtigt werden.
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Do 22.12.11 19:59
Hier ein Lösungsversuch von mir (keine Garantie, dass es fehlerfrei ist!  )
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Function Pausenzeit(Arbeitsbeginn, Arbeitsende, Pausenbeginn, Pausenende:Integer):Integer; Begin Result:=0;
IF (Arbeitsbeginn<=Pausenbeginn) AND (Arbeitsende>Pausenbeginn) then Result:=Pausenende-Pausenbeginn else IF (Arbeitsbeginn<Pausenende) AND (Arbeitsende>Pausenbeginn) then Result:=Pausenende-Arbeitsbeginn;
IF (Arbeitsende>Pausenbeginn) AND (Arbeitsende<Pausenende) then Result:=Result-(Pausenende-Arbeitsende);
End; |
EDIT: Fehlerkorrektur, für den Fall, dass die Arbeitszeit vor der Pause endet.
Ich gehe davon aus, dass es auch möglich ist, die Arbeit während der Pausenzeit zu beginnen bzw. zu beenden, auch wenn das nicht der Realität entspricht. Ich kommentiere meinen Quelltext nicht. Ich denke, er ist auch so nachvollziehbar. Die Funktion muss logischerweise für beide Pausen, also zweimal, aufgerufen werden. Der Wert Arbeitsbeginn muss kleiner als der Wert für Arbeitsende sein.
Beispiel:
Arbeitsbeginn : 9:05 Uhr
Arbeitsende: 11:00 Uhr
Pausenbeginn: 9:00 Uhr
Pausenende: 9:15 Uhr
Die Funktion liefert das Ergebnis 10. Es müssen 10 Minuten Pausenzeit von der Arbeitszeit abgezogen werden.
Viele Grüße
|
|