Was läuft?

Neben der Entwicklung einer SAPUI5 Anwendung sowie einem SAP ABAP Projekt, lese ich mich in ein Langzeitprojekt ein. Programmierung auf IBM Servern in RGP. Eine Business-Anwendung soll um Free-RPG erweitert und Code geändert werden.

Haben sie auch spannende Aufgaben? Ich bin für Sie da!

UI5: Route und Variabeln

Navigation in Views und die Übergabe von Parametern. Drei einfache Wege (von vielen) für verschiedene Szenarien.

Eingrenzende Filterung oder Bindung in Listen und Tabellen sind häufige Szenarien die in UI5 Anwendungen. Wie kann das realisiert werden, besteht die Anwendung aus mehreren Views?

Eine Möglichkeit ist das speichern von Daten im Session Storage – aus Sicherheitsgründen eine nicht gern realisierte Lösung. Im Controller lassen sich Daten mit „sessionStorage.setItem(„Variable“, „Wert“);“ speichern und an anderer Stelle oder anderem Controller mit „var Variable2 = sessionStorage.getItem(„Variable“);“ gelesen werden.

Eine bessere Lösung ist das deklarieren von globalen Variabeln. Im Controller, ausserhalb einer Funktion, simpel „var Variable;“ vereinbaren. Nach Aufruf des Controllers ist die Variable global verfügbar.

Von SAP favorisiert, ist das arbeiten mit Routing und Targets. Werte werden mit dem Aufruf eines Controllers über das Routing „mitgegeben“. So kann im aufgerufenen View Daten nach Selektion durch Binding oder Filter eingeschränkt dargestellt werden.

Im View 1 (Link zum Beispiel) wählen wir einen Kunden aus, nach dessen Kundennummer (description) im View2 die in Relation stehende Daten gefiltert darsgestellt werden.

Im Controller wird Wert aus dem gewählten Listeneintrag gelesen

NavTo lädt entsprechenden Controller. Das geschieht über die im manifest.json vereinbarten Router und Targets:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
"routes": [
            {
                ...........................
            },
            {
                "name": "kunde",
                "pattern": "kunde",
                "target": [
                    "kunde"
                ]
            },
            {
                "name": "bst",
                "pattern": "bst",
                "target": [
                    "bst"
                ]
            },
            {
                "name": "bst",
                "pattern": "bst/description/{description}",
                "target": [
                    "bst"
                ]
            },              
            {
                "name": "cam",
                "pattern": "cam",
                "target": [
                    "cam"
                ]
            },
            {
                "name": "cam",
                "pattern": "cam/description/{description}",
                "target": [
                    "cam"
                ]
            }               
        ],
        "targets": {
            ..................................
            },
            "kunde": {
                "viewType": "XML",
                "viewName": "kunde"
            },
            "bst": {
                "viewType": "XML",
                "viewName": "bst"
            },
            "cam": {
                "viewType": "XML",
                "viewName": "cam"
            }

Es ist zu erkennen, wie die Variable „description“ über den Router im manifest quasi über die URL weiter gegeben wird. Wird der Controller des Views „bst“ aufgerufen wird, liest die Funktion „onInit“ den übergbenen Wert.

OnInit ruft _onRouteMatched auf, wenn Daten übergeben wurden
mit dem übergebenden Argument, wird ein Filter gesetzt

Wird im zweiten View, durch Klick auf einen Listeneintrag, weiter selektiert, muss die Route und das Target ebenfalls deklariert sein.

Weiter Selektion läuft nach dem selben Muster ab

In dem Beispiel navigieren wir nur durch drei Views. Die Möglichkeiten der Selektion sind natürlich frei verwendbar und zu kombinieren.

OpenSAP: Qualifizierung

Es sind noch ein paar Wochen bis zum nächsten Projekt. Ich nutze die Zeit zum programmieren und lernen. hat neben dem Community Bereich auch einen Schulungsbereich. Zwischendurch lassen sich hier kleinere Themen vertiefen. Gutes Schulungsmaterial und Videos – so wie man es von SAP gewohnt ist, aussergewöhnlich gut!

Kürzlich erworben:

Grundlagen Updates Netweaver

SAP: Grundlage DART und CS

Merkzettel zum Vorgang DART Extrakte im Content Server archivieren.

