
ABAP - XCO Nachricht und Sprache
Was kannst du zusätzlich mit Nachrichten und den Sprachobjekten der XCO Bibliothek in ABAP Cloud machen? Lass uns der Frage im Detail nachgehen.
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
In diesem Artikel schauen wir uns das Thema Message Handling und die verschiedenen Funktionen in diesem Umfeld an. Zusätzlich schauen wir uns die Sprachen an und wie du sie zusätzlich in der Entwicklung nutzen kannst.
Sprache
Beginnen wir im ersten Kapitel mit der Analyse der Sprache und wofür du sie einsetzen kannst. Wenn du die bisherigen XCO Artikel verfolgt hast, dann haben wir bereits bei den Systemfeldern einen Zugriff auf die aktuelle Sprache gehabt.
Erzeugung
Wollen wir eine spezifische Sprache erzeugen, dann rufen wir die Factory über XCO_CP auf und übergeben die Sprache im SAP Format. Grundsätzlich würden wir uns hier wünschen, dass die Factory etwas flexibler ist und auch Sprachen im ISO Format entgegennehmen könnte.
DATA(language) = xco_cp=>language( 'E' ).
Methoden
Über das Objekt stehen uns dann verschiedene Methoden zur Verfügung. Per VALUE kommen wir wieder an die gesetzte Sprache des Objekts, über die verschiedenen Methoden an weitere Informationen zur Sprache.
Führen wir die Methoden einmal aus und greifen auf die verschiedenen Werte zu. Über VALUE kommen wir an die SAP Sprache heran, wir können uns den Kurztext und Langtext ausgeben lassen und über die AS-Methode und die Klasse XCO_CP_LANGUAGE, kommen wir an den ISO Code der Sprache.
language->value
language->get_long_text_description( )
language->get_name( )
language->as( xco_cp_language=>format->iso_639 )
Schauen wir uns dazu die Ausgabe für Deutsch und Englisch an.
Ein Fun-Fact zum Abschluss: Die beiden Texte werden intern dann auch nur über die Tabelle T002TX gelesen und nicht über einen entsprechenden Core Data Service. Zuvor wir allerdings der ISO über den Funktionsbaustein CONVERT_SAP_LANG_TO_ISO_LANG abgeleitet, der wiederum den klassischen Konvertierungsexit aufruft.
Nachricht
In diesem Kapitel schauen wir uns die Nachrichten an, die wir über die Klasse XCO_CP erzeugen können und was wir dann mit den Meldungen machen können.
Erzeugung
Ähnlich wie bei der Sprache können wir über die Factory ein neues Nachrichtenobjekt erzeugen. Im Gegensatz zu den Systemfeldern, können wir hier alle Informationen übergeben und bekommen unsere Meldung zurück.
DATA(message) = xco_cp=>message( VALUE #( msgid = 'ZBS_DEMO_XCO'
msgno = '001'
msgty = 'W'
msgv1 = 'Message'
msgv2 = 'Placeholder' ) ).
Mit der Nachricht stehen uns nun einige Optionen und Methoden zur Verfügung.
Ausgabe
Über das Attribut VALUE kommen wir an die Struktur mit der Meldung und den einzelnen Feldern. Über GET_TEXT erhalten wir die komplette Nachricht mit allen Platzhaltern befüllt.
message->value
message->get_text( )
Typen
Über die Methode GET_TYPE können wir auf den aktuellen Typen der Nachricht zugreifen. In unserem Beispiel haben wir zum Beispiel eine Warnung, also W, generiert.
DATA(type) = message->get_type( ).
Über VALUE können wir dann auf den einzelnen Wert (W) zugreifen. Haben wir noch eine zweite Meldung, dann können wir mit OCCURS_IN vergleichen, ob der Typ auch in unserer aktuellen Meldung enthalten ist.
DATA(compare) = xco_cp=>message( VALUE #( msgid = 'ZBS_DEMO_XCO'
msgno = '001'
msgty = 'W'
msgv1 = 'Test'
msgv2 = 'Compare' ) ).
type->value
type->occurs_in( compare )
Der Vergleich zweier Meldungen ist nicht ganz so sinnvoll, verwenden wir allerdings die verschiedenen Typen der XCO_CP_MESSAGE Klasse, dann können wir prüfen, ob unsere Meldung eine Warnmeldung oder ein Fehler ist.
xco_cp_message=>type->warning->occurs_in( message )
Ersetzen
Wie können wir Bestandteile einer Meldung verändern? Dazu stehen uns zwei Methoden zur Verfügung. Mit OVERWRITE können wir einzelne Bestandteile der Meldung gezielt überschreiben, hier werden uns alle Felder angeboten. In diesem Beispiel überschreiben wir den Platzhalter 2.
DATA(overwrite) = message->overwrite( iv_msgv2 = 'New' ).
Über die Methode PLACE_STRING kannst du einen Text in die verschiedenen Platzhalter übernehmen. Dazu übergibst du einen String und übergibst die Importing-Parameter die du überschreiben willst. Hier solltest du allerdings beachten, dass ein Platzhalter nur 50 Zeichen hat.
DATA(new_place) = message->place_string( iv_string = `Place me`
iv_msgv2 = abap_true ).
Nachrichten
Beim MESSAGES Objekt handelt es sich um einen einfachen Container, um mehrere Meldungen zu übergeben oder zu speichern. Dazu befüllen wir den Container mit unseren beiden Nachrichten aus dem Beispiel zuvor.
DATA(message_container) = xco_cp=>messages( VALUE #( ( message ) ( compare ) ) ).
Für die Ausgabe und Weiterverarbeitung könnten wir nun über VALUE loopen und die Nachrichten einzeln verarbeiten. Weitere Methoden hat dieses Objekt allerdings nicht.
LOOP AT message_container->value INTO DATA(local_message).
out->write( local_message->get_text( ) ).
ENDLOOP.
Vollständiges Beispiel
Das vollständige Beispiel der beiden Klasse findest du bei uns im GitHub Repository. In diesem Commit findest du die Änderungen aus dem heutigen Artikel und kannst die Schritte bei dir im System nachvollziehen.
Fazit
Die beiden Objekte bieten einige kleine Zusatzfunktionen in Form von Zugriffen auf Stammdaten, einfachere Mappings und Ableitungen. Die Nachrichten kannst du neben dem Befüllen, auch Ändern, und über einen Nachrichtencontainer weitergeben.