8.3 Rechnen mit Zeitfeldern 

Durch die Beispiele zum Rechnen mit Datumsfeldern sollten Sie schon ein Gefühl für die eigenartige, aber auch sehr praktische Mischung aus arithmetischen Operationen und String-Operationen bekommen haben, mit denen Sie Datumsfelder bearbeiten können. Auch Zeitfelder sind mit beiden Operationsarten modifizierbar – hierzu schauen wir uns wieder kleine Beispiele an.
[zB] Beispiel 1: Tägliche Arbeitszeit
Der Arbeitsbeginn an einem bestimmten Tag ist festgelegt auf 08:15 Uhr und das Arbeitsende auf 18:00 Uhr. Wie viel Zeit liegt dazwischen?
Die Lösungsschritte könnten folgendermaßen aussehen:
-
Die Felder ARBEITSBEGINN und ARBEITSENDE werden mit dem Datentyp t oder mit einem Verweis auf SY-UZEIT deklariert.
DATA arbeitsbeginn TYPE t.
DATA arbeitsende LIKE sy-uzeit. -
Im Programmablauf weisen Sie den tatsächlichen Arbeitsbeginn dem Zeitfeld ARBEITSBEGINN zu; das Arbeitsende schreiben Sie in das Zeitfeld ARBEITSENDE.
arbeitsbeginn = '081500'.
arbeitsende = '180000'. -
Die Zeitdifferenz zwischen ARBEITSENDE und ARBEITSBEGINN wird in Sekunden ausgedrückt. Das Zielfeld könnte daher durchaus ein Integerfeld vom Typ i sein.
zeitdifferenz_sec = arbeitsende
- arbeitsbeginn. -
Benötigen Sie für die weitere Verarbeitung die Zeitdifferenz in Minuten oder Stunden, dürfte ein Zielfeld vom Typ p mit mindestens zwei Dezimalstellen praktischer sein, da Sie Bruchteile von Stunden und Minuten über Nachkommastellen als Dezimalwert ausdrücken können, wie es bei Industrieminuten üblich ist. Benötigen Sie den Zeitwert in Minuten, schreiben Sie die Anweisung:
zeitdifferenz_min = ( arbeitssende - arbeitsbeginn ) / 60.
Soll die Zeitdifferenz in Stunden und Minuten als Dezimalzahl ausgedrückt werden, lautet die Anweisung:
zeitdifferenz_std =
( arbeitsende - arbeitsbeginn ) / 3600.
Nach diesen Verarbeitungsschritten stehen die Zeitdaten in Feldern vom Typ i bzw. p. Wenn Sie davon ausgehen, dass das Feld ZEITDIFFERENZ_STD vom Typ p ist und mindestens zwei Dezimalstellen hat, können Sie problemlos eine Mittagspause von 45 Minuten einbauen, d. h. 0,75 Stunden, indem Sie dem Feld PAUSE vom Typ p mit zwei Dezimalstellen den Wert 0.75 zuweisen. Anschließend subtrahieren Sie die Pausenzeit von der Zeitdifferenz und erhalten die Arbeitszeit.
pause = '0.75'.
arbeitszeit = zeitdifferenz_std - pause.
[zB] Beispiel 2: Verbleibende Tageszeit
Es soll berechnet werden, wie viel Zeit von der aktuellen Uhrzeit bis Mitternacht verbleibt. Die verbleibende Zeit soll in Stunden, Minuten und Sekunden in jeweils eigenen Feldern berechnet werden.
-
Zunächst müssen Sie die aktuelle Uhrzeit wieder aus der Systemzeit lesen und in das Feld MITTERNACHT die Zeit 24 Uhr eintragen:
aktuelle_uhrzeit = sy-uzeit.
mitternacht = '240000'. -
Anschließend berechnen Sie die Restzeit bis Mitternacht in Sekunden:
restzeit = mitternacht - aktuelle_uhrzeit.
-
Für die Anzahl der vollen Stunden deklarieren Sie das Feld RESTSTUNDEN mit dem Datentyp i und berechnen den Wert für die Stunden mit der Anweisung:
reststunden = ( mitternacht - aktuelle_uhrzeit ) div 3600.
-
Um die verbleibenden Minuten zu bestimmen, verwenden Sie den Rest der ganzzahligen Division, der in Sekunden ausgedrückt wird, und teilen ihn durch 60:
restminuten =
( ( mitternacht - aktuelle_uhrzeit )
mod 3600 ) div 60. -
Um die wiederum übrig bleibenden Sekunden zu bestimmen, berechnen Sie den Rest für die ganzzahlige Division der Zeitdifferenz durch die Minuten:
restsekunden =
( mitternacht - aktuelle_uhrzeit ) mod 60.
Die Ausgabe der drei Felder in einer Liste mit erklärenden Texten könnte folgendermaßen aussehen:
WRITE: / 'Restzeit bis Mitternacht:',
reststunden, 'Stunden,', restminuten,
'Minuten und', restsekunden, 'Sekunden'.
[zB] Beispiel 3: Zeitspanne mit Datumswechsel
Das Ende einer Arbeitsschicht liegt erst in den Morgenstunden des nächsten Tages. Wie viele Stunden, Minuten und Sekunden liegen zwischen der aktuellen Uhrzeit am Nachmittag oder am Abend und dem Schichtende? Auch hier sollen für die Ausgabe Stunden, Minuten und Sekunden in jeweils eigenen Feldern geführt werden.
Es fängt wieder ganz harmlos an: Sie übernehmen die aktuelle Uhrzeit aus der Systemzeit und setzen für das Schichtende die Zeit 05:20:10 Uhr ein. Zugegebenermaßen ist diese Zeit nicht sehr realistisch für das Schichtende, aber damit Sie auch einmal mit »krummen Sekunden« arbeiten, werden alle Schichtarbeiter um Nachsicht gebeten.
aktuelle_uhrzeit = sy-uzeit.
schichtende = '052010'.
Zum nächsten Schritt sind vielleicht einige Vorbemerkungen nützlich. Der Tag hat 86.400 Sekunden. Diese Tatsache ist zwar offensichtlich, aber die Zahl hat verständlicherweise nicht jeder Mensch permanent im Kopf. Darüber hinaus ist der Wert für das Schichtende im Beispiel kleiner als die aktuelle Uhrzeit, was zu negativen Zeiten führen würde. Gehen Sie beispielsweise von einer aktuellen Uhrzeit von 21:00 Uhr aus und davon, dass das Schichtende um 03:00 Uhr morgens wäre, hätten Sie eine Zeitdifferenz von sechs Stunden. Für Menschen leicht zu erkennen, für Computer aber nicht.
Deshalb zerlegen Sie den Prozess in zwei Schritte. Zunächst bilden Sie wie bisher die Differenz zwischen Ende und Beginn:
3 – 21 = –18
Im zweiten Schritt berechnen Sie den Betrag für den Rest von –18 auf 24. Es mag trivial für Sie sein, aber durch diesen Trick erreichen Sie einerseits, dass Sie die richtige Zeitdifferenz auf 24 Stunden erhalten, und andererseits, dass diese Zeitdifferenz positiv ist, wie jeder andere Betrag auch.
| 24 – 18 | = 6
Die dazugehörige ABAP-Anweisung fasst beide Schritte in einem Kommando zusammen und lautet:
restzeit =
( schichtende - aktuelle_uhrzeit )
MOD 86400.
Aus der so ermittelten Restzeit berechnen Sie die vollen Stunden:
reststunden = restzeit DIV 3600.
Aus dem Rest der ganzzahligen Division für die Stunden berechnen Sie wieder die Restminuten:
restminuten = ( restzeit MOD 3600 ) div 60.
Wie im zuvor ausgeführten Beispiel ermitteln Sie aus dem Rest der ganzzahligen »Minutendivision« die Restsekunden:
restsekunden = restzeit MOD 60.
Im letzten Schritt geben Sie die Werte noch in einer Liste aus:
WRITE: / 'Restzeit bis Schichtende:',
reststunden, 'Stunden', restminuten,
'Minuten', restsekunden, 'Sekunden'.
[+] Wichtig für die Praxis
Das Arbeiten mit Datums- und Zeitfeldern wird in der Praxis häufiger benötigt, als Sie denken. Es ist auch nicht auf ein bestimmtes Arbeitsgebiet beschränkt, sondern taucht in allen möglichen SAP-Modulen an den verschiedensten Stellen auf. Daher werden Ihnen die besprochenen Beispiele auch später in der Praxis noch nützliche Dienste erweisen.