SAP Business One Import

Datenextraktion aus SAP Business One und Import in Bilendo: Schlüssel, Ausgleich, Aufträge und Delta-Läufe.

Diese Seite beschreibt, wie die Daten aus SAP Business One extrahiert, flach gemacht und an Bilendo übergeben werden. Sie gilt für beide Wege (Pull und Push, siehe die Seite SAP Business One Hub). Die Felder selbst stehen in der Architektur SAP Business One.

So werden die Daten extrahiert

Jeder SAP-Business-One-Mandant ist eine eigene Datenbank (SAP HANA oder Microsoft SQL Server) und wird getrennt extrahiert. Die Tabellen sind bereits relational; der bevorzugte Weg ist daher je Kategorie (Kunden, offene Posten, ausgeglichene Posten, optional offene, nicht gelieferte Aufträge) eine lesende SQL-Abfrage auf diese Datenbank. Ohne Datenbankzugriff liefert der Service Layer (OData: BusinessPartners, JournalEntries, Invoices, Orders) dieselben Fakten mit Paging und $filter; die DI API ist der Ausweg für On-Premise-Add-ons. Die Feldnamen sind die Tabellenfelder von B1; der Service Layer schreibt sie nur anders.

So werden sie flach gemacht

Jede Kategorie wird als EINE flache Tabelle geliefert (CSV oder SQL-Ergebnis), eine Zeile je Schlüssel, Spaltenkopf = Feldname, keine verschachtelten Strukturen. Offener Betrag und Ausgleichsdatum werden auf der SAP-Seite berechnet und als fertige Spalten geliefert; Bilendo rechnet sie nicht nach.

SAP Business One (eine Mandanten-Datenbank)
|
+- OCRD + CRD1 + OCPR -------------------------> 1) Kunden, eine Zeile je CardCode
|     CardType = 'C', Rechnungsadresse, Kontakt
|     Schluessel: CompanyCode + CardCode, einmal je Datei
|
+- JDT1 (nur Kundenzeilen, ueber OCRD)
|     Schluessel: CompanyCode + TransId + Line_ID, aendert sich nie
|     + OJDT          Kopftext, Anlagedatum
|     + OINV / ORIN   Rechnungsnummer (TransType 13 / 14)
|     + ITR1 + OITR   Abstimmung (Ausgleich)
|     |
|     |  OpenAmount   = BalDueDeb - BalDueCred
|     |  ClearingDate = juengstes ReconDate, nur wenn OpenAmount = 0
|     |
|     +-- OpenAmount != 0 ---------------------> 2) offene Posten, Schluessel TransId + Line_ID
|     |
|     +-- OpenAmount = 0 und abgestimmt -------> 3) ausgeglichene Posten, gleiches Template
|
+- ORDR + RDR1 (optional) ---------------------> 4) offene, nicht gelieferte Auftraege, eine Zeile je Auftrag
      Schluessel: CompanyCode + CardCode + DocNum
      jede Lieferung = ALLE offenen Auftraege, kein Delta

1) bis 4)  ->  flache CSV / SQL-Ergebnis  ->  Bilendo-Import

Schlüssel und Doubletten

Bilendo bildet seine Schlüssel aus den gelieferten Spalten. Eine Doublette im debitorischen Nebenbuch führt zu falschen Salden; deshalb gelten die folgenden Regeln streng. Innerhalb EINES Batches (eines Lieferobjekts) erkennt Bilendo einen wiederholten Schlüssel als Doublette und nimmt ihn nicht an. Über getrennte Lieferungen hinweg überschreibt die neuere die Werte der älteren unter demselben Schlüssel (Kunden und Buchungen; Aufträge funktionieren anders, siehe unten).

Ausgeglichene Posten

Ausgeglichene Posten nutzen DASSELBE Template wie die offenen Posten: dieselben Felder, dieselbe flache Tabelle und denselben Schlüssel (CompanyCode + TransId + Line_ID); nur die Auswahl ist anders. Sie kommen daher als zweiter Auszug (oder in derselben Datei, solange der Schlüssel eindeutig bleibt). Ein ausgeglichener Posten ist der spätere Zustand eines offenen Postens: Er kommt mit dem Schlüssel, den er schon hat.

Offene, nicht gelieferte Aufträge

Aufträge (optional) sind ein Schnappschuss, kein Strom von Änderungen. Bilendo bildet den Auftrags-Schlüssel aus CompanyCode + CardCode + DocNum, und es wird nichts überschrieben: Mit jeder Lieferung archiviert Bilendo alle Auftragssätze, die es vorher erhalten hat, und legt die Sätze der neuen Lieferung neu an.

Delta-Läufe

Kunden (Stammdaten): Der erste Lauf liefert alle Kunden. Spätere Läufe liefern neue Kunden (OCRD.CreateDate) und geänderte Kunden (OCRD.UpdateDate), einen Tag zurück, jeweils unter demselben Schlüssel (CompanyCode + CardCode), damit die neueren Werte die älteren ersetzen. Eine Änderung an Rechnungsadresse oder Ansprechpartner gehört zum Kunden: An der Instanz des Kunden bestätigen, dass eine solche Änderung OCRD.UpdateDate verschiebt; tut sie das nicht, werden in jedem Lauf alle Kunden geliefert, was die Schlüsselregeln sicher machen. Empfohlen: die Kunden eines Laufs vor dessen Buchungen senden, damit eine Buchung nie auf einen Kunden zeigt, den Bilendo noch nicht kennt.

Buchungen (Bewegungsdaten): Neue Buchungen findet man über OJDT.CreateDate (einen Tag zurück neu lesen); eine Änderung an einer bestehenden Buchung (OJDT.UpdateDate) kommt erneut mit demselben Schlüssel. Ein offener Betrag ändert sich auch, wenn eine Zeile ausgeglichen wird, ohne neue Buchung: jede Zeile mit offenem Saldo neu lesen, dazu die seit dem letzten Lauf ausgeglichenen Zeilen (OITR.ReconDate). Eine stornierte Abstimmung (Canceled = 'Y') setzt die Zeile wieder auf offen: sie kommt mit dem erneuten Lesen der offenen Posten unter demselben Schlüssel zurück, mit OpenAmount über 0 und ohne Ausgleichsdatum, und fällt aus den ausgeglichenen Posten heraus.

Aufträge: kein Delta. Jeder Lauf liefert den vollständigen Schnappschuss der offenen, nicht gelieferten Aufträge.

Bitte an Ihrem System prüfen
Die Tabellen- und Feldnamen folgen dem SAP-Business-One-Standardschema. Angepasste Installationen (benutzerdefinierte Felder, Add-ons, eine andere B1-Version) können abweichen: Lassen Sie Joins und Feldnamen vor der ersten Extraktion mit Ihrem SAP-Partner an Ihrer eigenen Instanz bestätigen. Der Rückblick-Zeitraum für ausgeglichene Posten wird je Kunde vereinbart. Mahnstufe und Mahnstopp haben in B1 kein Standardfeld und gehören deshalb nicht zu dieser Seite; führen Sie sie in einem benutzerdefinierten Feld, nehmen wir es als Custom Field auf. Zwei Fälle würden einen Schlüssel ändern und müssen vor der ersten Extraktion mit dem Kunden geklärt werden: Manuelle Buchungen (TransType 30) lassen sich in SAP Business One nachträglich ändern, und wenn Zeilen eingefügt oder entfernt werden, kann sich Line_ID verschieben; und ein umbenannter Geschäftspartner-Code ist ein neuer Kunden-Schlüssel.