项目上碰到一个通过BAPI创建PO的需求,因为有增强会将不带删除标记的数据同步至其他系统,要等后续业务更新,将删除标记去掉之后,这张PO才能发送出去,所以需要创建出来的PO明细上打上删除标记,而标准BAPI中有标准逻辑做了限制:
后续也有很多关于删除标记的逻辑,所以标准BAPI是不能实现这个功能的,需要先创建,再去更改,连续调用BAPI时可能会有数据库提交不及时的问题,接口调用会影响效率,所以将标准BAPI复制一份出来,添加自定义逻辑,来实现这一需求,具体实现如下:
1.复制标准BAPI:
创建函数组ZXXPO_1001
将标准BAPI所在函数组TOP中的代码copy过来
FUNCTION-POOL ZXXPO_1001. "MESSAGE-ID ..
* includes
INCLUDE: mm_messages_mac, "macros for messages
fbgenmac.
* tables
TABLES: comsrv. "1963020
* type-pool
TYPE-POOLS:
szadr, mmcnt, abap, mmtyp.
* types
TYPES:
* address
BEGIN OF mepoheaderaddrzav,
ebeln TYPE mepoheader-ebeln,
strzav TYPE szadr_addr1_complete,
END OF mepoheaderaddrzav,
BEGIN OF mepoitemaddrzav,
ebeln LIKE mepoitem-ebeln,
ebelp LIKE mepoitem-ebelp,
strzav TYPE szadr_addr1_complete,
kunnr TYPE ekunnr, "1333377
emlif TYPE emlif, "1333377
lblkz TYPE lblkz, "1333377
addrtype TYPE char1,
END OF mepoitemaddrzav,
tab_mepoitemaddrzav TYPE if_ex_me_bapi_po_create_01=>type_t_address," STANDARD TABLE OF mepoitemaddrzav,
BEGIN OF gty_addr_mapping_entry,
ref_ebelp TYPE ebelp,
ebelp TYPE ebelp,
END OF gty_addr_mapping_entry,
gty_addr_mapping TYPE SORTED TABLE OF gty_addr_mapping_entry WITH UNIQUE
KEY ref_ebelp ebelp,
* conditions
* extends KOMV with field change_id
komv_bapi TYPE mmpur_konv_ext, "1012433
tab_komv_bapi TYPE STANDARD TABLE OF mmpur_konv_ext,
* document management
* extends EREVITEM with field activity
BEGIN OF erevitem_bapi.
INCLUDE TYPE erevitem.
TYPES: activity TYPE dcm_activity,
END OF erevitem_bapi.
* extens MMPA with field DELETE_IND
TYPES: BEGIN OF mmpa_bapi.
INCLUDE TYPE mmpa.
TYPES: delete_ind TYPE eloek,
END OF mmpa_bapi,
tab_mmpa_bapi TYPE STANDARD TABLE OF mmpa_bapi.
* Tables for accounting in service po
DATA: BEGIN OF acc_tab OCCURS 30.
INCLUDE STRUCTURE ueskn.
DATA: END OF acc_tab.
TYPES: mmpur_acc_tab TYPE STANDARD TABLE OF ueskn INITIAL SIZE 1.
* partner type for BAPI
TYPES gty_partner TYPE STANDARD TABLE OF bapimepopartner WITH DEFAULT KEY.
* definition of types for serial number handling
TYPES: BEGIN OF gty_serno,
ebelp TYPE mepoitem-ebelp,
etenr TYPE meposchedule-etenr,
loekz TYPE mepoitem-loekz,
serno TYPE gernr,
uii TYPE uii_char72, "EHP604 IUID
uid TYPE guid,
END OF gty_serno,
* define table type for serial number handling
gty_t_serno TYPE STANDARD TABLE OF gty_serno.
TYPES: BEGIN OF gty_sernox,
ebelp_key TYPE mepoitem-ebelp,
etenr_key TYPE meposchedule-etenr,
ebelp TYPE mmpur_bool,
etenr TYPE mmpur_bool,
loekz TYPE mmpur_bool,
serno TYPE mmpur_bool,
uid TYPE mmpur_bool,
END OF gty_sernox,
* define table type for serial number x-bar handling
gty_t_sernox TYPE STANDARD TABLE OF gty_sernox.
* constants
CONSTANTS:
c_lenstruc TYPE i VALUE 30.
* global data
DATA:
cancel_po TYPE mmpur_bool,
exitflag TYPE boole.
*--------------------------------------------------------------------*
* local class defitions
*--------------------------------------------------------------------*
* class pre-definitions
CLASS: lcl_bapi_mapping DEFINITION DEFERRED,
lcl_schedule DEFINITION DEFERRED, "1659181
lcl_account DEFINITION DEFERRED,
lcl_condition DEFINITION DEFERRED,
lcl_partner DEFINITION DEFERRED, "1739367
lcl_utility DEFINITION DEFERRED.
* local class definitions
INCLUDE: l2012d01, "class lcl_bapi_conf definition
l2012d02, "class lcl_bapi_mapping
l2012d03, "class lcl_utility
l2012d04, "class lcl_invoice_plan
l2012d05, "class lcl_serial_no
l2012d06, "class lcl_partners (SRM 6.0 & GP 2.0)
l2012d07, "class lcl_downpayments
l2012d08, "class lcl_memory "Park&Hold
l2012d09, "class lcl_schedule "1659181
l2012d10, "class lcl_account
l2012d11. "class lcl_condition
*---------------------------------------------------------------------*
* Makro to merge data of &1 and &2 by using &3
* (copy of bapi_merge_data in LMEPOF8C)
*---------------------------------------------------------------------*
FIELD-SYMBOLS: <comp> TYPE abap_compdescr,
<new> TYPE any, "#EC *
<old> TYPE any. "#EC *
* INCLUDE LZXXPO_1001D... " Local class definition
2.复制标准处理form,进行自定义逻辑处理:
pre_processing-->zpre_processing
将如下代码注释掉,避免在这一步清空明细数据:
set_object_attributes-->zset_object_attributes
添加如下代码:
* Create PO with delete flag
IF im_aktyp EQ cl_mmpur_constants=>hin.
IF <ls_item>-loekz = cl_mmpur_constants=>if_mmpur_constants_general~deleted AND
<ls_itemx>-loekz EQ lo_const->yes.
ls_item_new-loekz = 'X'.
ENDIF.
ENDIF.
* transport data to model
l_item->if_purchase_order_item_mm~set_data( ls_item_new ).
创建时通过ITEM-DELETE_IND = ‘X’ 调用复制的BAPI即可创建出带删除标记的PO
以上。