[OData] Übersicht zu SAP-Options

Option                 | Beschreibung                                             | Link
-----------------------+----------------------------------------------------------+--------------------------------------------------------------------------------------------------------------
?sap-language=DE       | Sprachstrings explizit für Sprache DE aus dem DDIC holen |
?sap-client=123        | Daten für Mandant 123 abfragen                           |
?sap-statistics=true   | Performance-Statistiken im Header mitliefern             | https://blogs.sap.com/2016/01/28/understanding-sap-performance-statistics-for-sap-netweaver-gateway-service/
?sap-ds-debug=true     | Debugmode mit eigenständiger HTML-Seite und Links        | https://blogs.sap.com/2013/07/18/nw-gateway-tips-tricks/
?sap-ds-debug=download | Debug-HTML als Download                                  | https://blogs.sap.com/2013/07/18/nw-gateway-tips-tricks/

[OData] System-Adminstration Frontend / Backend

Schritte

  • SAP Gateway aktivieren (/IWFND/IWF_ACTIVATE): SPRO -> SAP NetWeaver -> SAP Gateway -> OData Channel -> Konfiguration -> SAP Gateway aktivieren oder deaktivieren
  • SAP System Alias einrichten (SM30 + /IWFND/V_DFSYAL): SPRO -> SAP NetWeaver -> SAP Gateway -> OData Channel -> Konfiguration -> Verbindungseinstellungen -> SAP Gateway zu SAP-System -> SAP-Systemalias verwalten
  • SAP Gateway Einstellungen (SM30 + /IWBEP/C_SYSTEM): SPRO -> SAP NetWeaver -> Aktivierung SAP-Gateway-Service -> Backend OData Channel -> Verbindungsweinstellungen zu SAP Gateway -> SAP-Gateway-Einstellungen
  • Entwicklungspaket anlegen: Transportauftrag
  • bei mehreren Systemen: RFC-Verbindungen pflegen (SM59, SMT1)
  • Einrichtung Systemalias zu Service (/IWFND/MAINT_SERVICE): Transportauftrag
  • Frontend-Service aktivieren (SICF): /sap/bc/ui5_ui5/sap/ -> entsprechenden Service aktivieren
  • Backend-Service aktivieren (SICF): /sap/opu/odata/sap/ oder /sap/bc/bsp/sap/ -> entsprechenden Service aktivieren
  • Berechtigungen für Services einrichten (PFCG)
  • Frontend (Eclipse): Transportauftrag
  • Backend (SEGW, SE80): Transportauftrag

Weiterführende Infos: Quick Starter Configuration Guide – SAP Gateway

[ABAP] OData: $top und $skip – Pagingfunktionen implementieren

* https://blogs.sap.com/2017/12/06/display-countfilterorderbyinlinecounttop-and-skip-operations-using-odata-services/
* für SAPUI5-Elemente muss zugehöriges EntitySet in der SEGW auf "Paginierbar" gestellt sein

METHOD xyz_get_entityset.

  ...

* $top und $skip auslesen
    DATA(lv_top) = io_tech_request_context->get_top( ).
    DATA(lv_skip) = io_tech_request_context->get_skip( ).
    DATA(lv_maxrows) = 0.

* lv_maxrows setzen
    IF lv_top > 0.
      lv_maxrows = lv_top + lv_skip.
    ENDIF.

* Daten holen
    SELECT * FROM abc INTO TABLE @et_entityset UP TO @lv_maxrows ROWS.

* überflüssige Daten löschen
    IF NOT lv_skip IS INITIAL.
      DELETE et_entityset TO lv_skip.
    ENDIF.

  ...

ENDMETHOD.

[ABAP] OData: $orderby implementieren

Variante 1

* https://blogs.sap.com/2013/09/03/sap-gw-implement-a-better-orderby-for-cust-ext-class/
* http://www.techippo.com/2016/08/sorting-query-options-orderby-sap-odata-service.html
* http://www.saplearners.com/orderby-query-option-in-sap-netweaver-gateway/
* https://blogs.sap.com/2017/12/06/display-countfilterorderbyinlinecounttop-and-skip-operations-using-odata-services/

