Willkommen zum fünften und letzten Teil unserer Blogserie über ABAP RAP. In den ersten vier Teilen haben wir verschiedene Programmiermodelle von ABAP besprochen, ABAP RAP kennengelernt, das Szenario in acht Schritte aufgeteilt und diese bis zum fünften Schritt umgesetzt. In diesem Blogbeitrag setzen wir nun alle verbleibenden Schritte um, also Schritt 6 bis 8. Falls Sie unseren vorherigen Blogbeitrag noch nicht gelesen haben, empfehlen wir Ihnen, zunächst diesen durchzugehen, das Szenario zu verstehen und die dort beschriebenen Schritte hier umzusetzen.
In diesem Beitrag besprechen wir die Schritte 6 bis 8, mit denen die Entwicklungen für unser Szenario abgeschlossen werden:
Anlegen eines Pakets zur Ablage der Projektressourcen.
Anlegen von drei Tabellen samt eines Datenelements, das über diese Tabellen hinweg verwendet wird..
Employee Information: zur Speicherung grundlegender Informationen über einen Mitarbeitenden.
Employment Information: zur Speicherung von Beschäftigungsbestandteilen wie Eintrittsdatum und Gehalt.
Position Information: zur Speicherung positionsbezogener Informationen (dient als Value Help / Check Table).
Anlegen eines CDS Interface View, um eine Basissicht ohne umfangreiche Informationen zu erstellen, die von verschiedenen Services genutzt werden kann.
Anlegen eines CDS Projection View, der eine Teilmenge der Elemente des CDS Interface View bereitstellt. Er ist Service-agnostisch.
Anlegen einer Metadata Extension für UI-Elemente sowie Anlegen von Behavior Definition und Projection zur Festlegung der auf dem Service möglichen Aktionen. Beispiel: Create, Update, Delete, Determination usw.
Anlegen der Behavior Implementation, um die Geschäftslogik für Aktionen wie Validation, Action und Determination zu schreiben.
Anlegen der Binding Definition samt Service Binding, um die bereitzustellenden Entitäten und das vom Service verwendete Protokoll festzulegen. Beispiel: OData V2 - UI, OData V2 - WebAPI usw.
Den Service veröffentlichen.
Schritt 6: Anlegen der Behavior Implementation, um die Geschäftslogik für Aktionen wie Validation, Action und Determination zu schreiben.
Nachdem wir das Verhalten des Service in der Behavior Definition festgelegt haben, müssen wir die Geschäftslogik implementieren, damit dieses Verhalten auch wirksam wird. Das geschieht durch das Anlegen der Klasse zbp_i_rap_e2e_aemp, die im vorherigen Teil in der Behavior Definition definiert wurde.
Um die genannte Klasse anzulegen, klicken Sie auf die glühbirnenähnliche Schaltfläche links neben der Anweisung in der Zeile.
Nach dem Anlegen der Klasse erhalten Sie eine Klasse mit Boilerplate-Code, der Klassendefinition und Implementierung für die verschiedenen bereitgestellten Entitäten enthält. Genau hier schreiben wir im Weiteren die Geschäftslogik.
🤔 Wenn Sie genau hinsehen, fällt auf, dass es eine Methode namens get_instance_features gibt. Sie wird generiert und scheint zu keiner Validation, Determination oder Action zu passen. Ist das nicht seltsam?
Die Methode get_instance_features wird für die Dynamic Feature Control einiger Standardoperationen und Actions sowie auf Feldebene erzeugt. Das bedeutet, dass die Operation je nach Feature-Bedingungen ausführbar ist oder eben nicht. Wir implementieren das in unserem Szenario für die Actions Hire Employee und Retire Employee.
Sehen wir uns die Geschäftslogik für die Kindklasse LHC_EMPLOYEE an, die zur Entität Employee gehört.
LHC_EMPLOYEE
Diese Klasse wird speziell für die Entität Employee angelegt. Ihre Aufgabe ist es, das Alter eines Mitarbeitenden zu validieren, Mitarbeitende einzustellen und in den Ruhestand zu versetzen sowie diesen eine ID zuzuweisen.
Verwenden Sie den unten angegebenen Code, aktivieren Sie das Objekt aber noch nicht.
💡 Kurzinfo: Die Entity Manipulation Language kommt zum Einsatz, wenn wir mit Determinations, Validations und Actions arbeiten. Mehr dazu hier.
LHC_EMPLOYEMENT
Ähnlich wie bei der Entität Employee wird diese Klasse speziell für die Entität Employment angelegt. Sie erlaubt uns, die Geschäftslogik zu schreiben, mit der geprüft wird, ob einem Mitarbeitenden eine Position zugewiesen ist, und mit der Mitarbeitenden zusätzliche Informationen zugeordnet werden.
💡 In der Methode checkPositionAssigned lösen wir eine Ausnahmemeldung aus, wenn einem Mitarbeitenden bereits eine Position zugewiesen ist und eine weitere Position zugewiesen werden soll. Dafür legen wir in den kommenden Schritten die nötige Exception-Klasse und Message-Klasse an. Bis dahin sollten wir die Klasse nicht aktivieren.
Nachdem wir nun die Methoden für die gesamte Geschäftslogik implementiert haben, implementieren wir zusätzliche Ressourcen, die zum Auslösen von Fehlermeldungen benötigt werden. Dafür implementieren wir die Klasse ZCM_RAP_E2E und die Message-Klasse ZRAP_E2E_MSG.
Message-Klasse - ZRAP_E2E_MSG
Hier legen wir eine Message-Klasse an, um alle Meldungstexte mit Message-ID zu hinterlegen.
Um eine Message-Klasse anzulegen, klicken Sie mit der rechten Maustaste auf Ihr Paket->New->other ABAP Repository Object->Texts->Message Class.
Geben Sie Name und Beschreibung der Message-Klasse an, weisen Sie einen Transportauftrag zu und wählen Sie Finish.
Nachdem wir die Message-Klasse angelegt haben, fügen wir einige Meldungstexte samt Message-ID hinzu.
Sichern und aktivieren Sie die Message-Klasse.
Klasse für Exceptions - ZCM_RAP_E2E
Die Klasse ZCM_RAP_E2E wird als Exception-Klasse hinzugefügt. Eine Exception-Klasse dient dazu, Unstimmigkeiten zu behandeln, die während der Ausführung eines Programms auftreten.
Um eine Exception-Klasse anzulegen, klicken Sie mit der rechten Maustaste auf Ihr Paket->New->ABAP Class.
Geben Sie Name und Beschreibung an, tragen Sie CX_STATIC_CHECK als Superklasse ein und fügen Sie IF_ABAP_BEHV_MESSAGE als Interface hinzu.
Weisen Sie einen Transportauftrag zu und wählen Sie Finish.
Fügen Sie den unten angegebenen Code hinzu.
📢 Sie möchten tiefer einsteigen? Folgen Sie unserem GitHub Repository
Bis hierhin ist alles gut, aber finden Sie nicht auch 🤔, dass wir vergessen haben, die Position-Check-Tabelle zu füllen, die wir zur Validierung der Position und zum Ergänzen von Informationen wie Positionstext und Gehalt verwenden werden? Holen wir das nach.
Wir legen eine einfache Klasse ZCL_GENERATE_E2E_DATA an, um die Tabelle ZRAP_E2E_APOS zu füllen.
Schritt 7: Anlegen der Binding Definition samt Service Binding, um die bereitzustellenden Entitäten und das vom Service verwendete Protokoll festzulegen. Beispiel: OData V2 - UI, OData V2 - WebAPI usw.
🥁 Trommelwirbel, wir sind fast am Ziel, halten Sie noch kurz durch.
Service Definition
Die Service Definition legt fest, welche Entität bereitgestellt werden soll. Sie ist eine Projektion des Datenmodells und des zugehörigen Verhaltens, das bereitgestellt wird.
Um eine Service Definition anzulegen, klicken Sie mit der rechten Maustaste auf Ihr Paket->New->other ABAP Repository Object->Business Service->Service Definition.
Geben Sie Name und Beschreibung an und wählen Sie über 'Browse' die 'Exposed Entity' aus. Klicken Sie anschließend auf Next→ Finish. Hier wählen wir den Consumption View für den HR Manager aus.
Geben Sie danach den folgenden Code ein. Damit teilen wir dem Compiler mit, welcher View bereitgestellt werden soll. In diesem Fall sprechen wir über die Interface- und Consumption-Views. Das sind die Views, die für das HR-Manager-Szenario benötigt werden.
Auf die gleiche Weise lässt sich auch die Service Definition für den Manager anlegen.
Sobald Sie die Service Definition angelegt haben, müssen Sie sie auch binden. Dafür implementieren wir das Service Binding. Das Service Binding dient dazu, eine Service Definition an ein Client-Server-Kommunikationsprotokoll wie OData zu binden.
Klicken Sie dafür mit der rechten Maustaste auf den Ordner 'Business Services', unter dem Sie gerade die Service Definition angelegt haben, und wählen Sie New>Service Binding.
Geben Sie anschließend Name und Beschreibung für dieses Service Binding an. Als Nächstes wählen Sie den Binding Type und die Service Definition, für die das Service Binding angelegt wird. Wir wählen also 'OData V2 - UI' als Binding Type, und da wir dieses Binding für die Service Definition ZUI_RAP_E2E_AEMP_M anlegen, wählen wir eben diese über die Option 'Browse' aus.
Klicken Sie auf Next, wählen Sie den passenden Transportauftrag und klicken Sie auf Finish. Sie sehen daraufhin einen Bildschirm, der bestätigt, dass das Service Binding angelegt wurde.
Schritt 8: Den Service veröffentlichen
Nun müssen Sie ihn aktivieren und anschließend auf 'Publish local service endpoint' klicken, um ihn zu veröffentlichen. Damit können Sie die Vorschau des OData V2 - UI Service in Form einer Fiori UI sehen.
Nach der Veröffentlichung sehen Sie die zugehörigen Komponenten, und wenn Sie eine Komponente auswählen und auf 'Preview' klicken, gelangen Sie zur UI für dieses Element.
Ebenso müssen Sie ein weiteres Service Binding für den HR-Service anlegen. Falls Sie sich dabei noch unsicher fühlen, können Sie jederzeit unser GitHub Repository dazu besuchen. Hier ist der Link.
Das Endergebnis
Wie Sie wissen, haben wir in unserem Szenario UI-Zugriff, Berechtigungen und Anzeige für HR und HR Manager getrennt hart codiert. Nachfolgend sehen Sie daher die finalen Bildschirmvorschauen für beide!!
HR
HR Manager
Damit sind wir am Ende unserer Blogserie angelangt. Wir haben alle Schritte unserer Lösung für das Einstellungsszenario abgeschlossen. In diesem Blogbeitrag haben wir die letzten drei Schritte umgesetzt: Zuerst haben wir die Behavior Implementation für die Geschäftslogik angelegt, dann die Binding Definition und anschließend die Service Bindings. Im letzten Schritt haben wir schließlich alle angelegten Services veröffentlicht und die Funktionsweise jedes veröffentlichten UI-Service betrachtet.
Wir hoffen, dass Sie ABAP RAP und seine Anwendung nun besser verstehen. Warum also hier aufhören? Gehen Sie hinaus und erstellen Sie weitere solcher Anwendungen mit Funktionen wie Draft Handling, Multi-Inline-Edit und vielem mehr. Folgen Sie dem Link zur SAP Hilfe für weiteres Lernmaterial.
Es ist Zeit, sich zu verabschieden. Es war eine unterhaltsame und spannende Reise. Wir melden uns bald mit weiteren Beiträgen zu anderen Themen zurück. Bis dahin: auf Wiedersehen und viel Freude beim Lernen!