
RAP - Länge von Meldungen
Deine Meldung wird bei der Ausgabe mit RAP abgeschnitten? Lass uns das Problem und eine Lösung anschauen.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns einmal die Länge von Meldungen bei der Ausgabe in RAP an und wie diese unsere Möglichkeiten beeinflusst.
Einleitung
Die Ausgabe von Meldungen in RAP Anwendungen ist genauso wichtig, wie bereits zu Report Zeiten. Meldungen geben uns Auskünfte zu Fehlern in der Verarbeitung und während der Prozessierung. Der User weiß, wenn etwas nicht stimmt und kann darauf reagieren. Heute wollen wir unser Custom Pattern um eine Aktion erweitern und schauen uns in diesem Zusammenhang die Ausgabe der Meldungen an.
Vorbereitung
Dazu müssen wir im ersten Schritt in unserem RAP Objekt eine Aktion implementieren, damit wir eine Möglichkeit haben, Nachrichten ans Frontend zu übermitteln.
Verhalten
Im ersten Schritt erweitern wir das Verhalten um eine neue Aktion namens "CreateOutputMessage". Dabei setzen wir auf eine statische Aktion, da wir dies auslösen wollen, ohne einen Datensatz zu markieren.
static action CreateOutputMessage;
Über STRG + 1 können wir die Methode implementieren lassen. Die Funktion legt die Definition und die Implementierung in der Verhaltensimplementierung an.
Sichtbarkeit
Damit die Aktion nun im UI erscheint, müssen wir diese in der Entität in den UI Annotationen ergänzen. Da wir sie im List Report über der Liste sehen wollen, erweitern wir das Listitem.
@UI.lineItem: [{ position: 10, type: #FOR_ACTION, dataAction: 'CreateOutputMessage', label: 'Create message' }]
Nach Aktivierung der Objekte sollte nun die Aktion im List Report verfügbar sein.
Meldungen
Um nun eine Meldung nach dem Auslösen der Aktion an das UI zu geben, steht uns die "reported" Struktur in der Methode zur Verfügung. Wir können über %OTHER eine Vielzahl an Meldungen zurückgeben oder über die entsprechende Entität, in diesem Fall "swc" über das Feld %MSG eine entsprechende Meldung zu einem Schlüssel.
Dabei können wir über die beiden Methoden "NEW_MESSAGE" und "NEW_MESSAGE_WITH_TEXT" Meldungen vom Typ IF_ABAP_BEHV_MESSAGE erzeugen. Die Definition der beiden Methoden findest du durch die Vererbungshierarchie in der Klasse CL_ABAP_BEHV.
- NEW_MESSAGE - Erzeugung einer T100 Nachricht für die Ausgabe
- NEW_MESSAGE_WITH_TEXT - Übernahme eines Textes und Ausgabe einer Meldung
Die beiden Methoden erlauben uns ein einfaches Erzeugen von Meldungen während der Verarbeitung. Grundsätzlich kannst du auch ein eigenes Nachrichtenobjekt definieren, um Meldungen auszugeben.
Erzeugung
In diesem Kapitel erzeugen wir Meldungen und prüfen das Ergebnis der Ausgabe.
NEW_MESSAGE_WITH_TEXT
Erzeugen wir nun im ersten Schritt eine Meldung, bei der wir nur einen Text übergeben, dabei ist der Text relativ lang. In diesem Fall verwenden wir %OTHER, um verschiedene Nachrichten zu übergeben.
INSERT new_message_with_text( text = 'This is a message with the method NEW_MESSAGE_WITH_TEXT!' ) INTO TABLE reported-%other.
Dafür erhalten wir die folgende Ausgabe in der UI. Schauen wir uns die Meldung etwas genauer an, dann wirst du feststellen, dass die Meldung abgeschnitten wurde. Nicht alle Bestandteile der Meldung wurden ausgegeben.
Prüfen wir nun die Erzeugung der Meldung in der Klasse CL_ABAP_BEHV, dann werden wir den folgenden Quellcode finden. Dabei wir unser Text an eine Message Variable übergeben. Wenn du die Zeichen der Ausgabe prüfst, wirst du feststellen, dass die Meldung nach 50 Zeichen abgeschnitten wurde, was einer Länge einer Messagevariable entspricht.
obj = new_message(
id = 'SABP_BEHV'
number = 100
severity = severity
v1 = text
).
Damit können wir aktuell nur Meldungen mit einer maximalen Länge von 50 Zeichen erzeugen, ohne das Informationen abgeschnitten werden.
NEW_MESSAGE
Im nächsten Beispiel erzeugen wir eine Meldung mit der zweiten Methode. Dazu legen wir eine neue Nachricht in unserer Nachrichtenklasse ZBS_DEMO_RAP_PATTERN an und ergänzen die Nachricht um einen Platzhalter.
INSERT new_message( id = 'ZBS_DEMO_RAP_PATTERN'
number = '009'
severity = if_abap_behv_message=>severity-error
v1 = 'NEW_MESSAGE' )
INTO TABLE reported-%other.
Die Ausgabe übernimmt nun wieder die komplette Meldung plus dem Platzhalter und es gehen keine Informationen in der Ausgabe verloren. Grundsätzlich stehen uns vier Mal die 50 Zeichen zur Verfügung plus ein kleiner Teil an Meldung. Die Begrenzung von 220 Zeichen solltest du allerdings weiterhin nicht übersteigen.
Maximum
Das Maximum von 220 Zeichen kannst du relativ leicht prüfen. Dazu legen wir uns eine neue Meldung mit 4 Platzhaltern an und befüllen den Text der Meldung auf ein Maximum, hier sind insgesamt 74 Zeichen möglich. Dann erzeugen wir eine Meldung und übergeben jeweils Platzhalter mit 50 Zeichen.
DATA(placeholder) = '01234567890123456789012345678901234567890123456789'.
INSERT new_message( id = 'ZBS_DEMO_RAP_PATTERN'
number = '010'
severity = if_abap_behv_message=>severity-error
v1 = placeholder
v2 = placeholder
v3 = placeholder
v4 = placeholder )
INTO TABLE reported-%other.
Das Ergebnis können wir dann im Popup nachvollziehen und die Zeichenkette zählen lassen.
Vollständiges Beispiel
Die gesamte Anwendung findest du bei uns in GitHub bei den restlichen Beispielen aus dem RAP Bereich. Über den Commit kannst du alle Änderungen am Repository nachvollziehen.
Fazit
Für die Erzeugung von Nachrichten solltest du aktuell auf die Methode NEW_MESSAGE_WITH_TEXT verzichten, da damit Informationen verloren gehen. Nutze stattdessen normale T100 Meldungen mit NEW_MESSAGE oder eine eigene Implementierung der Klasse, um Meldungen an den Anwender zu übergeben.