cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Auto Clearing of Vendor Open Items using BAPI "POSTING_INTERFACE_CLEARING" with residual items too

SalmaMogal
Newcomer
0 Kudos
113

Hi Folks,

I got a requirement for my client to auto clear vendor open items through a background job report. It is an alternative to standard T-Code FB1K. In FB1K user able to perform clearing of open items only for one Account at a time and it is very tedious process to match open items and related invoices and clear them by creating Residual Items too if payment is not 0. So We came up with an Z report. 

Criteria to get Open Items (lt_open_items):

BSIK records: conditions: UMSKZ should be 'A', BSCHL should be '29' 

Criteria to get Related Invoices (lt_invoices):

BSIK records: conditions: BSCHL should be '31' 

Based on lt_open_items LIFNR, BUDAT, EBELN and I matching records with EKBE & MKPF to get EBELN and updating it in lt_invoices. Everything is fine & I am able to fetch records for example as shown below:
Open Items:

BukrsBelnrGjahrbuzeiumskzbschlwrbtrwaerslifnrebelnbudatbldat
10005000202310A29100000INRVEND0011234501-01-202402-01-2024
10005002202310A29200000INRVEND0021234601-01-202402-01-2024

Invoices Data:

BukrsBelnrGjahrbuzeiumskzbschlwrbtrwaerslifnrebelnbudatbldat 
10006000202310A31500000INRVEND0011234510-01-202411-01-20241st Invoice cleared against 100000 balance is 500000
10006001202310A34300000INRVEND0011234514-01-202415-01-2024500000 is cleared against 2nd invoice residual item 200000 is created
10006002202310A31200000INRVEND0011234518-01-202419-01-2024200000 is adjusted against 3rd invoice


Challenges which i am facing now:
1. I am processing each open Item and processing it for each Unique PO through BAPI but SY-SUBRC is becoming 0 but clearing not happening and residual items are not getting created obviously because somewhere I am loosing it.


