[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/

[ABAP] Open SQL: WHERE-Bedingung mit Hilfe einer internen Tabelle (RANGE, STANDARD TABLE)

Variante 1 (RANGE)

* Range für MATNR definieren
TYPES: ty_rg_matnr TYPE RANGE OF matnr.

* MATNR für Suche
DATA(lv_matnr) = |12345|.

* RANGE für die Suche definieren
DATA(it_matnr) = VALUE ty_rg_matnr( ( sign   = 'I'
                                      option = 'EQ'
                                      low    = |{ lv_matnr WIDTH = 18 ALPHA = IN }|
                                      high   = '' ) ).

DATA: it_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

SELECT * FROM mara INTO TABLE @it_mara WHERE matnr IN @it_matnr.

IF sy-subrc = 0.
  LOOP AT it_mara ASSIGNING FIELD-SYMBOL(<mat>).
    WRITE: / <mat>-matnr.
  ENDLOOP.
ELSE.
  WRITE: / 'Keine Daten vorhanden.'.
ENDIF.

Variante 2 (STANDARD TABLE)

* Zeilentyp für RANGE (STANDARD TABLE) für MATNR
TYPES: BEGIN OF ty_range,
         sign   TYPE ddsign,
         option TYPE ddoption,
         low    TYPE char18, " char18 für 18-stellige MATNR
         high   TYPE char18, " char18 für 18-stellige MATNR
       END OF ty_range.

* Tabellentyp für RANGE (STANDARD TABLE) für MATNR
TYPES: ty_rg_matnr TYPE STANDARD TABLE OF ty_range WITH DEFAULT KEY.

* MATNR für Suche
DATA(lv_matnr) = |12345|.

* RANGE für die Suche definieren
DATA(it_matnr) = VALUE ty_rg_matnr( ( sign   = 'I'
                                      option = 'EQ'
                                      low    = |{ lv_matnr WIDTH = 18 ALPHA = IN }|
                                      high   = '' ) ).

DATA: it_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

SELECT * FROM mara INTO TABLE @it_mara WHERE matnr IN @it_matnr.

IF sy-subrc = 0.
  LOOP AT it_mara ASSIGNING FIELD-SYMBOL(<mat>).
    WRITE: / <mat>-matnr.
  ENDLOOP.
ELSE.
  WRITE: / 'Keine Daten vorhanden.'.
ENDIF.

[ABAP] SELECT-OPTIONS Auswahl vorbelegen

Beispiel 1

DATA: gv_num TYPE i.
 
SELECT-OPTIONS: p_num FOR gv_num.
 
INITIALIZATION.
 
* Zahlenwerte 3 und 9
  p_num[] = VALUE #( ( sign = 'I' option = 'EQ' low = 3 )
                     ( sign = 'I' option = 'EQ' low = 9 ) ).

Beispiel 2

DATA: gv_matnr TYPE mara-matnr.
DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_matnr FOR gv_matnr.
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.

* MATNR von / bis
  so_matnr[] = VALUE #( ( sign = 'I' option = 'BT' low = '000000001000000000' high = '000000002000000000' ) ).
  
* Werk 0001
  so_werks[] = VALUE #( ( sign = 'I' option = 'EQ' low = '0001' ) ).

Beispiel 3

DATA: gv_werks TYPE mard-werks.
  
SELECT-OPTIONS: so_werks FOR gv_werks.

INITIALIZATION.
  
* Ausschluss Werk 0001
  so_werks[] = VALUE #( ( sign = 'E' option = 'EQ' low = '0001' ) ).

[ABAP] RANGES

Ein RANGE definiert eine spezielle interne Tabelle vom Typ STANDARD TABLE mit Header Line zur Abbildung von Intervallen (z.B. für SELECT-OPTIONS und WHERE … IN).
Die Definition von RANGES an sich ist obsolet.

Weiterführende Infos: Link und Link

Tabellenfelder einer RANGE-Tabelle

  • SIGN (Bereichabgrenzung)
    • Typ: DDSIGN
    • Domäne: DDSIGN
    • Werte
      • I Bereichsabgrenzung eingeschlossen (Inclusive)
      • E Bereichsabgrenzung ausgeschlossen (Exclusive)
  • OPTION (Optionen)
    • Typ: DDOPTION
    • Domäne: DDOPTION
    • Werte
      • EQ gleich
      • BT zwischen … und …
      • CP enthält das Template
      • LE kleiner oder gleich
      • GE größer oder gleich
      • NE ungleich
      • NB nicht zwischen … und …
      • NP enthält das Template nicht
      • GT größer
      • LT kleiner
  • LOW (niedrigster Wert des Intervalls)
    • Typ: C
    • Länge: 1…n (abh. vom Such-Datentyp)
  • HIGH (höchster Wert des Intervalls)
    • Typ: C
    • Länge: 1…n (abh. vom Such-Datentyp)
      (leer, wenn z.B. OPTION = EQ)

