SAP OData: Navigation und Filter (Teil 3/4)
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“
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:
- OData Service definieren
- OData Service implementieren
- Filter und Navigation implementieren
- OData Entities erstellen und testen
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.
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:
DATA: lt_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_option–property.
WHEN ‚EquipmentID‚.
lt_equipment_select_options = ls_filter_select_option–select_options.
WHEN ‚CustomerID‚.
lt_customer_select_options = ls_filter_select_option–select_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_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.
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.
Navigation zwischen Entitäten
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.
DATA: lt_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 1 INTO ls_key_tab.SELECT * FROM zhh_qmel INTO TABLE lt_qmel
WHERE equipmentid = ls_key_tab–value.ELSE.
“ Keine Navigation
LOOP AT it_filter_select_options INTO ls_filter_select_option.
CASE ls_filter_select_option–property..
WHEN ‚ServiceNotificationID‘.
lt_serv_notif_select_options = ls_filter_select_option–select_options.
WHEN ‚EquipmentID‘.
lt_equipment_select_options = ls_filter_select_option–select_options.
WHEN ‚CustomerID‘.
lt_customer_select_options = ls_filter_select_option–select_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_entity–servicenotificationid = ls_qmel–id.
ls_entity–equipmentid = ls_qmel–equipmentid.
ls_entity–customerid = ls_qmel–customerid.
ls_entity–description = ls_qmel–description.
ls_entity–begindate = ls_qmel–begindate.
ls_entity–enddate = ls_qmel–enddate.
ls_entity–status = ls_qmel–status.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:
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.
Ein Kommentar zu "SAP OData: Navigation und Filter (Teil 3/4)"
Bis hierhin: Vielen, vielen Dank!
Es hat alles geklappt. Die Insertstatments zum Einfügen eines Satzes in die interne Tabelle führen in der Workbench zu einer Warnung. Stattdessen habe ich appends verwendet, sodass es nun ohne Warnungen klappt.
Das Tutorial ist super als Einstieg und ich denke, dass etliches, was danach kommt Erfahrung bzw. „Lernen durch Schmerzen“ ist.