Overblog Alle Blogs
Edit post Folge diesem Blog Administration + Create my blog
MENU
Werbung
SAPManDoo - SAP Resource

Buchen Beleg per BAPI BAPI_ACC_DOCUMENT_POST

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht in #FI

Das nachfolgende Coding dient als Hilfestellung, wie der BAPI BAPI_ACC_DOCUMENT_POST mit Daten zu versorgen ist, damit er funzt. Hier haben sich nämlich schon etliche nicht-FI-kundige Entwickler die Ohren gebrochen...

Weiter unten sind 4 Beispielcodings zu diesem Themenkomplex aufgeführt:

  • Einfache Sachkontenbuchung ohne Steuer.
  • Debitorische Buchung mit normaler Ausgangssteuer
  • Kreditorische Buchung mit Reverse Charge-Steuer, also mit zwei Steuerzeilen (Stichwort ESE/ESA).
  • Erhaltene Anzahlung (debitorisch) mit Steuer und separater Übergabe in Beleg- und Hauswährung

UPDATE: Im  Beratungshinweis "2083799 - Sammelhinweis: Buchungen mit Rechnungswesen-BAPIs" finden sich über das unten beschriebene hinaus wertvolle Informationen und weitere Beispiele.

 

Werbung
*&---------------------------------------------------------------------*
*& Report  YTEST_SIMPLE_POST
*&
*&---------------------------------------------------------------------*
*& Demoprogramm zur Erläuterung der Aufrufparameter für das BAPI
*&    BAPI_ACC_DOCUMENT_POST
*&---------------------------------------------------------------------*

REPORT  ytest_simple_post.

* Beispieldaten für Beleginhalte
DATA:   bukrs  TYPE bukrs  VALUE '1000',        "Buchungskreis
        hkonts TYPE hkont  VALUE '0000047011',  "Konto Soll
        hkonth TYPE hkont  VALUE '0000047012',  "Konto Haben
        waers  TYPE waers  VALUE 'EUR',         "Belegwährung
        wrbtr  TYPE wrbtr  VALUE 100,           "Betrag
        sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
        kostl  TYPE kostl  VALUE '0000001000',  "Kostenstelle
        zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
        xblnr  TYPE xblnr  VALUE 'REFERENZ',    "Referenznummer
        blart  type blart  value 'SA',          "Belegart
        docnum TYPE belnr_d.                    "Belegnummer

* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  l_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objejktschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  l_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  l_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Steuerzeilen (in vorliegendem Bsp. nicht relevant)
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2,
  ls_return          TYPE bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEAR: lit_accountgl[],
       lit_accounttax[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno = 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    = 'RFBU'.     "Vorgang (fix)
ls_documentheader-username   = sy-uname.   "Belegerfasser
ls_documentheader-comp_code  = bukrs.      "Buchungskreis
ls_documentheader-doc_date   = sy-datum.   "Belegdatum
ls_documentheader-pstng_date = sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no = xblnr.      "Referenznummer
ls_documentheader-doc_type   = blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Soll)
*-----------------------------------------------------------------------
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.   "Positionsidentifier
ls_accountgl-gl_account      = hkonts.     "Sachkonto (Soll)
ls_accountgl-item_text       = sgtxt.      "Belegtext
ls_accountgl-costcenter      = kostl.      "Kostenstelle
ls_accountgl-alloc_nmbr      = zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr.      "positiver Betrag = Soll

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Haben)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = hkonth.
ls_accountgl-item_text       = sgtxt.
ls_accountgl-alloc_nmbr      = zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr * -1.   "Haben --> Minus

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader    = ls_documentheader
  IMPORTING
    obj_type          = l_obj_type
    obj_key           = l_obj_key
    obj_sys           = l_obj_sys
  TABLES
    accountgl         = lit_accountgl
*   ACCOUNTRECEIVABLE =
*   ACCOUNTPAYABLE    =
*   accounttax        =
    currencyamount    = lit_currencyamount
*   CRITERIA          =
*   VALUEFIELD        =
*   EXTENSION1        =
    return            = lit_return
*   PAYMENTCARD       =
*   CONTRACTITEM      =
*   EXTENSION2        =
*   REALESTATE        =
*   ACCOUNTWT         =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = lit_return.
ENDIF.

* systemseitig vergebene Belegnummer kommt zurück!
docnum = l_obj_key(10).

...und weil' so schön war, das gleiche nochmal als debitorische Buchung:

per Debitor 119,-- an Sachkonto 100,--, Steuer 19,--

