[ABAP] OData: $filter implementieren

* für SAPUI5-Elemente muss zugehöriges EntitySet in der SEGW auf "Filterbar" gestellt sein

* Groß-/Kleinschreibung beachten
* Verknüpfungen: "or" und "and" klein geschrieben
* Datumswerte mit VarDate=datetime'yyyy-mm-ddThh:mm:ss' konvertieren
* Umlaute konvertieren

* Filter-Options sind: eq, ne, le, lt, ge, gt, substringof, startswith, endswith

* Abfrage-URL
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst'
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst' and Col2 eq 'Schmidt'
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst'&$format=json

* Methode get_entityset implementieren
METHOD xyz_get_entityset.

* Variante 1 (Tabelle mit Filter-Properties + Options + RANGE)

* Achtung: Filterbedingungen, die mit 'or' verknüpft sind, werden aufgrund eines Fehlers vom MPC
*          nicht korrekt geparst -> get_filter_select_options liefert leere Tabelle
*
* Lösung 1: die or-Teile müssen korrekt in Klammern gesetzt werden
*           https://.../SERVICENAME/DataSet?$filter=(Col1 gt '1000' or Col1 lt '9999') and Col2 eq '10'
* Lösung 2: Filterbedingungen mit 'and' verknüpfen

* Filterkriterien holen
  DATA(it_filter_so) = io_tech_request_context->get_filter( )->get_filter_select_options( ).

  DATA(so_matnr) = VALUE /iwbep/t_cod_select_options( ).

  IF line_exists( it_filter_so[ property = 'MATNR' ] ).
    so_matnr = it_filter_so[ property = 'MATNR' ]-select_options.
  ENDIF.

  SELECT * FROM mara WHERE matnr IN so_matnr.

  ...

* Variante 2 (Tabelle mit Filter-Properties + Options auslesen)
  DATA: lv_matnr TYPE matnr
  DATA(it_filter_so) = io_tech_request_context->get_filter( )->get_filter_select_options( ).
  
  IF NOT it_filter_so IS INITIAL.
    TRY.
        lv_matnr = it_filter_so[ property = 'MATNR' ]-select_options[ 1 ]-low.

        ...
      CATCH cx_root.
    ENDTRY.
  ENDIF.
  
* Variante 3 (Filter-String)
  DATA(lv_filter_string) = io_tech_request_context->get_filter( )->get_filter_string( ).
  
  ...

* Variante 4 (String für WHERE-Clause)
  DATA(lv_osql_where_clause) = io_tech_request_context->get_osql_where_clause( ).

  ...

  SELECT * FROM xy INTO TABLE @it_itab
    WHERE (lv_osql_where_clause).

  ...
  
ENDMETHOD.

Links