MBLB 自定义字段增强

作者:ABAP三叔 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

# MBLB自定义字段增强

原创 ABAP三叔 [ ABAP三叔 ](javascript:void\(0\);)

__ _ _ _ _

前言

MBLB显示分包商库存报表, 本文以取MARA表的自定义字段为例,介绍MBLB报表的增强方法。

需求描述

在MARA表中增加的自定义字段有“品牌”、“系列”、“大类”、“小类”、“年份”、“季节”、“渠道”六个字段,这六个字段也只是存的KEY值,描述在另外的对照表中

。见下图

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

现在需要在MBLB报表中取出物料对应的这六个字段的描述。

增强实现

1.创建结构体 zsmara_ txt ,用来存放六个字段的描述。

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

2.se38打开报表RM07MLBB,找到itab结构定义的结尾,创建隐式增强,增加mara表中的六个字段。

2.1 隐式增强创建方法,如图所示(以下截图来自MB51增强)

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

2.2 增强代码如下:

• * * * * * * * * * * * *

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Struct. ITAB, End S*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 1  ZEHN_MBLB.    "active versionDATA: zbrand_txt TYPE zsmara_txt-zbrand_txt, zseries_txt TYPE zsmara_txt-zseries_txt, zmat_cate_txt TYPE zsmara_txt-zmat_cate_txt, zsm_cate_txt TYPE zsmara_txt-zsm_cate_txt, zyear_txt TYPE zsmara_txt-zyear_txt, zseason_txt TYPE zsmara_txt-zseason_txt, zchannel_txt TYPE zsmara_txt-zchannel_txt.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*

3.在FORM output 开始前增加代码。代码如下:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(2) Form OUTPUT, Start A*$*$-Start: (2)---------------------------------------------------------------------------------$*$*ENHANCEMENT 3  ZEHN_MBLB.    "active versionDATA lt_fieldcat TYPE slis_t_fieldcat_alv.DATA lv_lines TYPE i.IF p_grid IS INITIAL. lv_lines = lines( fc ).ENDIF.CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = sy-repid* I_INTERNAL_TABNAME = i_structure_name = 'ZSMARA_TXT'* I_CLIENT_NEVER_DISPLAY = 'X'* I_INCLNAME =* I_BYPASSING_BUFFER =* I_BUFFER_ACTIVE = CHANGING ct_fieldcat = lt_fieldcat* EXCEPTIONS* INCONSISTENT_INTERFACE = 1* PROGRAM_ERROR = 2* OTHERS = 3 .IF sy-subrc <> 0.* Implement suitable error handling hereENDIF.LOOP AT lt_fieldcat INTO DATA(ls_fieldcat). lv_lines += 1. ls_fieldcat-col_pos = lv_lines. ls_fieldcat-tabname = 'ITAB'. CLEAR ls_fieldcat-ref_tabname. IF p_grid IS INITIAL. APPEND ls_fieldcat TO fc. ENDIF.ENDLOOP. DATA: BEGIN OF lt_mara OCCURS 0, matnr TYPE mara-matnr, zbrand TYPE mara-zbrand, zseries TYPE mara-zseries, zmat_cate TYPE mara-zmat_cate, zsm_cate TYPE mara-zsm_cate, zyear TYPE mara-zyear, zseason TYPE mara-zseason, zchannel TYPE mara-zchannel, END OF lt_mara.DATA: BEGIN OF lt_ztmm015a OCCURS 0, fieldname TYPE ztmm015a-fieldname, ddkey TYPE ztmm015a-ddkey, ddtext TYPE ztmm015a-ddtext, END OF lt_ztmm015a.DATA: lt_ztmd001b TYPE STANDARD TABLE OF ztmd001b.DATA: lt_ztmd001c TYPE STANDARD TABLE OF ztmd001c.IF itab[] IS NOT INITIAL. SELECT matnr zbrand zseries zmat_cate zsm_cate zyear zseason zchannel INTO TABLE lt_mara FROM mara FOR ALL ENTRIES IN itab WHERE matnr = itab-matnr. SORT lt_mara BY matnr.* 码表:渠道/季节/年份 SELECT fieldname ddkey ddtext INTO TABLE lt_ztmm015a FROM ztmm015a WHERE ( fieldname = 'ZCHANNEL' OR fieldname = 'ZSEASON' OR fieldname = 'ZYEAR' ) AND langu = sy-langu.*品牌/系列 SELECT * INTO TABLE lt_ztmd001b FROM ztmd001b. SORT lt_ztmd001b BY zbrand zseries.*大类/小类 SELECT * INTO TABLE lt_ztmd001c FROM ztmd001c. SORT lt_ztmd001c BY zmat_cate zsm_cate. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_data>). READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = <fs_data>-matnr BINARY SEARCH. CHECK sy-subrc = 0. IF ls_mara-zbrand IS NOT INITIAL. READ TABLE lt_ztmd001b INTO DATA(ls_ztmd001b) WITH KEY zbrand = ls_mara-zbrand BINARY SEARCH. <fs_data>-zbrand_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmd001b-zbrand_txt ELSE ls_mara-zbrand ). ENDIF. IF ls_mara-zseries IS NOT INITIAL. READ TABLE lt_ztmd001b INTO ls_ztmd001b WITH KEY zbrand = ls_mara-zbrand zseries = ls_mara-zseries BINARY SEARCH. <fs_data>-zseries_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmd001b-zseries_txt ELSE ls_mara-zseries ). ENDIF. IF ls_mara-zmat_cate IS NOT INITIAL. READ TABLE lt_ztmd001c INTO DATA(ls_ztmd001c) WITH KEY zmat_cate = ls_mara-zmat_cate BINARY SEARCH. <fs_data>-zmat_cate_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmd001c-zmat_cate_txt ELSE ls_mara-zmat_cate ). ENDIF. IF ls_mara-zsm_cate IS NOT INITIAL. READ TABLE lt_ztmd001c INTO ls_ztmd001c WITH KEY zmat_cate = ls_mara-zmat_cate zsm_cate = ls_mara-zsm_cate BINARY SEARCH. <fs_data>-zsm_cate_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmd001c-zsm_cate_txt ELSE ls_mara-zsm_cate ). ENDIF. IF ls_mara-zchannel IS NOT INITIAL. READ TABLE lt_ztmm015a INTO DATA(ls_ztmm015a) WITH KEY fieldname = 'ZCHANNEL' ddkey = ls_mara-zchannel. <fs_data>-zchannel_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmm015a-ddtext ELSE ls_mara-zchannel ). ENDIF. IF ls_mara-zseason IS NOT INITIAL. READ TABLE lt_ztmm015a INTO ls_ztmm015a WITH KEY fieldname = 'ZSEASON' ddkey = ls_mara-zseason. <fs_data>-zseason_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmm015a-ddtext ELSE ls_mara-zseason ). ENDIF. IF ls_mara-zyear IS NOT INITIAL. READ TABLE lt_ztmm015a INTO ls_ztmm015a WITH KEY fieldname = 'ZYEAR' ddkey = ls_mara-zyear. <fs_data>-zyear_txt = COND #( WHEN sy-subrc = 0 THEN ls_ztmm015a-ddtext ELSE ls_mara-zyear ). ENDIF. ENDLOOP.ENDIF.ENDENHANCEMENT.*$*$-End: (2)---------------------------------------------------------------------------------$*$*