Das Data Retention Tool (DART) unterstützt uns dabei, die gesetzlichen Anforderungen an die Datenhaltung und die Datenüberlassung für steuerliche Prüfungszwecke zu erfüllen (Grundsätze zum Datenzugriff und zur Prüfbarkeit digitaler Unterlagen (GDPdU)). Mit diesen Datenextrakten kann man auch brauchbare Auswertungen anfertigen und lassen sich beliebig oft im SAP Content Server archivieren. Die Archivierung im Content Server löscht und stellt lokale Dateien wieder her.

Mit der FTW1A grenzen wir die zu extrahierenden Daten ein und benennen die zu erstellenden lokalen Datendateien. Die Dateien werden lokal zunächst kompakt abgelegt. Für das Einlesen der Daten in der IDEA Software der Finanzverwaltung, sind die Dateien mit dem Splitter S_P6D_40000027 zu zerlegen.

Die Datenextrakte lassen sich über FTWL anzeigen und mit dem Datenexplorer detailiert darstellen. Die Datenextrakte sowie die zerlegten Dateien und Views können im SAP Content Server archiviert werden.

nach Archivierung werden Dateien lokal gelöscht

Treten bei diesem Szenario Fehler auf, kann das an einer Besonderheit im Customizing liegen.

Die Pfadangaben in der DART und Content Server Administration muss als Literal absolut gleich sein! Auch wenn IP und Netzwerkname logisch ein Ziel darstellen, kommt es zum Fehler wenn diese Angaben nicht absolut (Zeichen, Gross- Kleinschrift) gleich sind!

Nachdem die Daten archiviert wurden, finden wir sie auch in der Dokumentenanzeige OAAD wieder.

SAP BAS: Adressabgleich

Offene Firmenregister – der Staat hat eigentlich diePflicht solche Daten öffentlich zu halten. Handelsregister.de ist reine Abzocke

In unserem Projekt „Business Address Service“ im SAP System bauen wir derzeit eine Adressprüfung gegen das öffentliche Firmenregister ein.

Unglaublich guter Service, den die GfUD nutzt: Plausibilitätsprüfung und Ergänzung zu ihrem Kundenverzeichnis.

Plausibilitätsprüfungen und wertvolle Ergänzungen für ihr CRM und SD. Ein Vorteil für ihre Risikoabschätzung und Herstellung der Transparenz von gemeinsamen Geschäften.

Das Projekt (2019) wird nicht veröffentlicht – wer noch teilnehmen, oder den Dienst ausserhalb von SAP System nutzen möchte, mag mich kontaktieren:

Telefon 02202 989 12 17

SAP Content Server 6.4 auf SLES 11

Optimale DMS für SAP Systeme. Hinweis zur Installation auf SUSE Enterprise for SAP 11.

Die Themen Dokmentenmanagement und Dokumentenarchiv sind im SAP System extrem komplex implementiert. Ganz bestimmt kein Thema, auf das man „mal eben“ in einem Blog eingeht.

Zu den bestehenden offiziellen Installationsanleitungen ( unter anderen: LINK ), bin ich über diese Kleinigkeiten gestolpert:

VOR der Installation (!!) sollten die User angelegt werden:

sapcs ( für den Content Server ) und sapcsc ( für den Cache Server ) in Gruppe sapsys.

In deren Homeverzeichnis ist dann jeweils ein Apache2  2.2 zu compilieren. Wer mag kann andere Apacheversionen ausprobieren – habe ich gemacht und sage: Apache2 2.2

Apache2 2.2 Installation in Homedirectorys von SAPCS und SAPCSC

Zuerst das configure ausführen. In jedem Verzeichnis:

./configure –prefix=/home/sapcsc/ –enable-mods-shared=most –with-mpm=prefork –with-expat=builtin –with-included-apr –with-included-apr-util

und dann

make && make install

Im Browser sollte, nach dem Start des Servers, der Server und der Cache erreichbar sein

Schauen wir uns demnächst die vielen Möglichkeiten, den Content Server zu nutzen, an.

SAP und Agorum als DMS Lösung

Mögliche Alternative wenn ein SAP Content Server nicht im Arbeitsprozess integrierbar ist.

