Kurzanleitung zum Vorerfassen und Buchen von FI-Eingangsrechnungen

enaio® data2s 11.0 »

Das Vorerfassen und Buchen von Eingangsrechnungen kann fachlich sehr komplex werden, daher kann diese Kurzanleitung nur einen Überblick über die prinzipielle Vorgangsweise geben. Für Beratungen zum konkreten Einsatz und Fragen der Übergabe weiterer Buchungsinformationen ist ein Beratungskontingent bei Bedarf bei OPTIMAL SYSTEMS erhältlich.

Zum Buchen bzw. Vorerfassen von FI-Eingangsrechnungen kann der SAP®-Baustein BAPI_ACC_DOCUMENT_POST benutzt werden. Dieser Baustein erfordert nach erfolgreicher Ausführung zusätzlich den Aufruf von BAPI_TRANSACTION_COMMIT, um die Daten der Verbuchung zuzuführen. Der Commit-Baustein muss im selben Prozess wie der Post-Baustein aufgerufen werden. In einigen Umgebungen bzw. Verteilungsszenarien kann dies zu Problemen führen, da eine Zuordnung der HTTP-Aufrufe zu einem dedizierten Prozess nicht möglich ist. In diesem Fall kann alternativ der Baustein /OSGMBH/D2S_DOCUMENT_POST verwendet werden. Es handelt sich dabei um einen Wrapper um die beiden zuvor genannten BAPIs. Die Schnittstelle ist mit der von BAPI_ACC_DOCUMENT_POST nahezu identisch. Es kommt lediglich ein weiterer Rückgabeparameter RC hinzu, der mit den Werten '0' bzw. '8' den Erfolg oder Misserfolg der Buchung kennzeichnet.

Alle nachfolgend für BAPI_ACC_DOCUMENT_POST gemachten Angaben sind somit auch für /OSGMBH/D2S_DOCUMENT_POST gültig.

Unabhängig davon, welche Bausteine verwendet werden, müssen analog zur oben beschriebenen Verfahrensweise die SOAP-Services generiert werden. Für /OSGMBH/D2S_DOCUMENT_POST existiert bereits ein SOAP-Service, so dass nur noch die Generierung des Endpunkts im SOA-Manager erforderlich ist.

Versionsabhängigkeit und Vorerfassung

Das genannte BAPI war ursprünglich nur für das endgültige Buchen von Rechnungen vorgesehen. Später wurde seine Funktionalität dann erweitert, um auch eine Vorerfassung zu ermöglichen. Die erweiterte Funktionalität kann auch in älteren SAP®-Systemen nachgerüstet werden. Siehe dazu OSS-Hinweis 2092366.

Eine einfache Möglichkeit, das Vorhandensein der Funktionalität zum Vorerfassen zu prüfen, ist die Existenz des Feldes DOC_STATUS im Eingabeparameter DOCUMENTHEADER. Sofern vorhanden, wird über Einträge in diesem Parameter die konkrete Funktion des BAPI gesteuert.

Wird der Parameter DOC_STATUS nicht mit einem Wert belegt, so erfolgt eine echte Buchung. Damit ist die Kompatibilität zu älteren Anwendungen sichergestellt. Die neuen Funktionalitäten werden durch folgende Werte im Feld DOC_STATUS ausgelöst:

Wert für DOC_STATUS Funktion
2 Vorerfasster Beleg
3 Vollständig gesicherter Beleg
4 oder leer Gebuchter Beleg
A Vorerfasster Beleg (Nur Beträge in Transaktionswährung werden beim Buchen übertragen)
B Vollständig gesicherter Beleg (Nur Beträge in Transaktionswährung werden beim Buchen übertragen)

Aufruf des BAPIs

Die SAP®-seitige Schnittstelle kann im SAP® über die Transaktion SE37 eingesehen werden. Zur Vorerfassung bzw. Buchung einer Rechnung ist die Übergabe einer Kopfzeile und von 1-n Buchungspositionen erforderlich.

Bei der Übergabe der Positionsdaten ist eine Aufspaltung der Daten in insgesamt 4 verschiedenen Übergabetabellen nötig. Aus einer Rechnungsposition müssen folgende Daten entstehen:

  • eine Kreditorenzeile im Tabellenparameter ACCOUNTPAYABLE
  • eine Sachkontenzeile im Tabellenparameter ACCOUNTGL
  • eine Steuerzeile im Tabellenparameter ACCOUNTTAX
  • drei Betragszeilen im Tabellenparameter CURRENCYAMOUNT, die den vorangegangenen Einträgen eindeutig zugeordnet werden müssen.

