Johannes Behrndt
25. März 2021

SAP OData: Navigation und Filter (Teil 3/4)

oData von SAP

Dies ist der dritte Teil meiner OData Einführung. Nachdem Sie diesen Blogbeitrag durchgelesen haben, werden Sie in der Lage sein, gefilterte Entitätsmengen über ihren OData Service anzubieten und über Navigationen von einer Entität zur nächsten zu springen.

Unser Video-Kurs „ODATA Services im SAP UI5 Umfeld“

OData Services im SAPUI5 Umfeld

Limitierte Rabattaktion für unseren Kurs “OData Services im SAPUI5 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.

Gefilterte Entitätsmengen über OData Service anbieten

Falls Sie die ersten beiden Teile des Tutorials noch nicht durchgearbeitet haben, bitte ich Sie dies als erstes nachzuholen.

Dieses HowTo ist der dritte Teil einer Reihe von Blogbeiträgen zum Thema OData:

Tobias Feldherr

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

Am Ende des zweiten Teils dieser Reihe wurden ihnen im Browser die Entitäten und Entitätsmengen der Equipments und Servicemeldungen angezeigt. In unzähligen Anwendungsszenarien ist es aber notwendig eine Menge von Objekten zu filtern und nur die für den Nutzer relevanten Objekte anzuzeigen. Dies soll natürlich auch über ihren OData Service möglich sein. Ein weiterer Nebeneffekt ist, dass keine unnötigen Daten versendet werden. Dies kann die Dauer einer Abfrage und damit die Reaktionszeit einer Anwendung stark verkürzen. Im Folgenden wird in einem kurzen Exkurs erklärt, wie Filter über die OData URL übergeben werden können. Anschließend werden Sie ihre Data Provider Erweiterungsklasse um die entsprechende Funktionalität erweitern.

Achtung: Im folgenden lasse ich den ersten Teil der Service-URL weg, da dieser von System zu System unterschiedlich ist.

OData Filter

Bisher haben Sie sich immer die gesamte Entitätsmenge anzeigen lassen. Zum Beispiel über den Aufruf /EquipmentCollection. Um diese Menge nun zu Filtern können Sie hinter das Fragezeichen einen Filter anhängen. Die Folgende Aufzählung gibt einige Beispiele für Filter:

  • /EquipmentCollection?$filter=CustomerID eq ‘2’
    • Alle Equipments des Kunden mit der Kundennummer 2
  • /EquipmentCollection?$filter=CustomerID gt ‘2’
    • Alle Equipments von Kunden mit einer Kundennummer größer als 2
  • /EquipmentCollection?$filter=CustomerID gt ‘2’ and EquipmentID lt ’10’
    • Alle Equipments mit einer EquipmentID kleiner als 10 von Kunden mit einer Kundennummer größer als 2

Die obigen Informationen sollten für dieses Tutorial reichen. Falls Sie mehr OData Filter erfahren möchten, finden Sie hier eine ausführliche Dokumentation. Falls Sie die URLs noch nicht mit ihrem Service ausprobiert haben, dann tuen Sie das jetzt. Ihnen wird auffallen, dass trotzdem  immer die komplette Menge ausgegeben wird. Das liegt daran, dass die Filterung noch nicht implementiert wurde.

ODATA Grundlagen

ODATA bildet die Schnittstelle zwischen dem UI5 Frontend und dem SAP Backend. Lesen Sie hier wichtigsten Learnings im Bereich ODATA.

Filter im Backend implementieren

Im SAP System wird, wenn eine gefilterte Entitätsmenge angefordert wird, ebenfalls die ihnen bereits bekannte X_GET_ENTITYSET Methode aufgerufen. Im folgenden muss diese also angepasst werden, damit Sie nicht immer die komplette Menge der Entitäten zurückgibt. Für eine erfolgreiche Implementierung von Filtern müssen Sie einen genaueren Blick auf den Paramter IT_FILTER_SELECT_OPTIONS werfen. Diese Tabelle enthält zwei Komponenten pro Zeile:

  • Property: Der Name der Property, welche gefiltert wird (zB. “CustomerID”)
  • Select-Options: Diese Komponente ist eine Tabelle von Select-Options. Dies bietet den Vorteil, dass Sie in SELECT-Anweisungen oder IF-Abfragen verwendet werden können. Mehr zu Select-Options finden Sie hier.

