on 2025 May 08 11:50 AM
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:
Bukrs | Belnr | Gjahr | buzei | umskz | bschl | wrbtr | waers | lifnr | ebeln | budat | bldat |
1000 | 5000 | 2023 | 10 | A | 29 | 100000 | INR | VEND001 | 12345 | 01-01-2024 | 02-01-2024 |
1000 | 5002 | 2023 | 10 | A | 29 | 200000 | INR | VEND002 | 12346 | 01-01-2024 | 02-01-2024 |
Invoices Data:
Bukrs | Belnr | Gjahr | buzei | umskz | bschl | wrbtr | waers | lifnr | ebeln | budat | bldat | |
1000 | 6000 | 2023 | 10 | A | 31 | 500000 | INR | VEND001 | 12345 | 10-01-2024 | 11-01-2024 | 1st Invoice cleared against 100000 balance is 500000 |
1000 | 6001 | 2023 | 10 | A | 34 | 300000 | INR | VEND001 | 12345 | 14-01-2024 | 15-01-2024 | 500000 is cleared against 2nd invoice residual item 200000 is created |
1000 | 6002 | 2023 | 10 | A | 31 | 200000 | INR | VEND001 | 12345 | 18-01-2024 | 19-01-2024 | 200000 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:
TYPES: BEGIN OF ty_awkey,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
END OF ty_awkey.
DATA: lt_awkey TYPE STANDARD TABLE OF ty_awkey WITH EMPTY KEY.
DATA: lt_return TYPE TABLE OF bapiret2,
lv_line TYPE i,
lv_index TYPE sy-tabix,
lv_flag TYPE flag.
DATA: ls_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(3) TYPE n VALUE '001',
lv_simu TYPE char1,
lv_function TYPE funct_pi VALUE 'C',
lv_mode TYPE allgazmd VALUE 'N',
lv_balance TYPE wrbtr.
SELECT bukrs, belnr, gjahr, buzei, umskz, bschl, blart,
wrbtr, waers,lifnr, ebeln, budat, bldat
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 lifnr, ebeln, budat.
IF sy-subrc NE 0.
MESSAGE TEXT-t01 TYPE 'I'.
LEAVE LIST-PROCESSING.
ELSE.
SORT lt_source_doc BY lifnr ebeln budat.
ENDIF.
SELECT bukrs, belnr, gjahr, buzei, umskz, bschl, blart,
wrbtr, waers,lifnr, ebeln,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 lifnr, ebeln, budat.
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 bukrs, belnr, gjahr, awkey
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 belnr, gjahr, ebeln
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_belnr) = ls_bkpf-awkey(10).
DATA(lv_gjahr) = ls_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_doc) WHERE lifnr = ls_source-lifnr
AND ebeln = ls_source-ebeln AND wrbtr > 0 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.
CLEAR: lt_blntab, lt_fttax, lt_ftpost, ls_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_blntab) INDEX 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 #
Request clarification before answering.
User | Count |
---|---|
34 | |
21 | |
13 | |
8 | |
5 | |
4 | |
4 | |
4 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.