Die Zuordnung der Einträge in der CURRENCYAMOUNT zu den Einträgen in den anderen Tabellen erfolgt über das Feld ITEMNO_ACC, das in allen Tabellen enthalten ist. Der Wert dieses Feldes wird in der CURRENCYAMOUNT laufend hochgezählt und dann als Fremdschlüssel in den anderen drei Tabellen verwendet.

Beispiel für einen Aufruf in VBA-Syntax:

'Zunächst wird die Header-Zeile gefüllt:

DIM Param
' Kopfdaten füllen
SET HeaderData = CreateObject("Scripting.Dictionary")
Param = CreateObject("Scripting.Dictionary")
HeaderData("USERNAME") = "USER"         'Benutzer ist Pflichtfeld
HeaderData("HEADER_TXT") = "Kopftext"   'BKTXT
HeaderData("COMP_CODE") = "1000"        'Buchungskreis
HeaderData("DOC_DATE") = "13.04.2018"   'Belegdatum
HeaderData("PSTNG_DATE") = "13.04.2018" 'Buchungsdatum
HeaderData("DOC_TYPE") = "KR"           'Belegart
HeaderData("REF_DOC_NO") = "REF123"     'Referenz / Re.nr. des Lieferanten

' Kopfdaten zu Parameterobjekt hinzufügen
Param.Add "DOCUMENTHEADER",HeaderData

'Danach werden die Beträge für den Parameter CURRENCYAMOUNT erfasst. Die Begründung für die unterschiedlichen Werte erfolgt später.

DIM AmountData(2) 'beginnend mit 0

'Position 1 füllen
SET Entry = CreateObject("Scripting.Dictionary")
Entry("ITEMNO_ACC") = "0000000001"
Entry("CURR_TYPE") = "00"
Entry("CURRENCY") = "EUR"
Entry("AMT_DOCCUR") = "-119,00"              'Bruttobetrag
Entry("TAX_AMT") = "-19,00"                  'Steuerbetrag
Entry("EXCH_RATE") = "1,00"                  'Umrechnungskurs (kann auch leer bleiben)

'Position in Array anhängen
SET AmountData(0) = Entry

'Position 2 füllen
SET Entry = CreateObject("Scripting.Dictionary")
Entry("ITEMNO_ACC") = "0000000002"
Entry("CURR_TYPE") = "00"
Entry("CURRENCY") = "EUR"
Entry("AMT_DOCCUR") = "100,00"               'Nettobetrag
Entry("TAX_AMT") = "0,00"
Entry("EXCH_RATE") = "1,00"                  'Umrechnungskurs

'Position in Array anhängen
SET AmountData(1) = Entry

'Position 3 füllen
SET Entry = CreateObject("Scripting.Dictionary")
Entry("ITEMNO_ACC") = "0000000003"
Entry("CURR_TYPE") = "00"
Entry("CURRENCY") = "EUR"
Entry("AMT_DOCCUR") = "19,00"                'Steuersumme
Entry("AMT_BASE") = "100,00"                 'Steuerbasis
Entry("TAX_AMT") = "0,00"
Entry("EXCH_RATE") = "1,00"                  'Umrechnungskurs

'Position in Array anhängen
SET AmountData(2) = Entry

'Positionen zu Parameterobjekt hinzufügen
Param.Add "CURRENCYAMOUNT", AmountData

'Nun können die Einträge für die anderen Parameter erzeugt weden.

'Array für Kreditorenpositionen erzeugen
DIM PayableData(0)
'Objekt für eine Position erzeugen
SET Entry = CreateObject("Scripting.Dictionary")
'Positionsdaten füllen
Entry("ITEMNO_ACC") = "0000000001"
Entry("VENDOR_NO") = "0000001000"         'Kreditor
Entry("PMNTTRMS") = "ZB01"                'Zahlungsbedingungen
Entry("BLINE_DATE") = "16.04.2018"        'Zahlungsfristenbasisdatum
Entry("DSCT_DAYS1") = "14"                'Skontofrist 1
Entry("ITEM_TEXT") = "Text 1"             'SGTXT
'Position in Array anhängen
SET PayableData(0) = Entry
'Positionen zu Parameterobjekt hinzufügen
Param.Add "ACCOUNTPAYABLE",PayableData

