ALV FIELDCAT添加属性 – REUSE_ALV_FIELDCATALOG_MERGE函数详解编程语言

在 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

 

然后,还要注意的一点是,由于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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论