在 ALV 定义 Fieldcat 的时候,我们往往需要通过 slis_fieldcat_alv 的赋值给Fieldcat导入结构。
如上篇文章中给出的例子:
01 02 03 04 05 06 07 08 09 10 11 12 13 | DATA : wa_fieldcat TYPE slis_fieldcat_alv , i_fieldcat TYPE slis_t_fieldcat_alv , i_layout TYPE slis_layout_alv. wa_fieldcat-tabname = 'I_TAB' . wa_fieldcat-fieldname = 'MATNR' . " 需要输出的内表的字段名 wa_fieldcat-seltext_l = 'Material NO.' . " 字段的描述-长字段标签 wa_fieldcat-seltext_m = 'Material NO.' . " 字段描述-中字段标签 wa_fieldcat-seltext_s = 'Material NO.' . " 字段描述-短字段标签 wa_fieldcat-fix_column = 'X' . " 是否是固定列 APPEND wa_fieldcat TO i_fieldcat. CLEAR wa_fieldcat. |
上面的例子中,只给 fieldcat 中增加了一行记录,即 ALV 只输出一列数据;
如若我们需要输出的 ALV 字段非常多,比如50个字段(会有这种需求);
这时候,就会重复操作同样的赋值语句,这只会增加我们的开发量,没法提高效率;
如果开发中又需要对一些字段做属性修改,又需要对相应的 Fieldcat 字段添加属性,这又是一个烦躁的过程;
一般这种情况下,可以通过两种方法解决上面的问题。
一种是通过定义宏,来为Fieldcat 赋值;
一种是通过REUSE_ALV_FIENDCATALOG_MERGE函数为Fieldcat赋值。
或者是两种方法结合。
1. 宏定义
宏定义的操作较为简单,不做详细说明,这里直接给出示例:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | DATA : gw_fieldcat_print TYPE lvc_s_fcat, gt_fieldcat_print TYPE lvc_t_fcat. * 定义宏 DEFINE def_fieldcat_print. clear gw_fieldcat_print. gw_fieldcat_print-fieldname = &1. "字段名称 gw_fieldcat_print-ref_table = &2. "参考内表 gw_fieldcat_print-reptext = &3. "字段名称 gw_fieldcat_print-coltext = &3. "字段名称 gw_fieldcat_print-scrtext_l = &3. "长文本 gw_fieldcat_print-scrtext_m = &3. "中文本 gw_fieldcat_print-scrtext_s = &3. "短文本 gw_fieldcat_print-no_zero = &4. "去零显示 gw_fieldcat_print-edit = &5. "编辑 gw_fieldcat_print-outputlen = &6. "字段输出长度 gw_fieldcat_print-checkbox = &7. "以复选框形式输出 gw_fieldcat_print-do_sum = &8. "小计 append gw_fieldcat_print to gt_fieldcat_print. END - OF - DEFINITION . * 定义宏 def_fieldcat_print 'CHECK' '' '选择' '' 'X' '10' 'X' '' . def_fieldcat_print 'KDAUF' '' '订单号' 'X' '' '10' '' '' . def_fieldcat_print 'KDPOS' '' '行项目号' '' '' '6' '' '' . def_fieldcat_print 'WERKS' '' '工厂' '' '' '6' '' '' . def_fieldcat_print 'AUFNR' '' '生产工单号' 'X' '' '10' '' '' . |
2. REUSE_ALV_FIENDCATALOG_MERGE函数
REUSE_ALV_FIENDCATALOG_MERGE函数可以根据现有的内表结构返回FIELDCAT字段结构信息;
其中包括数据字典中的结构、透明表、视图,自定义的Add-On表、结构、视图;
也包括程序中定义的全局、局部结构、内表。
REUSE_ALV_FIENDCATALOG_MERGE 函数的输入输出参数:
1) Import参数:
I_PROGRAM_NAME:程序名称
I_INTERNAL_TABNAME:内表名称,必须为输出内表的自定义STRUCTURE
I_STRUCTURE_NAME:结构名称,直接参考数据字典中的透明表、视图或STRUCTURE
I_CLIENT_NEVER_DISPLAY:显示Client字段
I_INCLNAME:Include 名称
2) Changing参数:
CT_FIELDCAT:导出的Fieldcat结构信息
这里需要注意的是,I_INTERNAL_TABNAME 与 I_STRUCTURE_NAME 参数只需一项。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | DATA : BEGIN OF gt_out, "输出表 machine(5) TYPE n, ton(5) TYPE n, END OF gt_out. DATA :i_fieldcat TYPE slis_t_fieldcat_alv. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = sy-repid i_internal_tabname = 'GT_OUT' * i_structure_name = 'GT_OUT' i_inclname = sy-repid CHANGING ct_fieldcat = i_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 . |
从上面的程序可以看出,在定义内表结构时,使用了 Data 关键字来定义内表结构;
有时候,也会习惯于用TYPES关键字定义内表结构;但在这里,如若用Types定义结构时,该函数则会取不到任何相关的信息:

reuse_alv_fieldcatalog_merge
然后,还要注意的一点是,由于REUSE_ALV_FIELDCATALOG_MERGE 函数中导出的Fieldcat结构为slis_t_fieldcat_alv;
故该函数只能和 REUSE_ALV_GRID_DISPLAY 函数一起使用,不能用于 REUSE_ALV_GRID_DISPLAY_LVC 函数。
必须需要使用REUSE_ALV_GRID_DISPLAY_LVC 函数的,则可以通过前面讲到的定义宏来为Fieldcat提交相关信息。
下面给出一个示例:
01 02 03 04 05 06 07 08 09 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | DATA : BEGIN OF gt_out OCCURS 0, "输出表 machine(5) TYPE n, "机台 ton(5) TYPE n, "吨位 extwg LIKE mara-extwg, "客户 zeinr LIKE mara-zeinr, "机种 matnr LIKE mara-matnr, "内部品番 maktx LIKE makt-maktx, "外部品番 vgw04 LIKE afvv-vgw04, "周期 bmsch(16) TYPE n, "取数 ngrad LIKE kako-ngrad, "收率 abili(7) TYPE p, "日生产能力 kpcs01(7) TYPE p DECIMALS 3, "产量 days01(5) TYPE p DECIMALS 2, "生产天数 work01(2) TYPE n, "工作天数 acti01 LIKE konv-kbetr, "稼动率 END OF gt_out. * ALV 定义 TYPE - POOLS :slis. DATA : g_repid LIKE sy-repid, gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE , gt_layout TYPE slis_layout_alv. DEFINE modify_fieldcat1. READ TABLE gt_fieldcat INDEX &1. gt_fieldcat-seltext_m = &2. gt_fieldcat-ddictxt = 'M' . MODIFY gt_fieldcat INDEX &1. END - OF - DEFINITION . DATA :lv_index LIKE sy-tabix, lv_text TYPE scrtext_m. g_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = g_repid i_internal_tabname = 'GT_OUT' i_inclname = g_repid CHANGING ct_fieldcat = gt_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 . modify_fieldcat1: 1 '机台' , 2 '吨位' , 3 '客户' , 4 '机种' , 5 '内部品番' , 6 '外部品番' , 7 '周期' , 8 '取数' , 9 '收率' , 10 '日生产能力' . READ TABLE gt_fieldcat INDEX 8. gt_fieldcat-no_zero = 'X' . MODIFY gt_fieldcat INDEX 8. gt_layout-colwidth_optimize = 'X' . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = g_repid is_layout = gt_layout it_fieldcat = gt_fieldcat[] i_save = 'X' TABLES t_outtab = gt_out EXCEPTIONS program_error = 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 . |