[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 -> it_filter_so bleibt leer!
* Lösung: Filterbedingungen mit 'and' verknüpfen

  DATA(it_filter_so) = io_tech_request_context->get_filter( )->get_filter_select_options( ).

  IF line_exists( it_filter_so[ property = 'MATNR' ] ).
* RANGE aus den SelectOptions holen
    DATA(rg_matnr_so) = it_filter_so[ property = 'MATNR' ]-select_options.

    SELECT * FROM mara WHERE matnr IN rg_matnr_so.

    ...

  ENDIF.

* 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.

Weiterführende Infos: Link