4\. 在FORM detail_list 开始前增加代码。 代码如下:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(3) Form DETAIL_LIST, Start A*$*$-Start: (3)---------------------------------------------------------------------------------$*$*ENHANCEMENT 2  ZEHN_MBLB.    "active versionIF p_grid IS NOT INITIAL. DATA lt_fieldcat TYPE slis_t_fieldcat_alv. DATA lv_lines TYPE i. lv_lines = lines( fc ). CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_program_name = sy-repid* I_INTERNAL_TABNAME = i_structure_name = 'ZSMARA_TXT'* I_CLIENT_NEVER_DISPLAY = 'X'* I_INCLNAME =* I_BYPASSING_BUFFER =* I_BUFFER_ACTIVE = CHANGING ct_fieldcat = lt_fieldcat* EXCEPTIONS* INCONSISTENT_INTERFACE = 1* PROGRAM_ERROR = 2* OTHERS = 3 . IF sy-subrc <> 0.* Implement suitable error handling here ENDIF. LOOP AT lt_fieldcat INTO DATA(ls_fieldcat). lv_lines += 1. ls_fieldcat-col_pos = lv_lines. ls_fieldcat-tabname = 'ITAB'. APPEND ls_fieldcat TO fc. ENDLOOP.ENDIF.ENDENHANCEMENT.*$*$-End: (3)---------------------------------------------------------------------------------$*$*

效果展示

1\. 层级ALV

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

2.非层级ALV

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

总结

MBLB总共需增强3个地方:一处为内表结构增强;一处为层级ALV显示的增强;另一处为非层级ALV显示的增强。朋友们可根据自己实际需求,调整字段和取值逻辑即可。

MBLB 自定义字段增强 - 封面图
MBLB 自定义字段增强 - 封面图

— END —

MBLB 自定义字段增强 - 封面图.textContent = new Date().getFullYear();