Sunday, 8 January 2023

Alternative to BDC for Transactions F-30 or FB05 in RAP/Fiori Apps for Posting with Clearing

Posting the documents with Clearing open items and doing the transfer postings is a very common requirements in most of the SAP implementation FICO based projects.

Clearing can done in multiple ways

◉ G/L posting with clearing
◉ Customer – Customer  Posting with clearing
◉ Vendor- vendor Posting with Clearing

Till today for the custom based requirements we are using either BDC on the transactions F-30 or FB05 with Transfer posting with clearing options or using the below three function modules which is detailed out in the below blog .

◉ POSTING_INTERFACE_START
◉ POSTING_INTERFACE_CLEARING
◉ POSTING_INTERFACE_END

However with the ABAP cloud and Fiori apps are coming into picture there was an alternative approach required to perform the transfer postings.

New Approach for the Transfer postings :


During the analysis to find a new class or function module to avoid the BDC coding and perform the above activity the below applications Upload Journal Entry app  F2548 https://fioriappslibrary.hana.ondemand.com/sap/fix/externalViewer/#/detail/Apps(‘F2548’)/S24OPand the SOAP based Interface https://api.sap.com/api/OP_JOURNALENTRYBULKCLEARINGREQUEST_IN/overview which is posting the Journal Entries is evaluated and realized the class CL_FDC_ACCDOC_POST=> ACCDOC_POST is used in the same.

Before Moving into the technical solution let us understand what is the Transfer posting with Clearing :

Lets say customer 1  has total open items of 2000 Eur and out of that he wants to transfer 1500 to another customer and clear the original posting we can use any of the transaction FB05 or F-30 to do the same using the options

◉ Open Transaction F-30 provide the customer1 details to be cleared and posted

SAP ABAP Career, SAP ABAP Skills, SAP ABAP Jobs, SAP ABAP Prep, SAP ABAP Preparation, SAP ABAP Learning, SAP ABAP
F-30 Transaction

Enter the amount to be transferred from Customer 1

SAP ABAP Career, SAP ABAP Skills, SAP ABAP Jobs, SAP ABAP Prep, SAP ABAP Preparation, SAP ABAP Learning, SAP ABAP
Transfer Amount

Now click on the Process Open Items buttons and check the list of open items

SAP ABAP Career, SAP ABAP Skills, SAP ABAP Jobs, SAP ABAP Prep, SAP ABAP Preparation, SAP ABAP Learning, SAP ABAP

Now click on the Charge Off Difference to charge the remaining amounts to Customer 2 for Clearing as shown below enter amount as *

SAP ABAP Career, SAP ABAP Skills, SAP ABAP Jobs, SAP ABAP Prep, SAP ABAP Preparation, SAP ABAP Learning, SAP ABAP

On Click of back button the posting will be seen as below with the customer line items and the amounts to be transferred,

SAP ABAP Career, SAP ABAP Skills, SAP ABAP Jobs, SAP ABAP Prep, SAP ABAP Preparation, SAP ABAP Learning, SAP ABAP

Thus you can do the postings and clear the Customer 1. When you open the Open items again for the Customer 1 1500 will be cleared.

Find the below reference code for the reference for Customer – Customer Transfer posting scenario .

◉ Fill the Header structure
◉ Fill the Item Table with the line items for the Customer 1 to be transferred
◉ Fill the Item table to be cleared structure with the Customer 2 number
◉ Simulate using the class method cl_fdc_accdoc_post=>accdoc_simulate  to check for any errors
◉ In case of no errors use the class cl_fdc_accdoc_post=>accdoc_post  or wrap the class inside a RFC Function module for RAP based scenarios and call the function module with Destination ‘NONE’ to avoid the commit dumps .

NOTE : The below code will help to start with the postings with clearing but it might non work 1-1 in practical scenarios .

*&---------------------------------------------------------------------*
*& Report Z_POST_CLEAR
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_post_clear.
DATA: fdc_accdoc_tax              TYPE fdc_t_accdoc_tax,
      fdc_accdoc_whtax            TYPE fdc_t_accdoc_whtax,
      fdc_accdoc_itm_to_be_clrd   TYPE fdc_t_accdoc_itm_to_be_clrd,
      fdc_accdoc_pay_diff         TYPE fdc_t_accdoc_pay_diff,
      accdoc_itm_copa             TYPE fdc_t_accdoc_itm_copa,
      fdc_accdoc_itm              TYPE fdc_t_accdoc_itm,
      accdoc_dispute              TYPE fdc_t_accdoc_dispute,
      accdoc_one_time_account     TYPE fdc_t_accdoc_one_time_account,
      itm_payment_only            TYPE fdc_s_accdoc_with_item,
      fdc_accdoc_warning_messages TYPE fdc_t_accdoc_warning_messages,
      warning                     TYPE fdc_t_accdoc_warning_messages.
