在 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 函数中导出的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 .
|
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20175.html