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.
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.
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.
Hast du dir die Stringtab mal im debugger angeschaut?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!
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.
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...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.
hab ich aus der SAP-Hilfe kopiert...JHM hat geschrieben:(Die Sache mit den Leerzeilen war nicht sehr leserlich, habe das gleich mit geändert)
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.
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.
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.
ich wuede jetzt mal behaupten, damit ist meine Idee wohl hinfaellig oder?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.
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.