dynamische Where -Bedingung mit Select-Option

Getting started ... Alles für einen gelungenen Start.
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

dynamische Where -Bedingung mit Select-Option

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
Hallo SAP-Spezies,

wieder mal ein Problem:
ich moechte eine Variable, welche als SELECT-OPTION deklariert ist, in eine dynamische WHERE-Bedingung aufnehmen und bekommen immer einen Kurzdump. Kann mir da vllt jmd. weiterhelfen? Bitte!

Code: Alles auswählen.

Laufzeitfehler         SAPSQL_IN_ILLEGAL_LIST
Ausnahme               CX_SY_DYNAMIC_OSQL_SYNTAX
       aufgetreten am  21.08.2006 um   11:53:25


Die WHERE-Bedingung hat ein unerwartetes Format.


Fehleranalyse

Es ist eine Ausnahme aufgetreten, die weiter unten näher erläutert wird.
Die Ausnahme, der die Klasse 'CX_SY_DYNAMIC_OSQL_SYNTAX' zugeordnet ist,
wurde nicht abgefangen und führte deshalb zu einem Laufzeitfehler.
Der Grund für die Ausnahme ist:

Das laufende ABAP-Programm wollte eine Open SQL-Anweisung ausführen,
die eine WHERE-Bedingung der Form WHERE (itab) oder WHERE ... AND (itab)
enthält. Der Teil der WHERE-Bedingung, der zur Laufzeit in der
internen Tabelle itab angegeben wurde, enthält den Operator
         IN (v1, ..., vn)
in unvollständiger Form.
Hier noch ein wenig Code zum Nachstellen

Code: Alles auswählen.

TABLES: tadir.

DATA: s         TYPE string,
      stringtab TYPE TABLE OF string.

SELECT-OPTIONS : l_where FOR tadir-devclass.

DATA : i_tadir LIKE tadir OCCURS 0.
DATA : wa_tadir LIKE LINE OF i_tadir.

