fbu8跨公司冲销-冲销前检查是否允许冲销的方法

版权声明:如有转载请注明 by Huang.Lin https://blog.csdn.net/huanglin6/article/details/82897688

业务场景:在执行跨公司冲销时(FBU8),当我们在使用BAPI去冲销时候需要去检查是否允许冲销,就像MIGO过账前的检查一样,但是BAPI TB_FI_DOCUMENT_REVERSE 虽然有模拟运行标识,但并没有什么用,而且这个BAPI必须将所有的单子都冲一次(BAPI自带commit)。业务要求是要么都冲,要么都不冲,所以需要在冲之前校验一下。

解决办法:GOOGLE了也没找到什么好的解决办法,只说这个BAPI可以用,后面实在没招,DEBUG了FBU8的程序,将校验的逻辑copy了出来,以下是完整的校验逻辑,只需改动很少即可运行。最后校验没问题的话直接调用BDC,模拟FBU8输入跨公司号去冲销,问题得以解决!

*&---------------------------------------------------------------------*
*& FORM CHECK_BEFORE_REVERSE
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*&      <-- L_ERROR
*&---------------------------------------------------------------------*
FORM CHECK_BEFORE_REVERSE  USING P_FW_OUTPUT STRUCTURE GS_OUTPUT
                           CHANGING P_L_ERROR P_MESSAGE.

    DATA COMPANYCODE         TYPE BUKRS.
    DATA DOCUMENT            TYPE BELNR_D.
    DATA DOCUMENT2           TYPE BELNR_D.
    DATA YEAR                TYPE GJAHR.
    DATA OBJ_KEY             TYPE AWKEY.
    DATA DATE_OF_REVERSAL    TYPE BUDAT.
    DATA PERIOD_OF_REVERSAL  TYPE MONAT.
    DATA REASON_FOR_REVERSAL TYPE STGRD.
    DATA FLOW_IN             TYPE VTBFHAPO.
    DATA SIMULATION          TYPE BOOLE_D.
    DATA L_MESSAGE           TYPE STRING.

  SELECT *
    INTO TABLE @DATA(LT_BKPF)
    FROM BKPF
   WHERE BVORG EQ @P_FW_OUTPUT-BVORG.

  LOOP AT LT_BKPF ASSIGNING FIELD-SYMBOL(<FW_BKPF>).


* ------ PREPARE BATCH-INPUT DATA

    REFRESH BDCDATA.
    CLEAR BDCDATA.
    BDCDATA-PROGRAM  = 'SAPMF05A'.
    BDCDATA-DYNPRO   = '0105'.
    BDCDATA-DYNBEGIN = 'X'.
    APPEND BDCDATA.

    PERFORM FILL_BDCDATA USING 'RF05A-BELNS' <FW_BKPF>-BELNR.
    PERFORM FILL_BDCDATA USING 'BKPF-BUKRS'  <FW_BKPF>-BUKRS.
    PERFORM FILL_BDCDATA USING 'RF05A-GJAHS' <FW_BKPF>-GJAHR.
    PERFORM FILL_BDCDATA USING 'UF05A-STGRD' P_STGRD.
    IF NOT P_BUDAT IS INITIAL.
      PERFORM FILL_BDCDATA USING 'BSIS-BUDAT' P_BUDAT.
      PERFORM FILL_BDCDATA USING 'BSIS-MONAT' P_BUDAT+4(2).
    ENDIF.
*    IF NOT RF05U-VATDATE IS INITIAL.                           "N1660511
*      PERFORM FILL_BDCDATA USING 'VBKPF-VATDATE' RF05U-VATDATE."N1660511
*    ENDIF.                                                     "N1660511
* TRANSFER BARCODE TO ALL PARTICIPATING DOCUMENTS (NOTE 0390492)

*    PERFORM FILL_BDCDATA USING 'FS006-DOCID' DOCID.
*    PERFORM FILL_BDCDATA USING 'FS006-BARCD' BARCODE_ID.
* SUPRESS CHECKING OF BARCODE IN TRANSACTION FB08 (NOTE 440553)
    PERFORM FILL_BDCDATA USING 'FS006-XNOCHECK' 'X'.

    PERFORM FILL_BDCDATA USING 'BDC_OKCODE' '/11'.

    _MODE = 'N'.

    CALL TRANSACTION 'FB08' USING BDCDATA MODE _MODE.
