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 函数中导出的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 .
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: reuse_alv_fieldcatalog_merge是一个ABAP函数模块,用于合并两个ALV字段目录。它可以将两个字段目录合并成一个,并且可以根据需要进行排序、删除重复项等操作。这个函数模块通常用于在ALV报表中显示数据时,对字段目录进行处理和优化。 ### 回答2: reuse_alv_fieldcatalog_merge是一个ABAP函数模块,用于合并两个ALV字段目录。 ALV字段目录是一个内部表,包含了对应于显示在ALV表格中的字段的元数据信息。它定义了字段的名称、类型、宽度、对齐方式、数据类型和编辑输出选项等。 这个函数模块的作用是将两个字段目录合并为一个字段目录。它将两个字段目录的内容逐行比较,并进行合并。如果字段名称相同,它将会合并其他属性,如类型、宽度等。如果字段名称不同,它将会将两个字段分别加到合并后的目录中。 使用这个函数模块可以方便地合并两个字段目录,并避免手动处理合并过程中的重复和冲突。 使用示例: DATA: lt_fieldcat1 TYPE TABLE OF lvc_s_fcat, lt_fieldcat2 TYPE TABLE OF lvc_s_fcat, lt_merged_fieldcat TYPE TABLE OF lvc_s_fcat. lt_fieldcat1 = ... "填充第一个字段目录 lt_fieldcat2 = ... "填充第二个字段目录 CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING it_fieldcatalog1 = lt_fieldcat1 it_fieldcatalog2 = lt_fieldcat2 IMPORTING et_fieldcatalog = lt_merged_fieldcat. 现在,lt_merged_fieldcat中包含了合并后的字段目录,可以用于创建或修改一个ALV表格的显示。 ### 回答3: reuse_alv_fieldcatalog_merge是一个在ABAP程序中用于合并两个ALV Field Catalog函数模块。它的作用是将两个Field Catalog合并成一个,以便在ALV报表中使用。 要使用reuse_alv_fieldcatalog_merge,首先需要定义两个ALV Field Catalog,然后将它们作为输入参数传递给该函数模块。当函数模块被调用时,它会将两个Field Catalog合并成一个,并返回合并后的Field Catalog函数模块会将两个Field Catalog中的字段和属性进行合并。如果两个Field Catalog中存在相同的字段,则它们的属性会根据合并规则进行相应的处理。例如,如果两个Field Catalog中都定义了同一个字段的标题(field catalog的字段名称),则可以选择保留某一个Field Catalog的标题,或者合并两个标题。 使用reuse_alv_fieldcatalog_merge可以方便地将两个Field Catalog合并在一起,以便在ALV报表中显示所需的字段和属性。合并后的Field Catalog可以后续用于生成ALV报表的列设置和字段显示。这可以大大简化ABAP程序的开发工作,提高开发效率。 总之,通过reuse_alv_fieldcatalog_merge函数模块,我们可以在ABAP程序中快速、简便地合并两个ALV Field Catalog,以便在ALV报表中使用。这有助于更好地展示和处理数据,并提高ABAP程序的可读性和实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值