ME21N增强(辅助输入)

最近接到一个需求要实现在创建PO时批量为行项目输入成本中心和税码,我的第一反应是让这两个字段在行项目区域直接可以编辑,但成本中心与行项目基本数据并不在一个结构中所以可能比较麻烦,后来采取了在抬头增加批输入子屏幕的方式,实现抬头输入项目自动获取,以下是实现的方式:

 

  1. 首先创建自建表,其中要包含增强字段

参考 MEPOBADIEX复制一个新的函数组

进入include程序TOP的部分定义增强结构

参考定义的结构创建一个子屏幕

2,进入SE19创建BADI:ME_GUI_PO_CUST的实现

进入实施类中参考增强结构添加属性

 

在Method: SUBSCRIBE中添加子屏幕

    DATALS_SUBSCRIBERS TYPE MEPO_SUBSCRIBERS.
    IF SY-TCODE 'ME21N'.
* we want to add a customer subscreen on the Header tab
      CHECK IM_APPLICATION 'PO'.
      CHECK IM_ELEMENT     'HEADER'.

      CLEAR LS_SUBSCRIBERS.
      LS_SUBSCRIBERS-NAME SUBSCREEN1.
      LS_SUBSCRIBERS-DYNPRO '0100'.
      LS_SUBSCRIBERS-PROGRAM 'SAPLZFG_POCREN01'.
      LS_SUBSCRIBERS-STRUCT_NAME 'ZEKKO01'.
      LS_SUBSCRIBERS-LABEL '辅助输入(增强)'.
      LS_SUBSCRIBERS-POSITION 11.
      LS_SUBSCRIBERS-HEIGHT 6.
      APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.
    ENDIF.

这里注意要填入函数组的程序名、自建的增强表名、屏幕号以及子屏幕的描述等参数

在Method:MAP_DYNPRO_FIELDS中添加代码,为增强字段分配编号

  METHOD IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIELDS.
    FIELD-SYMBOLS<MAPPING> LIKE LINE OF CH_MAPPING.

    LOOP AT CH_MAPPING ASSIGNING <MAPPING>.
      CASE <MAPPING>-FIELDNAME.
        WHEN 'KOSTL'<MAPPING>-METAFIELD MMMFD_CUST_01.
        WHEN 'MWSKZ'<MAPPING>-METAFIELD MMMFD_CUST_02.
      ENDCASE.
    ENDLOOP.
  ENDMETHOD.

 

这个增强需要实现的功能比较简单,只需要将结构上的之传出到BADI里就可以了

所以这里需要在屏幕PAI事件中将数据传出

 

在Method: IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP中调用函数组中的FUNCTION 'ZCI_EKKODB_POP'

 

  METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP.
    IF IM_NAME SUBSCREEN1.
      CALL FUNCTION 'ZFG_POCREN01_POP'
        IMPORTING
          EX_DYNP_DATA DYNP_DATA_PAI.

    ENDIF.

    IF DYNP_DATA_PAI <> DYNP_DATA_PBO.
* something has changed therefor we have to notify the framework
* to transport data to the model
      RE_CHANGED MMPUR_YES.
    ENDIF.
  ENDMETHOD.

在函数组中找到FUNCTION ' ZFG_POCREN01_POP'

这里的函数需要自行修改为自己的增强表结构

 

在Method:IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL中添加代码,这里我选择直接用ABAP内存将数据传出,然后在其他BADI中接收

 

  METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL.
*--------------------------------------------------------------------*
* data have to be transported to business logic
*--------------------------------------------------------------------*
    IF IM_NAME SUBSCREEN1.

      EXPORT DYNP_DATA_PAI FROM DYNP_DATA_PAI TO MEMORY ID 'DYNP_DATA_PAI'.
    
    
ENDIF.
  ENDMETHOD.

 

  1. 创建BADI:ME_PROCESS_PO_CUST的实现

在方法IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER中添加代码:

  METHOD IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER.
    DATALV_PERSISTENT TYPE MMPUR_BOOL.
    FIELD-SYMBOLS<FS> LIKE LINE OF CH_FIELDSELECTION.

    DEFINE SET_INPUT.
      READ TABLE CH_FIELDSELECTION ASSIGNING <FS> WITH TABLE KEY METAFIELD &1.
      IF SY-SUBRC 0.
       IF IM_HEADER->IS_CHANGEABLE( ) = MMPUR_YES.
         <FS>-FIELDSTATUS '+'.
       ELSE.
         <FS>-FIELDSTATUS '*'.
       ENDIF.
      ENDIF.
    END-OF-DEFINITION.

* IF THE ITEM IS ALREADY ON THE DATABASE, WE DISALLOW TO CHANGE FIELD BADI_BSGRU
    LV_PERSISTENT IM_HEADER->IS_PERSISTENT( ).

    SET_INPUT MMMFD_CUST_01.
    SET_INPUT MMMFD_CUST_02.
  ENDMETHOD.

这里控制分配了编号的增强字段的可编辑性,如果没有添加则字段只会在现实状态下出现

 

最后在修改项目和账户数据的方法中读取abap内存数据处理行项目就可以实现功能了

  METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM.

    DATALS_ITEMS  TYPE MEPOITEM .

    DATADYNP_DATA_PAI TYPE ZEKKO01.

    IF SY-TCODE 'ME21N'.

      IMPORT DYNP_DATA_PAI TO DYNP_DATA_PAI FROM MEMORY ID 'DYNP_DATA_PAI'.

      CLEAR:LS_ITEMS .

      LS_ITEMS IM_ITEM->GET_DATA( ) .

      IF DYNP_DATA_PAI-MWSKZ IS NOT INITIAL AND LS_ITEMS-MWSKZ IS INITIAL.
        LS_ITEMS-MWSKZ DYNP_DATA_PAI-MWSKZ .
        IM_ITEM->SET_DATALS_ITEMS ).
      ENDIF.


    ENDIF.

  ENDMETHOD.

  METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ACCOUNT.

    DATALS_POAC   TYPE MEPOACCOUNTING .

    DATADYNP_DATA_PAI TYPE ZEKKO01.

    IF SY-TCODE 'ME21N'.

      IMPORT DYNP_DATA_PAI TO DYNP_DATA_PAI FROM MEMORY ID 'DYNP_DATA_PAI'.

      CLEAR:LS_POAC .

      LS_POAC IM_ACCOUNT->GET_DATA( ) .

      IF DYNP_DATA_PAI-KOSTL IS NOT INITIAL AND LS_POAC-KOSTL IS INITIAL.
        LS_POAC-KOSTL DYNP_DATA_PAI-KOSTL .
        IM_ACCOUNT->SET_DATALS_POAC ).
      ENDIF.

    ENDIF.

  ENDMETHOD.

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值