Es sind Umstände vorstellbar, in denen die Integration von Belegen in das SAP System garnicht gewünscht sind. Große Steuerberater erhalten die Belege als Scan von ihren Mandanten und ein kopieren in das SAP eigene DMS, dem SAP Content Server, ist garnicht gewünscht. Es ist aber Standard, die Originalbelege zum Systembeleg abzulegen, zumindest eine Referenz herzustellen. Das Belegfeld „Referenznummer“ dient zur Aufnahme der Fremdbelegnummer und hat im weiteren Belegprozess eine Bedeutung. Das vermerken der Systembelegnummer auf dem Originalbeleg ist angeraten und wird in der Praxis meisst per Hand vollzogen.

Wenn ich mit meinem Lieblings-DMS, dem von Agorum, arbeite, arbeite ich auf zwei Bildschirmen. Links ist die Buchungsmaske, rechts das Dokument. Wenn ich links buche, wird eine Systembelegnummer generiert die ich rechts auf dem Originalbeleg vermerken sollte. So ist ein suchen und finden von Belegen von beiden Applikationen aus möglich.

Das gilt es zu automatisieren. Ich will dabei garnicht zu sehr ins Detail gehen, etwas Vorkenntnis setze ich voraus – im Zweifel fragen!

Möglichkeiten, in die SAP Software manipulativ einzuwirken, gibt es viele. Eine sehr schöne und einfache Möglichkeit sind BTE’s ( Business Transaction Events ).  Der Name lässt schon auf die Systematik schliessen: In den Arbeitsprozessen werden zu bestimmten Zeitpunkten, einfach gesagt, nach geschaut, ob der Kunde an diesem Punkt eigenen Programmcode ablaufen lassen möchte. Wirklich sehr einfach dargestellt!

Solche Eventtimes existieren in jedem Arbeitsprozess und zu mehreren sinnvollen Zeitpunkten. Den richtigen Zeitpunkt zu finden, kann in stundenlangen Suchorgien ausarten. Wenn man aber das Wochende mit dem austesten glücklich verbracht hat, hat man etwas gelernt. Kurz: Für unsere Zwecke hat sich der Zeitpunkt 1030 ganz anständig vorgestellt. Wir sprechen von einem Zeitpunkt im Arbeitsprozess „Beleg buchen“ welcher nach der Belegprüfung und nach dem „speichern“ aber vor dem COMMIT WORK liegt. Zu diesem Zeitpunkt steht fest, das und mit welcher Belegnummer gespeichert wird. Im Dictionary befinden sich für jeden Zeitpunkt ein beispielhafter Funktionsbaustein der in seinen Parametern nicht verändert werden darf. Dieser wird in den eigenen Namensraum kopiert. ( Listing )

Bevor es an die Programmierung geht, kurz ein Gedanke zum pro cedere. Der Buchhalter bucht, zum Beispiel, über die FB50 Belege ein. Dort stehen uns Felder für den Belegkopf zur Verfügung. Wenn wir nun eine Verbindung zu einem externen Originalbeleg herstellen wollen, bedient man sich allgemein dem Referenzfeld. Wie schon weiter oben gesagt, hat das Feld eine Aufgabe. Nämlich die, der Zuordnung beim maschinellen Ausgleich. Im Agorum DMS liegt ein File, mit einem Namen und einer Objekt ID. Hier können wir also keine einfache Verbindung zwischen Systembeleg und Originalbeleg assoziieren. Ich habe es ersteinmal so gelöst, ohne Programmierung von kundeneigenen Feldern, das Feld „Belegkopftext“ Zweck zu entfremden.

Dazu habe ich eine neue Belegart „AG“ erstellt und das Feld  „Belegkopftext“  zum Mussfeld gemacht. Damit ist zwingend das Feld mit der Objekt ID des im Agorum DMS befindlichen Originalbelegs zu befüllen.

Wenn nun die Buchung verbucht wird, kommt es zum Event 1030 zu dem die Belegkopfdaten als Notiz an den Originalbeleg im Agorum DMS hinzu gefügt werden sollen. Dazu stellt Agorum eine REST API zur Verfügung. Über URL mit POST/GET angesprochen, wird eine Antwort per XML zurück gegeben. Im SAP System bediene ich mich dazu der Klasse CL_HTTP_CLIENT. ( Listing )

