RAP - Deep Table Action
Ist die Übergabe von Tabellen an Aktionen in RAP aktuell möglich? Dieser Artikel soll einen besseren Einblick in das Thema gewähren.
Inhaltsverzeichnis
Bereits im letzten Jahr hatten wir zum Thema Deep Actions in OData v4 geschrieben und uns eine Umsetzung angeschaut, wie du von außen eine Action mit tiefen Strukturen aufrufen kannst. Über Marian Zeis kam nun die Frage, wie Deep Table Actions umgesetzt werden können.
Einleitung
Bei Deep Actions geht es darum, dass wir eine verschachtelte Struktur an die Aktion übergeben wollen. So können wir zum Beispiel nicht nur einen Beleg übergeben, sondern auch in der gleichen Struktur die Tabelle der verschiedenen Positionen und weiterer Zusatzdaten. Da wir hier mit tiefen Strukturen arbeiten, können wir verschiedene Informationen auf verschiedenen Ebenen mitgeben.
Implementierung
Schauen wir uns dazu eine Implementierung in unserer Anwendung zur komplexen Entität an und was du dabei beachten solltest.
Erweiterung
Dazu erweitern wir unsere API "ZBS_API_RAPC_INVOICE_O4" aus dem oben genannten Blog. Im ersten Schritt benötigen wir eine neue Aktion. Diese ist im Grunde wie die andere Aktion aufgebaut, nur das noch das Schlüsselwort TABLE ergänzt werden muss.
static action CreateMultipleInvoices deep table parameter ZBS_S_RAPCreateInvoice;
Dadurch ändert sich der Parameter von einer Struktur zu einer Tabelle. Damit könnten wir nun direkt eine Tabelle an das Objekt übergeben.
Problem
Allerdings gibt es nun im OData Service einen Fehler, wenn wir versuchen zuzugreifen. Wenn wir das Service Binding aufrufen, erhalten wir allerdings eine Fehlermeldung "Error in entity 'ZBS_C_RAPCINVOICE(CDS)': 'T' is not a valid value of the enumeration type 'TY_ACTION_PARAMETER_DEPTH'.":
Über me.sap.com findest du auch eine entsprechende Frage in der SAP Community zu dem Thema. Dort findest du zwar keine Antwort der SAP, allerdings hatte sich der Entwickler bereits durch das SADL Framework debuggt und die auskommentierte Stelle plus Kommentar gefunden.
Hinweis: Geprüft hatten wir diesen Stand im ABAP Environment, damit scheint im Moment die Deep Table nicht im OData unterstützt zu sein.
EML
Allerdings funktioniert das Beispiel weiterhin mit dem RAP Business Objekt in EML. Dazu können wir entsprechende Daten vorbereiten.
DATA lt_document TYPE tt_document.
INSERT VALUE #( %cid = xco_cp=>uuid( )->value ) INTO TABLE lt_document REFERENCE INTO DATA(lr_new_item).
lr_new_item->%param = VALUE #( Partner = '1000000004'
( Document = 'TEST'
_position = VALUE #( Unit = 'ST'
Currency = 'EUR'
( Material = 'F0001' Quantity = '2' Price = '13.12' )
( Material = 'H0001' Quantity = '1' Price = '28.54' ) ) )
( Document = 'TEST2'
_position = VALUE #( Unit = 'ST'
Currency = 'USD'
( Material = 'G0001' Quantity = '2' Price = '17.12' )
( Material = 'Z0001' Quantity = '1' Price = '29.55' ) ) ) ).
Im Anschluss rufen wir per EML dann unsere Aktion auf und übergeben die beiden Dokumente an das Statement. Im Anschluss können wir die Aktion testen.
MODIFY ENTITIES OF ZBS_R_RAPCInvoice
ENTITY Invoice
EXECUTE CreateMultipleInvoices FROM lt_document
FAILED DATA(ls_failed_deep)
REPORTED DATA(ls_reported_deep).
Setzen wir nun einen Breakpoint in der Aktion und schauen uns die Payload an, erhalten wir unsere gesendeten Daten als Tabelle.
Workaround
Aktuell gibt es einen Workaround für das Problem. Dazu kannst du die Struktur als Dummy verwenden und die Tabelle auf der nächsten Ebene anhängen. In dem Artikel erfährst du mehr zur Verwendung und der Implementierung in eine Fiori App. Über unseren Artikel zum Thema Deep Action kannst du dir das Thema noch einmal im Detail anschauen. Dort erklären wir den Aufruf von außen und die Verwendung als EML.
Eine Verwendung von Tabellen in Fiori Elements Anwendungen (Aktion) ist allerdings weiterhin nicht unterstützt, hier kannst du nur flache Strukturen verwenden.
Komplettes Beispiel
Die Anpassungen und gezeigten Ressourcen findest du auf GitHub im Repository. Die Änderungen wurden über den folgenden Commit durchgeführt.
Fazit
Aktuell kannst du die Funktion der DEEP TABLE PARAMETER nur eingeschränkt im EML Umfeld verwenden und nicht direkt im Service. Der Workaround über die Dummy-Struktur kann allerdings helfen, nicht die komplette Idee über den Haufen zu werfen.
Quelle:
SAP Help - Modeling Parameters for Non-Standard Operations