SAP OData Service implementieren (Teil 2/4)
Unser Video-Kurs „ODATA Services im SAP UI5 Umfeld“
Für Besucher von Mission Mobile können wir unseren Kurs „ODATA Services im SAP UI5 Umfeld“ mit kräftigem Rabatt anbieten:
Kurs: “ODATA Services im SAP UI5 Umfeld
PS: Wir haben den Rabatt nur für 20 Käufe erhalten. Falls Sie den Link klicken und keine Vergünstigung mehr angezeigt werden, ist unser Kontingent bereits aufgebraucht.
OData Service mit Business Logik füllen
Falls Sie den ersten Teil des Tutorials noch nicht durchgearbeitet haben, bitte ich Sie dies als erstes nachzuholen.
Dieses HowTo ist der zweite Teil einer Reihe von Blogbeiträgen zum Thema OData. Hier alle Themen der Blogbeiträge in der Übersicht:
- OData Service definieren
- OData Service implementieren
- OData: Filter und Navigation implementieren
- OData: Entitäten erstellen
SAP OData
Das Lesen von Tutorials führt Sie nicht zum Ziel? Dann ist unsere Demo genau das Richtige für Sie. Gerne können wir auch in einer kostenlosen Websession Ihre Herausforderungen und Möglichkeiten besprechen.
Rückblick
In vorherigen Tutorial haben Sie gelernt, wie man einen OData Service definieren und auf dem SAP Gateway registrieren kann. Es wurden allerdings noch keine Daten angezeigt. Das ist offensichtlich, denn das SAP-System weiß bisher ja auch gar nicht, was für Daten geliefert werden sollen. Im nächsten Schritt werde ich Ihnen erklären, an welcher Stelle die Business Logik hinterlegt werden muss, damit der OData Service auch Daten überträgt.
Die Data-Provider Klasse erweitern
Am Ende des letzten Tutorials haben Sie die Laufzeitartefakte angelegt. Diese Klassen werden vom SAP-System aufgerufen, wenn der OData Service angefragt wird. Sie können sich im SAP NetWeaver Gateway Service Builder (SEGW) alle Laufzeitobjekte anzeigen lassen.
-
- Öffnen Sie die Transaktion SEGW
- Öffnen Sie Ihr Projekt und dort die Laufzeitobjekte
- Sie sehen dort auch die Data-Provider Erweiterungsklasse
- Ein Doppelklick auf Ihren Namen führt Sie zur Methodenliste dieser Klasse
Die Erweiterungsklasse erbt Ihre Methoden von der Data-Provider-Basisklasse. Diese werden in den nächsten Schritten dann von Ihnen redefiniert. Der Grund hierfür ist, dass Ihre Anpassungen bei einer erneuten Generierung der Basisklasse verloren gehen würden. Änderungen in den Erweiterungsklassen bleiben jedoch erhalten. Scrollen Sie bitte an das Ende der Methodenliste. Sie sehen nun die folgenden Methoden:
Diese Methoden werden vom SAP-System aufgerufen, wenn eine OData-Anfrage gestellt wird. Im Folgenden erkläre ich kurz die Bedeutung jeder Methode:
X_CREATE_ENTITY: Erstellen einer Entität vom Typ X (zB. Equipment)
X_DELETE_ENTITY: Löschen einer gegebenen Entität vom Typ X
X_GET_ENTITY: Anfrage nach einer einzelnen Entität (zB. anhand der ID) vom Typ X
X_GET_ENTITYSET: Anfrage nach einer Collection vom Typ X
X_UPDATE_ENTITY: Aktualisieren einer gegebenen Entität vom Typ X
Vorbereitung der Tabellen
Damit unser Service auch Daten liefern kann, muss es auch welche im System geben. Um dieses Tutorial zu vereinfachen, erstellen Sie bitte zwei Datenbanktabellen für jede Entität. Diese könnten beispielsweise ZHH_EQUI für Equipments und ZHH_QMEL für ServiceNotifications heißen. Diese Namen sind an die Tabellennamen angelehnt, welche im SAP System für die entsprechenden Objekte verwendet werden. Die Attribute für jede Entität entnehmen Sie bitte dem ersten Teil des Tutorials. Achtung: Sie können hier nicht die gleichen Datentypen verwenden wie in der Definition vom OData Service. Verwenden Sie bitte Datentypen aus dem ABAP Dictionary, welche zu den jeweiligen Attributen passen. Sie können sich natürlich auch an meiner Beispiellösung orientieren:
Tabelle ZHH_EQUI
Tabelle ZHH_QMEL
Anmerkung: Wenn Sie dieses Tutorial durchgearbeitet haben, dann können Sie ja versuchen, die SAP Tabellen und BAPIs zur Implementierung Ihres OData Service zu benutzen.
Beispieldaten pflegen
Füllen Sie Ihre Tabellen bitte mit Beispieldaten. Achten Sie dabei darauf, dass die Kundennummer von Equipment und zugehöriger Servicemeldung identisch sein sollte. Sie können die Daten zum Beispiel über die SE16N einpflegen. Meine Beispieldaten finden Sie hier:
Tabelle ZHH_EQUI
Tabelle ZHH_QMEL
Alle Entitäten zurückgeben
Jetzt befinden sich genügend Daten im Backend, dass Ihr OData Service genutzt werden kann. Damit die Daten auch ausgegeben werden, müssen die Methoden GET_ENTITY und GET_ENTITYSET in der Data-Provider Erweiterungsklasse redefiniert werden. Navigieren Sie nun in die Erweiterungsklasse der EquipmentCollection und markieren Sie die Methode EQUIPMENTCOLLECT_GET_ENTITYSET und klicken Sie auf (Redefinieren). Sie können die Methode nun mit diesem Code füllen:
DATA: lt_equi TYPE TABLE OF zhh_equi,
ls_equi TYPE zhh_equi,
ls_entity TYPE zcl_zuif_test_mpc=>ts_equipment.SELECT * FROM zhh_equi INTO TABLE lt_equi.
LOOP AT lt_equi INTO ls_equi.
ls_entity–equipmentid = ls_equi–id.
ls_entity–customerid = ls_equi–customerid.
ls_entity–desription = ls_equi–description.
ls_entity–endofwarranty = ls_equi–endofwarranty.
ls_entity–serialnumber = ls_equi–serialnumber.INSERT ls_entity INTO TABLE et_entityset.
ENDLOOP.
ET_ENTITYSET ist der Export-Parameter der Methode und enthält die Menge der Entitäten. Bisher werden einfach nur alle Einträge der Tabelle ZHH_EQUI ausgelesen und zur Rückgabetabelle hinzugefügt. In der Loop-Schleife können Typkonvertierungen durchgeführt werden. In diesem Beispielfall sollte aber alles ohne Probleme klappen. Wenn Sie Ihre Methode gesichert und aktiviert haben, können Sie nun erneut Ihren OData Service im Browser aufrufen. Wie das geht, wurde im ersten Teil des Tutorials erklärt. Sie sollten folgende Ausgabe erhalten, wenn Sie auf EquipmentCollection klicken (denken Sie an den URL-Zusatz ?sap-ds-debug=true):
Ihr OData Service liefert Ihnen nun also die gesamte Menge aller Equipments zurück. Redefinieren Sie nun analog die Methode SERVICENOTIFICAT_GET_ENTITYSET und überprüfen Sie die Funktionalität im Browser.
Eine Entität zurückgeben
Als nächsten werden Sie eine einzelne Entität zurückgeben. Wenn Sie in der Ausgabe im Browser auf den Link zu einer Entität klicken, dann bekommen Sie die Meldung, dass die Methode EQUIPMENTCOLLECT_GET_ENTITY in der Datenanbieterklasse nicht implementiert ist. Dies muss nun für beide Entitäten nachgeholt werden. Redefinieren Sie bitte die entsprechenden Methoden. Hier finden Sie den Beispielcode für die Equipment Entität:
DATA: ls_key_tab TYPE /iwbep/s_mgw_name_value_pair,
lv_equipmentid TYPE string,
ls_equi TYPE zhh_equi.LOOP AT it_key_tab INTO ls_key_tab.
IF ls_key_tab–name = ‘EquipmentID‘.
lv_equipmentid = ls_key_tab–value.
ENDIF.
ENDLOOP.SELECT SINGLE * FROM zhh_equi INTO ls_equi WHERE id = lv_equipmentid.
er_entity–customerid = ls_equi–customerid.
er_entity–desription = ls_equi–description.
er_entity–endofwarranty = ls_equi–endofwarranty.
er_entity–equipmentid = ls_equi–id.
er_entity–serialnumber = ls_equi–serialnumber.
Ein Parameter der GET_ENTITY Methode ist die interne Tabelle LT_KEY_TAB. Sie enthält die Schlüsselwerte, welche die Entität eindeutig identifizieren. In diesem Fall enthält der Primärschlüssel lediglich die ID des Equipments. Nachdem die ID ausgelesen wurde, wird die entsprechende Zeile aus der Datenbank geladen und dem Exportparameter zugewiesen.
Wenn Sie die beiden GET_ENTITY Methoden redefiniert haben, können Sie im Browser auf eine Entität klicken und erhalten folgendes Ergebnis:
Ausblick
Ihr OData Service liefert nun erfolgreich einzelne Entitäten und die gesamte Menge aller Entitäten zurück. Im dritten Teil dieser Serie werde ich ihnen erklären, wie die Entitätsmenge nun gefiltert werden kann. Möglicherweise interessieren Sie sich nur für die Equipments von einem bestimmten Kunden? Oder für die Servicemeldungen zu einem bestimmten Equipment? Darüberhinaus werden Sie die Navigation von einem Equipment zu den passenden Servicemeldungen implementieren. Auch zu diesem Beitrag freue ich mich über Feedback und Anregungen.
2 Kommentare zu "SAP OData Service implementieren (Teil 2/4)"
Leider funktioniert bei mir die GET_ENTITYSET-Methode nicht, da die Felder in der LOOP unbekannt sind
Das Problem trat bei mir auch auf. Beim Kopieren des Quellcodes erkennt SAP jedes “-” Zeichen nicht mehr. Um sicher zu gehen den Quellcode abtippen :o)