Wir sehen in den Zeilen 45 bis 65 das zunächst der http Client initialisiert  und eine Session ID angefordert wird. Die lokale Variable lv_bin enthält nun die XML Antwort von Agorum als XSTRING und wird in den Zeilen 95 bis 100 in eine itab gelesen. Beim programmieren kommt man nicht ohne Debugger weiter, denn der Aufbau des XML ist nicht klar. Das Ergebnis wird schlicht als „value“ übertragen und hängt demnach von der Anforderung ab. Werden mehrer Anforderungen gestellt, heißen alle Werte „value“.

Die Zeilen 80 bis 93, das Suchen nach dem Filenamen, hat zwei Gründe: Es kann eine Tabelle aufgebaut werden, in der die Verbindung Objekt ID, Filename und Systembelegnummer protokolliert wird. Und es war nicht möglich, nach dem Abfragen der Session ID direkt die Notiz zu generieren. Es kommt ohne vorheriges GET vor dem POST zur Fehlermeldung seitens Agorum DMS.

In den Zeilen 112 bis 135 wird es haarig. Uns stehen an dieser Stelle alle Daten zur Verfügung: Objekt ID, Session ID und Belegdaten. Diese müssen als escaped JSON formatiert werden. Nach dem senden ist die Zeile 142 entscheident. Erfolgt nach dem send kein receive, wird die Notiz nicht erstellt.

Dieser neue kundeneigene Funktionsbaustein ist nun, nach dem aktivieren, dem Event zu zuordnen. Über die Transaktionen BF24 und BF34 können wir unser Produkt ersteinmal benennen, aktivieren und einem Zeitpunkt, hier 00001030, zuordnen.

Das Ergebnis ist, das wir im SAP System an der Belegart und dem Belegtext erkennen, das es einen Originalbeleg im Agorum DMS gibt. Im Agorum DMS können wir schnell an der vorhandenen Notiz erkennen, das eine Buchung im SAP System vorgenommen wurde. Im Detail können wir nach Systembelegnummern, Buchungsdatum usw. suchen.

Eine einfache und praktikable Lösung.

SAP Zinsrechnung – Verwendbarkeit

Aktuelle Frage zum letzten Workshop Zinsrechnung mit ABAP

Kann man das Beispiel aus meinem Beitrag (Link) so übernehmen? Nein!

Natürlich darf der Code hier kopiert werden. Alle Code sind aber nur Beispiele und Arbeitsvorlagen. Nicht zuletzt existiert die Seite, weil sie auch mir als Merkhilfe für bestimmte Dinge dient.

Bei einer Zinsrechnung ist darauf zu achten, für wen ich was rechne! In unserem Beispiel wird der Zins vom Zins mit berechnet. Das ist nach §289 BGB nicht zulässig. Auch ist die Frage ob eine lineare Berechnung gefragt ist. Also, ist der Code in jedem Fall an die Bedürfnisse anzupassen und niemals blind zu kopieren und produktiv zu nutzen!

Zinsrechnung unter Beachtung 286BGB ( kein Zins vom Zins )

In dem Listing (Link) ist die Zeile 112 fraglich. Nimmt man sie heraus und bildet über das ALV eine Aggregation, ist diese Rechnung rechtlich korrekt für Kredite nach Effektivzinsmethode mit Zinsaufschlag auf den Leitzins unter Berücksichtigung, das der Zins nicht vom Zins gerechnet wird.

Aufbau des ALV mit Summenaggregation

SAP Fax – Standard Installation

Man mag es nicht glauben, aber den Fernkopierer wollen viele nicht missen. Das analoge Relikt der frühen 80er Jahre lässt sich aber heute noch durch Umwandlung einer Mail in, über das Telefon, übertragbare Töne umwandeln.

Ein SAP Netweaver System kann über viele Wege mit ihren Nutzern oder Kunden kommunizieren. Im Standard vorgesehen ist EMail, SMS und das Fax – über die Schnittstellen ist jede Art der Kommunikation möglich. Wenn wir beim Thema Fernkopierer sind: Ja, auch TELEX und das Morsen ist realisierbar.

SAPConnect (c) SAP
SAPConnect
(c) SAP

