一般调用两个FUNCTION 就能实现.
1. REUSE_ALV_FIELDCATALOG_MERGE
用来将内表结构转化为slis_t_fieldcat_alv类型的数据.
2. LVC_TRANSFER_FROM_SLIS
用来将普通ALV格式等数据转化为面对对象方法所需要的数据.与上面的FUNCTION一起使用.半自动创建ALV显示字段.
DATA: ls_fcat TYPE lvc_s_fcat.
DATA: ls_slis_fcat TYPE slis_t_fieldcat_alv.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_internal_tabname = 'GT_LIST'
* i_structure_name =
* I_CLIENT_NEVER_DISPLAY = 'X'
i_inclname = sy-repid
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = ls_slis_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS'
EXPORTING
it_fieldcat_alv = ls_slis_fcat
* IT_SORT_ALV =
* IT_FILTER_ALV =
* IS_LAYOUT_ALV =
IMPORTING
et_fieldcat_lvc = p_gt_fieldcat[]
* ET_SORT_LVC =
* ET_FILTER_LVC =
* ES_LAYOUT_LVC =
TABLES
it_data = gt_list
EXCEPTIONS
it_data_missing = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
第一个FUNCTION中的 i_internal_tabname 参数需要注意, 如果是参考工作区的结构生成的内表而不是用OCCURS 申明的话,最好在这个参数后面填上工作区结构名字,事实证明,能达到同样的效果.在使用OO开发ALV时,有一个FUNCTION 名字叫LVC_FIELDCATALOG_MERGE,功能和上面差不多,但貌似无法将内表按结构生成对应的FIELDCAT.