Overblog Folge diesem Blog
Edit post Administration Create my blog
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...

 

 

*&---------------------------------------------------------------------*
*& 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 (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.

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).

Diesen Post teilen

Repost 0
Um über die neuesten Artikel informiert zu werden, abonnieren:

Kommentiere diesen Post