Der Weg über den FAX Provider ist der kleverste. Der Postfix Mailserver ist in der Regel bereits vorhanden und kann auch von anderen Anwendungen genutzt werden.

Der SAP Netweaver ist schnell vorbereitet. (Link) Man ist gut beraten, eine eigene, extern erreichbare Maildomain zu konfigurieren. Das SAP System produziert also nicht mehr als eine EMail, welche mit einer eigenen Domain versehen an den Mailserver transportiert wird. Über die Transaktion SBWP geben wird lediglich die Faxnummer ein, das Mailformat sieht dann so aus: FAX=+49105954900@fax-provider.com. Der Präfix FAX= wird zwingend automatisch hinzugefügt. Genau so die Ländervorwahl +49 für „DE“ Deutschland und der Suffix, die Domain. Ein Fax kann und soll auch von anderen Applikationen versendet werden können. Sehen wir uns die verschiedenen „To:“ Zeilen im Header der Mails an um heraus zu finden, wie man letztendlich die Faxnummer heraus filtern kann.

To: "DE 22023480" <FAX=+4922023480@FAX.SYSTEM.DE>

So sendet das SAP System. Andere Systeme sehen so aus:

1
2
To: 0223480@fax.system.de
To: "022023480@fax.system.de" <022023480@fax.system.de>

Thunderbird sendet wie in Zeile 1 und Microsoft Outlook wie in Zeile 2. Für die Filterung der Faxnummer aus dem Mail Header existiert ein gutes Script von Lee Howard (Hylafax) welches die üblichen Fälle abdeckt. Für die Besonderheiten des SAP Systems müssen wir es modifizieren.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh
# Script von Lee Howard
# customized 2018
# thomas@schilling-bontkirchen.de
RANDOMFAX=/tmp/mail2fax.$$
mkdir $RANDOMFAX
cat >> $RANDOMFAX/_message_
# Debug setting
#set -x
#exec > /tmp/mail2fax.log 2>&1
JOBID=`grep -e "^subject:" -i $RANDOMFAX/_message_ | sed q | sed 's/^[^:]*: *//g'`
TOLINE=`grep -e "^to:" -i $RANDOMFAX/_message_ | sed q`
FROMLINE=`grep -e "^from:" -i $RANDOMFAX/_message_ | sed q`
if [ "`echo $TOLINE | grep '<.*>'`" != "" ]; then
TONUMBER=`echo $TOLINE| sed -e 's/.*<\(.*[^@]*\)@.*>.*/\1/'`
else
TONUMBER=`echo $TOLINE| sed -e 's/^[Tt]o://g' -e 's/[ ]*\(.*[^@]*\)@.*/\1/'`
fi
if [ "`echo $TONUMBER | grep 'FAX='`" != "" ]; then
TO=`echo $TONUMBER| tr -d 'FAX='`
TONUMBER=$TO
fi
if [ "`echo $FROMLINE | grep '<.*>'`" != "" ]; then
FROMPATH=`echo $FROMLINE| sed -e 's/.*<\(.*\).*>.*/\1/'`
else
FROMPATH=`echo $FROMLINE| sed -e 's/^[Ff]rom://g' -e 's/[ ]*\([^ ]*\).*/\1/'`
fi
cat $RANDOMFAX/_message_ | faxmail -v -T $FROMPATH | sendfax -vv -n -D -f "$FROMPATH" -i "$JOBID" -d $TONUMBER
rm -rf $RANDOMFAX
exit 0

In den Zeilen 19 bis 22 korrigieren wir die Faxnummer die vom SAP System mit einer quasi Dienstkennung (FAX= oder SMS=) versendet wird. Schauen wir uns den Debug an:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
+ grep -e ^subject: -i /tmp/mail2fax.24145/_message_
+ sed s/^[^:]*: *//g
+ sed q
+ JOBID=Test
+ grep -e ^to: -i /tmp/mail2fax.24145/_message_
+ sed q
+ TOLINE=To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ grep -e ^from: -i /tmp/mail2fax.24145/_message_
+ sed q
+ FROMLINE=From: "Thomas Schilling" <schillingt@sap.system.de>
+ echo To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ grep <.*>
+ [ To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE> != ]
+ echo To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ sed -e s/.*<\(.*[^@]*\)@.*>.*/\1/
+ TONUMBER=FAX=+49123456789
+ echo FAX=+49123456789
+ grep FAX=
+ [ FAX=+49123456789 != ]
+ echo FAX=+49123456789
+ tr -d FAX=
+ TO=+49123456789
+ TONUMBER=+49123456789
+ echo From: "Thomas Schilling" <schillingt@sap.system.de>
+ grep <.*>
+ [ From: "Thomas Schilling" <schillingt@sap.system.de> != ]
+ echo From: "Thomas Schilling" <schillingt@sap.system.de>
+ sed -e s/.*<\(.*\).*>.*/\1/
+ FROMPATH=schillingt@sap.system.de
+ rm -rf /tmp/mail2fax.24145
+ exit 0

