最近接到一个需求要实现在创建PO时批量为行项目输入成本中心和税码,我的第一反应是让这两个字段在行项目区域直接可以编辑,但成本中心与行项目基本数据并不在一个结构中所以可能比较麻烦,后来采取了在抬头增加批输入子屏幕的方式,实现抬头输入项目自动获取,以下是实现的方式:
- 首先创建自建表,其中要包含增强字段
参考 MEPOBADIEX复制一个新的函数组
进入include程序TOP的部分定义增强结构
参考定义的结构创建一个子屏幕
2,进入SE19创建BADI:ME_GUI_PO_CUST的实现
进入实施类中参考增强结构添加属性
在Method: SUBSCRIBE中添加子屏幕
DATA: LS_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.
- 创建BADI:ME_PROCESS_PO_CUST的实现
在方法IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER中添加代码:
METHOD IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER.
DATA: LV_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.
DATA: LS_ITEMS TYPE MEPOITEM .
DATA: DYNP_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_DATA( LS_ITEMS ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ACCOUNT.
DATA: LS_POAC TYPE MEPOACCOUNTING .
DATA: DYNP_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_DATA( LS_POAC ).
ENDIF.
ENDIF.
ENDMETHOD.