*    IF SY-SUBRC = 0.
*      <FW_BKPF>-XBUOK = 'X'.
*    ELSE.
*      CLEAR <FW_BKPF>-XBUOK.
*    ENDIF.
    SELECT SINGLE * FROM  T100
           WHERE  SPRSL       = SY-LANGU
           AND    ARBGB       = SY-MSGID
           AND    MSGNR       = SY-MSGNO       .
    IF SY-SUBRC = 0.
      F160 = T100-TEXT.
    ELSE.
      F160 = SY-MSGID.
      F160+3(3) = SY-MSGNO.
* (DEL) F160+7(10) = ':  & & & &'.                          "NOTE455782
      F160+7(14) = ':  &1 &2 &3 &4'.                        "NOTE455782
    ENDIF.
*   ERROR? NOTE 413469
    IF SY-MSGID NE 'F5' OR SY-MSGNO NE '530'.
      ERROR = 'X'.
    ENDIF.

*    CLEAR BELEG_TABLE-XBSTATB.                             "NOTE2375208
    DATA: L_BSTAT LIKE BKPF-BSTAT.                         "NOTE2375208
    IF SY-MSGID = 'F5' AND SY-MSGNO = '360'.               "NOTE2375208
      SELECT SINGLE BSTAT INTO L_BSTAT                     "NOTE2375208
       FROM BKPF                                           "NOTE2375208
       WHERE BUKRS = <FW_BKPF>-BUKRS                     "NOTE2375208
         AND BELNR = <FW_BKPF>-BELNR                     "NOTE2375208
         AND GJAHR = <FW_BKPF>-GJAHR.                    "NOTE2375208
      IF L_BSTAT = 'B' OR L_BSTAT = 'A'.                   "NOTE2375208
*        BELEG_TABLE-XBSTATB = 'X'.                         "NOTE2375208
      ENDIF.                                               "NOTE2375208
    ENDIF.                                                 "NOTE2375208

    REPLACE '&1' WITH SY-MSGV1 INTO F160.                   "NOTE455782
    IF SY-SUBRC NE 0.                                       "NOTE455782
      REPLACE '&' WITH SY-MSGV1 INTO F160.
    ENDIF.                                                  "NOTE455782
    CONDENSE F160.
    REPLACE '&2' WITH SY-MSGV2 INTO F160.                   "NOTE455782
    IF SY-SUBRC NE 0.                                       "NOTE455782
      REPLACE '&' WITH SY-MSGV2 INTO F160.
    ENDIF.                                                  "NOTE455782
    CONDENSE F160.
    REPLACE '&3' WITH SY-MSGV3 INTO F160.                   "NOTE455782
    IF SY-SUBRC NE 0.                                       "NOTE455782
      REPLACE '&' WITH SY-MSGV3 INTO F160.
    ENDIF.                                                  "NOTE455782
    CONDENSE F160.
    REPLACE '&4' WITH SY-MSGV4 INTO F160.                   "NOTE455782
    IF SY-SUBRC NE 0.                                       "NOTE455782
      REPLACE '&' WITH SY-MSGV4 INTO F160.
    ENDIF.                                                  "NOTE455782
    CONDENSE F160.
    REPLACE '$' WITH SY-MSGV1 INTO F160.
    CONDENSE F160.
    REPLACE '$' WITH SY-MSGV2 INTO F160.
    CONDENSE F160.
    REPLACE '$' WITH SY-MSGV3 INTO F160.
    CONDENSE F160.
    REPLACE '$' WITH SY-MSGV4 INTO F160.
    CONDENSE F160.
    IF SY-MSGTY EQ 'E'.
      P_L_ERROR = 'X'.
      P_MESSAGE = F160.
      LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE  HKTID = P_FW_OUTPUT-HKTID AND LIFNR = P_FW_OUTPUT-LIFNR AND ZBVTY = P_FW_OUTPUT-ZBVTY.
        GS_OUTPUT-STATUS   = GC_LIGHT_R.
        GS_OUTPUT-MESSAGE1 = P_MESSAGE.
        MODIFY GT_OUTPUT FROM GS_OUTPUT.
      ENDLOOP.
    ENDIF.


  ENDLOOP.

猜你喜欢

转载自blog.csdn.net/huanglin6/article/details/82897688