FUNCTION zrfc_bpm_bapi_po_release.
*"----------------------------------------------------------------------
*"*"區域介面:
*"  IMPORTING
*"     VALUE(I_EBELN) TYPE  EKKO-EBELN
*"     VALUE(I_LANGUAGE) TYPE  SPRAS DEFAULT 'ZF'
*"  TABLES
*"      LT_RETURN STRUCTURE  BAPIRETURN OPTIONAL
*"----------------------------------------------------------------------

  TABLES:bapimmpara,t16fk,t16fv,bapireturn.

  TYPES: BEGIN OF ty_ekko,
           ebeln TYPE ebeln, "采购单
           frggr TYPE frggr, "核发群组
           frgsx TYPE frgsx, "核发策略
           frgzu TYPE frgzu, "核发指示码
           frgrl TYPE frgrl, "是否需要核发
         END OF ty_ekko.

  DATA: l_cod     LIKE bapimmpara-po_rel_cod,
        ls_return TYPE  bapireturn,
        ls_ekko   TYPE ty_ekko,
        l_len     TYPE i,
        e_frgzu   LIKE ekko-frgzu. "签核指示吗

  DO 8 TIMES.
    SELECT SINGLE ebeln frggr frgsx frgzu frgrl
      INTO ls_ekko
      FROM ekko
      WHERE ebeln = i_ebeln.

    IF sy-subrc = 0 AND ls_ekko-frgrl = 'X'.
      CONCATENATE ls_ekko-frgzu 'X' INTO ls_ekko-frgzu.
*      WRITE 'X' TO ls_ekko-frgzu+sy-fdpos(1).
      t16fk+7(8) = ls_ekko-frgzu.
      SELECT SINGLE * FROM t16fk WHERE frggr EQ ls_ekko-frggr
                                    AND frgsx EQ ls_ekko-frgsx
                                    AND frga1 EQ t16fk-frga1
                                    AND frga2 EQ t16fk-frga2
                                    AND frga3 EQ t16fk-frga3
                                    AND frga4 EQ t16fk-frga4
                                    AND frga5 EQ t16fk-frga5
                                    AND frga6 EQ t16fk-frga6
                                    AND frga7 EQ t16fk-frga7
                                    AND frga8 EQ t16fk-frga8.

      IF sy-subrc = 0.

        e_frgzu = ls_ekko-frgzu.

        REPLACE ALL OCCURRENCES OF  'X'  IN e_frgzu WITH '+'.

        l_len = strlen( e_frgzu ).
        l_len = l_len - 1.

        IF l_len >= 1 .
          e_frgzu = e_frgzu(l_len).
        ELSE.
          e_frgzu = ''.
        ENDIF.

        CONCATENATE e_frgzu 'X' INTO e_frgzu.

        t16fv+9(8) = e_frgzu.

        SELECT SINGLE * FROM t16fv WHERE frggr EQ ls_ekko-frggr
                                    AND frgsx EQ ls_ekko-frgsx
                                    AND frga1 EQ t16fv-frga1
                                    AND frga2 EQ t16fv-frga2
                                    AND frga3 EQ t16fv-frga3
                                    AND frga4 EQ t16fv-frga4
                                    AND frga5 EQ t16fv-frga5
                                    AND frga6 EQ t16fv-frga6
                                    AND frga7 EQ t16fv-frga7
                                    AND frga8 EQ t16fv-frga8.

        IF sy-subrc = 0.
          CALL FUNCTION 'BAPI_PO_RELEASE'
            EXPORTING
              purchaseorder          = i_ebeln
*             po_rel_code            = 'A3'
              po_rel_code            = t16fv-frgco
*             USE_EXCEPTIONS         = 'X'
*             NO_COMMIT              = ' '
*       IMPORTING
*             REL_STATUS_NEW         =
*             REL_INDICATOR_NEW      =
*             RET_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 lt_return[] IS INITIAL.
            "提交
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.

            "解锁
            CALL FUNCTION 'DEQUEUE_ALL'
              EXPORTING
                _synchron = 'X'.

          ELSE.
            "回滚
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
            EXIT.
          ENDIF.
        ENDIF.
      ENDIF.
    ELSEIF  ls_ekko-frgrl = '' OR sy-subrc <> 0.
      EXIT.
    ENDIF.
  ENDDO.

  "采购单核发检查
  SELECT SINGLE ebeln frggr frgsx frgzu frgrl
   INTO ls_ekko
   FROM ekko
   WHERE ebeln = i_ebeln.

  IF  lt_return[] IS INITIAL AND sy-subrc = 0 AND  ls_ekko-frgrl = 'X'.
    "采购单核发错误提示
    ls_return-type = 'E'.
    ls_return-code = 'ME192'.
    ls_return-message = 'E'.

    SELECT SINGLE text
        INTO ls_return-message
        FROM t100
        WHERE arbgb = 'ME'
        AND   msgnr = '192'
        AND  sprsl = i_language.

    APPEND ls_return TO lt_return.CLEAR:ls_return.
  ELSEIF sy-subrc <> 0.
    "采购单不存在
    ls_return-type = 'E'.
    ls_return-code = 'MN351'.
    ls_return-message = 'E'.

    SELECT SINGLE text
        INTO ls_return-message
        FROM t100
        WHERE arbgb = 'MN'
        AND   msgnr = '351'
        AND  sprsl = i_language.

    APPEND ls_return TO lt_return.CLEAR:ls_return.
  ENDIF.

ENDFUNCTION.

 

 

 

posted on 2022-06-09 16:22  淡淡-祥  阅读(92)  评论(0编辑  收藏  举报