ABAP LOGIC:
    TYPESBEGIN OF ty_awkey,
             belnr TYPE belnr_d,
             gjahr TYPE gjahr,
           END OF ty_awkey.

    DATAlt_awkey TYPE STANDARD TABLE OF ty_awkey WITH EMPTY KEY.

    DATAlt_return TYPE TABLE OF bapiret2,
          lv_line   TYPE i,
          lv_index  TYPE sy-tabix,
          lv_flag   TYPE flag.

    DATAls_header   TYPE bapiache09,
          lt_currency TYPE STANDARD TABLE OF bseg,
          lt_ftclear  TYPE STANDARD TABLE OF ftclear,
          lt_ftpost   TYPE STANDARD TABLE OF ftpost,
          ls_ftclear  TYPE ftclear,
          lt_blntab   TYPE TABLE OF blntab,
          lt_fttax    TYPE TABLE OF fttax,
          ls_ftpost   TYPE ftpost,
          lv_count(3TYPE VALUE '001',
          lv_simu     TYPE char1,
          lv_function TYPE funct_pi VALUE 'C',
          lv_mode     TYPE allgazmd VALUE 'N',
          lv_balance  TYPE wrbtr.


    SELECT bukrsbelnrgjahrbuzeiumskzbschlblart,
           wrbtrwaers,lifnrebelnbudatbldat
       FROM bsik
       INTO TABLE @DATA(lt_source_doc)
       WHERE lifnr IN @s_lifnr
       AND bukrs IN @s_bukrs
       AND budat LE @p_date
       AND umskz EQ 'A'
       AND bschl EQ '29'
      ORDER BY lifnrebelnbudat.
    IF sy-subrc NE 0.
      MESSAGE TEXT-t01 TYPE 'I'.
      LEAVE LIST-PROCESSING.
    ELSE.
      SORT lt_source_doc BY lifnr ebeln budat.
    ENDIF.

    SELECT bukrsbelnrgjahrbuzeiumskzbschlblart,
           wrbtrwaers,lifnrebeln,budat
       FROM bsik
       INTO TABLE @DATA(lt_recipient_doc)
       WHERE lifnr IN @s_lifnr
       AND bukrs IN @s_bukrs
       AND budat LE @p_date
       AND bschl EQ '31'
      ORDER BY lifnrebelnbudat.
    IF sy-subrc NE 0.
      MESSAGE TEXT-t02 TYPE 'I'.
      LEAVE LIST-PROCESSING.
    ELSE.
      SORT lt_recipient_doc BY lifnr ebeln budat.
    ENDIF.

    IF lt_recipient_doc IS NOT INITIAL.

      SELECT bukrsbelnrgjahrawkey
       INTO TABLE @DATA(lt_bkpf)
       FROM bkpf
       FOR ALL ENTRIES IN @lt_recipient_doc
       WHERE bukrs EQ @lt_recipient_doc-bukrs
       AND belnr EQ @lt_recipient_doc-belnr
       AND gjahr EQ @lt_recipient_doc-gjahr.
    ENDIF.

    lt_awkey VALUE #FOR bk IN lt_bkpf (
                                belnr bk-awkey(10)
                                gjahr bk-awkey+10(4).

    IF lt_awkey IS NOT INITIAL.
      SELECT belnrgjahrebeln
         INTO TABLE @DATA(lt_ekbe)
         FROM ekbe
         FOR ALL ENTRIES IN @lt_awkey
         WHERE belnr @lt_awkey-belnr
         AND gjahr @lt_awkey-gjahr.
    ENDIF.


    LOOP AT lt_recipient_doc ASSIGNING FIELD-SYMBOL(<inv>).
      READ TABLE lt_bkpf INTO DATA(ls_bkpf)
           WITH KEY bukrs <inv>-bukrs belnr <inv>-belnr gjahr <inv>-gjahr.
      IF sy-subrc 0.
        DATA(lv_belnrls_bkpf-awkey(10).
        DATA(lv_gjahrls_bkpf-awkey+10(4).
        READ TABLE lt_ekbe INTO DATA(ls_ekbe)
             WITH KEY belnr lv_belnr gjahr lv_gjahr.
        IF sy-subrc 0.
          <inv>-ebeln ls_ekbe-ebeln.
        ENDIF.
      ENDIF.
    ENDLOOP.

*    SORT lt_recipient_doc BY lifnr ebeln budat.

    LOOP AT lt_source_doc INTO DATA(ls_source).
      lv_balance ls_source-wrbtr.
      lv_flag abap_true.

      LOOP AT lt_recipient_doc INTO DATA(ls_recepient_docWHERE lifnr ls_source-lifnr
                              AND ebeln ls_source-ebeln AND wrbtr > AND waers ls_source-waers.
        IF lv_balance LE 0.
          EXIT.
        ENDIF.

        APPEND VALUE #agkoa 'K'
                            agkon ls_source-lifnr
                            agbuk ls_source-bukrs
                            agums ls_source-umskz
                            selfd 'BELNR'
                            selvon ls_source-belnr
                            selbis ls_recepient_doc-belnr
                            xnops abap_true TO lt_ftclear.

        IF lv_balance GE ls_recepient_doc-wrbtr.
          lv_balance lv_balance ls_recepient_doc-wrbtr.
        ELSE.
          lv_balance 0.
        ENDIF.
      ENDLOOP.

      CLEARlt_blntablt_fttaxlt_ftpostls_ftpost.
      IF lv_flag IS NOT INITIAL.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-BLDAT' fval ls_source-bldat )  TO lt_ftpost.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-BUDAT' fval ls_source-budat )  TO lt_ftpost.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-BELNR' fval ls_source-belnr )  TO lt_ftpost.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-BLART' fval 'AB' )             TO lt_ftpost.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-BUKRS' fval ls_source-bukrs )  TO lt_ftpost.
        APPEND VALUE #stype gc_header count lv_count fnam 'BKPF-WAERS' fval ls_source-waers )  TO lt_ftpost.
        APPEND VALUE #stype gc_item   count lv_count fnam 'RF05A-NEWKO' fval ls_source-lifnr TO lt_ftpost.
        DATA(lv_sgtxt|Auto clearing|.
        APPEND VALUE #stype gc_item   count lv_count fnam 'BSEG-SGTXT' fval lv_sgtxt )         TO lt_ftpost.
        APPEND VALUE #stype gc_item   count lv_count fnam 'BSEG-BSCHL' fval '29' )             TO lt_ftpost.
        APPEND VALUE #stype gc_item   count lv_count fnam 'BSEG-WRBTR' fval lv_balance )       TO  lt_ftpost.
        APPEND VALUE #stype gc_item   count lv_count fnam 'RF05A-NEWUM' fval ls_source-umskz TO lt_ftpost.


        CALL FUNCTION 'POSTING_INTERFACE_START'
          EXPORTING
            i_function         lv_function
            i_mode             lv_mode
          EXCEPTIONS
            client_incorrect   1
            function_invalid   2
            group_name_missing 3
            mode_invalid       4
            update_invalid     5
            user_invalid       6
            OTHERS             7.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
          EXPORTING
            i_auglv                    'UMBUCHNG'
            i_tcode                    'FB05'
            i_sgfunct                  'C'
*           i_xsimu                    = space
          IMPORTING
            e_msgid                    sy-msgid
            e_msgno                    sy-msgno
            e_msgty                    sy-msgty
            e_msgv1                    sy-msgv1
            e_msgv2                    sy-msgv2
            e_msgv3                    sy-msgv3
            e_msgv4                    sy-msgv4
          TABLES
            t_blntab                   lt_blntab
            t_ftclear                  lt_ftclear
            t_ftpost                   lt_ftpost
            t_fttax                    lt_fttax
          EXCEPTIONS
            clearing_procedure_invalid 1
            clearing_procedure_missing 2
            table_t041a_empty          3
            transaction_code_invalid   4
            amount_format_error        5
            too_many_line_items        6
            company_code_invalid       7
            screen_not_found           8
            no_authorization           9
            OTHERS                     10.

        IF sy-subrc <> 0.
        ENDIF.

        CALL FUNCTION 'POSTING_INTERFACE_END'
          EXPORTING
            i_bdcimmed              abap_true
          EXCEPTIONS
            session_not_processable 1
            OTHERS                  2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        READ TABLE lt_blntab INTO DATA(ls_blntabINDEX 1.
        IF sy-subrc 0.
          gs_final-belnr ls_blntab-belnr.
          gs_final-bukrs ls_blntab-bukrs.
          gs_final-msg   'Document is cleared successfully'.
        ELSE.
          IF sy-msgty IS NOT INITIAL.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno INTO gs_final-msg
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
        ENDIF.

      ENDIF.
      CLEAR lv_flag.
    ENDLOOP.


Please let me know, If I am making mistake any where or I am taking wrong approach:
@ABAP @SAPABAP ABAP Development @FICO #

Accepted Solutions (0)

Answers (0)