实现采购订单收货过账
注:采购订单退货(161),传入的移动类型也是101。
LOOP AT TP_INPUT->REQDATA ASSIGNING FIELD-SYMBOL(<FS>).
* 明细行操作
REFRESH IT_ITEM.
CLEAR I_ITEM.
LOOP AT <FS>->DETAILS ASSIGNING FIELD-SYMBOL(<FSITEM>).
CLEAR:WK_ITEM.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FSITEM>->MATNR
IMPORTING
OUTPUT = <FSITEM>->MATNR.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FSITEM>->EBELN
IMPORTING
OUTPUT = <FSITEM>->EBELN .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FSITEM>->EBELP
IMPORTING
OUTPUT = <FSITEM>->EBELP.
WK_ITEM-PO_NUMBER = <FSITEM>->EBELN. "PO订单
WK_ITEM-PO_ITEM = <FSITEM>->EBELP. "行项目
WK_ITEM-ITEM_TEXT = <FSITEM>->SGTXT. "项目文本
WK_ITEM-PLANT = <FSITEM>->WERKS. "工厂
WK_ITEM-VAL_SALES_ORD = <FSITEM>->KDAUF. "评估销售定单库存的销售订单号
WK_ITEM-VAL_S_ORD_ITEM = <FSITEM>->KDPOS. "评估销售定单库存的销售订单行项目
WK_ITEM-SALES_ORD = <FSITEM>->KDAUF. "销售订单
WK_ITEM-S_ORD_ITEM = <FSITEM>->KDPOS. "销售订单行项目
WK_ITEM-STGE_LOC = <FSITEM>->LGORT."存储位置
WK_ITEM-BATCH = <FSITEM>->CHARG. "批次
WK_ITEM-ENTRY_QNT = <FSITEM>->ERFMG. "数量
WK_ITEM-ENTRY_UOM = <FSITEM>->ERFME. "采购单位
WK_ITEM-MOVE_TYPE = <FSITEM>->BWART. "移动类型
WK_ITEM-MVT_IND = 'B'. "移动标识 ’B‘为采购收货 ’F ' 生产收货
WK_ITEM-MATERIAL = <FSITEM>->MATNR. "物料
* 凭证行的唯一标识
IF <FSITEM>->BWART eq '543'.
* 上一行的识别码
WK_ITEM-parent_id = l_parent_id.
WK_ITEM-line_depth = '01'.
ENDIF.
WK_ITEM-line_id = <FSITEM>->MESPOSNR.
WK_ITEM-SPEC_STOCK = <FSITEM>->SOBKZ.
l_parent_id = <FSITEM>->MESPOSNR.
APPEND WK_ITEM TO IT_ITEM.
* 输出数据结构设置
CLEAR WK_OUTPUT.
WK_OUTPUT-WERKS = <FSITEM>->WERKS.
WK_OUTPUT-BUDAT = <FS>->BUDAT.
WK_OUTPUT-MESMBLNR = <FS>->MESMBLNR.
WK_OUTPUT-MESPOSNR = <FSITEM>->MESPOSNR.
I_item = I_item + 1.
WK_OUTPUT-POSNR = I_item.
APPEND WK_OUTPUT TO IT_OUTPUT.
ENDLOOP.
CLEAR: WK_HEAD,WK_CODE.
WK_HEAD-DOC_DATE = <FS>->BLDAT. "凭证日期
WK_HEAD-PSTNG_DATE = <FS>->BUDAT."过账日期
WK_HEAD-PR_UNAME = SY-UNAME."创建用户
WK_HEAD-HEADER_TXT = <FS>->BKTXT.
WK_HEAD-REF_DOC_NO = <FS>->XBLNR.
WK_CODE-GM_CODE = '01'.
CLEAR V_MBLNR.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = WK_HEAD
GOODSMVT_CODE = WK_CODE
IMPORTING
MATERIALDOCUMENT = V_MBLNR
TABLES
GOODSMVT_ITEM = IT_ITEM
* GOODSMVT_SERIALNUMBER = IT_NUMB
RETURN = IT_RETUN.
CLEAR WK_RETUN.
READ TABLE IT_RETUN INTO WK_RETUN WITH KEY TYPE = 'E'.
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
O_CODE = 'E'.
O_DESC = '过账失败!'.
CONCATENATE O_DESC 'Reason: ' WK_RETUN-MESSAGE INTO O_DESC SEPARATED BY SPACE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
O_CODE = 'S'.
O_DESC = '过账成功!'.
* 输出数据结果设置
LOOP AT IT_OUTPUT INTO WK_OUTPUT WHERE MESMBLNR = <FS>->MESMBLNR.
WK_OUTPUT-MBLNR = V_MBLNR.
MODIFY IT_OUTPUT FROM WK_OUTPUT TRANSPORTING MBLNR.
ENDLOOP.
ENDIF.
ENDLOOP.
GMCODE TCODE:
GM_Code 01: Goods receipt for purchase order
GM_Code 02: Goods receipt for production order
GM_Code 03: Goods issue
GM_Code 04: Transfer posting
GM_Code 05: Other goods receipts
GM_Code 06: Reversal of goods movements
GM_Code 07: Subsequent adjustment to a subcontract order