peshkova - Fotolia
Wie Sie mit ABAP Datums- und Uhrzeitdatentypen bearbeiten
Dieses Tutorial führt Sie in die SAP ABAP Datums- und Uhrzeitdatentypen ein. Sie lernen, wie Sie mit eingebauten Datentypen Berechnungen ausführen.
Dieses Tutorial führt Sie in die SAP ABAP Datums- und Uhrzeitdatentypen ein. Sie lernen auch mit Built In Data und Time Data Berechnungen durchzuführen.
Online Transaction Processing (OLTP) Systeme, die mit der SAP Business Suite zusammenarbeiten, unterstützen zeitkritische Daten. Deshalb ist es wichtig, dass Sie verstehen, wie man mit den integrierten Datums- und Uhrzeittypen in ABAP arbeitet. In den folgenden Abschnitten stellen wir diese Datentypen vor und zeigen Ihnen, wie man sie benutzt, um Berechnungen und Konvertierungen auszuführen.
ABAP stellt zwei eingebaute Datentypen bereit für die Arbeit mit Datum und Uhrzeit: Der D (Date) Datentyp und der T (Time) Datentyp. Beide Typen haben eine feste Zeichenlänge der Form YYYYMMDD und HHMMSS. Zusätzlich zu diesen eingebauten Typen werden in vielen Standard-Anwendungstabellen immer häufiger die Dictionary-Typen TIMESTAMP und TIMESTAMPL verwendet, um einen Zeitstempel im UTC Format abzuspeichern. Tabelle 1 zeigt die grundlegenden Datums- und Uhrzeit-Typen in ABAP.
Der Begriff „UTC“ ist eine Abkürzung für „Coordinated Universal Time“, also „koordinierte Weltzeit“. Dies ist ein Zeitstandard, der auf der Internationalen Atomzeit basiert. UTC entspricht in etwa dem Greenwich Mean Time-Standard (oder GMT), der sich auf die mittlere Sonnenzeit am Royal Observatory in Greenwich, London bezieht. Zusammengenommen legen diese Standards einen globalen Zeitstandard fest, der verwendet werden kann, um eine bestimmte Zeit in die lokale Zeit zu konvertieren und umgekehrt.
Datentyp |
Beschreibung |
D | Ein eingebauter Datumstyp mit fester Länge in der Form YYYYMMDD. Beispielsweise steht der Wert 20100913 für das Datum 13. September 2010. |
T | Ein eingebauter Uhrzeittyp mit fester Länge in der Form HHMMSS. Beispielsweise steht der Wert 102305 für die Zeit 10:23:05 Uhr. |
TIMESTAMP (Typ P – Länge 8, keine Nachkommastellen) | Kann verwendet werden für kurze Zeitstempel der Form YYYYMMDDhhmmss. Beispielsweise steht der Wert 20100913102305 für das Datum 13. September 2010, 10:23:05 Uhr. |
TIMESTAMPL (Typ P – Länge 11, 7 Dezimalstellen) | Kann verwendet werden für lange Zeitstempel der Form YYYYMMDDhhmmssmmmuuun. Die zusätzlichen Ziffern mmmuuun stellen Sekundenbruchteile dar. |
Tabelle 1: ABAP Datums- und Uhrzeit-Datentypen
Datums- und Zeitberechnungen
Wer mit dem Datum arbeitet, muss häufig verschiedene Berechnungen ausführen, etwa um die Differenz zwischen zwei Datumsangaben zu kalkulieren, Vergleiche zu erstellen, oder einen gültigen Datumsbereich festzulegen. Wie wir in Abschnitt „ABAP Datums- und Zeittypen verstehen“ erwähnt haben, sind die eingebauten Datums- und Uhrzeittypen in ABAP vom Typ Charakter, also nicht numerischer Natur.
Dennoch erlaubt Ihnen die ABAP-Laufzeitumgebung mit diesem Datentyp grundlegende numerische Operationen auszuführen. Dazu wandelt ABAP diese Typen in numerische Typen um.
Der Programmausdruck „Datumsberechnungen in ABAP ausführen“ zeigt, wie diese Berechnungen funktionieren. Zu Beginn wird der Variablen lv_date der Wert des aktuellen Systemdatums zugeordnet (zum Beispiel das Systemfeld SY-DATUM). Als nächstes erhöhen wir diesen Datumswert um 30.
Für die Datumsberechnung in ABAP bedeutet dies, dass wir die Komponente „Tag“ des Datumsobjekts um 30 Tage erhöhen. Beachten Sie hierbei, dass die ABAP-Laufzeitumgebung korrekt über den Datumswert hinausrechnet, wenn das Ende eines Monats erreicht ist. Mit anderen Worten: Sie können sich auf das System verlassen, und können sich sicher sein, dass kein ungültiger Datumswert (z.B. 01/43/2011) berechnet wird.
DATA: lv_date TYPE d. lv_date = sy-datum. WRITE: / 'Current Date:',
lv_date MM/DD/YYYY.
lv_date = lv_date + 30. WRITE: / 'Future Date:', lv_date MM/DD/YYYY.
Programmausdruck: Datumsberechnungen in ABAP ausführen
Die Uhrzeitberechnungen basieren auf der Sekundenkomponente des Uhrzeitobjekts. Der Programmausdruck „Uhrzeitberechnungen in ABAP ausführen“ zeigt, wie man mit grundlegender Zeitarithmetik die aktuelle Systemzeit um 90 Sekunden erhöhen kann.
DATA: lv_time TYPE t. lv_time = sy-uzeit. WRITE /(60) lv_time
USING EDIT MASK 'The current time is __:__:__'. lv_time = lv_time + 90. WRITE /(60) lv_time USING
EDIT MASK 'A minute and a half from now it will be __:__:__'.
Programmausdruck: Uhrzeitberechnungen in ABAP ausführen
Neben diesen typischen numerischen Berechnungen haben Sie auch die Möglichkeit, mit Datums-/ Uhrzeitfeldern in normaler, zeichenbasierter Semantik zu arbeiten. Zum Beispiel können Sie die Offset-/Längen Funktionalität verwenden, um Datums- oder Uhrzeitkomponenten zu initialisieren. Folgender Code-Auszug zeigt, wie Sie das Datum 02/13/2003 mit Offset-/Längensemantik an 01/13/2003 anpassen:
DATA: lv_date TYPE d VALUE '20030213'. WRITE: / lv_date MM/DD/YYYY.
lv_date+4(2) = '01'. WRITE: / lv_date MM/DD/YYYY.
Programmausdruck: Mit Zeitstempeln arbeiten
Wenn Sie schon mit einigen der neueren Produktversionen in der SAP Business Suite gearbeitet haben, sind Sie vielleicht schon auf Anwendungen gestoßen, die für die zeitkritische Datenspeicherung TIMESTAMP oder TIMESTAMPL Datentypen verwenden.
Wie Sie in Tabelle 1 sehen können, speichern diese ABAP Dictionary-Typen die Zeitstempel mit einem unterschiedlichem Grad an Genauigkeit. Dies ist insofern interessant, als diese Typen keine eingebauten Datentypen wie D oder T sind. ABAP bietet für diese native Unterstützung in Form von ein paar eingebauten Anweisungen.
Darüber hinaus verfügt SAP auch über eine Systemklasse namens CL_ABAP_TSTMP. Diese kann benutzt werden, um den Umgang mit den Zeitstempeln zu vereinfachen. Wir stellen diese Funktionen in den folgenden Unterabschnitten vor.
Sie können die aktuelle Systemzeit abrufen und diese in einer Zeitstempel Variable mit der GET TIME STAMP-Anweisung speichern. Deren Syntax finden Sie unter „Verwendung der GET TIME STAMP Anweisung“. Die GET TIME STAMP-Anweisung speichert den Zeitstempel in einem kürzeren oder längeren Format – abhängig davon, welche Art des Timestamp-Datenobjekts nach dem Zusatz FIELD verwendet wird. Der Timestamp-Wert wird unter Nutzung des UTC-Standards codiert.
DATA: lv_tstamp_s TYPE timestamp, lv_tstamp_l TYPE timestampl. GET
TIME STAMP FIELD lv_tstamp_s. WRITE: / 'Short Time Stamp:', lv_tstamp_s TIME ZONE sy-zonlo. GET
TIME STAMP FIELD lv_tstamp_l. WRITE: / 'Long Time Stamp: ', lv_tstamp_l TIME ZONE sy-zonlo.
Programmausdruck: Verwendung der GET TIME STAMP Anweisung
Wenn Sie sich das Code-Fragment in Listing 2.6 ansehen, werden Sie bemerken, dass wir den Zeitstempel mit dem Zusatz TIME ZONE in der WRITE-Anweisung anzeigen. Dieser Zusatz formatiert die Ausgabe des Zeitstempels entsprechend den Regeln für die spezifizierte Zeitzone.
In Listing 2.6 haben wir das Systemfeld SY-ZONLO genutzt, um die vom Nutzer präferierte und konfigurierte lokale Zeitzone anzuzeigen. Allerdings könnten wir genauso gut ein Datenobjekt vom Typ TIMEZONE verwenden, oder sogar eine hartcodiertes Symbol wie „CST“.
Konvertieren von Zeitstempeln
Sie können in ABAP einen Zeitstempel mit Hilfe der CONVERT-Anweisung in ein Datums/Uhrzeit-Datenobjekt konvertieren und umgekehrt. Der Programmausdruck „Syntax der CONVERT TIME STAMP Anweisung“ zeigt die Syntax, die verwendet werden muss, um einen Zeitstempel in Datenobjekte vom Typ D und T zu konvertieren.
Der Zusatz TIME ZONE stellt den Wert für das UTC-Datum beziehungsweise die UTC Uhrzeit gemäß einer bestimmten Zeitzone innerhalb des Zeitstempels ein. Zusätzlich kann die optionale DAYLIGHT SAVING TIME verwendet werden, um festzulegen, ob der Wert des Zeitstempels mit der Sommerzeit zusammenfallen soll oder nicht. Ist dies der Fall, hat die lv_dst Variable den Wert "X"; ansonsten ist sie leer.
Diese Funktion kann sehr nützlich sein bei der Differenzierung zwischen Zeitstempelwerten, die in der Übergangszeit zwischen Sommer und Winterzeit liegen.
CONVERT TIME STAMP lv_tstamp TIME ZONE lv_tzone INTO [ DATE lv_date
] [ TIME lv_time ] [DAYLIGHT SAVING TIME lv_dst].
Programmausdruck: Syntax der CONVERT TIME STAMP Anweisung
Der Programmausdruck „Zeitstempel in Datums-/Uhrzeit-Objekte konvertieren“ zeigt, wie die CONVERT TIME STAMP-Anweisung genutzt werden kann, um den aktuellen System-Zeitstempel durch Nutzung der lokalen Zeitzone in Datums-/ Zeit-Datenobjekte zu konvertieren.
TYPE-POOLS: abap. DATA: lv_tstamp TYPE timestamp, lv_date TYPE d, lv_time TYPE t, lv_dst TYPE
abap_bool.
GET TIME STAMP FIELD lv_tstamp. CONVERT TIME STAMP lv_tstamp TIME ZONE sy-zonlo INTO DATE
lv_date TIME lv_time DAYLIGHT SAVING TIME lv_dst.
WRITE: / 'Today's date is: ', lv_date MM/DD/YYYY. WRITE: /(60) lv_time USING EDIT MASK 'The
current time is: __:__:__'.
IF lv_dst EQ abap_true. WRITE: / 'In daylight savings time...'. ELSE. WRITE: / 'Not in daylight
savings time...'. ENDIF.
Programmausdruck: Zeitstempel in Datums-/Uhrzeit-Objekte konvertieren
Um mit einem Datum-/Uhrzeit-Objekt einen Zeitstempel zu erzeugen, können Sie die Syntax-Variante der CONVERT-Anweisung aus dem Programmausdruck „Syntax der CONVERT DATE Anweisung“ verwenden. Die Datums- / Uhrzeitwerte können den Zusatz TIME ZONE nutzen, so dass die entsprechenden Offsets angewendet werden können, während der UTC-Zeitstempel generiert wird.
CONVERT DATE lv_date [TIME lv_time [DAYLIGHT SAVING TIME lv_dst]] INTO TIME STAMP lv_tstamp
TIME
ZONE lv_tzone.
Programmausdruck: Syntax der CONVERT DATE Anweisung
Der Code-Auszug im Programmausdruck „Erstellen eines Zeitstempel aus einem Datums-/Uhrzeit-Objekt“ zeigt, wie die CONVERT DATE-Anweisung genutzt werden kann, um ein Zeitstempel-Objekt aus einem Datums- / Uhrtzeit-Objekt zu erzeugen.
TYPE-POOLS: abap. DATA: lv_tstamp TYPE timestamp, lv_date TYPE d, lv_time TYPE t, lv_dst TYPE
abap_bool.
lv_date = sy-datum. lv_time = sy-uzeit.
CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_tstamp TIME ZONE sy-zonlo.
WRITE: / 'Time Stamp Value:', lv_tstamp TIME ZONE sy-zonlo.
Programmausdruck: Erstellen eines Zeitstempel aus einem Datums-/Uhrzeit-Objekt
CL_ABAP_TSTMP |
+ ADD( ) + SUBTRACT( ) + SUBTRACTSECS( ) + TD_ADD( ) + TD_SUBTRACT( ) + ISDOUBLEINTERVAL( ) + SYSTEMTSTMP_SYST2LOC( ) + SYSTEMTSTMP_LOC2SYST( ) + SYSTEMTSTMP_UTC2SYST( ) +SYSTEMTSTMP_SYST2UTC( ) + TD_NORMALIZE( ) + NORMALIZE( ) |
UML-Klassendiagramm für die Klasse CL_ABAP_TSTMP
Timestamp-Operationen mit der System-Klasse CL_ABAP_TSTMP
Anders als bei den nativen D- und T-Typen verfügt die ABAP-Laufzeitumgebung für die Zeitstempel nicht über integrierte Funktionen, um Berechnungen damit auszuführen (zum Beispiel zu addieren oder zu subtrahieren). Für diesen Zweck bietet SAP stattdessen eine System Klasse namens CL_ABAP_TSTMP.
Abbildung 1 zeigt ein UML-Klassendiagramm, das die in dieser Klasse bereitgestellten öffentlich zugänglichen Methoden zeigt. Wie zu erwarten, gibt es verschiedene Formen der ADD () und SUBTRACT () Methoden, um Zeitstempel Berechnungen durchzuführen. Darüber hinaus kann eine Reihe von Konvertierungsmethoden (z.B. SYSTEMTSTMP_SYST2LOC ()) verwendet werden, um einen Zeitstempel in verschiedene Zeitzonen umzuwandeln.
Mit einer Booleschen Methode namens ISDOUBLEINTERVAL kann man feststellen, ob ein Zeitstempel auf Sommerzeit steht. Zudem kann eine Reihe von Methoden verwendet werden, um einen Zeitstempel zu normieren. Normalisierung bedeutet hier, dass ein ungültiger Zeitwert wie 10:30:60 auf den richtigen Wert 10.31.00 eingestellt wird.
In der Notation von UML-Klassendiagrammen sind Methoden, die unterstrichen sind, als Klassenmethoden definiert. Klassenmethoden können aufgerufen werden, ohne vorher eine Instanz der Klasse zu definieren, wie der im Programmausdruck „Arbeiten mit Zeitstempeln unter Nutzung vonCL_ABAP_TSTMP“ gezeigte Codeauszug belegt. Hier verwenden wir die Klassenmethode ADD (), um 75 Sekunden zur aktuellen Systemzeit hinzuzufügen.
DATA: lv_tstamp TYPE timestamp, lv_date TYPE d, lv_time TYPE t.
GET TIME STAMP FIELD lv_tstamp. WRITE: / 'Time Stamp Value:', lv_tstamp TIME ZONE sy-zonlo.
TRY. CALL METHOD cl_abap_tstmp=>add EXPORTING tstmp = lv_tstamp secs = 75 RECEIVING r_tstmp
= lv_tstamp. CATCH CX_PARAMETER_INVALID_RANGE. CATCH CX_PARAMETER_INVALID_TYPE. ENDTRY.
WRITE: / 'Time Stamp Value:', lv_tstamp TIME ZONE sy-zonlo.
Programmausdruck: Arbeiten mit Zeitstempeln unter Nutzung von CL_ABAP_TSTMP
Die Call-Signaturen von den meisten anderen Methoden in der Klasse CL_ABAP_TSTMP sind ähnlich wie die ADD() Methode, die im Programmausdruck „Arbeiten mit Zeitstempeln unter Nutzung von CL_ABAP_TSTMP“ gezeigt wird. Für weitere Informationen bezüglich der Funktionalität bestimmter Methoden in dieser Klasse verweisen wir Sie auf die Klasse / Methode Dokumentation für diese Klasse im Class Builder (Transaction SE24).
Kalender Operationen
Bisher haben wir uns auf einfache numerische Berechnungen und -Konvertierungen konzentriert. Viele typische Anwendungsfälle in der Wirtschaft erfordern jedoch, dass wir aus einer semantischen Sicht auf die Daten schauen.
Zum Beispiel könnten Sie fragen, ob das Datum 1/13/2010 ein Werktag ist, und ob 4/4/2010 ein Feiertag oder Urlaubstag ist. Die Antworten auf diese Art von Fragen erfordern den Einsatz eines Kalenders. Glücklicherweise bietet SAP mit NetWeaver AS ABAP eine sehr robuste Menge von Kalender-Features aus der Box.
SAP Calendar wird in Client-spezifischer Art innerhalb des SAP Customizing Implementation Guide (Transaktion SPRO) vorgehalten. Je nachdem, wie Ihr System eingerichtet ist, müssen Sie möglicherweise einen projektspezifischen Einführungsleitfaden zu Rate ziehen.
Für die Zwecke dieser Einführung nehmen wir einfachheitshalber an, dass Sie den Standard-SAP-Reference Implementation Guide (IMG; Einführungsleitfaden) nutzen. Auf dieses Handbuch können Sie zugreifen, indem Sie auf dem Eingangsschirm der Transaktion SPRO auf die Schaltfläche „SAP Reference IMG“ klicken (siehe Abbildung 1).
In der SAP-Referenz-IMG finden Sie SAP Calendar unter dem Navigationspfad SAP NetWeaver • General Settings • Maintain Calendar (siehe Abbildung 2).
Abbildung 3 zeigt das Hauptmenü der SAP Calendar Transaktion. Von hier aus können Sie Unterobjekte wie Feiertage, den Urlaubskalender oder den Betriebskalender konfigurieren. Standardmäßig wird das SAP-NetWeaver-System vorkonfiguriert mit einigen typischen Einstellungen in diesen Teilbereichen ausgeliefert. Dennoch sind Sie natürlich frei, ihre individuellen Urlaubs- und Ferienzeiten zu erstellen und den Kalender nach Bedarf zu konfigurieren.
Nachdem SAP Calendar passend konfiguriert wurde, können Sie diese Daten verwenden, um verschiedene Arten von Berechnungen auszuführen. Tabelle 2 zeigt einige nützliche funktionale Module, die diese Daten nutzen, um festzustellen, ob ein bestimmter Zeitpunkt ein Werktag oder Feiertag ist und so weiter. Mehr Informationen über diesen Funktionsbausteine erhalten Sie in der Dokumentation, die für jedes Modul im Function Builder (Transaktion SE37) zu finden ist.
Name der Funktion | Beschreibung |
DATE_COMPUTE_DAY | Berechnet den Wochentag für ein bestimmtes Datum. Die Tageswerte werden als 1 (Montag), 2 (Dienstag) angegeben und so weiter. |
DATE_COMPUTE_DAY_ENHANCED | Berechnet den Wochentag wie DATE_ COMPUTE_DAY; gibt den Tages-Wert auch als Text zurück (zum Beispiel Dienstag, etc.). |
DATE_CONVERT_TO_FACTORYDATE | Berechnet den Betriebs-Datumswert für ein bestimmtes Datum. Stellt auch einen Indikator bereit, der bestätigt, ob das angegebene Datum entsprechend des ausgewählten Betriebskalenders ein Werktag ist. |
DATE_GET_WEEK | Bestimmt die Kalenderwoche für das angegebene Datum. Beispielsweise ist das Datum 9/13/2010 die 37. Woche des Jahres 2010. |
FACTORYDATE_CONVERT_TO_DATE | Konvertiert einen betrieblichen Datumswert zurück in ein Datumsobjekt |
HOLIDAY_CHECK_AND_GET_INFO | Test um festzustellen, ob ein bestimmtes Datum ein Feiertag ist, basierend auf dem konfigurierten Feiertagskalender |
WEEK_GET_FIRST_DAY | Berechnet den ersten Tag einer bestimmten Woche |
Tabelle 2: Nützliche Datumsfunktionen der Funktionsgruppe SCAL