Skip to Content

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

 

 

 

 

 

 

13 Comments
You must be Logged on to comment or reply to a post.
  • 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

  • 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

  • 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