Dynamische WHERE-Klausel bei LOOP

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Dynamische WHERE-Klausel bei LOOP

Beitrag von KleinerEisbaer (Specialist / 123 / 3 / 0 ) »
Hallo ABAPler*innen,

ich möchte das folgende Statement ...

Code: Alles auswählen.

 loop at ct_table transporting no fields
          where bbein is not initial.
… dynamisch setzen und habe es so versucht:

Code: Alles auswählen.

CONCATENATE iv_columnname 'is not initial.' INTO lv_where_clause SEPARATED BY space.
LOOP AT it_table TRANSPORTING NO FIELDS
      WHERE (lv_where_clause).
Es führt zu einem Laufzeitfehler DYN_WHERE_PARSE_ERROR der Ausnahme CX_SY_ITAB_DYN_LOOP. Unter anderem steht in der Fehlerbeschreibung:
Beim Parsen des logischen Ausdrucks konnte das Token "INITIAL." in Zeile 0 und Spalte 14 nicht interpretiert werden.
Auf der Variablen lv_where_clause steht lt. "Ausgewählte Variablen":
BBEIN is not initial.
Ich habe den Zusammenbau via CONCATENATE auch schon mit diversen space-Zeichen z.B. vor der Variablen iv_columnname oder nach dem initial oder auch nach dem Punkt probiert, auch mit dem ALT+255-Trick. Je nachdem kann dann aber das Token „ „ oder „.“ nicht interpretiert werden.

Hat jemand eine gute Idee, wie ich den String richtig zusammenbauen kann, der bei der dynamischen WHERE-Klausel restriktiver gehandhabt wird, als bei einer statischen?

Ich arbeite noch einem 731-System.

Besten Dank für Eure Unterstützung!
Nimm die Menschen wie sie sind, es gibt keine anderen.


Re: Dynamische WHERE-Klausel bei LOOP

Beitrag von Tron (Top Expert / 1252 / 26 / 306 ) »
Moin.
folge doch einfache Diesem Beispiel :https://abapforum.com/forum/viewtopic.php?f=18&t=23998.
CALL FUNCTION 'F4_CONV_SELOPT_TO_WHERECLAUSE'

erzeugt dynamisch eine WHERE klausel in einen String , die man einfach am loop anbringen kann.
gruß Jens

Beispiel:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report ztest
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest.

DATA lt_sflight TYPE TABLE OF sflight.
DATA lt_sflight2 TYPE TABLE OF sflight.
DATA ls_sflight TYPE sflight.

DATA ls_sel TYPE ddshselopt.
DATA lt_sel TYPE TABLE OF ddshselopt.
DATA gv_where TYPE string.

CLEAR ls_sel.
ls_sel-shlpfield = 'CARRID'.
ls_sel-sign = 'I'.
ls_sel-option = 'EQ'.
ls_sel-low = 'AA'.
APPEND ls_sel TO lt_sel.

CLEAR ls_sel.
ls_sel-shlpfield = 'CARRID'.
ls_sel-sign = 'I'.
ls_sel-option = 'EQ'.
ls_sel-low = 'LH'.
APPEND ls_sel TO lt_sel.

CALL FUNCTION 'F4_CONV_SELOPT_TO_WHERECLAUSE'
  IMPORTING
    where_clause = gv_where
  TABLES
    selopt_tab   = lt_sel.


" gv_where = (  CARRID EQ 'AA' OR CARRID EQ 'LH' )
SELECT * FROM sflight INTO TABLE lt_sflight.

LOOP AT lt_sflight INTO ls_sflight WHERE (gv_where).
  APPEND ls_sflight TO lt_sflight2.
ENDLOOP.


cl_demo_output=>display( lt_sflight2 ).

Folgende Benutzer bedankten sich beim Autor Tron für den Beitrag (Insgesamt 2):
qyurryusKleinerEisbaer

<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Dynamische WHERE-Klausel bei LOOP

Beitrag von KleinerEisbaer (Specialist / 123 / 3 / 0 ) »
Hallo Jens,

erst mal vielen Dank für den Hinweis! Ich habe es eingebaut.

Ziel ist es, einer Methode Spaltennamen zu übergeben und die Methode setzt für einen ALV die Spalte nur dann auf sichtbar, wenn mindestens ein Eintrag in der Spalte vorhanden ist (sprich, wenn alle Einträge in der Spalte initial sind, dann keine Anzeige der Spalte).

Die Spalten, welche ich übergebe sind unterschiedlichen Typs. Es geht konkret um Datumswerte (DATS) und Mengenwerte (QUAN 13,3). Initial wird vermutlich unterschiedlich interpretiert, also mit einer Prüfung ungleich auf einen einfachen space hat es nicht funktioniert.
Ich habe dann wegen der Datumswerte auf ungleich „00000000“ geprüft und siehe da, es klappt nicht nur bei den Datumswerten, sondern auch bei den Mengenwerten (warum auch immer).

Also es ist noch nicht die perfekte Lösung, aber es funktioniert. 😊 Danke sehr!
Nimm die Menschen wie sie sind, es gibt keine anderen.

Re: Dynamische WHERE-Klausel bei LOOP

Beitrag von DeathAndPain (Top Expert / 1546 / 181 / 341 ) »
Der Fehler in Deiner anfänglichen Lösung war der komische Punkt. In der Variablen sollst Du einfach nur die Bedingung eingeben. Das ist kein Befehl und deshalb kommt da auch kein Punkt dahinter. Genau darüber hat er ja auch gemeckert (weil er mit "initial." nichts anfangen konnte).

Seite 1 von 1

Über diesen Beitrag



ABAP & SAP eBook Flatrate von Espresso Tutorials Sponsorlink
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

DB-Update setzt kein Subrc
Gestern von ewx gelöst 6 / 86
Zukunft ABAP?
Gestern von mbsr 1 / 56

Vergleichbare Themen

LOOP Dynamische Bedingung
von caiuss » 18.08.2003 19:00
LOOP über dynamische Tabelle
von Jüüürgen » 10.01.2006 14:11
into-Klausel
von dimes » 15.07.2005 10:43
Methodenaufruf in SQL-WHERE-Klausel?
von Patrick1982 » 05.11.2020 14:01