'Array für Sachkontenpositionen erzeugen
Dim AccountGLData(0)
'Objekt für eine Position erzeugen
SET Entry = CreateObject("Scripting.Dictionary")
'Positionsdaten füllen
Entry("ITEMNO_ACC") = "0000000002"
Entry("GL_ACCOUNT") = "0000476000"        'Sachkonto
Entry("ITEM_TEXT") = "Text 2" 'SGTXT
Entry("COSTCENTER") = "0000001000"        'Kostenstelle
Entry("VALUE_DATE") = "16.04.2018"        'Valutadatum
'Position in Array anhängen
SET AccountGLData(0) = Entry
'Positionen zu Parameterobjekt hinzufügen
Param.Add "ACCOUNTGL",AccountGLData

'Array für Steuerzeilen erzeugen
DIM TaxData(0)
'Objekt für eine Position erzeugen
SET Entry = CreateObject("Scripting.Dictionary")
'Positionsdaten füllen
Entry("ITEMNO_ACC") = "0000000003"
Entry("TAX_CODE") = "VA"                  'Steuerkennzeichen
'Position in Array anhängen
SET TaxData(0) = Entry
'Positionen zu Parameterobjekt hinzufügen
Param.Add "ACCOUNTTAX",TaxData

Nach Füllen der Parameter kann der Aufruf des BAPIs erfolgen. Die Auswertung über den Erfolg oder Misserfolg erfordert die Analyse des RETURN-Parameters. Es handelt sich dabei ebenfalls um einen Tabellenparameter. Es können mehrere Zeilen zurückgegeben werden, daher muss der gesamte Inhalt ausgewertet werden. Der Aufbau einer Zeile dieser Tabelle orientiert sich am Aufbau der SAP®-Messages.

Feld Datentyp Beschreibung

TYPE

CHAR1

Meldungstyp: S: Success, E: Error, W: Warning, I: Info, A: Abort, X: Exit

ID

CHAR20

Nachrichtenklasse
NUMBER NUMC3 Nachrichtennummer
MESSAGE CHAR220 Meldungstext
LOG_NO CHAR20 Anwendungs-Log: Protokollnummer
LOG_MSG_NO NUMC6 Anwendungs-Log: interne laufende Nummer der Meldung
MESSAGE_V1 CHAR50 Nachrichtenvariable
MESSAGE_V2 CHAR50 Nachrichtenvariable
MESSAGE_V3 CHAR50 Nachrichtenvariable
MESSAGE_V4 CHAR50 Nachrichtenvariable
PARAMETER CHAR32 Parametername
ROW INT Zeile im Parameter
FIELD CHAR30 Feld im Parameter
SYSTEM CHAR10 System (logisches System) aus dem die Nachricht stammt

Von entscheidender Bedeutung ist das Feld TYPE. Tritt ein Fehler auf, ist hier ein 'E', ein 'A' oder ein 'X' eingetragen. In diesem Fall wurde die Rechnung nicht vorerfasst.

Im Feld MESSAGE ist eine Fehlermeldung enthalten. In dieser Meldung können Platzhalter der Form '&1' - '&4' enthalten sein, die durch die Inhalte der Felder MESSAGE_V1 bis MESSAE_V4 ersetzt werden können. Zumindest während der Testphase sollten die Fehlermeldungen ausgewertet und in jedem Fall geloggt werden.

Wenn keine E- A- oder X-Zeile im RETURN-Parameter enthalten ist, dafür aber eine S-Zeile, dann wurde die Rechnung vorerfasst. In diesem Fall ist im Export-Parameter OBJ_KEY des BAPIs die Belegnummer des vorerfassten Belegs enthalten. Es ist zu beachten, dass der Wert dieses Feldes aus den konkatenierten Werten der einzelnen Schlüsselfelder besteht und somit noch zu zerlegen ist, wenn die konkreten SAP®-Felder benötigt werden.

Im Falle von FI-Rechnungen hat der Wert des Parameters OBJ_KEY folgenden Aufbau:

Position Beschreibung
1-10 Belegnummer
11-14 Buchungskreis
15-18 Geschäftsjahr