使用函数REUSE_ALV_FIELDCATALOG_MERGE可以快速地参考内表或者结构体生成ALV报表的FIELDCAT,但需要注意的是所参考的内表必须是以下面这样的格式定义的,如果是先types定义一个结构体再参考此结构体创建的内表,使用此函数将会返回空的FIELDCAT。
同时,所定义的内表中的字段必须用like而不是type参考其他数据对象。
如果程序中有的地方必须参考types定义的数据类型,例如使用create data创建对象时所参考的结构体必须是types定义的结构体或者SE11里创建好的结构或表;有的地方又必须要用DATA…OCCURS 0这样的方式定义的数据类型,可以考虑分别用types和data定义两份数据类型,虽然代码上有些冗余,但至少快速、干净利索地解决问题了。
如下为Demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
DATA : BEGIN OF ITAB_FIELDCATALOG_MERGE OCCURS 0, VKORG LIKE VBAK-VKORG , VTEXT LIKE TVKOT-VTEXT , RBUKRS LIKE ACDOCA-RBUKRS, PRCTR LIKE ACDOCA-PRCTR, RACTT_VF LIKE ACDOCA-RACCT, RACTT_DES LIKE SKAT-TXT50, END OF ITAB_FIELDCATALOG_MERGE. * ALV 参数 TYPE-POOLS : SLIS. DATA : GV_REPID TYPE SY-REPID, FIELDCAT TYPE TABLE OF SLIS_FIELDCAT_ALV WITH HEADER LINE, LAYOUT TYPE SLIS_LAYOUT_ALV, VAR TYPE DISVARIANT. *******快速生成FIELDCAT. FORM FRM_INIT_FC . GV_REPID = SY-REPID. ** 获取內表定义的静态结构 CALL FUNCTION 'SBUF_OBJ_RESET_OBJECT' "Reset the alv buffer EXPORTING BUFF_ID = 0 INV_CODE = 'DEL_WORLD_GENERIC ' TABNAME = 'EUINFO' KEY = '%F' KEY_L = 2. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING I_PROGRAM_NAME = GV_REPID * I_STRUCTURE_NAME = 'ITAB' I_INTERNAL_TABNAME = 'ITAB_FIELDCATALOG_MERGE' I_INCLNAME = GV_REPID CHANGING CT_FIELDCAT = FIELDCAT[] 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. DELETE FIELDCAT WHERE FIELDNAME = 'BOX'. "放开全部字段. LOOP AT FIELDCAT ASSIGNING FIELD-SYMBOL(<LFS_FC>). CLEAR <LFS_FC>-NO_OUT. ENDLOOP. ENDFORM. |
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/4229.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。