*&---------------------------------------------------------------------*
*& Report  YTEST_SIMPLE_POST
*&
*&---------------------------------------------------------------------*
*& Demoprogramm zur Erläuterung der Aufrufparameter für das BAPI
*&    BAPI_ACC_DOCUMENT_POST
*&---------------------------------------------------------------------*

REPORT  ytest_simple_post.

* Beispieldaten für Beleginhalte
DATA:   bukrs  TYPE bukrs  VALUE '1002',        "Buchungskreis
        kunnr  TYPE kunnr  VALUE '0000064756',  "Debitor Soll
        hkonth TYPE hkont  VALUE '0000331000',  "Konto Haben
        waers  TYPE waers  VALUE 'EUR',         "Belegwährung
        wrbtr  TYPE wrbtr  VALUE 119,           "Betrag
        sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
        kostl  TYPE kostl  VALUE '0000102719',  "Kostenstelle
        zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
        xblnr  TYPE xblnr  VALUE 'REFERENZ',    "Referenznummer
        blart  TYPE blart  VALUE 'DR',          "Belegart
        mwskz  TYPE mwskz  VALUE 'A1',          "Steuerkennzeichen
        docnum TYPE belnr_d.                    "Belegnummer

* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  l_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objektschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  l_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  l_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Debitorenposition
  lit_accountrec     TYPE TABLE OF bapiacar09,
  ls_accountrec      TYPE bapiacar09,

* Steuerzeilen 
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

* Steuerdaten
DATA:
  lit_mwdat TYPE TABLE OF rtax1u15,
  ls_mwdat  TYPE rtax1u15.

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEARlit_accountgl[],
       lit_accounttax[],
       lit_accountrec[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Steuerdaten holen
*-----------------------------------------------------------------------
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
  EXPORTING
    i_bukrs bukrs
    i_mwskz mwskz
    i_waers waers
    i_wrbtr wrbtr
  TABLES
    t_mwdat lit_mwdat
  EXCEPTIONS
    OTHERS  16.

IF sy-subrc NE 0.
*   Fehlerbehandlung
ELSE.
  READ TABLE lit_mwdat INTO ls_mwdat INDEX 1.
ENDIF.

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    'RFBU'.     "Vorgang (fix)
ls_documentheader-username   sy-uname.   "Belegerfasser
ls_documentheader-comp_code  bukrs.      "Buchungskreis
ls_documentheader-doc_date   sy-datum.   "Belegdatum
ls_documentheader-pstng_date sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no xblnr.      "Referenznummer
ls_documentheader-doc_type   blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Soll - Debitor)
*-----------------------------------------------------------------------
CLEARls_accountrecls_currencyamount.
ls_accountrec-itemno_acc     l_itemno.   "Positionsidentifier
ls_accountrec-customer       kunnr.      "Debitor (Soll)
ls_accountrec-item_text      sgtxt.      "Belegtext
ls_accountrec-alloc_nmbr     zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc ls_accountrec-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur wrbtr.      "positiver Betrag = Soll

APPENDls_accountrec     TO lit_accountrec,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Haben - Sachkonto)
*-----------------------------------------------------------------------
ADD TO l_itemno.
CLEARls_accountglls_currencyamount.
ls_accountgl-itemno_acc      l_itemno.
ls_accountgl-gl_account      hkonth.
ls_accountgl-costcenter      kostl.
ls_accountgl-item_text       sgtxt.
ls_accountgl-tax_code        mwskz.
ls_accountgl-alloc_nmbr      zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc ls_accountgl-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur ls_mwdat-kawrt * -1.   "Nettobetrag / Haben --> Minus

APPENDls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile (Haben)
*-----------------------------------------------------------------------
ADD TO l_itemno.
CLEARls_accounttaxls_currencyamount.
ls_accounttax-itemno_acc     l_itemno.
ls_accounttax-tax_code       mwskz.

ls_currencyamount-itemno_acc ls_accounttax-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur ls_mwdat-wmwst * -1.
ls_currencyamount-amt_base   ls_mwdat-kawrt * -1.

APPENDls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader    ls_documentheader
  IMPORTING
    obj_type          l_obj_type
    obj_key           l_obj_key
    obj_sys           l_obj_sys
  TABLES
    accountgl         lit_accountgl
    accountreceivable lit_accountrec
*   ACCOUNTPAYABLE    =
    accounttax        lit_accounttax
    currencyamount    lit_currencyamount
*   CRITERIA          =
*   VALUEFIELD        =
*   EXTENSION1        =
    return            lit_return
*   PAYMENTCARD       =
*   CONTRACTITEM      =
*   EXTENSION2        =
*   REALESTATE        =
*   ACCOUNTWT         =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab lit_return.
ENDIF.


