创建 修改 删除转储订单
DATA: l_ebeln TYPE bapimepoheader-po_number,
ls_ebeln TYPE zebeln.
DATA: ls_poheader TYPE bapimepoheader,
ls_poheaderx TYPE bapimepoheaderx,
lt_poitem TYPE TABLE OF bapimepoitem WITH HEADER LINE,
lt_poitemx TYPE TABLE OF bapimepoitemx WITH HEADER LINE,
lt_poschedule TYPE TABLE OF bapimeposchedule WITH HEADER LINE,
lt_poschedulex TYPE TABLE OF bapimeposchedulx WITH HEADER LINE,
lt_poaccount TYPE TABLE OF bapimepoaccount WITH HEADER LINE,
lt_poaccountx TYPE TABLE OF bapimepoaccountx WITH HEADER LINE,
lt_potextitem TYPE TABLE OF bapimepotext WITH HEADER LINE,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
CLEAR: lt_poitem , lt_poitemx , lt_poschedule , lt_poschedulex , lt_poaccount , lt_poaccountx , lt_potextitem ,
lt_poitem[], lt_poitemx[], lt_poschedule[], lt_poschedulex[], lt_poaccount[], lt_poaccountx[], lt_potextitem[].
IF i_dump-action = 'C'."创建转储订单
"采购订单抬头数据
ls_poheader-doc_type = i_dump-bsart ."采购凭证类型
ls_poheader-comp_code = i_dump-bukrs ."公司代码
ls_poheader-purch_org = i_dump-ekorg ."采购组织
ls_poheader-pur_group = i_dump-ekgrp ."采购组
ls_poheader-suppl_plnt = i_dump-reswk ."供货工厂
ls_poheader-langu = sy-langu."语言代码
ls_poheaderx-doc_type = 'X'."凭证类型
ls_poheaderx-comp_code = 'X'."公司代码
ls_poheaderx-purch_org = 'X'."采购组织
ls_poheaderx-pur_group = 'X'."采购组
ls_poheaderx-suppl_plnt = 'X'."供货工厂
ls_poheaderx-langu = 'X'.
LOOP AT it_ebeln INTO ls_ebeln.
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-ebelp.
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-matnr.
lt_poitem-po_item = ls_ebeln-ebelp."采购凭证的项目编号
lt_poitem-material = ls_ebeln-matnr."物料号
lt_poitem-po_unit = ls_ebeln-meins."基本计量单位 "采购订单的计量单位
lt_poitem-plant = ls_ebeln-werks."收货工厂
lt_poitem-stge_loc = ls_ebeln-lgort."库存地点
lt_poitem-suppl_stloc = ls_ebeln-reslo."库存运输订单发货存储地点
APPEND lt_poitem.
lt_poitemx-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
lt_poitemx-material = 'X'."物料号
lt_poitemx-po_unit = 'X'."基本计量单位 "采购订单的计量单位
lt_poitemx-plant = 'X'."收货工厂
lt_poitemx-stge_loc = 'X'."库存地点
lt_poitemx-suppl_stloc = 'X'."库存运输订单发货存储地点
APPEND lt_poitemx.
"交货日期的处理
CLEAR lt_poschedule.
lt_poschedule-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
lt_poschedule-del_datcat_ext = 'D'."交货日期的类别
lt_poschedule-delivery_date = ls_ebeln-eeind."交货日期
lt_poschedule-quantity = ls_ebeln-menge."采购订单数量
APPEND lt_poschedule.
lt_poschedulex-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
lt_poschedulex-del_datcat_ext = 'X'."交货日期的类别
lt_poschedulex-delivery_date = 'X'."交货日期
lt_poschedulex-quantity = 'X'."采购订单数量
APPEND lt_poschedulex.
lt_poaccount-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
APPEND lt_poaccount.
lt_poaccountx-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
APPEND lt_poaccountx.
lt_potextitem-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
APPEND lt_potextitem.
CLEAR: ls_ebeln, lt_poitem, lt_poitemx, lt_poschedule, lt_poschedulex, lt_poaccount, lt_poaccountx, lt_potextitem.
ENDLOOP.
CLEAR: l_ebeln, lt_return, lt_return[].
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_poheader
poheaderx = ls_poheaderx
IMPORTING
exppurchaseorder = l_ebeln
TABLES
return = lt_return
poitem = lt_poitem
poitemx = lt_poitemx
poschedule = lt_poschedule
poschedulex = lt_poschedulex
poaccount = lt_poaccount
poaccountx = lt_poaccountx
potextitem = lt_potextitem.
IF l_ebeln <> ''.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF sy-subrc EQ 0.
msg_type = 'S'.
message = '转储订单创建成功. '.
e_ebeln = l_ebeln.
ELSE.
msg_type = 'E'.
message = '转储订单创建失败: 未知异常. '.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ELSE.
msg_type = 'E'.
message = '转储订单创建失败. '.
CLEAR lt_return.
LOOP AT lt_return.
IF lt_return-type = 'E' OR lt_return-type = 'A'.
CONCATENATE message lt_return-message INTO message.
ENDIF.
CLEAR lt_return.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
"""""""""""""""""更新转储订单""""""""""""""""""""""""""
ELSEIF i_dump-action = 'U'."更新转储订单
IF i_dump-ebeln IS INITIAL .
msg_type = 'E'.
message = '请输入转储订单号. '.
EXIT.
ENDIF.
LOOP AT it_ebeln INTO ls_ebeln.
IF ls_ebeln-loekz = 'X'."行项目有删除标识
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-ebelp.
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-matnr.
lt_poitem-po_item = ls_ebeln-ebelp."采购凭证的项目编号
lt_poitem-material = ls_ebeln-matnr."物料号
lt_poitem-delete_ind = 'X'."采购凭证中的删除标识
APPEND lt_poitem.
lt_poitemx-po_item = ls_ebeln-ebelp."采购凭证的项目编号
lt_poitemx-po_itemx = 'X'."采购凭证的项目编号
lt_poitemx-material = 'X'."物料号
lt_poitemx-delete_ind = 'X'."采购凭证中的删除标识
APPEND lt_poitemx.
ELSE." IF ls_ebeln-loekz = 'U' OR ls_ebeln-loekz = 'C'."行项目有更新
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-ebelp.
CALL METHOD z_itf_utils=>add_zero
CHANGING
c_input = ls_ebeln-matnr.
lt_poitem-po_item = ls_ebeln-ebelp."采购凭证的项目编号
lt_poitem-material = ls_ebeln-matnr."物料号
lt_poitem-po_unit = ls_ebeln-meins."基本计量单位 "采购订单的计量单位
lt_poitem-plant = ls_ebeln-werks."收货工厂
lt_poitem-stge_loc = ls_ebeln-lgort."库存地点
lt_poitem-suppl_stloc = ls_ebeln-reslo."库存运输订单发货存储地点
APPEND lt_poitem.
lt_poitemx-po_item = ls_ebeln-ebelp."采购凭证的项目编号
lt_poitemx-po_itemx = 'X'."采购凭证的项目编号
lt_poitemx-material = 'X'."物料号
lt_poitemx-po_unit = 'X'."基本计量单位 "采购订单的计量单位
lt_poitemx-plant = 'X'."收货工厂
lt_poitemx-stge_loc = 'X'."库存地点
lt_poitemx-suppl_stloc = 'X'."库存运输订单发货存储地点
APPEND lt_poitemx.
"交货日期的处理
lt_poschedule-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
lt_poschedule-del_datcat_ext = 'D'."交货日期的类别
lt_poschedule-delivery_date = ls_ebeln-eeind."交货日期
lt_poschedule-quantity = ls_ebeln-menge."采购订单数量
APPEND lt_poschedule.
lt_poschedulex-po_item = ls_ebeln-ebelp. "采购凭证的项目编号
lt_poschedulex-del_datcat_ext = 'X'."交货日期的类别
lt_poschedulex-delivery_date = 'X'."交货日期
lt_poschedulex-quantity = 'X'."采购订单数量
APPEND lt_poschedulex.
ENDIF.
CLEAR: ls_ebeln, lt_poitem, lt_poitemx, lt_poschedule, lt_poschedulex.
ENDLOOP.
CLEAR: lt_return, lt_return[].
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
purchaseorder = i_dump-ebeln
TABLES
return = lt_return
poitem = lt_poitem
poitemx = lt_poitemx
poschedule = lt_poschedule
poschedulex = lt_poschedulex.
LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
msg_type = 'E'.
EXIT.
ENDLOOP.
IF msg_type EQ 'E'.
message = '转储订单修改失败. '.
CLEAR lt_return.
LOOP AT lt_return.
IF lt_return-type = 'E' OR lt_return-type = 'A'.
CONCATENATE message lt_return-message INTO message.
ENDIF.
CLEAR lt_return.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
* 提交所做得更改
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF sy-subrc = 0.
msg_type = 'U'.
message = '转储订单修改成功. '.
ELSE.
msg_type = 'E'.
message = '转储订单修改失败: 未知异常. '.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDIF.
ENDIF.