Generische Select Where-Klauseln

Aus SAP-Wiki
(Weitergeleitet von Generische Where-Klauseln)
Zur Navigation springenZur Suche springen

Siehe Schlüsselbefehl Select.

Siehe Dynamische/Generische Programmierung.

Siehe Kategorie: Dynamische/Generische Programmierung.

Hier ist die Where-Bedingung einer Tabelle erst zur Laufzeit bekannt. Die Felder werden mit einem Parameter P_WHERE im Selektionsbildschirm abgefragt, in eine Tabelle GT_WHERE gefüllt und mit "(gt_where)" dem Select-Statement übergeben.

Die Tabelle GT_WHERE wird mit dem Befehl DATA: GT_WHERE TYPE TABLE OF STRING angelegt, um Felder beliebiger Länge aufnehmen zu können.

Coding mit Abfangen Laufzeitfehler

Um einen Laufzeitfehler zu vermeiden, wenn es in der Tabelle eine Where-Klausel nicht gibt, bzw. nicht gültig ist, wird mit einem Try-Endtry-Befehl eine Fehlerbehandlung durchgeführt.

PARAMETERS: p_where(70) type c.

DATA: oerror     TYPE REF TO cx_root,
      txterror   TYPE string,
      gt_where   type table of string,
      gt_sflight type table of sflight.

append p_where to gt_where. 

TRY.
    SELECT carrid
      INTO CORRESPONDING FIELDS OF TABLE gt_sflight
      from sflight
      where (gt_where).

  CATCH cx_sy_dynamic_osql_semantics INTO oerror.
    txterror = oerror->get_text( ).
    MESSAGE i531(0u) WITH txterror.
ENDTRY.

Abfrage nach literalen Wert

Bei einer Abfrage nach einem literalen Wert, muss man mit den Hochkomma sorgfältig sein. Der gesamte String wird durch einfaches Hochkomma umschlossen. Wenn ein Literal im String ist, wird der durch 2 Hochkomma umschlossen.

lv_where = 'vbeln = ''0000000013'' '.

Abfrage mit bedingter teildynamischer Where-Bedingung

  • Sehr elegant kann es sein, Teile der Where-Bedingung in Abhängigkeit einer Bedingung dynamisch zu füllen.
  • Auch wenn die Where-Bedingung leer ist, kommt der Select damit zurecht und bricht nicht ab.
  • Wichtig sind hier die Leerzeichen, die mit dem Zeichen "`" eingegrenzt werden, damit die Leerzeichen im Zielfeld "lv_where" erhalten bleiben.
PARAMETERS: p_segm TYPE xfeld.

DATA(lv_where) = COND string( WHEN p_segm = 'X'
                   THEN ` ekpo~sgt_scat <> ekes~sgt_scat ` ).
 SELECT
   ...
   WHERE
     ...
     ekko~ebeln IN @s_ebeln AND
     (lv_where).

Releasestandabhängiges Coding

  • Ab NetWeaver 7.02 sind auch für interne Tabellen (LOOP) dynamische WHERE-Klauseln möglich.

Literatur