* systemseitig vergebene Belegnummer kommt zurück!
docnum l_obj_key(10).

Werbung
*&---------------------------------------------------------------------*
*& Report ZTESTBAPI
*&---------------------------------------------------------------------*
*&  kreditorische Buchung mit E1 (Reverse Charge, ESA/ESE)
*&---------------------------------------------------------------------*
REPORT ztestbapi.

* Beispieldaten für Beleginhalte
DATA: bukrs  TYPE bukrs  VALUE '9000',        "Buchungskreis
      lifnr  TYPE lifnr  VALUE '0000000117',  "Kreditor Haben
      hkonts TYPE hkont  VALUE '0000688000',  "Konto soll
      waers  TYPE waers  VALUE 'EUR',         "Belegwährung
      wrbtr  TYPE wrbtr  VALUE 100,           "Betrag
      sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
      kostl  TYPE kostl  VALUE '9000000000',  "Kostenstelle
      zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
      xblnr  TYPE xblnr  VALUE '4711-001',    "Referenznummer
      blart  TYPE blart  VALUE 'KR',          "Belegart
      mwskz  TYPE mwskz  VALUE 'E1',          "Steuerkennzeichen
      docnum TYPE belnr_d.                    "Belegnummer

* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  l_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objektschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  l_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  l_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Kreditorenposition
  lit_accountpay     TYPE TABLE OF bapiacap09,
  ls_accountpay      TYPE bapiacap09,

* Steuerzeilen
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

* Steuerdaten
DATA:
  lit_mwdat TYPE TABLE OF rtax1u15,
  ls_mwdat  TYPE rtax1u15.

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEAR: lit_accountgl[],
       lit_accounttax[],
       lit_accountpay[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Steuerdaten holen
*-----------------------------------------------------------------------
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
  EXPORTING
    i_bukrs = bukrs
    i_mwskz = mwskz
    i_waers = waers
    i_wrbtr = wrbtr
  TABLES
    t_mwdat = lit_mwdat
  EXCEPTIONS
    OTHERS  = 16.

IF sy-subrc NE 0.
*   Fehlerbehandlung
ELSE.
  break srohde.
ENDIF.

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno = 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    = 'RFBU'.     "Vorgang (fix)
ls_documentheader-username   = sy-uname.   "Belegerfasser
ls_documentheader-comp_code  = bukrs.      "Buchungskreis
ls_documentheader-doc_date   = sy-datum.   "Belegdatum
ls_documentheader-pstng_date = sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no = xblnr.      "Referenznummer
ls_documentheader-doc_type   = blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Haben - Kreditor)
*-----------------------------------------------------------------------
CLEAR: ls_accountpay, ls_currencyamount.
ls_accountpay-itemno_acc     = l_itemno.   "Positionsidentifier
ls_accountpay-vendor_no      = lifnr.      "Kreditor
ls_accountpay-item_text      = sgtxt.      "Belegtext
ls_accountpay-alloc_nmbr     = zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountpay-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr * -1. "negativer Betrag = Haben

APPEND: ls_accountpay     TO lit_accountpay,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Soll - Sachkonto)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = hkonts.
ls_accountgl-costcenter      = kostl.
ls_accountgl-item_text       = sgtxt.
ls_accountgl-tax_code        = mwskz.
ls_accountgl-alloc_nmbr      = zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr.   "Soll

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile 1 (HABEN) - ESA
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_currencyamount.
ls_accounttax-itemno_acc     = l_itemno.
ls_accounttax-tax_code       = mwskz.
read table lit_mwdat index 1 into ls_mwdat.
ls_accounttax-acct_key       = ls_mwdat-ktosl.

ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst.
ls_currencyamount-amt_base   = ls_mwdat-kawrt * -1.  "Steuerbasis VZ drehen

APPEND: ls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile 2 (Haben) - ESE
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_currencyamount.
ls_accounttax-itemno_acc     = l_itemno.
ls_accounttax-tax_code       = mwskz.
read table lit_mwdat index 2 into ls_mwdat.
ls_accounttax-acct_key       = ls_mwdat-ktosl.

ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst.
ls_currencyamount-amt_base   = ls_mwdat-kawrt * -1.

APPEND: ls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader = ls_documentheader
  IMPORTING
    obj_type       = l_obj_type
    obj_key        = l_obj_key
    obj_sys        = l_obj_sys
  TABLES
    accountgl      = lit_accountgl
    accountpayable = lit_accountpay
    accounttax     = lit_accounttax
    currencyamount = lit_currencyamount
*   CRITERIA       =
*   VALUEFIELD     =
*   EXTENSION1     =
    return         = lit_return
