Enlarging the use of BAPI_ACC_DOCUMENT_POST
Dear SCN Friends,
I would like to share some tips related to the use of BAPI_ACC_DOCUMENT_POST and how to enlarge the use of this powerfull BAPI for Accounting Post.
For a long time, I’ve been using the BAPI_ACC_DOCUMENT_POST in my solutions. It is much better than the Transaction Call Technique (CALL_TRANSACTION of FB01 for example) for many reasons listed below:
- You can simulate the document creation usine BAPI_ACC_DOCUMENT_CHECK before commit.
- The Z Transaction Code is recorded in the BKPF table (Field TCODE) where you can see in the document display (FB03). So, you can track where the posting came from.
- You don’t have Screen Layout/Field Status errors like in Transaction Call.
Because of these reasons and many others I prefer to use the BAPI_ACC_DOCUMENT_POST.
In the previous months I’ve been researching about this BAPI to find some answers to the following questions that I have in mind:
- Why is not possible to use the BAPI_ACC_DOCUMENT_POST to posting Noted Items and/or Special G/L Transactions ? There is no input parameter to determine the Special GL Indicators.
- Why we can’t change the Posting Key of the BAPI_ACC_DOCUMENT_POST ? We don´t have the posting key in the Parameter Tables to use. It determines automatically (40/50 for G/L Accounts, 31/21 for vendor sub-ledger, etc.)
- Ledger Specific Posting
So, I found out some improvements to be done to enlarge the use of the BAPI_ACC_DOCUMENT_POST that I would like to share to you.
Let’s get straight to the point, technical SAP allow us to Change the Accounting Document thru BAdI BADI_ACC_DOCUMENT (Interface IF_EX_ACC_DOCUMENT). In this BAdI there is a CHANGE Method. Check the parameters bellow:
As we can see, Header, Item, Currency and WHT tables are available there to be changed. These structures are much more complete than the input parameters of BAPI*.
* Note that the structure C_EXTENSION2 appears at this point.
I’ve been researching about the use of EXTENSION2 table, and I could not find an specific use of this structure in the FI accounting post. Many posts in the internet mention only the EXTENSION1.
In the processing of BAPI_ACC_DOCUMENT_POST table EXTENSION2 is not used, the Method Change of BAdI is called with the information in EXTENSION2 change the structures of the accounting document ACCHD, ACCIT, ACCCR, ACCWT, etc:
So, the idea here is to use the EXTENSION2 table in BAPI_ACC_DOCUMENT_POST and create some dynaimc ABAP code in the BAdI to add the additional information in the accounting tables.
We have set the logic of the EXTENSION2 as below:
STRUCTURE: The structure to be changed or added (ACCOUNTGL, ACCOUNTRECEIVABLE, ACCOUNTPAYABLE or DOCUMENTHEADER)
VALUEPART1: Line Item ID (ITEMNO_ACC)
VALUEPART2: The Structure/Table to be modified in the BADI (C_ACCHD, C_ACCIT, C_ACCCR, C_ACCWT)
VALUEPART3: The field of the Structure/Table to be modified in the BADI (C_ACCHD, C_ACCIT, C_ACCCR, C_ACCWT)
VALUEPART4: The value to be endered or change in the the Structure/Table to be modified in the BADI.
EXAMPLE
The example below, I will post an Customer Down Payment Request.
The following information/data should be informed in EXTENSION2 table to have the down payment request working:
C_ACCIT-BSTAT Document Status: ‘S’ for noted items
C_ACCIT-ZUMSK Target Special G/L Indicator: ‘A’ for Down Payment Request
C_ACCHD-GLVOR Business Transaction: ‘RFST’ FI: Statistical postings
The standards of BAPI_ACC_DOCUMENT_POST does not allow the modification on these parameters, so the BAdI changind the accounting data with the information in EXTENSION2 will help us. Check the parameters:
Check how the structure EXTENSION2 is filled:
Note that the DOCUMENTHEADER there is no VALUEPART1, the line item because is a change in the header of the document C_ACCHD table.
Let´s see how the BAdI source code is being designed to interpret that and change the tables.
Check the ABAP source code below that we developed to dynamicly interpret the EXTENSION2 and change the structures:
METHOD if_ex_acc_document~change.
*** Local variable
DATA: lt_extension2 TYPE STANDARD TABLE OF bapiparex.
*** Pointers
FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE,
<fs_header> TYPE any,
<fs_field> TYPE any,
<fs_ext> TYPE bapiparex,
<fs_ext2> TYPE bapiparex.
*** Delete duplicate records
lt_extension2[] = c_extension2[].
SORT lt_extension2 BY structure ASCENDING
valuepart1 ASCENDING
valuepart2 ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_extension2 COMPARING structure
valuepart1
valuepart2.
*** Read all values to update
LOOP AT lt_extension2 ASSIGNING <fs_ext>.
*** Search inside a internal table
IF NOT <fs_ext>-valuepart1 IS INITIAL.
*** Get Table value
UNASSIGN <fs_table>.
ASSIGN (<fs_ext>-valuepart2) TO <fs_table>.
*** Found data
CHECK sy-subrc = 0.
*** Try get values
TRY.
*** Get table
READ TABLE <fs_table> WITH KEY
('BAPI_PARAM') = <fs_ext>-structure
('BAPI_TABIX') = <fs_ext>-valuepart1
ASSIGNING <fs_header>.
*** Found record - Update Fields
CHECK sy-subrc = 0.
*** Get all fields of same position
LOOP AT c_extension2 ASSIGNING <fs_ext2>
WHERE structure = <fs_ext>-structure
AND valuepart1 = <fs_ext>-valuepart1
AND valuepart2 = <fs_ext>-valuepart2.
*** Get field
UNASSIGN <fs_field>.
ASSIGN COMPONENT <fs_ext2>-valuepart3 OF STRUCTURE <fs_header>
TO <fs_field>.
*** Update new value
CHECK sy-subrc = 0.
<fs_field> = <fs_ext2>-valuepart4.
ENDLOOP.
*** Error at read table
CATCH cx_root.
UNASSIGN <fs_table>.
ENDTRY.
*** Header Case
ELSE.
*** Get Header
UNASSIGN <fs_header>.
ASSIGN (<fs_ext>-valuepart2) TO <fs_header>.
*** Found data
CHECK sy-subrc = 0.
*** Get all fields of same position
LOOP AT c_extension2 ASSIGNING <fs_ext2>
WHERE structure = <fs_ext>-structure
AND valuepart1 = <fs_ext>-valuepart1
AND valuepart2 = <fs_ext>-valuepart2.
*** Get field
UNASSIGN <fs_field>.
ASSIGN COMPONENT <fs_ext2>-valuepart3 OF STRUCTURE <fs_header>
TO <fs_field>.
*** Update new value
CHECK sy-subrc = 0.
<fs_field> = <fs_ext2>-valuepart4.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDMETHOD.
In the end, the document is posted
This can be done with another fields or purpose, not only for Down Payment or Special G/L documents.
I never saw this kind of solution to enlarge the use of the BAPI_ACC_DOCUMENT_POST in other customers. So I hope I could share some help for you guys that is looking for something related to this post.
Please, if you will do something like this solutton, pay attention in the fields that you change in the accounting posting to not generate inconsistence postings. For example, in the special g/l transactions you must define Business Transaction as ‘RFST’ otherwise FAGLFLEXA and FAGLFLEXT will be filled when should not.
Test the scenarios carefully and enjoy it !
Best regards,
Gabriel Coleti
Hi Gabriel, looks very valuable, thanks for sharing!
Thanks you Bastiaan 🙂
Very nice - I learned some more about a function module that I use.
Could you add the tag ABAP Development? I know more people than just me would like to read this!
Michelle
Thanks you Michelle, I will do it. I should be useful for ABAP community as well.
Nice and useful blog. Just would like to let you know, that you can do ledger specific postings with passing acccounting principle in header structure of BAPI_ACC_DOCUMENT_POST.
Best regards, Tapio
Thanks Tapio, yes, you can do specific ledger posting as well. Another use that we do here is posting using the FM - Emarked Funds Object, since in the ACCOUNTGL parameter table doesn´t have the Emarked Funds/Item to post. This solutions has helped us a lot.
Hi Gabriel Felipe Coleti, I have a requirement to create documents through this BAPI and the user wants it to also carry the "freely defined currencies" (at least one of them, fields ROCUR/OSL from ACDOCA). I found out that this BAPI supports freely definable currencies, and was just wondering if you have already implemented this before, or know how achieve this?
Many thanks!
Hi Willian,
Were you able to find a solution to this ? i have the same requirement... I need to populate ACDOCA-QUANT1 field but, i am not able to find this field in ACCIT or any structure where i can transfer the value.
Hi,
Very interesting, thank you for sharing it. I'm trying to figure out how to post recurring entries (FBD1)with the BAPI, I'm stuck how to populate the table BKDF. Any clue how to achieve this ? thx
Did you manage to use BAPI_ACC_DOCUMENT_POST to post recurring entries (FBD1)?
I have a similar requirement and I am looking a solution
Good job my dear ! Top !!
Hi Gabriel,
Thank you for your post it was very helpful.
I really this post is some years old now, but I was hoping you might be able to advise me. I am using this BAPI however it is posting individual items instead of posting per document.
As i am Posting from the HR System to the FI System it should post at document Level and not per item because otherwise in FI we end up with thousands of entries!
Kind regards
thanks Gabriel Felipe Coleti
Very good and very clear
Attention: if this do not update filed's of sap table ,
run report SAPFACCG to update the structure P_ACC (the report only runs the function FI_DOCUMENT_INIT and will not raise any messages or execution log).
Best Regards
Hi all,
I've added a ZZ field by creating APPEND structures to BKPF and ACCIT also.
Then I'm trying to update that field by using the same code snippet provided here fo BADI BADI_ACC_DOCUMENT but the field is not getting updated.
I'm able to update any standard field on BKPF using EXTENSION2 but it is not working for the ZZ field in append structure.
I've been debugging BAPI_ACC_DOCUMENT_POST all day but there is so many code and I'm not been able to find anything. I've also searched in all SCN and Gogle for this but found nothing. :-/
I've done this in the past in ECC with EXTENSION1 and BTE but now in S4HANA 1809 it doesn't work with the BADI or the BTE.
What am I missing here? Any help would be useful.
Thanks in advanced.
Regards.
Carlos
Disculpa, lo resolviste?.. de ser así como lo hiciste... saludos.
Please appending the same customer structure for COBL_FI as well.
I solved my requirement in this way.
Hi Gabriel,
Nice blog. Very helpful.
Thanks
Wow dude this is so good!
Thank you very much for the well explained information, I searched a lot how to use this efficiently and with your post I achieved it
Hi, I know it's an old post, but I'm facing a similar issue triing to use this bapi for F-59 but I'm getting some errors even though I have implemented the badi.
I think I'm filling wrong ACCOUNTRECEIVABLE structure, and getting this error: E RW 033 Interfaz RW: Saldo en moneda de transacción
Is this the structure I have to fill ? thnks!