You can achieve it in the way described below. I wrote a sample code snippet with comments. Basically the starting table is LTDX
.
First read the layouts for the program using FM LT_VARIANTS_READ_FROM_LTDX
. Replace REPORT_NAME_REPLACE
with your program name of interest. Additionally you can filter layouts for specific user(s) - uncomment lines with range table lt_r_uname
and replace LOGIN_REPLACE
with your login.
TYPES: ty_r_repid TYPE RANGE OF syrepid,
ty_r_uname TYPE RANGE OF syst_uname.
DATA: lt_variants TYPE TABLE OF ltvariant.
DATA(lt_r_repid) = VALUE ty_r_repid(
( sign = 'I' option = 'EQ' low = 'REPORT_NAME_REPLACE' )
).
DATA(lt_r_uname) = VALUE ty_r_uname(
( sign = 'I' option = 'EQ' low = 'LOGIN_REPLACE' )
).
CALL FUNCTION 'LT_VARIANTS_READ_FROM_LTDX'
EXPORTING
i_tool = 'LT'
i_text = 'X'
TABLES
et_variants = lt_variants
it_ra_report = lt_r_repid.
* it_ra_username = lt_r_uname.
IF sy-subrc <> 0.
WRITE: / 'Not layout(s) found.'.
EXIT.
ENDIF.
Next for the found layout(s) read the data - basic field catalog - with FM LT_DBDATA_READ_FROM_LTDX
and afterwards the field catalog itself with FM LT_FC_LOAD
.
LOOP AT lt_variants ASSIGNING FIELD-SYMBOL(<fs_variant>).
DATA: lt_fcat_base TYPE TABLE OF ltdxdata,
lt_fcat_def TYPE kkblo_t_fieldcat,
lt_fcat TYPE kkblo_t_fieldcat,
ls_layout TYPE kkblo_layout.
DATA(ls_key_base) = CORRESPONDING ltdxkey( <fs_variant> ).
CALL FUNCTION 'LT_DBDATA_READ_FROM_LTDX'
EXPORTING
i_tool = 'LT'
is_varkey = ls_key_base
TABLES
t_dbfieldcat = lt_fcat_base.
IF sy-subrc = 0.
DATA(ls_key) = CORRESPONDING disvariant( <fs_variant> ).
LOOP AT lt_fcat_base ASSIGNING FIELD-SYMBOL(<fs_fcat_base>).
COLLECT VALUE kkblo_fieldcat( fieldname = <fs_fcat_base>-key1 )
INTO lt_fcat_def.
ENDLOOP.
CALL FUNCTION 'LT_FC_LOAD'
EXPORTING
is_variant = ls_key
i_tabname = '1'
IMPORTING
et_fieldcat = lt_fcat
CHANGING
cs_layout = ls_layout
ct_default_fieldcat = lt_fcat_def.
IF sy-subrc = 0.
LOOP AT lt_fcat_base ASSIGNING <fs_fcat_base>
WHERE param = 'NO_OUT' AND value = 'X'.
DELETE lt_fcat WHERE fieldname = <fs_fcat_base>-key1.
ENDLOOP.
SORT lt_fcat BY col_pos.
* Field catalog for layout is in internal table lt_fcat
* Debug output: layout and fields
WRITE: / |Layout: { <fs_variant>-variant } [{ <fs_variant>-username }] |.
LOOP AT lt_fcat ASSIGNING FIELD-SYMBOL(<ls_fcat>).
WRITE: /9 |{ <ls_fcat>-fieldname }|.
ENDLOOP.
ELSE.
WRITE: |No field catalog found for layout { <fs_variant>-variant }|.
ENDIF.
CLEAR: lt_fcat_def.
ELSE.
WRITE: |No data found for layout { <fs_variant>-variant }|.
ENDIF.
ENDLOOP.
The internal table lt_fcat contains columns of the layout: component fieldname the name of the column and col_pos its position. I filtered out from the internal table the columns which have parameter NO_OUT = 'X' and therefore are not displayed in the layout.