Pausen berechnen
spacer
Autor Nachricht
JCHenri
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: 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;

ausblenden Delphi-Quelltext markieren
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; // 540 Minuten
Ende = 9 * 60 + 15; // 555 Minuten
Pause = 0,25 * 60; // 15 Minuten
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JCHenri Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 14.12.11 16:59 
Moderiert von user profile iconNarses: 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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 618
Erhaltene Danke: 9

Windows XP/7 Kubuntu
RAD XE2
BeitragVerfasst: 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JCHenri Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 15.12.11 09:04 
Hi,
Start- und Endzeit bekomme ich aus der Oracle 9.1 Datenbank mit einer SQL abfrage.

ausblenden Delphi-Quelltext markieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JCHenri Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 26
Erhaltene Danke: 12



BeitragVerfasst: Do 22.12.11 16:55 
Die Pausen die zu berücksichtigen sind:
ausblenden Quelltext markieren
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:
ausblenden Delphi-Quelltext markieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 161
Erhaltene Danke: 6



BeitragVerfasst: Do 22.12.11 19:59 
Hier ein Lösungsversuch von mir (keine Garantie, dass es fehlerfrei ist! ;-) )
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//Zeit jeweils in Minuten
//Bsp.: Arbeitsbeginn = 8:15 Uhr => Arbeitsbeginn:=8*60+15;
//Das Ergebnis ist die effektive Pausenzeit und muss von der Arbeitszeit abgezogen werden
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home