1、文档说明

如之前文档《MIGO新增页签增强》,在MIGO中增强自定义字段,那么在查询MB51时,想通过自定义字段进行筛选,并将数据展示到报表中,就需要对MB51进行增强。

此处需要说明,文档《MIGO新增页签增强》中是将自定义字段存入自建表中,读者也可以自己研究,是否能将字段存入标准表MSEG中。两种做法不同,则在本篇文档中的做法也有一定区别,请读者予以辨别。

2、增强实施

2.1、增强字段

文档《MIGO新增页签增强》中将MIGO增强字段存储在表ZTPP001中

因为需要将数据展示在报表中,所以要在标准表中增强该字段

MSEG

MATDOC

此处请注意,如果增强的字段和MIGO中增强的字段名称一致,则需要修改MIGO增强页签中的一段逻辑

文档《MIGO新增页签增强》中在增强方法IF_EX_MB_MIGO_BADI~POST_DOCUMENT中,将MIGO增强的字段存表时,为了得到物料凭证、年度、行项目的值,曾使用MOVE-CORRESPONDING,将MSEG结构的数据传递到自建表的内表中。如果MSEG增强字段和ZTPP001字段名一致,就会使ZTPP001的ZNUM被MSEG的ZNUM(空值)覆盖掉,所以此处可以单独将物料凭证、年度、行项目赋值给ZTPP001的内表。当然,读者也可以定义不一样的字段名,避免覆盖的情况。

2.2、配置选择屏幕

可以通过配置,为MB51新增筛选和展示字段

TCODE:SPRO

新增对应字段,其中选择字段:显示在选择屏幕中,输出字段:显示在报表中

保存之后,重新执行MB51,标准代码则自动更新,此时单据号字段就显示在选择屏幕上

 查看包含文件RM07DOCS_GENERATED,可以看到代码更新的时间

选择屏幕代码中也已经自动添加了ZNUM

 2.3、隐式增强

在RM07DOCS_GENERATED的子例程FORM DATA_SELECTION_NEW开头位置创建隐式增强

 代码如下

"--------------------@斌将军--------------------
IF sy-tcode = 'MB51'.
  IF znum[] IS NOT INITIAL."当选择屏幕筛选字段有值
    SELECT
      mblnr,
      mjahr,
      zeile,
      znum
      FROM ZTPP001
      INTO TABLE @DATA(lt_ztpp001)
      WHERE znum IN @znum.
    "将物料凭证、年度、行项目赋值到对应的筛选字段中
    LOOP AT lt_ztpp001 INTO DATA(ls_ztpp001).
      mblnr-low = ls_ztpp001-mblnr.
      mblnr-sign = 'I'.
      mblnr-option = 'EQ'.
      APPEND mblnr.
      CLEAR mblnr.
      mjahr-low = ls_ztpp001-mjahr.
      mjahr-sign = 'I'.
      mjahr-option = 'EQ'.
      APPEND mjahr.
      CLEAR mjahr.
      zeile-low = ls_ztpp001-zeile.
      zeile-sign = 'I'.
      zeile-option = 'EQ'.
      APPEND zeile.
      CLEAR zeile.
      CLEAR:ls_ztpp001.
    ENDLOOP.
    "标准表中该字段是空的,并不存值,所以此处要清空,
    "避免标准代码用此字段筛选查询MSEG表,导致数据为空,所以此处要清空
    CLEAR znum[].
  ENDIF.
ENDIF.
"--------------------@斌将军--------------------

同样的代码,增强到以下子例程的开头处

FORM DATA_SELECTION

FORM DATA_SELECTION_VIA_MATNR

FORM DATA_SELECTION_VIA_BUDAT 

在RM07DOCS的FORM detail_list中创建隐式增强,将该字段数据赋值到ALV中

代码如下

"--------------------@斌将军--------------------
ENHANCEMENT 5  ZEMM_MB51_APPEND.    "active version
IF list[] IS NOT INITIAL.
  DATA(lt_list) = list[].

  SELECT
    ztpp001~mblnr,
    ztpp001~mjahr,
    ztpp001~zeile,
    ztpp001~ZNUM
  FROM ZTPP001
  INNER JOIN @lt_list AS LIST ON ztpp001~mblnr = LIST~MBLNR
                          AND ztpp001~mjahr = LIST~mjahr
                          AND ztpp001~zeile = LIST~zeile
  INTO TABLE @DATA(LT_ZPP001).

  SORT LT_ZPP001 BY MBLNR MJAHR ZEILE.

  LOOP AT list ASSIGNING FIELD-SYMBOL(<fs_list>).
    READ TABLE LT_ZPP001 INTO DATA(LS_ZPP001) WITH KEY mblnr = <fs_list>-MBLNR
                                                        mjahr = <fs_list>-mjahr
                                                        zeile = <fs_list>-zeile BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      <fs_list>-ZNUM = LS_ZPP001-ZNUM.
    ENDIF.
  ENDLOOP.

ENDIF.
ENDENHANCEMENT.
"--------------------@斌将军--------------------

 2.4、测试效果

输入单据号

数据表中存储的数据

运行结果

 2.5、问题说明

此方法实现的屏幕筛选,并不能像常规一样,多个筛选条件取交集,而是与其他筛选字段取并集。读者可以根据项目情况,灵活更改代码实现需求。

3、MB51代码重置

正常情况下,如上文中配置完屏幕字段后,运行MB51,对应的MB51源码就能更新。但是也存在个例,运行MB51时,源代码没有更新过来,选择屏幕中并没有对应的字段

推测原因,有系统本身的原因,也有可能是开发的增强与MB51要更新的代码出现了冲突,导致更新失败。

例如:有的选择屏幕字段,是直接增强上去的,而不是配置的,导致配置的字段与原本增强的字段重复,所以更新失败

解决方法一:

注释选择屏幕中自开发的增强字段和相关的增强,然后运行MB51,保证程序不DUMP的情况下,程序就会自动再更新源码

解决方法二:

如果仍然不能更新,则采用以下办法,根据官方提供的程序,手动执行更新

首先注释与选择屏幕相关的自开发增强逻辑,保证源码被重置时,使用到选择屏幕等字段的相关逻辑不报错,保证MB51的正常运行

找到官方NOTE:

根据官方源码,创建并执行程序

对比前后的RM07DOCS_GENERATED,可以发现选择屏幕等源代码全部都没了

执行事务代码MB51,重新生成对应代码

配置的字段就更新进来了

 

定期更文,欢迎关注

 

TRANSLATE with
x
English

Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  


 
TRANSLATE with

COPY THE URL BELOW



Back
EMBED THE SNIPPET BELOW IN YOUR SITE


Enable collaborative features and customize widget: Bing Webmaster Portal
Back