*   PAYMENTCARD    =
*   CONTRACTITEM   =
*   EXTENSION2     =
*   REALESTATE     =
*   ACCOUNTWT      =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = lit_return.
ENDIF.

* systemseitig vergebene Belegnummer kommt zurück!
docnum = l_obj_key(10).

Mein Kollege Markus hatte mal einen Fall im Rahmen einer Migration, dass erhaltene (debitorische) Anzahlungen (Sonderhauptbuch "A") inkl. Steuerzeile übernommen werden sollten. Zudem wurden hier beispielhaft Beträge sowohl in Transaktions- als auch Hauswährung übergeben. Folgender Beleg wird exemplarisch mit dem weiter unten aufgeführten Coding Snippet gebucht:

Beispielbeleg

Beispielbeleg

 
 Hier das entsprechende Coding-Snippet:
 

*&---------------------------------------------------------------------*
*& Report YTEST_MALA
*&---------------------------------------------------------------------*
*& erhaltene Anzahlungen (SHB-Kz.) und Betragsübergabe in Haus- und Belegwährung
*&---------------------------------------------------------------------*
REPORT ytest_mala.

* Beispieldaten für Beleginhalte
DATA: bukrs   TYPE bukrs  VALUE '0010',        "Buchungskreis
      kunnr   TYPE kunnr  VALUE '0102000392',  "Debitor Soll
      hkonth  TYPE hkont  VALUE '9920020000',  "Konto Haben
      waers   TYPE waers  VALUE 'EUR',         "Belegwährung
      wrbtr   TYPE wrbtr  VALUE 238,           "Betrag brutto
      sgtxt   TYPE sgtxt  VALUE 'Test',        "Belegpos.text
*     kostl   TYPE kostl  VALUE '0000102719',  "Kostenstelle
      zuonr   TYPE dzuonr VALUE '23456',       "Zuordnung
      xblnr   TYPE xblnr  VALUE 'REFERENZ',    "Referenznummer
      blart   TYPE blart  VALUE 'T0',          "Belegart
      curtp00 TYPE curtp  VALUE '00',          "Währungstyp 00
      curtp10 TYPE curtp  VALUE '10',          "Währungstyp 10
      mwskz   TYPE mwskz  VALUE 'A1',          "Steuerkennzeichen
      docnum  TYPE belnr_d.                    "Belegnummer
 
 
 
* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  l_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objektschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  l_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  l_obj_sys          TYPE bapiache09-obj_sys,   "log. System
 
 
* Belegkopf
  ls_documentheader  TYPE bapiache09,
 
 
* Debitorenposition
  lit_accountrec     TYPE TABLE OF bapiacar09,
  ls_accountrec      TYPE bapiacar09,
 
 
* Steuerzeilen
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,
 
 
* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,
 
 
* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2,
  lit_return_all     TYPE TABLE OF bapiret2.
 
 
DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)
 
 
* Steuerdaten
DATA:
  lit_mwdat TYPE TABLE OF rtax1u15,
  ls_mwdat  TYPE rtax1u15.
 
 
*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEAR: lit_accountgl[],
       lit_accounttax[],
       lit_accountrec[],
       lit_currencyamount[],
       lit_return[].
 
 
*-----------------------------------------------------------------------
* Steuerdaten holen
*-----------------------------------------------------------------------
 
 
DATA(lv_kalk) = wrbtr. "* -1.
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
  EXPORTING
    i_bukrs = bukrs
    i_mwskz = mwskz
    i_waers = waers
    i_wrbtr = lv_kalk
  TABLES
    t_mwdat = lit_mwdat
  EXCEPTIONS
    OTHERS  = 16.
 
 
IF sy-subrc NE 0.
*   Fehlerbehandlung
ELSE.
  READ TABLE lit_mwdat INTO ls_mwdat INDEX 1.
