SAP: So funktioniert RFBIBL00 (mit Beispielcode)

RFBIBL00 ist ein SAP-Standardprogramm zum Import von Buchhaltungsdaten in ein SAP-System. Verarbeitet wird eine Textdatei in einem speziellen Format. Die Dokumentation dieses Programms ist spärlich. SAP liefert kein (mir bekanntes) Beispielprogramm für den Umgang it RFBIBL00.

Hauptzweck des Programms ist die Erzeugung von Batch-Input-Mappen. Es wird alternativ dazu auch angeboten, die Daten direkt zu verbuchen. Allerdings kann dies zu Problemen führen, wenn es bei der Verarbeitung zu Fehlern kommt. Der Aufruf muss dann so gestaltet werden, dass er wiederanlauffähig ist.

Da RFBIBL00 ohnehin schon nicht trivial zu bedienen ist, wird es bei direkter Verbuchung noch schwieriger, den Import korrekt zu behandeln. Das Standardverfahren Batch-Input sollte daher den Vorzug bekommen.

Der Programmname RFBIBL00

Was ist die Logik hinter dem Programmnamen RFBIBL00?

  • RF steht für „remote function“, also für eine Funktion, die von außerhalb aufgerufen wird
  • BI steht für „bank interface“
  • BL steht für „bank ledger“. Ledger ist die englische Bezeichnung für Kassenbuch, insbesondere für Hauptbuch

Die Dokumentation von RFBIBL00

SAP stellt zu RFBIBL00 Dokumentation zur Verfügung: Transaktion SE38 und dort „Dokumentation“ anklicken:

Diese Dokumentation kommt aber über Gemeinplätze nicht weit hinaus. Ich hoffe, dass dir meine Ausführungen helfen, dir auf diese Dokumentation einen Reim zu machen.

Das Dateiformat von RFBIBL00

Die Eingabedatei von RFBIBL00 besteht aus einzelnen Zeilen der folgenden Datentypen:

  • BGR00 Satztyp 0 Mappenvorsatz
  • BBKPF Satztyp 1 Kopfdaten
  • BBSEG Satztyp 2 Belegsegmentdaten
  • BBTAX Satztyp 2 Belegsteuern
  • BWITH Satztyp 2 Belegquellensteuerdaten (erweiterte
  • Quellensteuerfunktionalität; nur FB01, FBV1)
  • BSELK Satztyp 2 Selektionskopfdaten (nur FB05)
  • BSELP Satztyp 2 Selektionspositionen (nur FB05)

Jede Zeile enthält am Anfang ein Feld, das den Satztyp kennzeichnet. Damit kann rfbibl00 die Zeilen der Inputdatei zuordnen. Die Felder sind jeweils in der vollen Breite der jeweiligen Feldtypen zu schreiben. Das Format ähnelt damit etwas dem interen IDOC-Format (zeilenweise, nicht die XML-Variante). Du kannst sie dadurch erzeugen, dass du Variablen der jeweiligen Typen erzeugst und diese in eine Textdatei schreibst. (Siehe unten).

Der Inhalt dieser Segmente lässt sich jeweils im DDIC nachschauen (Transaktinon SE11) Diese Strukturen sind breit. Sie enthalten Dutzende von Feldern, von denen nicht alle benötigt werden. Viele dieser Felder wirst du nicht setzten wollen. Sie sind daher in der Eingabedatei so zu markieren, dass sie nicht verarbeitet werden sollen. Es reicht nicht, sie leer (blank) zu lassen. Blank würde bedeuten, dass das Feld als Blank in die Eingabemasken der Verbuchung gefüllt wird. Stattdessen werden zu ignorierende Felder speziell markiert.

Markieren von nicht verwendeten Feldern

Für diese Zwecke wird ein Sonderzeichen vereinbart. Voreinstellung ist „/“. Ein nicht verwendetes Feld der Breite von 5 Zeichen ist also mit „/////“ zu füllen. Es kann beim Programmaufruf von rfbibl00 in den Parametern auch ein beliebiges anderes Zeichen angegeben werden, aber der Default „/“ ist eine gute Wahl.

Es gibt einen einfachen Weg, alle Felder einer Struktur auf diesen Wert zu setzen. Eine Variante des ABAP Clear-Befehls erlaubt es, eine Struktur vorzubelegen:

constants:
  co_nodata         type char1       value '/'.

data: ls_bbseg      type bbseg.

clear ls_bbseg with co_nodata.

Anschließend sind alle Felder von ls_bbseg in der vollen Breite mit ‚/////////‘ belegt.

Grundstruktur eines Importprogramms auf Basis von rfbibl00

