Hi,
meine Schleife steht jetzt und funktioniert auch - wenn es so ist, wie der Code, den ich hier poste. Allerdings bin ich jetzt auf ein anderes Problem gestoßen: Ich habe mal experimentiert und nach und nach mehr Felder eingefügt - noch aus den gleichen vier Tabellen KNC1, KNB1, KNA1 und T001 - und bin drauf gestoßen, daß es Probleme gibt, wenn es zwei Felder gleichen Namens gibt. Das kommt aber im SAP-System eben relativ oft vor - ist ja auch praktischer so - und weil die Ergebnisse bei dem SELECT aktuell mit der Option INTO CORRESPONDING FIELDS reingestellt werden, wird es auch zu Problemen kommen, wenn ich die Namen abändere.
Hat da jemand eine Idee, wie man das vermeiden könnte?
Hier kommt mal der Code:
*&---------------------------------------------------------------------*
*& Include ZFH_INTTAB_JOIN4_DX_DYNDECL *
*&---------------------------------------------------------------------*
* Hereby, an internal table is created fully dynamically so it will
* adapt to whatever data the SELECT statement that is yet to come
* will provide.
* Before we can use the CREATE DATA statement, we must declare the
* type of this internal-table-to-be.
* The variables are of course to be taken from the dialogs;
* That works fine with the tables. The fields are not yet
* available as single variables, so we have to declare them here.
* DATA NrTbs TYPE i VALUE 4.
*DATA: Tab1 TYPE C LENGTH 4 VALUE 'KNC1',
* Tab2 LIKE Tab1 VALUE 'KNB1',
* Tab3 LIKE Tab1 VALUE 'KNA1',
* Tab4 LIKE Tab1 VALUE 'T001'.
DATA: F1 TYPE C LENGTH 5 VALUE 'KUNNR',
F2 LIKE F1 VALUE 'BUKRS',
F3 LIKE F1 VALUE 'GJAHR',
F4 LIKE F1 VALUE 'USNAM',
F5 LIKE F1 VALUE 'UMSAV',
F6 LIKE F1 VALUE 'UM01U',
F7 LIKE F1 VALUE 'AKONT',
F8 LIKE F1 VALUE 'NAME1',
F9 LIKE F1 VALUE 'NAME2',
F10 LIKE F1 VALUE 'ORT01',
F11 LIKE F1 VALUE 'ERDAT',
F12 LIKE F1 VALUE 'ERNAM'.
F13 LIKE F1 VALUE 'BUTXT',
F14 LIKE F1 VALUE 'WAERS',
F15 LIKE F1 VALUE 'SPRAS',
F16 LIKE F1 VALUE 'KOKFI'.
DATA Flds1 TYPE C VALUE '6'.
DATA Flds2 TYPE C VALUE '1'.
DATA Flds3 TYPE C VALUE '5'.
*DATA Flds4 TYPE C VALUE '4'.
* Before using the internal table i_fcat in the method called,
* it has to be declared with the usual four-step-process:
* 1) Linetype -> 2) Table_type 3) DATA_table -> DATA_wa.
*********** Declaration of the internal table i_fcat *******************
DATA i_fcat TYPE LVC_T_FCAT.
DATA wa_fcat TYPE LVC_S_FCAT.
************ Population of internal table i_fcat *******************
* This has to be done in a WHILE-clause lateron so that we can have
* as many rows here as the user has selected fields.
DATA v_tabctr TYPE i value 1. "TYPE C VALUE '1'.
DATA v_fieldctr TYPE i value 1. "C LENGTH 2 VALUE '1'.
DATA Flds_new TYPE i.
DATA v_currTab TYPE STRING.
DATA Flds_currTab TYPE STRING.
DATA v_currFld TYPE STRING.
FIELD-SYMBOLS .FIELD-SYMBOLS .FIELD-SYMBOLS .* The running logic of this WHILE construction is the
* following: The outer loop runs through all the tables
* the user has entered in the dialogs, tab1 to tabX.
* => The inner loop runs through all the fields in
* one specific table (variable from one table to
* the next) before the inner loop is left and the
* next table is worked on.
* => Inside the inner loop, every table-field combination
* is appended to int. table i_fcat that goes into
* the method to be called further down.
WHILE v_tabctr <= NrTbs.
move v_tabctr TO v_currTab.
CONCATENATE 'Tab' v_currTab INTO v_currTab.
ASSIGN (v_currTab) TO . move v_tabctr to Flds_currTab.
CONCATENATE 'Flds' Flds_currTab INTO Flds_currTab.
ASSIGN (Flds_currTab) TO . Flds_new = v_fieldctr + - 1. WHILE v_fieldctr <= flds_new.
move v_fieldctr to v_currFld.
CONCATENATE 'F' v_currFld INTO v_currFld.
ASSIGN (v_currFld) TO . wa_fcat-tabname = . wa_fcat-fieldname = . APPEND wa_fcat TO i_fcat.
CLEAR wa_fcat.
v_fieldctr = v_fieldctr + 1.
ENDWHILE.
v_tabctr = v_tabctr + 1.
ENDWHILE.
************************** Done ************************
* Using the method create_dynamic_table (method of class
* cl_alv_table_create) it is possible to create a dynamic
* internal table based on a field_catalog i_fcat.
* This field_catalog is another internal table
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = i_fcat
* I_STYLE_TABLE ='X'
IMPORTING
ep_table = TAB_REF.
Wie gesagt, so wie es dasteht, funktioniert der Code. Ein Problem gibt es, wenn ich bspw. aus der Tabelle KNC1 noch das Feld ERDAT will (das müsste man dann oben direkt nach den anderen KNC1-Feldern anhängen und die lfd. Nummerierung entspr. anpassen).
Danke vielmals!
Gruß,
Sappralott