тема достаточно регулярно возникает.
Нижеприведенный код поможет разобраться с полями из bseg и индексных таблиц.
(Исходник должен быть узким)
Code:
report ZSHOW.
tables CCSELTAB.
type-pools: ABAP,SLIS,ICON.
parameters: T1 like CCSELTAB-TABNAME value check obligatory
default 'BSEG'.
parameters: T2 like CCSELTAB-TABNAME value check obligatory
default 'BKPF'.
parameters: T3 like CCSELTAB-TABNAME default 'BSIS'.
parameters: T4 like CCSELTAB-TABNAME default 'BSID'.
parameters: T5 like CCSELTAB-TABNAME default 'BSIK'.
data WA_COMPONENTS type ABAP_COMPDESCR.
data IT_COMPONENTS type ABAP_COMPDESCR_TAB.
data IT_NAMES type table of ABAP_COMPNAME.
data WA_NAMES type ABAP_COMPNAME.
data: DESCR_STRUC_REF type ref to CL_ABAP_STRUCTDESCR,
DESCR_STRUC_REF2 type ref to CL_ABAP_STRUCTDESCR,
DESCR_STRUC_REF3 type ref to CL_ABAP_STRUCTDESCR,
DESCR_STRUC_REF4 type ref to CL_ABAP_STRUCTDESCR,
DESCR_STRUC_REF5 type ref to CL_ABAP_STRUCTDESCR.
data: begin of OUT_LINES occurs 0,
NAME like DD03L-FIELDNAME,
F1(5),
F2(5),
F3(5),
F4(5),
F5(5),
end of OUT_LINES.
data G_REPID like SY-REPID.
data: GT_FIELDCAT type SLIS_T_FIELDCAT_ALV.
data: WA_FIELDKAT type SLIS_FIELDCAT_ALV.
start-of-selection.
G_REPID = SY-REPID.
try.
DESCR_STRUC_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( T1 ).
catch CX_ROOT.
endtry.
try.
DESCR_STRUC_REF2 ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( T2 ).
catch CX_ROOT.
endtry.
if not T3 is initial.
try.
DESCR_STRUC_REF3 ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( T3 ).
catch CX_ROOT.
endtry.
endif.
if not T4 is initial.
try.
DESCR_STRUC_REF4 ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( T4 ).
catch CX_ROOT.
endtry.
endif.
if not T5 is initial.
try.
DESCR_STRUC_REF5 ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( T5 ).
catch CX_ROOT.
endtry.
endif.
if DESCR_STRUC_REF is bound.
append lines of DESCR_STRUC_REF->COMPONENTS to IT_COMPONENTS.
endif.
if DESCR_STRUC_REF2 is bound.
append lines of DESCR_STRUC_REF2->COMPONENTS to IT_COMPONENTS.
endif.
if DESCR_STRUC_REF3 is bound.
append lines of DESCR_STRUC_REF3->COMPONENTS to IT_COMPONENTS.
endif.
if DESCR_STRUC_REF4 is bound.
append lines of DESCR_STRUC_REF4->COMPONENTS to IT_COMPONENTS.
endif.
if DESCR_STRUC_REF5 is bound.
append lines of DESCR_STRUC_REF5->COMPONENTS to IT_COMPONENTS.
endif.
loop at IT_COMPONENTS into WA_COMPONENTS.
WA_NAMES = WA_COMPONENTS-NAME.
collect WA_NAMES into IT_NAMES.
endloop.
loop at IT_NAMES into WA_NAMES.
clear OUT_LINES.
OUT_LINES-NAME = WA_NAMES.
read table DESCR_STRUC_REF->COMPONENTS into WA_COMPONENTS
with key NAME = WA_NAMES.
if SY-SUBRC is initial.
OUT_LINES-F1 = ICON_CHECKED.
else.
OUT_LINES-F1 = ICON_INCOMPLETE.
endif.
read table DESCR_STRUC_REF2->COMPONENTS into WA_COMPONENTS
with key NAME = WA_NAMES.
if SY-SUBRC is initial.
OUT_LINES-F2 = ICON_CHECKED.
else.
OUT_LINES-F2 = ICON_INCOMPLETE.
endif.
if DESCR_STRUC_REF3 is bound.
read table DESCR_STRUC_REF3->COMPONENTS into WA_COMPONENTS
with key NAME = WA_NAMES.
if SY-SUBRC is initial.
OUT_LINES-F3 = ICON_CHECKED.
else.
OUT_LINES-F3 = ICON_INCOMPLETE.
endif.
endif.
if DESCR_STRUC_REF4 is bound.
read table DESCR_STRUC_REF4->COMPONENTS into WA_COMPONENTS
with key NAME = WA_NAMES.
if SY-SUBRC is initial.
OUT_LINES-F4 = ICON_CHECKED.
else.
OUT_LINES-F4 = ICON_INCOMPLETE.
endif.
endif.
if DESCR_STRUC_REF5 is bound.
read table DESCR_STRUC_REF5->COMPONENTS into WA_COMPONENTS
with key NAME = WA_NAMES.
if SY-SUBRC is initial.
OUT_LINES-F5 = ICON_CHECKED.
else.
OUT_LINES-F5 = ICON_INCOMPLETE.
endif.
endif.
append OUT_LINES.
endloop.
call function 'REUSE_ALV_FIELDCATALOG_MERGE'
exporting
I_PROGRAM_NAME = G_REPID
I_INTERNAL_TABNAME = 'OUT_LINES'
I_INCLNAME = G_REPID
I_BYPASSING_BUFFER = 'X'
changing
CT_FIELDCAT = GT_FIELDCAT
exceptions
others = 0.
WA_FIELDKAT-ICON = 'X'.
modify GT_FIELDCAT
from WA_FIELDKAT
transporting ICON
where FIELDNAME cp 'F*'.
read table GT_FIELDCAT into WA_FIELDKAT
with key FIELDNAME = 'F1'.
if SY-SUBRC is initial.
WA_FIELDKAT-SELTEXT_M = WA_FIELDKAT-SELTEXT_S.
WA_FIELDKAT-SELTEXT_L = T1.
modify GT_FIELDCAT from WA_FIELDKAT index SY-TABIX.
endif.
read table GT_FIELDCAT into WA_FIELDKAT
with key FIELDNAME = 'F2'.
if SY-SUBRC is initial.
WA_FIELDKAT-SELTEXT_M = WA_FIELDKAT-SELTEXT_S.
WA_FIELDKAT-SELTEXT_L = T2.
modify GT_FIELDCAT from WA_FIELDKAT index SY-TABIX.
endif.
if not DESCR_STRUC_REF3 is bound.
delete GT_FIELDCAT where FIELDNAME = 'F3'.
endif.
if not DESCR_STRUC_REF4 is bound.
delete GT_FIELDCAT where FIELDNAME = 'F4'.
endif.
if not DESCR_STRUC_REF5 is bound.
delete GT_FIELDCAT where FIELDNAME = 'F5'.
endif.
read table GT_FIELDCAT into WA_FIELDKAT
with key FIELDNAME = 'F3'.
if SY-SUBRC is initial.
WA_FIELDKAT-SELTEXT_M = WA_FIELDKAT-SELTEXT_S.
WA_FIELDKAT-SELTEXT_L = T3.
modify GT_FIELDCAT from WA_FIELDKAT index SY-TABIX.
endif.
read table GT_FIELDCAT into WA_FIELDKAT
with key FIELDNAME = 'F4'.
if SY-SUBRC is initial.
WA_FIELDKAT-SELTEXT_M = WA_FIELDKAT-SELTEXT_S.
WA_FIELDKAT-SELTEXT_L = T4.
modify GT_FIELDCAT from WA_FIELDKAT index SY-TABIX.
endif.
read table GT_FIELDCAT into WA_FIELDKAT
with key FIELDNAME = 'F5'.
if SY-SUBRC is initial.
WA_FIELDKAT-SELTEXT_M = WA_FIELDKAT-SELTEXT_S.
WA_FIELDKAT-SELTEXT_L = T5.
modify GT_FIELDCAT from WA_FIELDKAT index SY-TABIX.
endif.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
I_CALLBACK_PROGRAM = G_REPID
IT_FIELDCAT = GT_FIELDCAT
tables
T_OUTTAB = OUT_LINES.