创建 修改 删除转储订单

  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.

posted @ 2019-10-31 10:38  纱缚之印  阅读(324)  评论(0编辑  收藏  举报