ABAP - XCO UUID
Wie generierst du mit den XCO Klassen eindeutige IDs in ABAP? In diesem Artikel erfährst du, wie schnell und einfach das möglich ist.
Inhaltsverzeichnis
Die XCO Klassen sind Hilfsklassen die verschiedene Funktionen des Alltags gebündelt unter einer öffentlichen API zur Verfügung stellen. Weitere Informationen und eine Übersicht über die XCO Bibliotheken findest du auf der Übersichtsseite.
Einleitung
Die Generierung von eindeutigen IDs wird in der Fiori und RAP Welt immer weniger über Nummernkreisobjekte gemacht. Die Datensätze benötigen weiterhin einen Schlüssel, dieser muss aber nicht sprechend sein, da er in vielen Fällen in der UI ausgeblendet wird. Der User soll wissen, wie zum Beispiel der Kunde "xyz" heißt, es ist aber nicht mehr so wichtig, dass er die Kundennummern "0815" hat. In solchen Fällen generiert das RAP Framework bereits Schlüssel automatisch. Doch wie sieht es aus, wenn wir selbst die Schlüssel erzeugen müssen?
Erzeugung
In diesem Abschnitt schauen wir uns die Erzeugung der verschiedenen UUIDs über die Klasse XCO_CP=>UUID an und wie es für alle Typen funktioniert.
Typ X16
Der Standardtyp für UUIDs im ABAP RESTful Programming Model ist mittlerweile SYSUUID_X16. Hierbei handelt es sich um einen 16 stelligen Binary.
" Classic
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_16 = uuid.
" Modern
TRY.
uuid = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error.
ENDTRY.
" XCO
uuid = xco_cp=>uuid( )->value.
In der klassischen Entwicklung wird die GUID oder UUID über einen Funktionsbaustein generiert. Möchtest du das Ganze mit einer Klasse machen, verwendest du die Klasse CL_SYSTEM_UUID, dabei musst du allerdings das Exception Handling durchführen oder mit der Warnung in den ABAP Development Tools leben, wobei das der unsaubere Teil wäre. In der XCO Bibliothek findest du in der Klasse XCO_CP das Objekt für die UUID und kannst direkt auf VALUE zugreifen, um eine aktuelle ID zu erhalten.
Typ C22
Schaust du dir die oben genannte Klasse an, dann wird dir auffallen, dass nur X16 UUIDs unterstützt werden und die Charakterbasierten UUIDs fehlen. Hierfür implementiert der Standard einen Formatter, um die anderen Formate zu erzeugen.
" Classic
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_22 = char_uuid.
" Modern
TRY.
char_uuid = cl_system_uuid=>create_uuid_c22_static( ).
CATCH cx_uuid_error.
ENDTRY.
" XCO
char_uuid = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c22 )->value.
In dem Beispiel oben rufen wir die Methode AS auf und übergeben den entsprechenden Formatter für das gewünschte Format. Als Ergebnis erhalten wir ein String Objekt, bei dem wir über VALUE auf den entsprechenden Inhalt zugreifen können.
Formatter
Aktuell werden die folgenden Formatter für die UUID angeboten. Dabei gibt es dir klassischen Char 22 und 32 IDs, aber auch schon eine lesbarere Form als Char 36.
DATA(uuid_c22) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c22 )->value.
DATA(uuid_c32) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c32 )->value.
DATA(uuid_c36) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c36 )->value.
Führen wir den Code von oben aus, erhalten wir die folge Ausgabe und das entsprechende Format.
Einlesen
Wenn wir das externe Format kennen, können wir auch die ID wieder einlesen, um ein UUID Objekt im System zu erzeugen. Allerdings muss uns dazu das Format bekannt sein. In diesem Beispiel erzeugen wir aus der Char 36 ID ein UUID Objekt über die Methode TO_UUID.
DATA(uuid) = xco_cp_uuid=>format->c36->to_uuid( `BAF0A1E7-5FB0-1EDF-B5E8-89F53894CA3A` ).
Im Debugger können wir uns nun den aktuellen Wert im Objekt anschauen. Damit ist es möglich, die externe ID auch wieder in ein internes Objekt umzuwandeln, um so die ID zu verarbeiten oder in ein neues Format zu bringen.
Vollständiges Beispiel
Hier findest du das vollständige Beispiel der ausführbaren Klasse von oben mit den entsprechenden Implementierungen und Datentypen. Im GitHub Repository findest du alle Beispiele zu den XCO Klassen und im Commit die Änderungen dieses Artikels.
CLASS zcl_bs_demo_xco_uuid DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PRIVATE SECTION.
METHODS operation_for_uuid_x16
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS operation_for_uuid_c22
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS operation_for_uuid_formatter
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS operation_convert_uuid
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.
CLASS zcl_bs_demo_xco_uuid IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
operation_for_uuid_x16( out ).
operation_for_uuid_c22( out ).
operation_for_uuid_formatter( out ).
operation_convert_uuid( out ).
ENDMETHOD.
METHOD operation_for_uuid_x16.
DATA uuid TYPE sysuuid_x16.
" Classic
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_16 = uuid.
" Modern
TRY.
uuid = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error.
ENDTRY.
" XCO
uuid = xco_cp=>uuid( )->value.
ENDMETHOD.
METHOD operation_for_uuid_c22.
DATA char_uuid TYPE c LENGTH 22.
" Classic
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_22 = char_uuid.
" Modern
TRY.
char_uuid = cl_system_uuid=>create_uuid_c22_static( ).
CATCH cx_uuid_error.
ENDTRY.
" XCO
char_uuid = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c22 )->value.
ENDMETHOD.
METHOD operation_for_uuid_formatter.
DATA(uuid_c22) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c22 )->value.
out->write( uuid_c22 ).
DATA(uuid_c32) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c32 )->value.
out->write( uuid_c32 ).
DATA(uuid_c36) = xco_cp=>uuid( )->as( xco_cp_uuid=>format->c36 )->value.
out->write( uuid_c36 ).
ENDMETHOD.
METHOD operation_convert_uuid.
DATA(uuid) = xco_cp_uuid=>format->c36->to_uuid( `BAF0A1E7-5FB0-1EDF-B5E8-89F53894CA3A` ).
out->write( uuid->value ).
ENDMETHOD.
ENDCLASS.
Fazit
Auch im Bereich XCO findest du das Thema UUID und kannst einfach auf neue IDs zugreifen. Dabei bleibt dir aktuell die Ausnahmebehandlung erspart, da keine Ausnahmen nach außen weitergegeben werden und im Notfall zu einem Abbruch der Verarbeitung führen.