采购订单审批和取消例子

1 Introduction

This is a exmaple for releaseing po and reseting po.

2 Example

  DATA:lw_in   TYPE zmms015,
       lw_out  TYPE zmms015_out,
       lt_head LIKE TABLE OF  ZMMT003_head,
       lw_head TYPE ZMMT003_head,
       lt_item TYPE zmmt003_item_t,
       lt_spjd TYPE ZMMT003_spjd_T.

  DATA:lv_rel_code LIKE  bapimmpara-rel_code.
  DATA:lt_return TYPE TABLE OF bapireturn,
       ls_return TYPE bapireturn.
  DATA:lv_str    TYPE string,lv_offset TYPE i.
  DATA:BEGIN OF ls_grp,
         frgco TYPE t16fc-frgco,
       END OF ls_grp,
       lt_grp LIKE TABLE OF ls_grp.
  FIELD-SYMBOLS:<lfs_v1> TYPE any.


* logic part
  lw_in = ps_in.
  lt_item  =  lw_in-is_value-it_items1.
  lt_spjd  =  lw_in-is_value-it_items2.

  MOVE-CORRESPONDING lw_in-is_value  TO lw_head .

  IF lw_in-is_value-ebeln  IS INITIAL.
    ps_out-es_value-code =   'E'.
    ps_out-es_value-msg  =   '采购单号必填,请核实数据!'.
    RETURN.
  ENDIF.

  LOOP AT lt_item ASSIGNING FIELD-SYMBOL(<fs_item>).

    IF <fs_item>-ebeln  IS INITIAL.
      ps_out-es_value-code =   'E'.
      ps_out-es_value-msg  =   '采购单号必填,请核实数据!'.
      RETURN.
    ENDIF.

    IF <fs_item>-ebelp  IS INITIAL.
      ps_out-es_value-code =   'E'.
      ps_out-es_value-msg  =   '采购行项目必填,请核实数据!'.
      RETURN.
    ENDIF.
  ENDLOOP.


  LOOP AT lt_spjd ASSIGNING FIELD-SYMBOL(<fs_spjd>).

    IF <fs_spjd>-ebeln  IS INITIAL.
      ps_out-es_value-code =   'E'.
      ps_out-es_value-msg  =   '采购订单必填,请核实数据!'.
      RETURN.
    ENDIF.
  ENDLOOP.

* Get po's  approve  code  and get apporve leve code
  IF lw_head-zspbs  =  'R' .  "  Approve po
    SELECT k~ebeln,k~frgzu,s~frgc1,s~frgc2,s~frgc3,s~frgc4,
           s~frgc5,s~frgc6,s~frgc7,s~frgc8
      FROM t16fs AS s
      INNER JOIN ekko AS k
         ON k~frggr = s~frggr
        AND k~frgsx = s~frgsx
      WHERE k~ebeln = @lw_head-ebeln
        AND k~frgrl = @abap_true "FRGRL 字段标示审批是否结束
      INTO TABLE @DATA(lt_t16fs).

    READ TABLE lt_t16fs ASSIGNING FIELD-SYMBOL(<lfs_t16fs>) INDEX 1.
    IF sy-subrc EQ 0.
      DO 8 TIMES.
        lv_str = sy-index.
        lv_str = 'FRGC' && lv_str.
        CONDENSE lv_str NO-GAPS.
        ASSIGN COMPONENT lv_str OF STRUCTURE <lfs_t16fs> TO <lfs_v1>.
        IF sy-subrc EQ 0.
          IF <lfs_v1> IS NOT INITIAL.
            DATA(lv_x) = <lfs_t16fs>-frgzu+lv_offset(1).
            IF lv_x IS INITIAL."未审批
              ls_grp-frgco = <lfs_v1>.
              APPEND ls_grp TO lt_grp.
            ENDIF.
          ENDIF.
        ENDIF.
        lv_offset = lv_offset + 1.
      ENDDO.
      CLEAR lv_str.
    ENDIF.

* Approve po's order
    LOOP AT lt_grp INTO ls_grp.
      CALL FUNCTION 'BAPI_PO_RELEASE'
        EXPORTING
          purchaseorder = lw_head-ebeln
          po_rel_code   = ls_grp-frgco
        TABLES
          return        = lt_return.
      LOOP AT lt_return INTO ls_return
            WHERE type = 'E' OR type = 'A'.
        lv_str = lv_str && '|' && ls_return-message.
        DATA(lv_flag) = abap_true.
      ENDLOOP.
      SHIFT lv_str LEFT DELETING LEADING '|'.
      IF lv_flag EQ abap_true.
        EXIT.
      ENDIF.
      WAIT UP TO 1 SECONDS.
    ENDLOOP.
    IF lv_flag EQ abap_true."失败
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ps_out-es_value-code =   'E'.
      ps_out-es_value-msg  =   '审核失败'.
    ELSE."成功
      ps_out-es_value-code =   'S'.
      ps_out-es_value-msg  =   '审核成功'.
    ENDIF.
* Disapprove po's order .
  ELSE.  "

    CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
      EXPORTING
        purchaseorder            = lw_head-ebeln
        po_rel_code              = 'R2'
        use_exceptions           = 'X'
      EXCEPTIONS
        authority_check_fail     = 1
        document_not_found       = 2
        enqueue_fail             = 3
        prerequisite_fail        = 4
        release_already_posted   = 5
        responsibility_fail      = 6
        no_release_already       = 7
        no_new_release_indicator = 8
        OTHERS                   = 9.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ps_out-es_value-code =   'E'.
      ps_out-es_value-msg  =   '审核失败'.
    ELSE.
      ps_out-es_value-code =   'S'.
      ps_out-es_value-msg  =   '审核成功'.
    ENDIF.
  ENDIF.



  MODIFY ZMMT003_head FROM lw_head.
  MODIFY ZMMT003_item FROM  TABLE lt_item.
  MODIFY ZMMT003_spjd FROM TABLE  lt_spjd.

  IF sy-subrc = 0.
    COMMIT WORK.
  ELSE.
    ROLLBACK WORK .
  ENDIF.
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值