DDIC-Zeilentypen, die RANGEs abbilden

* SELOPT
* RSDSSELOPT
* RSIS_S_RANGE

DDIC-Tabellentypen, die RANGEs abbilden

* RSELOPTION
* CMS_TAB_BII_CAG_TYP_RNG
* FIWTIN_T_SELOPT
* PIQ_SELOPT_T
* PSI_WE_SELOPT_TT

Beispiel 1 (Übergabe von RANGES (SELECT-OPTIONS) an Klassenmethoden)

REPORT zrange_demo.

* Klasse für Demo der Übergabe von RANGEs (SELECT-OPTIONS)
CLASS lcl_matnr DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      get_data
        IMPORTING
          i_it_matnr TYPE STANDARD TABLE. " RANGE (SELECT-OPTIONS) als STANDARD TABLE übergeben
ENDCLASS.

CLASS lcl_matnr IMPLEMENTATION.
  METHOD get_data.
    DATA: it_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

* STANDARD TABLE im SQL verwenden
     SELECT * FROM mara INTO TABLE @it_mara
       WHERE matnr IN @i_it_matnr.

     ...

  ENDMETHOD.
ENDCLASS.

* SELECT-OPTIONS festlegen
DATA: lv_matnr TYPE mara-matnr.
* RANGE so_matnr für MATNR definieren
SELECT-OPTIONS: so_matnr FOR lv_matnr.

INITIALIZATION.
* RANGE so_matnr initialisieren
  so_matnr[] = VALUE #( ( sign   = 'I'
                          option = 'EQ'
                          low    = '0000012345'
                          high   = '' ) ).

START-OF-SELECTION.
* Datenbereich des RANGE so_matnr übergeben
  lcl_matnr=>get_data( i_it_matnr = so_matnr[] ).

Beispiel 2 (RANGE OF)

* erzeugt eine interne Tabelle vom Typ STANDARD TABLE mit Header Line mit den Datenfeldern
* SIGN (C(1)) | OPTION (C(2)) | LOW (C(10)) | HIGH (C(10))
DATA: it_kunnr TYPE RANGE OF kunnr.

Beispiel 3 (STANDARD TABLE)

TYPES: BEGIN OF ty_range,
         sign   TYPE ddsign,
         option TYPE ddoption,
         low    TYPE char18, " char18 für 18-stellige MATNR
         high   TYPE char18, " char18 für 18-stellige MATNR
       END OF ty_range.

* erzeugt eine interne Tabelle vom Typ STANDARD TABLE mit den Datenfeldern
* SIGN (C(1)) | OPTION (C(2)) | LOW (C(18)) | HIGH (C(18))
DATA: it_matnr TYPE STANDARD TABLE OF ty_range WITH DEFAULT KEY.

Beispiel 4 (STANDARD TABLE mit generischen DDIC-Strukturen)

DATA(rg_so_carrid) = VALUE rseloption( ( sign   = 'I'
                                         option = 'EQ'
                                         low    = 'AA'
                                         high   = '' ) ).

Beispiel 5 (Verwendung in OpenSQL-WHERE-Condition)

DATA(rg_carrid) = VALUE rseloption( ( sign = 'I' option = 'EQ' low = 'AA' high = '' )
                                    ( sign = 'I' option = 'EQ' low = 'LH' high = '' )
                                  ).

SELECT *
  INTO TABLE @DATA(it_sflight)
  FROM sflight
  WHERE carrid IN @rg_carrid.

cl_demo_output=>display( it_sflight ).

Beispiel 6 (Verwendung eines RANGESs zum Filtern von internen Tabellen)

* Liste mit Namen
DATA(it_names) = VALUE string_table( ( |Horst| ) ( |Heiner| ) ( |Ida| ) ( |Lotte| ) ( |Hanna| ) ).

* Range mit Suchbegriffen
DATA(rg_search) = VALUE rseloption( ( sign = 'I' option = 'EQ' low = 'Ida' high = '' )
                                    ( sign = 'I' option = 'EQ' low = 'Lotte' high = '' )
                                  ).

* Filtern der Liste mittels WHERE-Condition + RANGE
LOOP AT it_names ASSIGNING FIELD-SYMBOL(<n>) WHERE table_line IN rg_search.
  WRITE: / <n>.
ENDLOOP.