METHOD xyz_get_entityset.

  ...

  DATA(it_orderby) = io_tech_request_context->get_orderby( ).

  IF line_exists( it_orderby[ property = 'MATNR' ] ).
    DATA(lv_orderby) = it_orderby[ property = 'MATNR' ].

    CASE lv_orderby-order.
      WHEN 'asc'.
        SORT: et_entityset BY name ASCENDING.
      WHEN 'desc'.
        SORT: et_entityset BY name DESCENDING.
    ENDCASE.
  ENDIF.

  ...

ENDMETHOD.

Variante 2

METHOD xyz_get_entityset.

  ...

  DATA(it_orderby) = io_tech_request_context->get_orderby( ).

  READ TABLE it_orderby INTO DATA(ls_orderby) INDEX 1.
  IF sy-subrc = 0.
* generische Order-Property verwenden, wenn z.B. nur ein Sortierkriterium vorhanden
* (z.B. beim Anklicken von Tabellenfeldern)
    CASE ls_orderby-order.
      WHEN 'asc'.
        SORT: et_entityset BY (ls_orderby-property) ASCENDING.
      WHEN 'desc'.
        SORT: et_entityset BY (ls_orderby-property) DESCENDING.
    ENDCASE.
  ENDIF.

  ...

ENDMETHOD.

[ABAP] OData: $inlinecount implementieren

* https://blogs.sap.com/2017/12/06/display-countfilterorderbyinlinecounttop-and-skip-operations-using-odata-services/
* $inlinecount=allpages
* $inlinecount=none

METHOD xyz_get_entityset.
  
  ...

  IF abap_true = io_tech_request_context->has_inlinecount( ).
    es_response_context-inlinecount = lines( et_entityset ).
  ELSE.
    CLEAR: es_response_context-inlinecount.
  ENDIF.

ENDMETHOD.

[ABAP] OData: DELETE – Datensatz für eine Entität löschen

* URL
URL/SERVICENAME/ItemSet(Key1='...',Key2='...')
* METHODE: DELETE
* HTTP-Request: <leer->
* HTTP-Response: 204 / Deleted / Empty Response

METHOD xyz_delete_entity
  DATA: lv_entry_data TYPE zcl_xyz_mpc=>ts_pos.

* HTTP-Daten holen
  io_data_provider->read_entry_data( IMPORTING es_data = lv_entry_data ).

* Wenn Keywerte gefüllt
  IF NOT lv_entry_data-col1 IS INITIAL.

* Daten löschen
    DELETE FROM abc WHERE col1 = lv_entry_data-col1.

    IF sy-subrc <> 0.
* Exceptionhandling
      ...
    ENDIF.
  ENDIF.
ENDMETHOD.

[ABAP] OData: CREATE – Neuen Datensatz für eine Entität erzeugen

* URL
URL/SERVICENAME/ItemSet
* METHODE: POST
* HTTP-Request: Entität mit den Keyfeldern
* HTTP-Response: 201 / Created / Erzeugte Entität bei Erfolg
METHOD xyz_create_entity
  DATA: lv_entry_data TYPE zcl_xyz_mpc=>ts_pos.

* HTTP-Daten holen
  io_data_provider->read_entry_data( IMPORTING es_data = lv_entry_data ).

* Daten aufbereiten
  ...

* Datensatz anlegen
  INSERT INTO abc VALUES ...

  IF sy-subrc = 0.
* Rückgabemenge für erzeugten Datensatz aufbereiten
    er_entity ...
  ELSE.
* Exceptionhandling
    ...
  ENDIF.
ENDMETHOD.

[OData] Übersicht zu OData-Abfrageoptionen (Query-Optionen)

Option       | manuell implementieren
-------------+-----------------------
$count       | nein
$expand      | nein
$filter      | ja
$format      | nein
$inlinecount | ja
$link        | nein
$orderby     | ja
$select      | nein
$skip        | ja
$skiptoken   | ja
$top         | ja
$value       | nein

Links