cancel
Showing results for 
Search instead for 
Did you mean: 

How to pass buscs to BAPI_ACC_DOCUMENT_POST?

0 Kudos

Dear Experts,

can you please show me how to pass the Acc: List of Business Transactions (RF05A-BUSCS) to BAPI_ACC_DOCUMENT_POST?

My aim is to create enter incoming invoices (t-code = FB60) with BAPI_ACC_DOCUMENT_POST.

Kind regards,

Emal

Accepted Solutions (0)

Answers (2)

Answers (2)

0 Kudos

Hi Eli,

If you call the transaction code FB60 it is the first drop down field you can choose between invoice and credit memo (see screenshot).

My problem:

I’m trying to create mass enter incoming invoices with BAPI_ACC_DOCUMENT_POST from header-table (zsd_rgkopf_lft) and position-table (zsd_rgpos_lft) through the following source code

  METHOD create_voucher_fb60.


    CONSTANTS:
      lc_sys_part   TYPE zsd_nrver VALUE 5,
      lc_salesorder TYPE zsd_belegart VALUE 'SD',
      lc_blart      TYPE blart VALUE 'KR',
      lc_awtyp      TYPE awtyp VALUE 'BKPFF',
      lc_bktxt      TYPE bktxt VALUE 'trans-o-flex Express GmbH',
      lc_waers      TYPE waers VALUE 'EUR',
      lc_kunnr      TYPE kunnr VALUE '0237000201',
      lc_glvor      TYPE glvor VALUE 'RFBU'.


    DATA: doc_header           TYPE  bapiache09,
          lt_accountpayable    TYPE TABLE OF bapiacap09,
          ls_accountpayable    TYPE bapiacap09,
          ls_accountgl         TYPE bapiacgl09,
          lt_accountgl         TYPE TABLE OF bapiacgl09,
          lt_accounttax        TYPE TABLE OF  bapiactx09,
          ls_currencyamount    TYPE bapiaccr09,
          lt_currencyamount    TYPE TABLE OF bapiaccr09,
          ls_extension1        TYPE bapiacextc,
          lt_extension1        TYPE TABLE OF bapiacextc,
          lt_return            TYPE TABLE OF bapiret2,
          obj_type             TYPE bapiache08-obj_type,
          obj_key              TYPE bapiache02-obj_key,
          obj_sys              TYPE bapiache02-obj_sys,
          belnr                TYPE bkpf-belnr,
          docnum               TYPE bkpf-belnr,
          lc_bukrs             TYPE bukrs,
          lv_message           TYPE string,
          ld_posting_date      TYPE syst_datum,
          ld_fiscal_year       TYPE bapi0002_4-fiscal_year,
          ld_fiscal_period     TYPE bapi0002_4-fiscal_period,
          lv_posnr             TYPE posnr_acc VALUE 1,
          ld_return             TYPE bapireturn1,
          lc_awkey             TYPE awkey,
          lt_accountreceivable TYPE TABLE OF bapiacar09.


    DATA: l_s_log       TYPE bal_s_log,
          l_s_msg       TYPE bal_s_msg,
          l_t_msg       TYPE bal_t_msg,
          l_balloghandl TYPE balloghndl,
          l_t_ballog    TYPE bal_t_logh,
          logger        TYPE REF TO zcl_log.

    CREATE OBJECT logger.
    logger->call_application_log(
    i_t_msg       = l_t_msg
    i_object      = 'ZSD_KRED_XML'
    i_subobject   = 'ZSD_KRED_XML_SUBOBJ'
    iwa_s_log     = l_s_log
    i_balloghandl = l_balloghandl
    i_t_ballog    = l_t_ballog ).


    SELECT * FROM zsd_rgpos_lft INTO TABLE @DATA(lt_rgpos)
    WHERE angelegter_beleg NE @space AND nummer_verarbeitung EQ @lc_sys_part AND modul = @lc_salesorder AND gegenbuchung EQ @space.

    SELECT * FROM zsd_rgkopf_lft INTO TABLE @DATA(lt_rgkopf)
    WHERE angelegter_beleg NE @space AND nummer_verarbeitung EQ @lc_sys_part AND modul = @lc_salesorder AND gegenbuchung EQ @space.


    DESCRIBE TABLE lt_rgkopf LINES DATA(lv_linenumber).

    IF lv_linenumber NE 0.


      LOOP AT lt_rgkopf INTO DATA(ls_rgkopf).

        TRY.
            lc_bukrs = lt_rgpos[ id = ls_rgkopf-id positionsnummer = '1'  ]-kartennummer+3(3).
            belnr = lt_rgpos[ id = ls_rgkopf-id positionsnummer = '1'  ]-angelegter_beleg.
          CATCH cx_sy_itab_line_not_found.
            logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD)' ).
            MOVE ls_rgkopf-id TO lv_message.
            CONCATENATE 'Mit der Positionsnummer 1 und id' lv_message 'kann keiner Datensatz in der Tabelle ZSD_RGPOS_LFT gefunden werden.' INTO lv_message SEPARATED BY space.
            logger->i_message( lv_message ).
            logger->i_message( '<--Ende der Meldung.' ).
        ENDTRY.


        IF lc_bukrs IS INITIAL.
          logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD).' ).
          logger->i_message( 'Für ID ' && ls_rgkopf-id && ' und Positionsnummer 1 könnte kein Buchungskreis ermittelt werden.'  ).
          logger->i_message( '<--Ende der Meldung.' ).
          CONTINUE.
        ELSE.

          lc_bukrs = 0 && lc_bukrs.

        ENDIF.

        MOVE ls_rgkopf-rechnungsdatum TO ld_posting_date.
        CALL FUNCTION 'BAPI_COMPANYCODE_GET_PERIOD'
          EXPORTING
            companycodeid = lc_bukrs
            posting_date  = ld_posting_date
          IMPORTING
            fiscal_year   = ld_fiscal_year
            fiscal_period = ld_fiscal_period
            return        = ld_return.

        IF sy-subrc <> 0.
          logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD)' ).
          logger->i_message( ' Geschäftsjahr bzw. Geschäftsmonat könnte nicht ermittelt werden' ).
          logger->i_message( '<--Ende der Meldung.' ).
        ELSE.

          " Get last SA type document.
          SELECT MAX( belnr )
          INTO docnum
          FROM bkpf
          WHERE bukrs = lc_bukrs
          AND bstat = ''
          AND blart = lc_blart
          AND gjahr = sy-datlo(4).
          " Create new document number to be used.
          docnum = docnum + 1.



          " Begin to populate docnument header.
          CONCATENATE '0' docnum '001' sy-datlo(4) INTO doc_header-obj_key.
          doc_header-obj_type = lc_awtyp.
          CONCATENATE sy-sysid sy-mandt INTO doc_header-obj_sys.
          doc_header-username = sy-uname.
          doc_header-header_txt = lc_bktxt.
          doc_header-comp_code = lc_bukrs.
          doc_header-doc_date = ls_rgkopf-rechnungsdatum.
          doc_header-pstng_date = ls_rgkopf-rechnungsdatum.
          doc_header-doc_type = lc_blart.
          doc_header-ref_doc_no = belnr.
          CONCATENATE '0' docnum INTO docnum.
          doc_header-fisc_year = ld_fiscal_year.