Unser Ziel ist es also, mittels RFBIBL00 eine gewisse Menge von Buchungsdaten automatisiert ins SAP-System einzuspielen. Deinen konkreten Fall kenne ich nicht. Aber die Grundstruktur dieser Aufgabe dürfte immer dieselbe sein. Du musst folgende Teilaufgaben lösen:

  • Öffnen des Eingabedaten in einem externen Format: Die Daten, die du importieren willst, werden aus irgend einem externen Programm stammen. Das Ausgabeformat dürfte proprietär sein. Andernfalls hättest du dir vom externen Dienstleister vielleicht irgend ein Standard-IDoc-Format gewünscht und gleich IDocs importiert, statt RFBIBL00 zu verwenden. Gehen wir also einmal davon aus, dass du die Datei im CSV-Format bekommst.
  • Verarbeiten einer CSV-Datei. Sieh zu, dass du die Daten im CSV-Format bekommst. CSV lässt sich gut verarbeiten. Exel-Dateien (XLS-Format) sind im Vergleich dazu hässlich. Im Prinzip kannst du natürlich auch Excel-Dateien in SAP verarbeiten, aber CSV ist viel einfacher.
    Lass den Anwender die Datei über die SAP-GUI vom lokalen Rechner des Anwenders hochladen. Lies sie zeilenweise. Zerlege die Zeilen in ihre Zellen. Hierbei sind Escape-Sequenzen zu beachten. (Wenn du als Trennzeichen das Semikolon verwendest, kann eine Textzelle selbst auch ein Semikolon enthalten, wenn der Zellinhalt in Anführungszeichen steht.) Dazu gibt es die SAP-Standardfunktion ‚RSDS_CONVERT_CSV‘: Parameter sind: Trennzeichen (z.B. Semikolon). Escape-Zeichen (z.B. das Gänsefüßchen), die Textzeile. Rückgabewert ist am einfachsten ein lt_columns type table of string. Aus diesem kannst du dir dann spaltenrichtig die Nutzdaten herausziehen und damit die Inputstrukturen von rfbibl00 füllen. Eine detaillierte Anleitung zum Einlesen einer CSV-Datei findest du hier.
  • Aus den Eingabezeilen erzeugst du eine Datei auf dem Applicationserver:
open dataset pa_fname for output in text mode encoding default.
data: ls_bgr00 type bgr00, " session header
" todo: session header füllen
transfer ls_bgr00 to pa_fname
data: ls_bbkpf type bbkpf
" todo: Kopfdaten füllen
transfer ls_bbkpf to pa_fname.
data: ls_bbseg type bbseg
" todo: Segmentdaten füllen
transfer ls_bbseg to pa_fname
" Wiederholen für alle Segmente des aktuellen Belegs
ggf. weitere Kopf- und Segmentdaten schreiben
close dataset pa_fname
" Aufruf von rfbibl00

Das Ausfüllen der Zeilendaten hängt davon ab, welche Daten deine CSV-Datei enthält. Dazu kann ich Dir daher keine allgemeine Anleitung geben.

Markieren der Zeilentypen

Wie oben genannt, gibt es verschiedene Datenzeilen. Alle zu füllenden Objekte haben ein Feld „stype“. Dieses muss beim Session header auf 0 gesetzt werden. Bei bbkpf auf 1 und bei den Segmenten auf 2.

Zusätzlich ist bei bbseg die Spalte tbnam = ‚BBSEG‘ zu setzen. Das liegt daran, dass sich mehrere Segmenttypen (siehe oben) den Zeilentyp 2 teilen.

Auf Basis dieser Einträge kann rfbibl00 dann die Zeilen der Eingabedatei auseinander halten.

Zentral ist auch ls_bbkpf-tcode = ‚FB01‘. Jeder BKPF-Block (mit seinen folgenden Segmenten) gibt an, mit welcher Transaktion er gebucht werden will. Wenn dieses Feld nicht gefüllt wird, dann bricht der Import hart ab.

Füllen der Datenfelder

Wie also kannst du feststellen, welche Felder du wie zu füllen hast?

Schau dir die Datenstrukturen für BBKPF und BBSEG in SE11 an. (Oder verwende dazu SE16 auf der Tabelle dd03l). Diese Datenstrukturen sind breit. Die meisten dieser Felder wirst du nicht füllen wollen.

Schau dir deine Inputdaten (deine CSV-Datei) an. Sprich sie mit dem Kunden durch: was bedeuten diese Felder? Lass dir die manuelle Verbuchung zeigen, die du automatisieren sollst. Je besser du verstehst, was dort passiert, desto eher wirst du beim Import die Felder richtig zuordnen.

Versuche dann die Verbuchung (wahrscheinlich FB01) selbst durchzuführen. In den Eingabemasken von FB01 kannst du dir mittels F1 die technische Hilfe zum Feld anzeigen lassen. Schau dir an, wie die einzelnen Elemente dort heißen. Dann versuche, diese Felder in BBKPF un BBSEG wiederzufinden.

