Code: Alles auswählen.
data: lt_table type foo.
data: lt_fcat type lvc_t_fcat.
data: lo_columns type ref to cl_salv_columns_table,
lo_aggregations type ref to cl_salv_aggregations,
lo_salv_table type ref to cl_salv_table,
lr_table type ref to data.
field-symbols: <table> type standard table.
create data lr_table like lt_table.
assign lr_table->* to <table>.
try.
cl_salv_table=>factory(
exporting
list_display = abap_false
importing
r_salv_table = lo_salv_table
changing
t_table = <table> ).
catch cx_salv_msg.
endtry.
* get columns object (raw fieldcatalog)
lo_columns = lo_salv_table->get_columns( ).
* get aggregationss object (sorts)
lo_aggregations = lo_salv_table->get_aggregations( ).
lt_fcat =
cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = lo_columns
r_aggregations = lo_aggregations ).
Code: Alles auswählen.
TYPES: BEGIN OF t_mara,
matnr LIKE mara-matnr,
ersda TYPE ersda,
ernam LIKE mara-ernam,
maktx TYPE maktx,
END OF t_mara.
DATA: t1 TYPE STANDARD TABLE OF t_mara WITH DEFAULT KEY.
TYPE-POOLS: SYDES.
DATA TD TYPE SYDES_DESC.
DESCRIBE FIELD t1 INTO TD.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZDEBUG2 *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT zdebug3 .
TYPE-POOLS: sydes.
TYPES: BEGIN OF titx,
cx TYPE makt-spras,
ax TYPE mara-matnr,
bx TYPE makt-maktx,
END OF titx.
DATA itx TYPE TABLE OF titx WITH HEADER LINE.
DATA td TYPE sydes_desc.
DATA s_types TYPE sydes_typeinfo.
DATA s_names TYPE sydes_nameinfo.
DATA:
l_from TYPE i,
l_to TYPE i.
DESCRIBE FIELD itx INTO td.
* BEGIN OF SYDES_TYPEINFO,
* FROM TYPE I, " Index: first component
* TO TYPE I, " Index: last component
* BACK TYPE I, " Index: father entry
* IDX_NAME TYPE I, " Index: component name
* IDX_USER_TYPE TYPE I, " Index: type defined by TYPES
* CONTEXT TYPE C, " Values from SYDES_CONTEXT
* IDX_CONTEXT_NAME TYPE I, " Index: name of the type context
* IDX_EDIT_MASK TYPE I, " Index: edit mask
* IDX_HELP_ID TYPE I, " Index: help-id
* LENGTH TYPE I, " Internal length
* OUTPUT_LENGTH TYPE I, " Length used in a WRITE-statement
* DECIMALS TYPE I, " Decimals
* TYPE TYPE C, " ABAP/4-type
* TABLE_KIND TYPE C, " Kind of an internal table
* END OF SYDES_TYPEINFO,
* BEGIN OF SYDES_NAMEINFO,
* CONTINUE TYPE C, " Continuation flag (* = continued)
* NAME(15) TYPE C, " Name fragments
* END OF SYDES_NAMEINFO,
READ TABLE td-types INTO s_types INDEX 1.
CHECK sy-subrc = 0.
l_from = s_types-from.
l_to = s_types-to.
LOOP AT td-types INTO s_types FROM l_from TO l_to.
READ TABLE td-names INTO s_names INDEX s_types-idx_help_id.
IF sy-subrc = 0.
WRITE :/ s_names-name.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
FORM create_fieldcat USING ls_structure
CHANGING ls_fieldcat TYPE lvc_s_fcat
lt_fieldcat TYPE lvc_t_fcat.
* Deklarieren der Referenz ref_Structdescr
* sowie die Tabelle(lt_fields) die später die Feldbeschreibungen
* enthält.
DATA: ref_structdescr TYPE REF TO cl_abap_structdescr,
lt_fields TYPE ddfields.
* Deklaration eines Zählers um die Spaltenposition festzulegen.
DATA: lv_col_i TYPE i VALUE 0.
* Feld Symbol für Loop...Assigning am Ende der Routine.
FIELD-SYMBOLS: <fs_fields> TYPE LINE OF ddfields.
* Setzen der Referenz der Strukturbeschreibung anhand eines Downcasts
* des Rückgabewerts der methode describe_by_data der klasse
* cl_abap_structdescr der den Parameter p_data nutzt welcher
* die zu verwertende Struktur enthält.
ref_structdescr ?= cl_abap_structdescr=>describe_by_data(
p_data = ls_structure
).
* Die Methode der read_structdescr der Klasse cl_salv_data_descr
* um das Objekt auszuwerten und in eine Tabelle zu übertragen.
CALL METHOD cl_salv_data_descr=>read_structdescr
EXPORTING
r_structdescr = ref_structdescr
RECEIVING
t_dfies = lt_fields.
* Loop über die Feldbeschreibung um alle Daten in den Feldkatalog zu
* übertragen und evtl. mithilfe von If-Bedingungen sonderfälle zu
* steuern
LOOP AT lt_fields ASSIGNING <fs_fields>.
* Struktur leeren um Fehler zu vermeiden.
CLEAR ls_fieldcat.
* Zähler um 1 erhöhen um die Sortierung der Spalten zu ermöglichen
ADD 1 TO lv_col_i.
* Übertragen diverser Daten aus Strukturbeschreibung in Feldkatalog.
ls_fieldcat-col_pos = lv_col_i. "spaltenposition
ls_fieldcat-fieldname = <fs_fields>-fieldname. "Feldname
ls_fieldcat-tabname = <fs_fields>-tabname. "LVC-Tabname ?
ls_fieldcat-scrtext_l = <fs_fields>-scrtext_l. "feldbezeichner L
ls_fieldcat-scrtext_m = <fs_fields>-scrtext_m. "feldbezeichner M
ls_fieldcat-scrtext_s = <fs_fields>-scrtext_s. "feldbezeichner s
ls_fieldcat-ref_field = <fs_fields>-reffield. "referenzfeld
ls_fieldcat-ref_table = <fs_fields>-reftable. "referenztabelle
ls_fieldcat-intlen = <fs_fields>-intlen. "interne länge
ls_fieldcat-inttype = <fs_fields>-inttype. "interner datentyp
ls_fieldcat-lowercase = <fs_fields>-lowercase. "kleinschreiben j/n
ls_fieldcat-outputlen = <fs_fields>-outputlen. "ausgabelänge
ls_fieldcat-decimals_o = <fs_fields>-decimals. "ausgabedezimalstelln
ls_fieldcat-convexit = <fs_fields>-convexit. "konvertierunlsroutin
ls_fieldcat-decimals = <fs_fields>-decimals. "anzahl dezimalstelle
ls_fieldcat-reptext = <fs_fields>-reptext. "
ls_fieldcat-rollname = <fs_fields>-rollname. "Datenelement für F1
ls_fieldcat-domname = <fs_fields>-domname. "Name der Domäne
ls_fieldcat-datatype = <fs_fields>-datatype. "DictionaryDatentyp
ls_fieldcat-mac = <fs_fields>-mac. "suchhilfe j/n
ls_fieldcat-f4availabl = <fs_fields>-f4availabl. "F4 hilfe j/n
ls_fieldcat-checktable = <fs_fields>-checktable. "?????
ls_fieldcat-col_opt = abap_false. "Spaltenoptimierung *X/''.,
append ls_fieldcat to lt_fieldcat.
ENDLOOP.
Jepp RTTI gibts glaub ich erst ab Basis 6.0 und RTTC ab Basis 7.0Alexander D. hat geschrieben:Ich kann es leider nicht testen, es scheint auf einem 4.7 System nicht lauffähig zu sein.
Code: Alles auswählen.
do.
assign component sy-index of structure ls_structure to <la_field>.
if sy-subrc ne 0.
exit.
endif.
describe field <la_field> type ld_type length ld_length.
enddo.
Hey ja du hast recht,Alexander D. hat geschrieben:hallo Pinguincommander,
danke für das Beispiel. Ich kann es leider nicht testen, es scheint auf einem 4.7 System nicht lauffähig zu sein. Eine Frage hätte ich doch noch dazu: kann es sein, dass hier noch eine Zeile fehlt? Wofür brauchst du ls_fieldcat im CHANGING und wo greifst du auf lt_fieldcat zu? Vom Gefühl her hätte ich am Ende des Loops etwas in der Art von APPEND ls_fieldcat to lt_fieldcat erwartet...