Die Erkenntnisse stimmen so nicht ganz, denn es gibt dynamische Varianten von Select-Anweisungen, wo es ausreichend ist, daß die Tabellen zur Laufzeit bekannt sind. Das hängt allerdings vom Release-Stand ab. Damit sind dann in etwa solche Anweisungen möglich (Beispiel aus ABAP-Docu). Damit kann man dann auch dynamisch nahezu beliebige Select-Anweisungen aufbauen:ereglam hat geschrieben:Der Zugriff auf besagte Tabellen/Views ist deshalb nur unter Verwendung von CREATE DATA (ein jeweiliger Tabellentyp wird bei der Generierung mit angelegt)und anschließendem ASSIGN möglich.
Erkenntnisse:
Um in einem SELECT einen JOIN verwenden zu können, müssen die Tabellen im DDIC bekannt sein und explizit benannt werden. Da die Tabellen und Felder sich aber auf die internen Schlüssel von Klassen (CLINT) und Merkmalen (ATINN) beziehen, kann das aber nicht über die Systeme hinweg garantiert werden.
Code: Alles auswählen.
PARAMETERS: dbtab(10) TYPE c,
rows TYPE i DEFAULT 100.
DATA dref TYPE REF TO data.
FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<wa> TYPE ANY,
<comp> TYPE ANY.
TRY.
CREATE DATA dref TYPE STANDARD TABLE OF (dbtab)
WITH NON-UNIQUE DEFAULT KEY.
ASSIGN dref->* TO <table>.
SELECT *
FROM (dbtab) UP TO rows ROWS
INTO TABLE <table>.
LOOP AT <table> ASSIGNING <wa>.
DO.
ASSIGN COMPONENT sy-index
OF STRUCTURE <wa> TO <comp>.
IF sy-subrc = 0.
WRITE / <comp>.
ELSE.
EXIT.
ENDIF.
ENDDO.
ULINE.
ENDLOOP.
CATCH cx_sy_create_data_error.
WRITE 'Wrong Database!'.
ENDTRY.
Code: Alles auswählen.
PARAMETERS: p_cityfr TYPE spfli-cityfrom,
p_cityto TYPE spfli-cityto.
DATA: BEGIN OF wa,
fldate TYPE sflight-fldate,
carrname TYPE scarr-carrname,
connid TYPE spfli-connid,
END OF wa.
DATA itab LIKE SORTED TABLE OF wa
WITH UNIQUE KEY fldate carrname connid.
DATA: column_syntax TYPE string,
dbtab_syntax TYPE string.
column_syntax = `c~carrname p~connid f~fldate`.
dbtab_syntax = `( ( scarr AS c `
& ` INNER JOIN spfli AS p ON p~carrid = c~carrid`
& ` AND p~cityfrom = p_cityfr`
& ` AND p~cityto = p_cityto )`
& ` INNER JOIN sflight AS f ON f~carrid = p~carrid `
& ` AND f~connid = p~connid )`.
SELECT (column_syntax)
FROM (dbtab_syntax)
INTO CORRESPONDING FIELDS OF TABLE itab.
LOOP AT itab INTO wa.
WRITE: / wa-fldate, wa-carrname, wa-connid.
ENDLOOP.
funktioniert das auch unter Verwendung von JOIN?Anonymous hat geschrieben:...
Die Erkenntnisse stimmen so nicht ganz, denn es gibt dynamische Varianten von Select-Anweisungen, wo es ausreichend ist, daß die Tabellen zur Laufzeit bekannt sind. Das hängt allerdings vom Release-Stand ab. Damit sind dann in etwa solche Anweisungen möglich (Beispiel aus ABAP-Docu). Damit kann man dann auch dynamisch nahezu beliebige Select-Anweisungen aufbauen:
Code: Alles auswählen.
PARAMETERS: dbtab(10) TYPE c, rows TYPE i DEFAULT 100. DATA dref TYPE REF TO data. FIELD-SYMBOLS: <table> TYPE ANY TABLE, <wa> TYPE ANY, <comp> TYPE ANY. TRY. CREATE DATA dref TYPE STANDARD TABLE OF (dbtab) WITH NON-UNIQUE DEFAULT KEY. ASSIGN dref->* TO <table>. SELECT * FROM (dbtab) UP TO rows ROWS INTO TABLE <table>. LOOP AT <table> ASSIGNING <wa>. DO. ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <comp>. IF sy-subrc = 0. WRITE / <comp>. ELSE. EXIT. ENDIF. ENDDO. ULINE. ENDLOOP. CATCH cx_sy_create_data_error. WRITE 'Wrong Database!'. ENDTRY.
Code: Alles auswählen.
SELECT *
FROM (dbtab1) AS t1
[
JOIN (dbtab2) AS t2
ON t2~key EQ t1~key
] (n-1)-mal (dynamisch)
INTO CORRESPONDING FIELDS OF <lt_data>
WHERE (lt_where).