*          doc_header-ac_doc_no = docnum.
          doc_header-bus_act = lc_glvor.

          LOOP AT lt_rgpos INTO DATA(ls_rgpos) WHERE id = ls_rgkopf-id.

            IF ls_rgpos-positionsnummer <> 1.
              lc_bukrs = 0 && ls_rgpos-kartennummer+3(3).
              belnr = ls_rgpos-angelegter_beleg.
              " Get last SA type document.
              SELECT MAX( belnr )
              INTO docnum
              FROM bkpf
              WHERE bukrs = lc_bukrs
              AND bstat = ''
              AND blart = lc_blart
              AND gjahr = sy-datlo(4).

              " Create new document number to be used.
              docnum = docnum + 1.

              " Begin to populate docnument header.
              CONCATENATE '0' docnum '001' sy-datlo(4) INTO doc_header-obj_key.
              doc_header-ref_doc_no = belnr.
              doc_header-comp_code = lc_bukrs.

            ENDIF.


            " fill account payable
            ls_accountpayable-itemno_acc = lv_posnr.
            ls_accountpayable-vendor_no = lc_kunnr.
            APPEND ls_accountpayable TO lt_accountpayable.


            " fill currency amount
            ls_currencyamount-itemno_acc  = lv_posnr.
            ls_currencyamount-currency    = lc_waers.
            ls_currencyamount-amt_doccur  = ls_rgpos-nettowert.
            ls_currencyamount-curr_type   = '00'.
            APPEND ls_currencyamount TO lt_currencyamount.



*            " Change the posting key
*            ls_extension1-field1 =  ls_currencyamount-itemno_acc.
*            ls_extension1-field2 =  'BSCHL'.
*            ls_extension1-field3 =  '31'.
*            APPEND ls_extension1 TO lt_extension1.



            " fill account gl
            ADD 1 TO lv_posnr.
            ls_accountgl-itemno_acc = lv_posnr.
            ls_accountgl-gl_account = ls_rgpos-sachkonto_0205.
            ls_accountgl-comp_code  = lc_bukrs.
            ls_accountgl-fisc_year  = ld_fiscal_year.
            ls_accountgl-fis_period = ld_fiscal_period.
            ls_accountgl-costcenter = ls_rgpos-kartennummer.
            APPEND ls_accountgl TO lt_accountgl.



            " fill currency amount
            ls_currencyamount-itemno_acc = lv_posnr.
            ls_currencyamount-currency = lc_waers.
            ls_currencyamount-amt_doccur = ls_rgpos-nettowert * -1.
            ls_currencyamount-curr_type = '00'.
            APPEND ls_currencyamount TO lt_currencyamount.