ENDIF.
 
 
 
 
*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno = 1.
 
 
*-----------------------------------------------------------------------
* Belegkopf   IDOC E1BPACHE09
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    = 'RFBU'.     "Vorgang (fix)
ls_documentheader-username   = sy-uname.   "Belegerfasser
ls_documentheader-comp_code  = bukrs.      "Buchungskreis
ls_documentheader-doc_date   = sy-datum.   "Belegdatum
ls_documentheader-pstng_date = sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no = sy-datum && `/` && sy-uzeit.      "Referenznummer
ls_documentheader-doc_type   = blart.      "Belegart
 
 
*-----------------------------------------------------------------------
* 1. Belegposition (Haben - Debitor)   IDOC E1BPACAR09
*-----------------------------------------------------------------------
CLEAR: ls_accountrec, ls_currencyamount.
ls_accountrec-itemno_acc     = l_itemno.   "Positionsidentifier
ls_accountrec-customer       = kunnr.      "Debitor (Soll)
ls_accountrec-tax_code       = mwskz.
ls_accountrec-sp_gl_ind      = 'A'.        " Sonderhauptbuchkennzeichen (Debitor)
ls_accountrec-item_text      = sgtxt.      "Belegtext
ls_accountrec-alloc_nmbr     = zuonr.      "Zuordnung
 
 
* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountrec-itemno_acc.
ls_currencyamount-curr_type  = curtp00.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr * -1.          "Soll = positiv, Haben = negativ
ls_currencyamount-amt_base   = wrbtr * -1.          "Soll = positiv, Haben = negativ
ls_currencyamount-tax_amt    = ls_mwdat-wmwst * -1. "Steuerbetrag muss mitgegeben werden(!!!)
 
 
APPEND: ls_accountrec     TO lit_accountrec,
        ls_currencyamount TO lit_currencyamount.
 
 
* Hier wird beim Währungstyp 10 (Hauswährung) die gleiche Währung und der gleiche Betrag 
* wie beim Typ 00 (Belegwährung) übergeben. Natürlich können hier auch unterschiedliche
* Währungen und Beträge verwendet werden.
ls_currencyamount-curr_type  = curtp10.
APPEND ls_currencyamount TO lit_currencyamount.
 
 
*-----------------------------------------------------------------------
* 2. Belegposition (Soll - Sachkonto)   E1BPACGL09
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = hkonth.
*ls_accountgl-costcenter      = kostl.
ls_accountgl-item_text       = sgtxt.
*ls_accountgl-tax_code        = mwskz.
ls_accountgl-alloc_nmbr      = zuonr.
 
 
* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-curr_type  = curtp00.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr.         "Soll = positiv, Haben = negativ
ls_currencyamount-amt_base   = wrbtr.         "Soll = positiv, Haben = negativ
 
 
APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.
 
 
ls_currencyamount-curr_type  = curtp10.
APPEND ls_currencyamount TO lit_currencyamount.
 
 
 
 
*-----------------------------------------------------------------------
* 2. Belegposition (Haben - Sachkonto Steuer mit MVA) - Nicht Steuer, sondern GL
* IDOC E1BPACGL09
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = '3300000000'.
ls_accountgl-item_text       = sgtxt.
ls_accountgl-acct_key        = 'MVA'.
ls_accountgl-tax_code        = mwskz.
ls_accountgl-alloc_nmbr      = zuonr.
 
 
* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-curr_type  = curtp00.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst.         "Soll = positiv, Haben = negativ
ls_currencyamount-amt_base   = ls_mwdat-wmwst.         "Soll = positiv, Haben = negativ
 
 
APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.
 
 
ls_currencyamount-curr_type  = curtp10.
APPEND ls_currencyamount TO lit_currencyamount.
 
 
*-----------------------------------------------------------------------
* Steuerzeile (Haben)   IDOC E1BPACTX09
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_currencyamount.
ls_accounttax-itemno_acc     = l_itemno.
ls_accounttax-gl_account     = '2021100000'.
ls_accounttax-tax_code       = mwskz.
ls_accounttax-tax_rate       = ls_mwdat-msatz.
ls_accounttax-cond_key       = ls_mwdat-kschl.
 
 
ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
ls_currencyamount-curr_type  = curtp00.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst * -1.
ls_currencyamount-amt_base   = ls_mwdat-kawrt * -1.
 
 
APPEND: ls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.
 
 
ls_currencyamount-curr_type  = curtp10.
APPEND ls_currencyamount TO lit_currencyamount.
 
 
 
 
*
BREAK dl-laeller.
 
 
*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader    = ls_documentheader
  IMPORTING
    obj_type          = l_obj_type
    obj_key           = l_obj_key
    obj_sys           = l_obj_sys
  TABLES
    accountgl         = lit_accountgl
    accountreceivable = lit_accountrec
*   ACCOUNTPAYABLE    =
    accounttax        = lit_accounttax
    currencyamount    = lit_currencyamount
*   CRITERIA          =
*   VALUEFIELD        =
*   EXTENSION1        =
    return            = lit_return
*   PAYMENTCARD       =
*   CONTRACTITEM      =
*   EXTENSION2        =
*   REALESTATE        =
*   ACCOUNTWT         =
  .
COMMIT WORK.
 
 
 
 
*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = lit_return.
ENDIF.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Werbung
Diesen Post teilen
Repost0
Um über die neuesten Artikel informiert zu werden, abonnieren:
Kommentiere diesen Post