Achtung: die erfolgreich verbuchten Belege finden sich am Ende in BKPF (Kopfdaten) und BSEG (Segmentdaten). Die Importdatenstrukturen heißen aber BBKPF und BBSEG: Sie unterscheiden sich auch in den Spalten. Das kann an sehr schön in SE16 auf der Tabelle DD03L sehen. (Beide Tabellennamen BSEG und BBSEG eingeben, danach die gemeinsame Feldliste alphabetisch sortieren).

Wahrscheinlich musst du bei dem einen oder anderen Feld eine Weile suchen oder probieren.

Füllen der Kopfdaten in BBKPF

Hier sind die Felder, die ich in meinem Import fülle:

" => incremental document id. Diese Zeilen gehören zusammen
ls_bbkpf-idxsp = lf_curdoc.
" Buchungskreis
ls_bbkpf-bukrs = ...
" Belegart
ls_bbkpf-blart = 'KR'.
" Externe Belegnummer
ls_bbkpf-xblnr = ...
" Belegdatum
ls_bbkpf-bldat = ...
" Buchungsdatum
ls_bbkpf-budat = ... 
" Währung
ls_bbkpf-waers = ...
" Buchungstext
ls_bbkpf-bktxt = ...
" Transaktionscode
ls_bbkpf-tcode = 'FB01'.
" Satzende, ohne das geht es nicht
ls_bbkpf-sende = 'X'.

Füllen der Segmentdaten in BBSEG

Bei den Segmentdaten brauchst du mehr als eine. Zusammen müssen sie im Sinne der doppelten Buchführung aufgehen. Andernfalls wird SAP den Beleg nicht verbuchen und der Beleg verbleibt in SM35 als fehlerhafte Batch-Input-Mappe.

" Kontonummer
ls_bbseg1-newko = ...
" Betrag
ls_bbseg1-wrbtr = ...
" Buchungsschlüssel
ls_bbseg1-newbs = ...
" Externe Referenz (der Kunde wollte auch auf Ebene des Segements eine Referenz sehen)
ls_bbseg1-xref3 = ...
" Referenz auf Auftrag im SAP
ls_bbseg1-aufnr = ...
" Satzende, ohne das geht es nicht
ls_bbseg1-sende = 'X'.

Dort, wo ich nur … geschrieben habe, müsstest du deine Datenquelle verwenden, also vielleicht ein lt_columns[ xy ], wenn das entsprechende Feld in deiner CSV-Datei in Spalte xy steht.

Wichtig sind die Kennungen „sende“ (für „Satzende“). Wenn diese nicht gesetzt sind, dann führt ein „helles“ Verbuchen dazu, dass zuätzliche Popups erscheinen, deren Daten ich nicht übertrage. Dann bleibt die Verbuchung hängen. Ein „dunkles“ Verbuchen in SM35 führt dann zu keinem Ergebnis.

Aufruf von rfbibl00

Deine Daten musst du (siehe oben) zunächst in eine Temp-Datei schreiben, und diese wird dann in rfbibl00 gefüttert. Der Aufruf könnte so aussehen:

    SUBMIT rfbibl00 WITH ds_name  = uf_dsout   " File name
                    WITH fl_check = abap_false " Only check file
                    WITH os_xon   = abap_false " Old structures?
                    WITH xnonunic = abap_false " Non unicode
                    WITH callmode = 'B'        " Batch-Input mode
                    WITH max_comm = '1000'     " Max documents per COMMIT
                    WITH pa_xprot = uf_btclog  " extended protocol
                    WITH xpop     = abap_false " Messages as window
                    WITH xlog     = abap_false " Messages as list
                    WITH xinf     = abap_true  " No messages
                    AND RETURN.

Wenn du auf dem Testsystem dann eine Inputdatei hast, dann rufe rfbibl00 mit dem Parameter xlog=abap_true auf und schaue dir die Fehlermeldungen an. Es wird eine Weile dauern, diese Fehler zu beseitigen. Am Ende sollte der Import dann fehlerfrei durchlaufen und eine Batchinputmappe erzeugen, die sich korrekt verbuchen lässt.

Ein Wort zum Schluss

Die Dokumentation von SAP zu RFBIBL00 ist spärlich. Insbesondere sind in dieser Doku die einzlenen Felder von BBKPF und BBSEG nicht erklärt. Angesichts der Bedeutung dieses Programms ist das dünn. Das bedeutet, die Aufgabe, eine x-beliebige CSV-Datei so aufzudröseln, dass du sie mit rfbibl00 verarbeiten kannst, wird immer eine gewisse Forschungsreise sein.

Mehr Artikel über SAP findest du hier.

heiko

Dipl.-Ing. Heiko Evermann

Vorheriger Artikel