EWM PRDI交货单取消

FUNCTION zewm01_006.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(LV_DOC_NO) TYPE  VBELN_VL
*"  EXPORTING
*"     VALUE(EV_TYPE) TYPE  BAPI_MTYPE
*"     VALUE(EV_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------
  DEFINE set_msg.

    ev_type = &1. " 状态
    ev_msg  = &2. " 消息

  END-OF-DEFINITION.

  DATA: lo_controller   TYPE REF TO /scmb/cl_controller,
        lo_dlvhd        TYPE REF TO /scwm/cl_dlv_handler_adapter,
        lo_sp_prd_inb   TYPE REF TO /scwm/cl_sp_prd_inb,
        lt_inkey_lock   TYPE /scdl/t_sp_k_head,
        lv_rejected     TYPE boole_d,
        lt_return_codes TYPE /scmb/t_sp_return_code,
        lt_inkeys       TYPE /scdl/t_sp_k_head,
        ls_inkey_lock   TYPE /scdl/s_sp_k_head,
        lt_aspect       TYPE /scwm/t_sp_a_head_prdi.

  CLEAR: lv_rejected.

  SELECT SINGLE docid
    FROM /scdl/db_refdoc
    INTO @DATA(lv_docid)
   WHERE refdocno  = @lv_doc_no
     AND refdoccat = 'ERP'
     AND doccat    = 'PDI'.

  SELECT COUNT(*)
    FROM /scdl/db_proch_i
   WHERE docid = @lv_docid.

  IF sy-subrc NE 0.

    set_msg  'E' '未查询到交货单号'.
    lv_rejected = 'X'.

  ENDIF.

  IF lv_rejected NE 'X'.

    APPEND VALUE #( docid = lv_docid ) TO lt_inkeys.
    APPEND VALUE #( docid = lv_docid ) TO lt_inkey_lock.

    " 初始化
    CALL METHOD /scmb/cl_controller=>get_instance
      RECEIVING
        eo_controller = lo_controller.

    CALL METHOD lo_controller->initialize
      EXPORTING
        io_tm = lo_controller.

    CREATE OBJECT lo_dlvhd.

    IF lo_sp_prd_inb IS NOT BOUND.

      CREATE OBJECT lo_sp_prd_inb
        EXPORTING
          io_attribute_handler = lo_dlvhd
          io_message_handler   = lo_dlvhd
          iv_mode              = /scdl/cl_sp=>sc_mode_classic.

    ENDIF.

    " 交货单锁定
    DO 30 TIMES.

      CALL METHOD lo_sp_prd_inb->('LOCK')
        EXPORTING
          inkeys       = lt_inkey_lock
          aspect       = '/SCWM/S_SP_A_HEAD'
          lockmode     = 'E'
        IMPORTING
          rejected     = lv_rejected
          return_codes = lt_return_codes.

      IF lv_rejected IS INITIAL.
        EXIT.
      ELSE.
        WAIT UP TO '0.1' SECONDS .
      ENDIF.

    ENDDO.

    IF lv_rejected IS NOT INITIAL.
      set_msg 'E' '交货单锁定失败'.
    ENDIF.

  ENDIF.

  IF lv_rejected EQ ''.

    " 处理
    CALL METHOD lo_sp_prd_inb->('EXECUTE')
      EXPORTING
        aspect       = '/SCWM/S_SP_A_HEAD'
        inkeys       = lt_inkeys
        action       = '/SCWM/ACT_REJECT_DELIVERY'
      IMPORTING
        outrecords   = lt_aspect
        rejected     = lv_rejected
        return_codes = lt_return_codes.

*   Call SAVE method of service provider
    CALL METHOD lo_sp_prd_inb->('SAVE')
      EXPORTING
        synchronously = abap_true
      IMPORTING
        rejected      = lv_rejected.

    CASE lv_rejected.
      WHEN abap_false.

        COMMIT WORK AND WAIT.

        CALL METHOD lo_sp_prd_inb->('CLEANUP')
          EXPORTING
            reason = /scmb/if_sp_transaction=>sc_cleanup_commit.

        set_msg  'S' '拒绝并保存成功'.

      WHEN abap_true.

        ROLLBACK WORK.

        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).

        CALL METHOD lo_sp_prd_inb->('CLEANUP')
          EXPORTING
            reason = /scmb/if_sp_transaction=>sc_cleanup_commit.

        lv_msg = '取消失败,原因:' && lv_msg.
        set_msg 'E' lv_msg.

    ENDCASE.

  ENDIF.

ENDFUNCTION.
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值