SAP采购订单审批

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

采购订单审批在外围系统审批完后到SAP直接审批,原先的逻辑是外围系统通过不同审批节点调用SAP接口审批,但是节点太多不好处理,现改为外围系统只调用一次就把所有节点全部审批.
提示:以下是本篇文章正文内容,下面案例可供参考

一、审批策略

对于采购订单审批BAPI BAPI_PO_RELEASE我们需要的传参只有采购订单编号和审批代码,对于审批策略的查看我们可以通过IMG—物料管理—采购—采购订单—采购订单的下达过程—定义采购定单的审批过程或者table T16FV来查看

二、代码实现

  DATA: lv_purchaseorder TYPE bapimmpara-po_number,
        lv_po_rel_code   TYPE bapimmpara-po_rel_cod,
        lv_release       TYPE char1,
        lv_last          TYPE char1,
        lv_frga          TYPE string,
        lv_last_frga     TYPE string,
        lv_msg           TYPE string.

  DATA: lt_return TYPE TABLE OF bapireturn.

  FIELD-SYMBOLS:<lf_frga>      TYPE any,
                <lf_last_frga> TYPE any.

  "采购订单编号
  lv_purchaseorder = i_ebeln.

  "获取审批组,审批策略,审批代码,发布状态
  SELECT
    ekko~ebeln,
    ekko~frggr,
    ekko~frgsx,
    ekko~frgke,
    ekko~frgzu
    INTO @DATA(ls_ekko)
    FROM
      ekko
    WHERE
      ebeln EQ @i_ebeln AND
      frggr NE '' AND
      frgsx NE ''.
  ENDSELECT.

  SELECT
    *
    INTO TABLE @DATA(lt_t16fv)
    FROM
      t16fv
    WHERE
      frggr EQ @ls_ekko-frggr AND
      frgsx EQ @ls_ekko-frgsx
    .
  SELECT SINGLE
    ekko~frgzu
    INTO @DATA(lv_frgzu)
    FROM
      ekko
    WHERE
      ebeln EQ @i_ebeln.


  SELECT SINGLE
    ekko~frgke
    INTO @DATA(lv_frgke)
    FROM
      ekko
    WHERE
      ebeln EQ @i_ebeln.

  IF NOT ls_ekko IS INITIAL.

    IF i_cancel IS INITIAL.

      WHILE lv_frgke NE 'R'.

        lv_last = strlen( ls_ekko-frgzu ) + 1.      "获取已审批节点
        lv_release = strlen( ls_ekko-frgzu ) + 2.   "获取发布状态以判断在第几节点
        lv_frga = 'FRGA' && lv_release.             "将审批节点字段

        IF lv_last GT 0.
          lv_last_frga = 'FRGA' && lv_last.          "已审批节点字段
        ELSEIF lv_last EQ 0.
          lv_last_frga = lv_frga.                    "已审批节点字段
        ENDIF.

        LOOP AT lt_t16fv INTO DATA(ls_t16fv).
          "先判断将审批节点是否为空,若为空则判断上个节点是否不为空,符合条件下取审批代码
          ASSIGN COMPONENT lv_frga OF STRUCTURE ls_t16fv TO <lf_frga>.
          IF <lf_frga> IS ASSIGNED.
            IF <lf_frga> IS INITIAL.
              ASSIGN COMPONENT lv_last_frga OF STRUCTURE ls_t16fv TO <lf_last_frga>.
              IF <lf_last_frga> IS ASSIGNED.
                IF NOT <lf_last_frga> IS INITIAL.
                  lv_po_rel_code = ls_t16fv-frgco.
                  EXIT.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
          CLEAR ls_t16fv.
        ENDLOOP.

        CALL FUNCTION 'BAPI_PO_RELEASE'
          EXPORTING
            purchaseorder          = lv_purchaseorder
            po_rel_code            = lv_po_rel_code
          TABLES
            return                 = lt_return
          EXCEPTIONS
            authority_check_fail   = 1
            document_not_found     = 2
            enqueue_fail           = 3
            prerequisite_fail      = 4
            release_already_posted = 5
            responsibility_fail    = 6
            OTHERS                 = 7.

        IF line_exists( lt_return[ type = 'EAX' ] ).
          EXIT.
        ENDIF.

        CLEAR lv_frgke.

        SELECT SINGLE
          ekko~frgke
          INTO @lv_frgke
          FROM
            ekko
          WHERE
            ebeln EQ @i_ebeln.

      ENDWHILE.

      IF lt_return IS INITIAL.
        o_type = 'S'.
        o_msg = '审批成功'.
      ELSE.
        o_type  = 'E'.
        LOOP AT lt_return INTO DATA(ls_return).
          o_msg = o_msg && ls_return-message.
          CLEAR ls_return.
        ENDLOOP.
      ENDIF.
    ELSE.
      WHILE NOT lv_frgzu IS INITIAL.

        lv_last = strlen( ls_ekko-frgzu ) - 1.      "获取将取消审批节点上个节点
        lv_release = strlen( ls_ekko-frgzu ).       "获取发布状态已判断在第几节点
        lv_frga = 'FRGA' && lv_release.             "将取消审批节点字段
        lv_last_frga = 'FRGA' && lv_last.           "将取消审批节点上个节点字段

        IF lv_last GT 0.
          lv_last_frga = 'FRGA' && lv_last.          "已审批节点字段
        ELSEIF lv_last EQ 0.
          lv_last_frga = lv_frga.                   "已审批节点字段
        ENDIF.

        LOOP AT lt_t16fv INTO ls_t16fv.
          "先判断次审批节点是否不为空,若不为空则判断上个节点是否不为空,符合条件下取审批代码
          ASSIGN COMPONENT lv_frga OF STRUCTURE ls_t16fv TO <lf_frga>.
          IF <lf_frga> IS ASSIGNED.
            IF NOT <lf_frga> IS INITIAL.
              ASSIGN COMPONENT lv_last_frga OF STRUCTURE ls_t16fv TO <lf_last_frga>.
              IF <lf_last_frga> IS ASSIGNED.
                IF NOT <lf_last_frga> IS INITIAL.
                  lv_po_rel_code = ls_t16fv-frgco.
                  EXIT.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
          CLEAR ls_t16fv.
        ENDLOOP.

        CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
          EXPORTING
            purchaseorder            = lv_purchaseorder
            po_rel_code              = lv_po_rel_code
            use_exceptions           = 'X'
          TABLES
            return                   = lt_return
          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 line_exists( lt_return[ type = 'EAX' ] ).
          EXIT.
        ENDIF.

        CLEAR lv_frgzu.

        SELECT SINGLE
          ekko~frgzu
          INTO @lv_frgzu
          FROM
            ekko
          WHERE
            ebeln EQ @i_ebeln.

      ENDWHILE.

      IF lt_return IS INITIAL.
        o_type = 'S'.
        o_msg = '取消审批成功'.
      ELSE.
        o_type  = 'E'.
        LOOP AT lt_return INTO ls_return.
          o_msg = o_msg && ls_return-message.
          CLEAR ls_return.
        ENDLOOP.
      ENDIF.

    ENDIF.

    CLEAR: lv_purchaseorder,
           lv_po_rel_code,
           lv_release,
           lv_last,
           lv_frga,
           lv_last_frga,
           lv_msg.

  ELSE.
    o_type = 'S'.
    o_msg = '此采购订单无需审批'.
  ENDIF.

三.注意事项

现在是一次性审批/取消审批所有节点,若想按节点审批可以取消while循环即可变成节点审批

总结

对于此次功能的开发使自己对采购订单审批功能有了一定的了解,有很多的收获

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值