Wir sehen, das in Zeile 19 If   WAHR ist und FAX= durch tr(im) heraus geschnitten wird. Faxmails können jetzt von jedem Programm in jedem Format zum Faxserver zur Verarbeitung weiter geleitet werden. Im Postfix bedienen wir uns in der main.cf der virtual_alias_maps die folgenden Inhalt hat

@fax.system.de sapfax

Wir leiten alle Mails an die Domain fax.system.de an den Alias sapfax weiter. Sapfax ist wiederum in der /etc/aliases definiert.

sapfax: | /usr/local/bin/sapfax.sh

Der Systemuser-Alias „sapfax“ wird durch eine Pipe an unser Script, das global ausführbar sein muss, weiter geleitet und verarbeitet.

Ein hervorragendes Manual für die Installation von Asterisk und Hylafax ist noch zu nennen (Link) – alles weitere ist problemlos.

BAS Datenimport Beispiel

Beispiel eines Datenimports in das BAS eines SAP NETWEAVER

Möglichkeiten, Daten aus Altsystemen in SAP zu importieren, gibt es reichlich. LSWM, SHDB sind die wichtigsten Transaktionen die auch sehr gut dokumentiert sind. Sie basieren auf der Technik des Batch-Input – also des „abspielens“, des simulierens einer Benutzeraktion mit Dateneingabe. Im Fall des Adressimports, genauer: Adressdatensätze der Geschäftspartner – ist dieses Vorgehen sehr umständlich, sehr Ressourcenaufwendig und führte, bei meinen Versuchen, zu einem Speicherüberlauf da nicht nur die BUP1 Transaktion angesprochen wird, sondern zeitgleich mehrere Prozesse angestossen werden die für die Sache eigentlich nicht nötig sind. Es sollte unbedingt darauf verzichtet werden und den Import über Code und den entsprechenden Verbucher-Funktionsbausteinen der BAS zu realisieren. Hilfreich ist diese Seite zu der Funktionsgruppe SZA1.

In der Schulung gehen wir einmal den Weg eines Batch-Inputs der grundsätzlich sehr gut ist.

In der Transaktion SHDB starten wir eine neue Aufzeichnung mit der Transakton BUP1 und legen einen Kunden „Mustermann“ an. Wenn die Aufzeichnung nach dem speichern des Kunden beendet ist, sieht man eine lange Liste der ausgeführten Aktionen auf dem Screen.

Mit dieser Aufzeichnung lässt sich einiges anstellen: Als Vorlage für den Import mit der Transaktion LSMW, als eigenständiger Report oder als Funktionsbaustein. Letzteren wollen wir einmal ausprobieren.

Hier zeigt sich schon der ernorme Ressourcenverbrauch. In meinem Beispiel importiere ich eine CSV Datei mit 4000 Sätzen. Es wird 4000 mal der Input in die Transaktion BUP1 erzeugt. Man sollte darüber kurz nachdenken, bevor man F8 drückt! In der Realität würde ich mit Sicherheit den Verbucherbaustein direkt mit einem COMMIT WORK AND WAIT aufrufen.

Es funktioniert, wenn auch sehr langsam trotzdem. Unser Batch-Input wird Positiv quittiert.

 

Datemimport ist eine einmalige Sache, bei der man schon den zu betreibenden Aufwand berücksichtigen muss. Über den Batch-Import ist aber immer gewährleistet, nur gültige Daten importiert zu haben. Andere Ideen, wie der Import in das BAS schöner gestaltet werden kann, sind willkommen und werden veröffentlicht!