*CONCATENATE ' DEVCLASS EQ ''' l_where ''' AND' INTO s.
*APPEND s TO stringtab.

*CONCATENATE ' DEVCLASS IN ''' l_where ''' AND' INTO s.
CONCATENATE ' DEVCLASS IN ''' l_where ''' AND ' INTO s.
APPEND s TO stringtab.
CONCATENATE ' AUTHOR EQ ''' sy-uname '''' INTO s.
APPEND s TO stringtab.


SELECT * INTO CORRESPONDING FIELDS OF TABLE i_tadir
  FROM tadir
  WHERE (stringtab).

LOOP AT i_tadir INTO wa_tadir.
  WRITE :/ wa_tadir-obj_name.
ENDLOOP.

Gruss
BesenWesen

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von zzcpak (Expert / 673 / 5 / 68 ) »
"l_where" brauchst du ja nicht dort hinein zu schieben, sondern kannst es gleich hier WHERE nutzen und nur den Rest dynamisch.

Code: Alles auswählen.

CONCATENATE 'AUTHOR EQ' '''' sy-uname '''' INTO s.
APPEND s TO stringtab.

SELECT * INTO CORRESPONDING FIELDS OF TABLE i_tadir
  FROM tadir
  WHERE devclass in l_where and
  (stringtab).

LOOP AT i_tadir INTO wa_tadir.
  WRITE :/ wa_tadir-obj_name.
ENDLOOP.

Re: dynamische Where -Bedingung mit Select-Option

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
BesenWesen hat geschrieben:ich moechte eine Variable, welche als SELECT-OPTION deklariert ist, in eine dynamische WHERE-Bedingung aufnehmen und bekommen immer einen Kurzdump. Kann mir da vllt jmd. weiterhelfen? Bitte!
Hast du dir die Stringtab mal im debugger angeschaut?

Sieht dann so aus:
DEVCLASS IN 'IEQZABC' AND
AUTHOR EQ 'ABC'

Du musst den Namen der Selectoption übernehmen nicht den Inhalt der Kopfzeile.

Hier der überarbeitete Code (Die Sache mit den Leerzeilen war nicht sehr leserlich, habe das gleich mit geändert)

Code: Alles auswählen.

CONCATENATE 'DEVCLASS IN' 'l_where' 'AND' INTO s SEPARATED BY space.
APPEND s TO stringtab.
CONCATENATE 'AUTHOR EQ' 'sy-uname' INTO s SEPARATED BY space.
APPEND s TO stringtab.
Gruß Hendrik

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
zzcpak hat geschrieben:"l_where" brauchst du ja nicht dort hinein zu schieben, sondern kannst es gleich hier WHERE nutzen und nur den Rest dynamisch.
das war nur ein Beispiel, damit ihr schnell mal das Coding kopieren koennt um das ganz nachzuvollziehen. Im eigentlichen Fall ist es so, dass is zwei unterschiedliche Datumseingabefelder habe, die aber gegen das selbe Tabellenfeld geprueft werden sollen und zusaetzlich noch ein weiteres Kriterium erfuellt sein muss. Diese ist aber pro Datumsfeld anders...

tabellenfeld = datumsfeld1 + zusatzkriterium
oder
tabellenfeld = datumsfeld2 + zusatzkriterium
oder
tabellenfeld = datumsfeld1 + zusatzkriterium UND
tabellenfeld = datumsfeld2 + zusatzkriterium

jenachdem was vom Benutzer gefuellt wurde.
JHM hat geschrieben:(Die Sache mit den Leerzeilen war nicht sehr leserlich, habe das gleich mit geändert)
hab ich aus der SAP-Hilfe kopiert...

Leider funktioniert das ueberarbeitet Koding zwar in dem Bsp mit der TADIR, aber mit meinem Datumsfeld leider nicht.

Code: Alles auswählen.

  
DATA : tmp_string TYPE string.
DATA : l_where   TYPE TABLE OF string.
CONSTANTS : c_dateinw(7) TYPE c VALUE 'DATEINW'.
CONSTANTS : c_eingeinw(8) TYPE c VALUE 'EINWEING'.
DATA : einw_dat type dats.

CONCATENATE 'IST_TERMIN IN' 'einw_dat' 'AND'
  INTO tmp_string
  SEPARATED BY space.
  APPEND tmp_string TO l_where.
  CONCATENATE 'TERMIN_KZ EQ' 'c_dateinw'
  INTO tmp_string
  SEPARATED BY space.
  APPEND tmp_string TO l_where.

Macht es eigentlich einen Unterschied ob ich den Select auf die Datenbank absetze oder ob ich einen View benutze?
Gruss
BesenWesen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Dein neues Coding hat aber wieder einen anderen Haken. Jetzt übernimmst du den Namen der Konstanten und nicht den Wert. Die Where-Bedingung sieht so aus:

IST_TERMIN IN einw_dat AND
TERMIN_KZ EQ c_dateinw

soll aber wohl so aus sehen

IST_TERMIN IN einw_dat AND
TERMIN_KZ EQ 'DATEINW'.

Das muss geändert werden:

Code: Alles auswählen.

* Der Wert der Konstanten in Hochkommas bringen
CONSTANTS : c_dateinw(9) TYPE c VALUE '''DATEINW'''. 

* Die Konstante soll übernommen werden nicht der Name, also Hochkommas weg
  CONCATENATE 'TERMIN_KZ EQ ' c_dateinw
  INTO tmp_string
  SEPARATED BY space.
  APPEND tmp_string TO l_where.
Gruß Hendrik

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
also, ich hab das jetzt wieder probiert mit folgendem Coding:

Code: Alles auswählen.

CONCATENATE 'IST_TERMIN IN' 'einw_dat' 'AND'
INTO tmp_string
SEPARATED BY space.
APPEND tmp_string TO l_where.
CONCATENATE 'TERMIN_KZ EQ' c_dateinw
INTO tmp_string
SEPARATED BY space.
APPEND tmp_string TO l_where.
aber leider wieder ein Dump.
ich hab mich auch mal in der Hilfe versucht schlau zu machen und da hab ich dann das gefunden:
Dynamische logische Bedingung

Die in source_text angegebenen logische Bedingungen müssen dieselbe Form haben wie entsprechende Bedingungen im ABAP -Quelltext. Allerdings darf der Operator nicht in der Form f1 IN itab1 verwendet werden.
ich wuede jetzt mal behaupten, damit ist meine Idee wohl hinfaellig oder?
Gruss
BesenWesen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
BesenWesen hat geschrieben: ich wuede jetzt mal behaupten, damit ist meine Idee wohl hinfaellig oder?
Welches Releas hast du? Ab 6.4 ist es möglich.
Gruß Hendrik

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
4.7
aber da hab ich doch auch den Hinweis her.... :(
ich bin jetzt etwas ratlos...
Gruss
BesenWesen

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
hab's doch noch geloest bekommen!!

Code: Alles auswählen.

TYPE-POOLS : rsds.
TABLES: tadir.
DATA : i_tadir   LIKE tadir OCCURS 0.
DATA : wa_tadir  LIKE LINE OF i_tadir.
DATA : field_ranges    TYPE rsds_trange.
DATA : frange_t        TYPE rsds_frange_t.
DATA : selopt_t        TYPE rsds_selopt_t.
DATA : where           TYPE rsds_twhere.
DATA : wa_field_ranges LIKE LINE OF field_ranges.
DATA : wa_franges      LIKE LINE OF frange_t.
DATA : wa_selopt       LIKE LINE OF selopt_t.
DATA : where_tab       TYPE string.
DATA : wa_where        LIKE LINE OF where.
DATA : where_string    TYPE string.
SELECT-OPTIONS : l_where FOR tadir-devclass.

wa_field_ranges-tablename = 'TADIR'.
wa_franges-fieldname       = 'DEVCLASS'.
LOOP AT l_where.
  MOVE-CORRESPONDING l_where TO wa_selopt.
  INSERT wa_selopt INTO wa_franges-selopt_t INDEX sy-tabix.
ENDLOOP.
INSERT wa_franges INTO wa_field_ranges-frange_t INDEX 1.
APPEND wa_field_ranges TO field_ranges.
BREAK-POINT.

CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'
  EXPORTING
    field_ranges  = field_ranges
  IMPORTING
    where_clauses = where.

BREAK-POINT.

IF where[] IS NOT INITIAL.
  READ TABLE where INDEX 1 INTO wa_where.
  LOOP AT wa_where-where_tab INTO where_tab.
    CONCATENATE where_string where_tab
    INTO where_string
    SEPARATED BY space.
  ENDLOOP.
ENDIF.


BREAK-POINT.

TRY.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE i_tadir
      FROM tadir
    WHERE (where_string)
      .
  CATCH cx_sy_dynamic_osql_semantics.
    MESSAGE 'CX_SY_DYNAMIC_OSQL_SEMANTICS abgef.' TYPE 'S'.
  CATCH cx_sy_dynamic_osql_syntax.
    MESSAGE 'CX_SY_DYNAMIC_OSQL_SYNTAX abgef.' TYPE 'S'.
ENDTRY.
DESCRIBE TABLE i_tadir LINES sy-tabix.
WRITE : / 'Eintraege: ' COLOR 3, sy-tabix.
Gruss
BesenWesen

Seite 1 von 1

Vergleichbare Themen

11
Antw.
6947
Views
Dynamische Where-Bedingung mit Native SQL
von Walda86 » 21.09.2017 11:36 • Verfasst in Tips + Tricks & FAQs
2
Antw.
2289
Views
SELECT Wertepaar Select-Option
von myllertym » 12.08.2013 10:39 • Verfasst in ABAP® für Anfänger
3
Antw.
1548
Views
SELECT * Where Datum = select-option-low
von abapfreshman » 17.09.2021 00:24 • Verfasst in ABAP® für Anfänger
10
Antw.
985
Views
SELECT-OPTION
von ABAPLover » 09.08.2023 09:53 • Verfasst in ABAP® für Anfänger
1
Antw.
1262
Views
SELECT-OPTION
von SAP_ENTWICKLER » 21.09.2017 14:13 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1514
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8127