** Fill header info
DATA(headerinfo) = VALUE fdc_s_accdoc_hdr( bukrs = '0001'
                                 blart = cl_abap_context_info=>get_system_date( )
                                 budat = cl_abap_context_info=>get_system_date( )
                                 waers = 'EUR'
                                 hwaer = 'EUR' " Get the currencies from CDS View p_ldcmpcurr
                                 hwae2 = 'EUR' " Get the currencies from CDS View p_ldcmpcurr
                                 xblnr = 'Test13'
                                 gjahr = '2023'
                                 tcode = cl_fdc_posting_impl=>co_fdc_s_accdoc_hdr_tcode-ar_clearing "FBDC_C022'
                                 auglv = 'UMBUCHNG'
                                 curt1 = '10' " Get the currencies from CDS View p_ldcmpcurr
                                 curt2 = '10' " Get the currencies from CDS View p_ldcmpcurr
                                 awtyp = 'BKPFF'
                                 augtx = 'cleared header text' ).
"Get the Open Items from the CDS view I_OperationalAcctgDocItem and loop at it and fill the item informations
DATA(iteminfo) = VALUE fdc_t_accdoc_itm(
                                   ( shkzg = 'S'
                                     bschl = '17' " Other Clearing
                                     bukrs = '0001'
                                     gjahr = '2023'
                                     wrbtr = 1500
                                     dmbtr = 1500
                                     dmbe2 = 1500
                                     zuonr = 'zuonr'
                                     kunnr = Customer 1 " for the GL clearing fill HKONT instead of KUNNR
                                     posnr = '0000000001'
                                     koart = 'D'
                                   )
                                  ).

DATA(clearinfo) = VALUE fdc_t_accdoc_itm_to_be_clrd(
                                                ( belnr = '0100000000'"Get the Open Documents from the CDS view I_OperationalAcctgDocItem
                                                  bukrs = '0001'
                                                  gjahr = '2023'
                                                  awitem = '000002'
                                                  wrbtr = 100
                                                  dmbtr = 100
                                                  dmbe2 = 100
                                                  shkzg = 'H'
                                                  xaktp = abap_true
                                                  koart = 'D'
                                                  konko = Customer2
                                                  hkont = '1331100010'

                                                 )
                                                ).
** Simulate the posting to check the errors
cl_fdc_accdoc_post=>accdoc_simulate(
  IMPORTING
    et_ausz2                       = DATA(ausz2)                  
    et_ausz3                       = DATA(ausz3)                    
    et_message                     = DATA(return)                   
    et_simulated_gl_view           = DATA(simulated_gl_view)
    et_fdc_accdoc_hdr_sim          = DATA(fdc_accdoc_hdr_sim)
    es_fdc_accdoc_disc_doc         = DATA(fdc_accdoc_disc_doc)
  CHANGING
    cs_fdc_accdoc_hdr              = headerinfo
    ct_fdc_accdoc_tax              = fdc_accdoc_tax              
    ct_fdc_accdoc_whtax            = fdc_accdoc_whtax
    ct_fdc_accdoc_itm_to_be_clrd   = clearinfo                   
    ct_fdc_accdoc_pay_diff         = fdc_accdoc_pay_diff         
    ct_accdoc_itm_copa             = accdoc_itm_copa             
    ct_fdc_accdoc_itm              = iteminfo                    
    ct_accdoc_dispute              = accdoc_dispute              
    ct_accdoc_one_time_account     = accdoc_one_time_account
    cs_with_itm_payment_only       = itm_payment_only             
    ct_fdc_accdoc_warning_messages = fdc_accdoc_warning_messages " Warning Messages
).

IF return IS INITIAL.

** For RAP based apps use thie function module with destination None to avoid commit dumps
  CALL METHOD cl_fdc_accdoc_post=>accdoc_post
    EXPORTING
      is_fdc_accdoc_hdr              = headerinfo
      it_fdc_accdoc_itm              = iteminfo
      iv_ignore_warnings             = abap_true
    IMPORTING
      et_message                     = DATA(message)
      ev_awref                       = DATA(awref)
      es_posted_document             = DATA(posted_document)
    CHANGING
      ct_fdc_accdoc_itm_to_be_clrd   = clearinfo
      ct_fdc_accdoc_warning_messages = warning
    RECEIVING
      rv_save_rejected               = DATA(rejected).
  IF posted_document IS NOT INITIAL.
    COMMIT WORK AND WAIT.
  ENDIF.
ENDIF.

Thus you can avoid the BDC programming going forward for the F-30 and FB05 transactions

No comments:

Post a Comment