
ABAP Cloud - Datum aufbereiten
Wie kannst du eigentlich ein Datum in ABAP Cloud in das passende Ausgabeformat bekommen? Schauen wir uns dazu ein Beispiel im System an.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns verschiedene Varianten an, wie du ein Datum für die Ausgabe vorbereiten kannst, welche Möglichkeiten es gibt und wie du sie nutzen kannst.
Einleitung
Normalerweise übernimmt die Datumsaufbereitung das System für dich, wenn zum Beispiel ein Datum im Fiori UI angezeigt wird. Abhängig von der eingestellten Sprache und den weiteren Einstellungen des Users, kann das Datum entsprechend flexibel angezeigt und aufbereitet werden. Dies wird als externes Format bezeichnet.
Schauen wir uns ein Datum im ABAP Format an, also zur Laufzeit im System, dann folgt das Datum immer der gleichen Regel, um von dort in das externe Format konvertiert werden zu können. Solche Aufbereitungen brauchen wir zum Beispiel beim Druck oder Mailversand.
String Template
String Templates gibt es bereits seit einer ganzen Weile und damit kannst du ganz einfach verschiedene Texte zusammenfügen, diese aber auch entsprechend Formatieren. Wollen wir zum Beispiel ein Datum im aktuell eingestellten Userformat ausgeben, dann können wir aus dem Bereich DATE das Format für USER wählen. Die Dokumentation für weitere Formate findest du unten im Artikel verlinkt.
output = |{ actual_date DATE = USER }|.
Allerdings bringt uns diese Aufbereitung nicht, wenn wir ein spezifisches Format haben wollen. Zum Beispiel wollen wir das aktuelle Format für Deutschland haben, dann können wir den Zusatz für COUNTRY angeben. Grundsätzlich funktioniert das auch für andere Datentypen, wie Uhrzeit, Zahlen oder Timestamps.
output = |{ actual_date COUNTRY = 'DE ' }|.
Wenn du dir die Ausgabe anschaust, dann ist das Leerzeichen bei DE auch gewollt. Ohne das Leerzeichen gibt der Compiler eine Fehlermeldung aus und weißt uns auf das richtige Format hin.
CL_ABAP_DATFM
Eine Alternative zu den String Templates ist die Klasse CL_ABAP_DATFM, diese ist ebenfalls für ABAP Cloud freigegeben. Diese bietet zahlreiche Hilfsmethoden zur Aufbereitung von Daten zur Laufzeit. Schauen wir uns dazu einmal die öffentlichen Methoden der Klasse an.
Wir haben hier einige Prüfmethoden die mit CHECK beginnen, einige GET Methoden um verschiedene Einstellungen zu lesen und die CONV Methoden, um spezifische Konvertierungen durchzuführen. Im ersten Schritt müssen wir uns das Datumsformat für das Land ermitteln. Dieses wird aus dem Länder Customizing abgeleitet. Dann rufen wir die Konvertierung mit dem Format auf. Bei der Klasse müssen wir allerdings auch das Fehlerhandling übernehmen und die Ausnahme abfangen.
DATA(format_de) = cl_abap_datfm=>get_country_datfm( 'DE' ).
TRY.
cl_abap_datfm=>conv_date_int_to_ext( EXPORTING im_datint = actual_date
im_datfmdes = format_de
IMPORTING ex_datext = output ).
CATCH cx_abap_datfm_format_unknown.
ENDTRY.
Eine ähnliche Methode können wir auch verwenden, wenn wir zum Beispiel das kurze Datum ohne das Jahr haben wollen. In diesem Beispiel erzeugen wir die Ausgabe für die USA.
DATA(format_us) = cl_abap_datfm=>get_country_datfm( 'US' ).
TRY.
cl_abap_datfm=>conv_date_int_to_shortex( EXPORTING im_datint = actual_date
im_datfmdes = format_us
IMPORTING ex_abbrdatext = output ).
CATCH cx_abap_datfm_format_unknown.
ENDTRY.
Schauen wir uns zum Abschluss das Ergebnis in der Konsole an, wo wir die verschiedenen Methoden miteinander vergleichen können. Der Mehrwert der Klasse liegt vor allem in den zahlreichen Möglichkeiten ein Datum darzustellen und auch Aufbereitungen für ein Jahr oder ein kurzes Datum zu erhalten.
Vollständiges Beispiel
Hier findest du das vollständige Beispiel der oben gezeigten Code Snippets in der vollständigen Klasse. Du kannst das Beispiel in dein System kopieren und direkt mit dem Experimentieren starten.
CLASS zcl_bs_demo_date_conversion DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PRIVATE SECTION.
DATA out TYPE REF TO if_oo_adt_classrun_out.
DATA output TYPE string.
METHODS print
IMPORTING !description TYPE string DEFAULT ``.
METHODS use_string_template
IMPORTING actual_date TYPE d.
METHODS use_datfm_class
IMPORTING actual_date TYPE d.
ENDCLASS.
CLASS zcl_bs_demo_date_conversion IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
me->out = out.
DATA(actual_date) = zcl_syst=>create( )->system_date( ).
use_string_template( actual_date ).
use_datfm_class( actual_date ).
ENDMETHOD.
METHOD print.
IF description IS INITIAL.
out->write( output ).
ELSE.
out->write( |{ description }: { output }| ).
ENDIF.
ENDMETHOD.
METHOD use_string_template.
output = |{ actual_date DATE = USER }|.
print( `Format for User` ).
output = |{ actual_date COUNTRY = 'DE ' }|.
print( `Country (DE)` ).
output = |{ actual_date COUNTRY = 'US ' }|.
print( `Country (US)` ).
ENDMETHOD.
METHOD use_datfm_class.
DATA(format_de) = cl_abap_datfm=>get_country_datfm( 'DE' ).
DATA(format_us) = cl_abap_datfm=>get_country_datfm( 'US' ).
TRY.
cl_abap_datfm=>conv_date_int_to_ext( EXPORTING im_datint = actual_date
im_datfmdes = format_de
IMPORTING ex_datext = output ).
print( `DATFM Date (DE)` ).
CATCH cx_abap_datfm_format_unknown.
ENDTRY.
TRY.
cl_abap_datfm=>conv_date_int_to_shortex( EXPORTING im_datint = actual_date
im_datfmdes = format_us
IMPORTING ex_abbrdatext = output ).
print( `DATFM Shortex (US)` ).
CATCH cx_abap_datfm_format_unknown.
ENDTRY.
TRY.
cl_abap_datfm=>conv_date_int_to_shortex( EXPORTING im_datint = actual_date
im_datfmdes = format_de
IMPORTING ex_abbrdatext = output ).
print( `DATFM Shortex (DE)` ).
CATCH cx_abap_datfm_format_unknown.
ENDTRY.
ENDMETHOD.
ENDCLASS.
Fazit
Die Aufbereitung des Datums muss nicht immer schwer sein. SAP stellt in ABAP Cloud verschiedene Alternativen zur Verfügung, die recht einfach zu nutzen sind, um das richtige Zielformat zu erhalten. Damit sparst du dir eventuelle Teilstringzugriffe, um das Datum in das passende Format zu bekommen, vor allem wenn es um länderspezifische Formate geht.
Quelle:
SAP Help - String Template (Format options)
ABAP Cloud - Systemfelder