Versuchen Sie nun mit den obigen Informationen Filter für die EquipmentCollection zu implementieren. Sie sollten mindestens für die Properties “EquipmentID” und “CustomerID” auf die Filterung reagieren. Meinen Beispielcode finden Sie hier:

DATAlt_equi TYPE TABLE OF zhh_equi,
ls_equi TYPE zhh_equi,
ls_entity TYPE zcl_zuif_test_mpc=>ts_equipment,
” Die passenden Typen finden Sie immer  über die Vorwärtsnavigation
ls_filter_select_option TYPE /iwbep/s_mgw_select_option,
lt_equipment_select_options TYPE /iwbep/t_cod_select_options,
lt_customer_select_options TYPE /iwbep/t_cod_select_options.

” Hier wird die Filtertabelle geloopt um einzelne Select-Options zu lesen
LOOP 
AT it_filter_select_options INTO ls_filter_select_option.
CASE ls_filter_select_optionproperty.
WHEN EquipmentID.
lt_equipment_select_options ls_filter_select_optionselect_options.
WHEN CustomerID.
lt_customer_select_options ls_filter_select_optionselect_options.
ENDCASE.
ENDLOOP.

SELECT FROM zhh_equi INTO TABLE lt_equi
” Die Select-Anweisung wird um passende Where-Bedingungen erweitert
WHERE ID IN lt_equipment_select_options
AND customerid IN lt_customer_select_options.

LOOP AT lt_equi INTO ls_equi.
ls_entityequipmentid ls_equiid.
ls_entitycustomerid ls_equicustomerid.
ls_entitydesription ls_equidescription.
ls_entityendofwarranty ls_equiendofwarranty.
ls_entityserialnumber ls_equiserialnumber.

INSERT ls_entity INTO TABLE et_entityset.
ENDLOOP.

An dieser Stelle sollten Sie ihren OData Service so erweitern können, dass Sie die Equipments nach EquipmentID und CustomerID sowie die ServiceNotifications nach ServiceNotificationID, EquipmentID und CustomerID filtern können. Spielen Sie ein bischen mit der URL um ihre Filter zu testen. Versuchen Sie auch Filter zu kombinieren.

Im ersten Teil dieses Tutorials haben Sie im Model eine Navigation vom Equipment zur ServiceNotification angelegt. Der Benutzer soll also von einem Equipment zu allen zugehörigen Servicemeldungen springen können. Das Ergebnis dieser Navigation ist also eine Menge von Servicemeldungen. Daher wird die Methode SERVICENOTIFICAT_GET_ENTITYSET  aufgerufen. Die Navigation findet über die beiden Importparameter IV_SOURCE_NAME und IT_KEY_TAB. Die IT_KEY_TAB kennen sie bereits als Übergabewert für den Primärschlüssel. Nun muss noch geprüft werden, von wo die Entitätsmenge angefragt wurde. Die Quellentität steht im Parameter IV_SOURCE_NAME. Für dieses Tutorial reicht es also völlig aus zu prüfen, ob die Quelle ein Equipment ist und dementsprechend zu reagieren. Im Folgenden finden Sie meinen Beispielquellcode für die Implementierung der Methode.

DATAlt_qmel TYPE TABLE OF zhh_qmel,
ls_qmel TYPE zhh_qmel,
ls_entity TYPE zcl_zuif_test_mpc=>ts_servicenotification,
ls_filter_select_option TYPE /iwbep/s_mgw_select_option,
lt_serv_notif_select_options TYPE /iwbep/t_cod_select_options,
lt_equipment_select_options TYPE /iwbep/t_cod_select_options,
lt_customer_select_options TYPE /iwbep/t_cod_select_options,
ls_key_tab TYPE /iwbep/s_mgw_name_value_pair.

