Interne Tabelle mit COMPONENTS

Hier wird eine interne Tabelle anhand von einer beliebigen Anzahl Feldern generiert.

Die Tabelle, aus der die Daten gelesen werden sollen, muss angegeben werden. Dann müssen die Felder EINZELN in der Select-Option eingetragen werden. Die Feldnamen müssen mit dem Namen des Datenelements übereinstimmen.

Eine schönere Version wäre die Komponenten der angegebenen Tabelle zu ermitteln (CL_ABAP_STRUCTDESCR->GET_COMPONENTS).

Achtung:
Es erfolgt keine Prüfung ob die Felder in der Tabelle vorhanden sind! Wenn Feldnamen angegeben werden, die nicht in der angegebenen Tabelle existieren, kommt es zu einem Dump!

Es erfolgt keine Ausgabe der Daten!

Coding

*== Create internal table dynamically by given fields
 DATA: gr_element   TYPE REF TO cl_abap_elemdescr,
 gr_struc     TYPE REF TO cl_abap_structdescr,
 gr_table     TYPE REF TO cl_abap_tabledescr,
 gt_comp      TYPE cl_abap_structdescr=>component_table,
 gs_comp      LIKE LINE OF lt_comp,
 gr_data      TYPE REF TO data,
 gt_fields    TYPE STANDARD TABLE OF string,
 hf_fieldname TYPE fieldname.

FIELD-SYMBOLS <table> TYPE ANY TABLE.

*== selection screen
 PARAMETERS p_table TYPE tabname DEFAULT 'MARA'.
 SELECT-OPTIONS s_fields FOR hf_fieldname.
 

START-OF-SELECTION.

  LOOP AT s_fields.
 CLEAR: gs_comp.

*== Element Description for field
 gr_element ?= cl_abap_elemdescr=>describe_by_name( s_fields-low ).
 *== Field name
 gs_comp-name = s_fields-low.
 *== Field type (element)
 gs_comp-type = gr_element.
 *== add element to components table
 APPEND gs_comp TO gt_comp.

*== add column to selection table
 APPEND s_fields-low TO gt_fields.

  ENDLOOP.

*== Create structure/ work area
 gr_struc = cl_abap_structdescr=>create( gt_comp ).

*== create table by structure reference
 gr_table = cl_abap_tabledescr=>create(
 p_line_type  = gr_struc
 p_table_kind = cl_abap_tabledescr=>tablekind_std
 p_unique     = abap_false ).

*== create data handle for table
 CREATE DATA gr_data TYPE HANDLE gr_table.

*== assign data to table-pointer
 ASSIGN gr_data->* TO <table>.

*== Select data into dynamic internal table
 SELECT (gt_fields) FROM  (p_table)
 INTO CORRESPONDING FIELDS OF TABLE <table>
 UP TO 10 ROWS.

 

 

Enno Wulff