*            " Change the posting key
*            ls_extension1-field1 =  ls_currencyamount-itemno_acc.
*            ls_extension1-field2 =  'BSCHL'.
*            ls_extension1-field3 =  '40'.
*            APPEND ls_extension1 TO lt_extension1.



            CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
              EXPORTING
                documentheader = doc_header
              IMPORTING
                obj_key        = lc_awkey
              TABLES
                accountgl      = lt_accountgl
                accountpayable = lt_accountpayable
                accounttax     = lt_accounttax
                currencyamount = lt_currencyamount
                extension1     = lt_extension1
                return         = lt_return.

            IF sy-subrc EQ 0.
              CLEAR lv_message.
              COMMIT WORK AND WAIT.
              logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD)' ).
              logger->i_message('BAPI-Aufruf hat funkioniert.').
              logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD)' ).
              READ TABLE lt_return INTO DATA(ls_return) INDEX 1.
              MOVE ls_return-message TO lv_message.
              logger->i_message( lv_message ).
              logger->i_message( '<--Ende der Meldung.' ).

              IF lv_message IS NOT INITIAL.

                DATA(lv_change) = abap_true.
                ls_rgpos-gegenbuchung = lc_awkey.
                MODIFY lt_rgpos FROM ls_rgpos TRANSPORTING gegenbuchung.
                IF ls_rgpos-positionsnummer = '1' .
                  ls_rgkopf-gegenbuchung = lc_awkey.
                  MODIFY lt_rgkopf FROM ls_rgkopf TRANSPORTING gegenbuchung WHERE id = ls_rgkopf-id.
                ENDIF.
                CLEAR lc_awkey.
              ENDIF.

            ELSE.

              logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD)' ).
              LOOP AT lt_return INTO ls_return WHERE type = 'E'.
                MOVE ls_return-message TO lv_message.
                logger->i_message( lv_message ).
              ENDLOOP.

              logger->i_message( '<--Ende der Meldung.' ).

            ENDIF.



            REFRESH: lt_accountpayable, lt_accountgl, lt_accounttax, lt_currencyamount,lt_return.
            CLEAR lv_posnr.
            lv_posnr = 1.

          ENDLOOP.


        ENDIF.

        REFRESH: lt_accountpayable, lt_accountgl, lt_accounttax, lt_currencyamount,lt_return.

        CLEAR doc_header.

      ENDLOOP.


      IF lv_change = abap_true.

        MODIFY zsd_rgpos_lft FROM TABLE lt_rgpos.
        MODIFY zsd_rgkopf_lft FROM TABLE lt_rgkopf.
        COMMIT WORK.

      ENDIF.

    ELSE.

      IF gv_invoked_method <> 'create_voucher_f_22_43'.
        logger->i_message( '-->Die Schnittstelle SYS_PART meldet (SD).' ).
        logger->i_message( 'Es könnte kein Datensatz selektiert werden.' ).
        logger->i_message( '<--Ende der Meldung.' ).
        MESSAGE 'Die Verarbeitung ist abgeschlossen.' TYPE 'I'.
        LEAVE.
      ENDIF.

    ENDIF.

  ENDMETHOD.

This source code can create enter incoming invoices, but there is a problem. The posting key are not accurately acquired.

I try to change the posting key 40 to 31 with the aid of extension1 table as follows

          " Change the posting key
          ls_extension1-field1 =  ls_currencyamount-itemno_acc.
          ls_extension1-field2 =  'BSCHL'.
          ls_extension1-field3 =  '31'.
          APPEND ls_extension1 TO lt_extension1.

but I got the error message:

Error in document: BKPFF $ KA4CLNT100

Debit/credit indicator is inconsistent

I create manually a enter incoming invoices over the transaction code FB60 with the same account and posting key 31 it is working fine.

I suppose it has something to do with BUSCS.

Now I hope, that you or someone else can help me to hand over the posting key 31 to BAPI.

Kind regards,

Emal

iklovski
Active Contributor
0 Kudos

Still, this BUSCS is just a technical front-end field, which tells the system what path to choose for processing a document; you won't be able to pass it to BAPI. Posting key could be controlled by extension, though. I see that you put it on 'comments'. Also, the error message implies that you have some inconsistency with SHKZG (debit/credit).

iklovski
Active Contributor
0 Kudos

Hi,

BUSCS is an internal technical parameter. It is not stored with FI documents, so I'm not sure what you mean by the attempt to pass it through BAPI_ACC_DOCUMENT_POST.

Regards,

Eli