IF iv_source_name ‘Equipment’.
” Navigation von einem Equipment aus
READ TABLE it_key_tab INDEX INTO ls_key_tab.

SELECT FROM zhh_qmel INTO TABLE lt_qmel
WHERE equipmentid ls_key_tabvalue.

ELSE.
” Keine Navigation
LOOP AT it_filter_select_options INTO ls_filter_select_option.
CASE ls_filter_select_optionproperty..
WHEN ‘ServiceNotificationID’.
lt_serv_notif_select_options ls_filter_select_optionselect_options.
WHEN ‘EquipmentID’.
lt_equipment_select_options ls_filter_select_optionselect_options.
WHEN ‘CustomerID’.
lt_customer_select_options ls_filter_select_optionselect_options.
ENDCASE.
ENDLOOP.

SELECT FROM zhh_qmel INTO TABLE lt_qmel
WHERE id IN lt_serv_notif_select_options
AND customerid IN lt_customer_select_options
AND equipmentid IN lt_equipment_select_options.

ENDIF.

LOOP AT lt_qmel INTO ls_qmel.
ls_entityservicenotificationid ls_qmelid.
ls_entityequipmentid ls_qmelequipmentid.
ls_entitycustomerid ls_qmelcustomerid.
ls_entitydescription ls_qmeldescription.
ls_entitybegindate ls_qmelbegindate.
ls_entityenddate ls_qmelenddate.
ls_entitystatus ls_qmelstatus.

INSERT ls_entity INTO TABLE et_entityset.
ENDLOOP.

Sie können die Navigation von einem Equipment nun in ihrem Browser testen. Rufen Sie dafür die komplette Liste der Equipments auf und klicken Sie auf einen Navigationslink wie den unten abgebildeten:

OData Implementierung Navigation Link

OData Implementierung Navigation Link

Sie sollten anschließend zu einer Liste von Servicemeldungen zu dem gewählten Equipment umgeleitet werden.

Zusammenfassung und Ausblick

In diesem Blogbeitrag habe ich ihnen beschrieben, wie sie im Backend Filter und Navigationen für ihren OData Service implementieren können. Im vierten und letzten Beitrag in dieser Reihe werden Sie lernen wie Sie eine Entität erstellen können und wie sie dies auch ohne bestehendes Programm testen können. Ich hoffe, ich konnte ihnen OData Filter und Navigation im SAP System näher bringen und freue mich auf Feedback und Anregungen.

Johannes Behrndt

Johannes Behrndt

Seit über 10 Jahren berate ich große und mittelständische Unternehmen rund um mobile Lösungen, insbesondere im SAP-Umfeld. Ich habe den Überblick über die relevanten SAP-Prozesse und kenne die neuesten Technologien für mobile Lösungen.

Sie haben Fragen? Kontaktieren Sie mich!



Das könnte Sie auch interessieren

In diesem Blogbeitrag möchte ich Ihnen zeigen, wie einfach es möglich ist einen bestehenden OData Service zu exportieren um ihn anschließend anzupassen.

weiterlesen

Willkommen zum zweiten Teil meines OData Tutorials. In diesem Blogbeitrag werde ich Ihnen erklären, wie Sie einen bestehenden OData Service mit Business Logik füllen können. Am Ende dieses HowTo's werden […]

weiterlesen

In diesem Tutorial möchte ich Ihnen zeigen, wie Sie ohne viel Vorwissen einen OData Service auf Ihrem SAP NetWeaver Gateway anbieten können. Anhand eines kleinen Beispiels werde ich alle benötigten Schritte […]

weiterlesen

Schreiben Sie einen Kommentar

Bitte füllen Sie alle mit * gekennzeichneten Felder aus. Ihre E-Mail Adresse wird nicht veröffentlicht.





Kontaktieren Sie uns!
Sophie Weber
Sophie Weber Kundenservice