call-sap-rfc(alias a,rfc b,[inMap c,timeout d,filter e,outList f,debug g,h,i,j,k])
Gruppe |
Hinweis: Siehe auch Abschnitt SAP RFC.
Ruft einen RFC b eines SAP-Systems auf, das über den Alias in a definiert ist. Für den Aufruf notwendige Parameter sind in einer Map mit Namen c hinterlegt. Antwortwerte und -tabellen werden zeilenweise als Rückgabewert der Funktion geliefert, sowie (optional) in die Liste oder ein XML-Objekt f geschrieben. Wenn ein Ausgabefilter e definiert ist, werden nur die angegebenen Werte bzw. Tabellen ausgegeben. Wenn eine ABAP-Exception auftritt, deren Name einen der Token aus der Liste h enthält, wird diese Exception ignoriert und stattdessen der Rückgabewert i als Ergebnis geliefert. Alle anderen ABAP-Exceptions führen zum Job-Abbruch. Parameter j für RFC-Queue und Parameter k für JCoContext (siehe Parameter-Tabelle für Details).
Parameterbeschreibung
Parameter |
Beschreibung |
a |
SAP-Alias. |
b |
RFC-Name. |
c |
(optional) Name der Map, die die Eingangsparameter enthält. Default: default. Siehe Unterabschnitt Füllen der Parametermap c vor dem Aufruf. |
d |
(optional) Zeit in Sekunden, auf die auf eine Antwort gewartet wird. Zeiten kleiner drei Sekunden werden ignoriert. Der maximale Timeout ist 600 Sekunden. Default: 60 |
e |
(optional) Kommaseparierte Liste der Feld- und Tabellennamen und optionalen Indizes, auf die die Rückgabe der Funktion beschränkt sein soll. Default: Keine Ausgabefilterung. Siehe Unterabschnitte Ausgabefilterung durch Parameter e (es können auch ABAP-Exceptions bzw. die gesamte Response im Format SAPXML ausgegeben werden). |
f |
(optional) Mit diesem Parameter können die Antwortwerte zusätzlich (zum Rückgabewert der Funktion) in eine Liste oder ein XML-Objekt geschrieben werden. Bleibt der Parameter leer, wird beides nicht getan. Um zusätzlich in eine Liste zu schreiben, geben Sie hier einfach deren Namen an. Die Liste wird dann automatisch erzeugt (bzw. geleert, falls schon vorhanden). Die Ergebniszeilen werden in das Listen-Objekt eingefügt. Dabei wird auch der Filter e angewendet. Der Rückgabe-Zeilen der Funktion und der Inhalt der Liste sind also gleich. Um zusätzlich in ein XML-Objekt zu schreiben, verwenden Sie vor dem Namen bitte das Präfix :xml: (exakt so geschrieben und ohne Leerzeichen zwischen Präfix und Namen). Das XML-Objekt wird automatisch erzeugt und enthält die gesamte Response des RFCs. Filter e wird dabei nicht angewendet! Die Auswertung der RFC-Response im XML-Objekt können Sie mit den Funktionen select nodes from XML/DOM to List( a, b, c, d, e ) und get value from XML( a, b, c, d, e ) durchführen. Hinweis: Die XML-Struktur im XML-Objekt ist mit der XML-Struktur der Debug-Datei *_debug_RfcOut.xml identisch, die unter Verwendung des Parameters g als lokale Debug-Datei geschrieben werden kann. |
g |
(optional) true, wenn ein Trace des Aufrufs erstellt werden soll. Default: false. Die Namen der erzeugten Tracedateien werden im Job-Log hinterlegt. Dateinamen-Format: <Jobnummer>_<Timestamp>_debug_<RFC-Name>_<In|Out>.xml, wobei bei einem Mappingtest statt der Jobnummer der Wert T verwendet wird. Die Dateien landen im Ordner ./debug/sap. Wichtiger Hinweis: Selbst wenn der Parameter auf true gesetzt wird, erfolgt das Tracing nur in einem Mapping-Test oder wenn das Tracing für Phase 3 des Profils (oder systemweit) aktiviert wurde. Will man die Debug-Dateien immer schreiben (z. B. in der Probephase als Nachweis für das SAP-Team), also auch in einem normalen Job-Lauf und ohne das Tracing in Phase 3 (mit entsprechendem Overhead), kann man auch den Wert always angeben. Warnung: Diese Dateien werden nicht automatisch gelöscht, es liegt also in der Verantwortung des Benutzers diesen Ordner zu überwachen und Dateien manuell zu löschen, um einen Festplattenüberlauf zu verhindern. Beachten Sie bitte auch, das eine hohe Anzahl von Dateien in diesem Ordner die Performance beeinträchtigen kann. |
h |
(optional) Token-Liste (Trennzeichen Semikolon) der ABAP-Exceptions, die ignoriert werden sollen. |
i |
(optional) Rückgabewert bei einer ignorierten Exception (siehe h). |
j |
(optional) Die zu verwendende RFC-Queue. Wird der Parameter leer gelassen, wird die Default-Queue verwendet. Warnung: Wird ein JCoContext verwendet (siehe Parameter k), wird eine definierte Queue ignoriert! |
k |
(optional) JCoContext erzeugen (true/false). Default: <empty>. Einschränkung: Der JCoContext steht nur für Verbindungen mit JCo-Version 3 zur Verfügung. Für Aliase mit JCo-Version 2.x erfolgt ein Fehlerabbruch, wenn k=true gilt. Wenn ein Aufruf mit k=true erfolgt, wird für den Alias a ein JCoContext erzeugt, der bis zum Ende der Phase 3 dieses Profil-Jobs (oder bis zu einem Fehlerabbruch) besteht. Lediglich mit explizitem k=false kann man einen weiteren Aufruf aus einem bestehenden JCoContext herausnehmen (ein leerer Parameter k beendet den Kontext nicht!). Solch ein Kontext wird für (stateful) BAPI-Aufrufe (Business Objects in SAP) benötigt. Alle BAPI-Aufrufe müssen im selben JCoContext erfolgen, weil sie zusammenhängend sind. Alle Aufrufe zusammen werden dann am Ende committed (BAPI_TRANSACTION_COMMIT). Wenn kein Commit ausgeführt wird bis zum Ende des JCoContexts, werden die innerhalb des JCoContexts an SAP geschriebenen BAPI-Daten verworfen. Normale RFC-Aufrufe müssen nicht committed werden, daher hat dort der JCoContext keine Bedeutung und sollte auch nur für sequenzielle BAPI-Aufrufe erzeugt werden, da er sehr ressourcen-aufwendig ist. Allerdings können Sie in einem bestehenden JCoContext auch normale RFCs aufrufen werden. Beachten Sie dann aber, dass diese nicht zurückgerollt werden bei einem nicht erfolgten Commit, weil sie auch ohne diesen funktionieren! Warnung: Wenn der JCoContext erzeugt wird, wird eine eventuell in Parameter j definierte Queue ignoriert! Hinweis: Im ersten Funktionsaufruf kann der Wert true auch in Großbuchstaben geschrieben werden (TRUE). Dann wird die JCoDestination für diesen Job geclont und zum Beginn ein RFC_PING zum Test der Verbindung ausgeführt. |
Füllen der Parametermap c vor dem Aufruf
Die Funktion erwartet Schlüssel-Werte-Paare in einer bestimmten Notation, damit sie dem jeweiligen Parametertyp im RFC zugewiesen werden können.
Art der Eingangsparameters |
Resultierender Schlüssel pro Wert |
Ein einzelnes Feld. |
Name des Feldes. |
Eine Struktur, die aus einer Liste von Feldern (Komponenten) besteht. |
Strukturname-Feldname |
Eine Tabelle mit den Feldern (Komponenten) als darin enthaltene Spalten. |
Tabellenname[Zeilennummer]-Spaltenname |
Enthält ein Wert in der Map eine Zeichenkette der Art @Variablenname@ wird nach einer Variable mit dem angegebenen Namen gesucht und - sofern vorhanden - der Platzhalter durch den Wert ersetzt. Existiert keine solche Variable, wird der Platzhalter unverändert als Parameter im Aufruf verwendet.
Zur Vereinfachung des Füllens der Parametermap c kann die Funktion fill-map-from-fields( map a, prefix b, index c, hidden d ) genutzt werden.
Bei Strukturen und Tabellen muss beachtet werden, dass die Komponenten (Feldnamen/Spaltennamen) nicht optional sind. Wenn bei einem Strukturtyp eine Komponente angegeben wird, müssen alle anderen Komponenten dieser Struktur ebenfalls definiert werden, gegebenenfalls mit leerem Wert oder dem Default 0 bei numerischen Typen. Bei Tabellen stellt jede Zeile einen Strukturwert dar. Demzufolge müssen auch dort alle Komponenten einer Zeile definiert sein. Bei Tabellen ist weiterhin zu beachten, dass die Zeilennummern lückenlos sein müssen, um einen vorfristigen Abbruch der Parameterliste zu vermeiden.
Falls die Parametermap c mit der Funktion fill-map-from-fields( map a, prefix b, index c, hidden d ) gefüllt wird, müssen in der Zielstruktur des Profils bei Strukturen und bei Tabellen alle Komponenten als Zielfeld definiert sein. Um auch das Einfügen leerer Felder zu erzwingen, muss dort zusätzlich mit der Processing Anweisung val:addempty gearbeitet werden, wie es in der Dokumentation dieser Funktion beschrieben ist.
Nach dem RFC-Aufruf werden im Ergebnis Felder, Strukturen und Tabellen in der gleichen Weise zurückgegeben, wie dies beim Aufruf des RFCs über den zeitgesteuerten Eingangsagenten des Typs SAP geschieht, wenn dort als Format FixRecord ausgewählt wurde. Ein Beispiel ist am Ende dieses Dokuments.
Ausgabefilterung durch Parameter e
Um nur einzelne Felder oder komplette Zeilen einer Tabelle in das Ergebnis aufzunehmen, reicht die Angabe des Feld- bzw. Tabellennamens, z. B. QUERY_TABLE,DATA als Parameter e. Will man nur einen Teil des jeweiligen Wertes, ist es möglich, Teiltextbereiche anzugeben, die für die Zusammensetzung der Ergebniszeile verwendet werden sollen. Diese sind im Format Name[Indexdefinition] oder Name[Indexdefinition} anzugeben, wobei der Zeilenanfang mit Index 1 repräsentiert wird. Geschweifte Klammer am Ende bewirkt ein Entfernen von nachfolgenden Leerzeichen nach dem Durchführen der Teiltextermittlung. Eine Indexdefinition folgt dem Format [vonIndex] oder [vonIndex+länge] oder [vonIndex-bisIndex]. Der bisIndex gilt exklusive, wird er weggelassen, wird das Ende der Zeile genommen. Mehrere Indexdefinitionen können mittels Slash / zusammengesetzt werden.
Im Folgenden seien Varianten von Angaben aufgezeigt. Alle beziehen sich auf eine beispielhafte Zeile (Leerzeichen wurden durch Unterstriche ersetzt).
DATA__________________________Val1______Val2___Val3________Val4____ |
Ausgabefilterangabe |
Bedeutung |
Ergebnis |
DATA |
Jede Zeile komplett. |
Wie oben. |
DATA[1] |
Jede Zeile komplett. |
Wie oben. |
DATA[1} |
Jede Zeile komplett ohne nachfolgende Leerzeichen. |
DATA__[...]__Val4 |
DATA[31] |
Jede Zeile ab Index 31. |
Val1__[...]__Val4____ |
DATA[1-2/31-41/48-60} |
Das erste Zeichen, Feld1, Feld3 ohne nachfolgende Leerzeichen. |
DVal1______Val3 |
DATA[1+2/31-41/48-60} |
Die ersten beiden Zeichen, Feld1, Feld3 ohne nachfolgende Leerzeichen. |
DAVal1______Val3 |
Falls eine Liste in f angegeben wurde, wird das Ergebnis des erfolgreichen Funktionsaufrufs in gleicher Weise und Reihenfolge in dieser Named List gespeichert, sowie als Rückgabewert der Funktion geliefert. Im Rückgabewert sind die einzelnen Datensätze durch eine Zeilenschaltung getrennt, während in der Named List jeder Ergebnis-Datensatz ein einzelner List-Eintrag ist.
ABAP-Exceptions
Wenn der RFC mit einer ABAP-Exception endet, wird normalerweise der Profiljob mit Fehler beendet. Dieses Verhalten kann geändert werden, indem man im Parameter e explizit das Segment EXCEPTION angibt. Dann wird die ABAP-Exception als Segment ausgegeben und kann im Mapping ausgewertet werden. Exceptions aus dem JCo, die nicht vom Typ AbapException sind, können nicht abgefangen werden, sondern beenden den Job.
Format SAPXML
Wenn eine der Filter-Regeln in Parameter e entweder :SAPXML: oder :sapxml: lautet, wird die gesamte Response des RFCs im Format SAPXML zurück gegeben. Alle weiteren Filterregeln außer EXCEPTION werden dann ignoriert.
Dieses XML kann wahlweise in einer einzigen Zeile geliefert werden, wenn :sapxml: (in Kleinbuchstaben) verwendet wird, oder mehrzeilig (formatiert), wenn :SAPXML: (in Großbuchstaben) verwendet wird.
Beide Optionen können zusammen mit Parameter f genutzt werden. Bei einzeiliger XML-Rückgabe enthält die Liste das gesamte XML in einem Element. Bei mehrzeiliger XML-Rückgabe wird die Liste pro Zeile ein Element enthalten.
Beispiel
Der Aufruf der Funktion soll am Beispiel RFC_READ_TABLE gezeigt werden.
Das in diesem Beispiel verwendete Profil kann hier heruntergeladen werden: Package-SAP RFC Call Example RFC_READ_TABLE.pak
RFC_READ_TABLE
Input Parameters
Parameters: INPUT |
|||||
Index: |
1 |
2 |
3 |
4 |
5 |
Name: |
DELIMITER |
NO_DATA |
QUERY_TABLE |
ROWCOUNT |
ROWSKIPS |
Type: |
CHAR |
CHAR |
CHAR |
INT |
INT |
Size: |
1 |
1 |
30 |
4 |
4 |
Offset: |
0 |
1 |
2 |
32 |
36 |
Decimals: |
0 |
0 |
0 |
0 |
0 |
Default: |
SPACE |
SPACE |
|
0 |
0 |
Value: |
|
|
" " |
|
|
Output Parameters
None.
Table Parameters
Parameters: TABLES
Index: |
1 |
2 |
3 |
Name: |
DATA |
FIELDS |
OPTIONS |
Type: |
TABLE |
TABLE |
TABLE |
Size: |
4 |
6 |
7 |
Offset: |
0 |
4 |
10 |
Decimals: |
0 |
0 |
0 |
Value: |
TAB512 |
RFC_DB_FLD |
RFC_DB_OPT |
Table: DATA (TAB512) No. of Rows: 0 Row-length: 512 (chars) 512 (bytes)
Index: |
1 |
Name: |
WA |
Type: |
CHAR |
Size: |
512 |
Offset: |
0 |
Decimals: |
0 |
Table: FIELDS (RFC_DB_FLD) No. of Rows: 0 Row-length: 103 (chars) 103 (bytes)
Index: |
1 |
2 |
3 |
4 |
5 |
Name: |
FIELDNAME |
OFFSET |
LENGTH |
TYPE |
FIELDTEXT |
Type: |
CHAR |
NUM |
NUM |
CHAR |
CHAR |
Size: |
30 |
6 |
6 |
1 |
60 |
Offset: |
0 |
30 |
36 |
42 |
43 |
Decimals: |
0 |
0 |
0 |
0 |
0 |
Table: OPTIONS (RFC_DB_OPT) No. of Rows: 0 Row-length: 72 (chars) 72 (bytes)
Index: |
1 |
Name: |
TEXT |
Type: |
CHAR |
Size: |
72 |
Offset: |
0 |
Decimals: |
0 |
Aus der Beschreibung des Funktionsbaustein ergeben sich die folgenden zu füllenden Parameter.
Parametername |
Typ |
Bedeutung |
Feldnamen innerhalb des Parameters |
DELIMITER |
Feld Char(1) |
Das zwischen den Spalten in der Antwortzeile zu verwendende Trennzeichen. |
n.a. |
NO_DATA |
Feld Char(1) |
x, wenn keine Daten, sondern nur Feldinformationen gewünscht sind. |
n.a. |
QUERY_TABLE |
Feld Char(30) |
Name der auszulesenden Datenbank-Tabelle. |
n.a. |
ROWCOUNT |
Feld Integer |
Anzahl der zu lesenden Zeilen. |
n.a. |
ROWSKIPS |
Feld Integer |
Zu überspringende Zeilen bevor ROWCOUNT Zeilen gelesen werden. |
n.a. |
DATA |
Tabelle(OUT) |
Enthält nach erfolgreichem Aufruf die ausgelesenen Zeilen. |
WA Char(512) |
FIELDS |
Tabelle(INOUT) |
Informationen über die Spalten der ausgelesenen Tabelle bzw. beim Request die Spalten, die beim Ergebnis ausgegeben werden sollen. |
FIELDNAME Char(30) OFFSET Numeric(6) LENGTH Numeric(6) TYPE Char(1) FIELDTEXT Char(60) |
OPTIONS |
Tabelle(IN) |
Text, der dem intern gebildeten SQL-Statement als WHERE-Bedingung hinzugefügt wird. |
TEXT Char(72) |
Für die Vorbereitung und Durchführung des RFC-Calls kann eine Zielstruktur beispielsweise wie im Folgenden gezeigt aufgebaut sein.
Grundsätzlich kann der Knoten CallSapRfc in zwei Hauptbereiche unterteilt werden.
Erzeugen der Map, die alle Parameterwerte enthält. Da im vorliegenden Beispiel keine Strukturen als Parameter erwartet werden, beschränkt sich dies hier auf das Füllen der Eingangsfelder (über fill_INPUT_PARAMS) und Tabellen (über fill_TABLE_PARAMS).
Ausführen des RFC-Aufrufs über den Knoten CALL, in dem sich ein zusätzliches Feld dumpParamsKeys befindet, das zum Zwecke des Debuggings die in der Map enthaltenen Schlüssel und Werte ausgibt und z. B. im Mappingtest angezeigt werden.
Füllen der Parametertabelle
Die Felder in den jeweiligen Knoten sind genauso benannt wie die Feldnamen in den jeweiligen Parameterelementen (hier Felder und Tabellen, alles was nach einem # im Namen folgt, wird ignoriert).
Ziel in diesem Beispiel ist die Menge der gelesenen Felder auf eine Teilmenge der möglichen zu reduzieren. Dies wird über eine Liste realisiert, die im Feld prepareFieldSelection vorbereitet wird.
1) save variable a(b) type-safe
a constant: VAR_FIELD_SELECTION
b constant: MANDT,CARRID,CONNID,FLDATE,PRICE,CURRENCY,PLANETYPE
2) add to list(a,b,c)
a result: 1
b constant: fieldList
c constant: ,
3) count values in list(name of list a)
a constant: fieldList
4) save variable a(b) type-safe
a constant: VAR_SIZE
b result: 3
Pro Durchlauf des Knotens fill_FIELDS wird dann das jeweils erste Element aus oben genannter Liste entfernt.
1) remove from list(position a, name of list b)
a constant: 1
b constant: fieldList
Im folgenden seien die Funktionen der einzelnen fill-Felder gezeigt.
In Feld fill_INPUT:
1) fill-map-from-fields( map a, prefix b, index c, hidden d )
a constant: inMap
b constant:
c constant:
d constant: false
In Feld fill_option_table:
1) fill-map-from-fields( map a, prefix b, index c, hidden d )
a constant: inMap
b constant: OPTIONS[#]
c constant: 1
d constant: true
In Feld fill_fields_table:
1) calculate and save variable(a,b,c,d,[e])
a constant: VAR_COUNTER
b constant: +
c constant: 1
d constant: true
2) fill-map-from-fields( map a, prefix b, index c, hidden d )
a constant: inMap
b constant: FIELDS[#]
c variable: VAR_COUNTER
d constant: true
dumpParamsKeys dient nur dem Zweck, die Parameter-Schlüssel und Werte im Log des Mappingtests auszugeben. Damit das im produktiven Lauf nicht geschieht, wird die System-Variable VAR_IS_TEST abgeprüft.
1) dump map (a,b)
a constant: inMap
b variable: VAR_IS_TEST
Das Feld callRFC enthält den eigentliche Funktion für den Aufruf des RFCs.
1) call-sap-rfc( alias a,rfc b,[inMap c],[timeout d],[filter e],[outList f],[debug g])
a constant: testsap
b constant: RFC_READ_TABLE
c constant: inMap
d constant: 8
e constant: DATA[1}
f constant: outList
g constant: true
RFC-Aufruf
Beim Starten des Tests erscheint als Ergebnis der Funktionen in dumpParamKeys in diesem Fall folgende Meldung.
[...]
[M:] Dump of map inMap:
'FIELDS[6]-LENGTH'='0'
'FIELDS[5]-FIELDTEXT'=' '
'FIELDS[3]-LENGTH'='0'
'FIELDS[7]-OFFSET'='0'
'FIELDS[1]-OFFSET'='0'
'FIELDS[1]-FIELDNAME'='MANDT'
'FIELDS[4]-LENGTH'='0'
'FIELDS[4]-FIELDNAME'='FLDATE'
'FIELDS[7]-TYPE'=' '
'QUERY_TABLE'='SFLIGHT'
'FIELDS[6]-FIELDTEXT'=' '
'FIELDS[1]-TYPE'=' '
'FIELDS[6]-TYPE'=' '
'FIELDS[7]-FIELDTEXT'=' '
'FIELDS[2]-FIELDTEXT'=' '
'FIELDS[2]-LENGTH'='0'
'OPTIONS[1]-TEXT'='CARRID = 'LH''
[...]
'FIELDS[2]-OFFSET'='0'
'FIELDS[5]-OFFSET'='0'
'FIELDS[5]-LENGTH'='0'
'FIELDS[1]-LENGTH'='0'
'FIELDS[3]-FIELDNAME'='CONNID'
'FIELDS[2]-TYPE'=' '
'ROWCOUNT'='@VAR_ROWCOUNT@'
'FIELDS[4]-OFFSET'='0'
[...]
Aus technischen Gründen ist die Reihenfolge der Schlüssel-Wert-Paare nicht sortiert.
Der Aufruf der Funktion call-sap-rfc liefert folgende Ausgaben.
15:07:52.768 [M:] Calling SAP by RFC 'RFC_READ_TABLE'
15:07:52.893 [M:] rfc debug info: .\debug\sap\1319029672768_debug_RfcIn.xml
15:07:52.940 [M:] rfc debug info: .\debug\sap\1319029672768_debug_RfcOut.xml
15:07:52.940 [M:] Returning from SAP RFC 'RFC_READ_TABLE' after 172 ms
15:07:52.940 [M:field=callRFC] Executed function [Pos=1]call-sap-rfc( alias a,rfc b,[inMap c],[timeout d],[filter e],[outList f],
[debug g]), result='
DATA 000LH 040020011222 666.00 EUR A310-300
DATA 000LH 040020020119 666.00 EUR A310-300
DATA 000LH 040020020216 666.00 EUR A310-300
DATA 000LH 040020020316 666.00 EUR A310-300
DATA 000LH 040020020413 666.00 EUR A310-300
Da Parameter g fix auf true gestellt ist, werden Debug-Trace-Dateien angelegt, deren entsprechende Dateinamen angezeigt werden. Da eine Ausgabeliste angegeben ist, in der die Werte der Ausgabetabelle DATA geschrieben werden, kann der Rückgabewert der Funktion selbst - eine Fixedrecordausgabe der DATA-Tabelle getrost ignoriert bzw. für die Fehlersuche genutzt werden.
Ergebnisauswertung
Im vorliegenden Beispiel wurden die Werte aus der Ergebnistabelle DATA in die Liste outList geschrieben. Jedes Element in der Liste entspricht hierbei einer Zeile der Tabelle DATA. Die Werte der einzelnen Felder müssen hierbei selbst aus dem Text "extrahiert" werden.
Im Beispielprofil erfolgt dies im Knoten OUTPUT.
Damit der Knoten OUTPUT so oft betreten wird, wie es Einträge in der Liste gibt, wird im Feld readSize die Anzahl in eine Integer-Variable geschrieben und diese als Pfad im Knoten OUTPUT verwendet. Das Berechnungsfeld item entfernt immer den ersten Eintrag in der Liste outList mit der Funktion remove from list an Position 1, alle nachfolgenden Felder verwenden diesen Wert dann immer mittels "Zielwert: item". Wird unter Nutzung von Parameter e mehr als ein Feld oder eine Tabelle angegeben, die in die Antwort gepackt werden soll, muss zwischen den einzelnen Ergebniszeilen unterschieden werden. Daher ist - auch wenn dies im konkreten Beispiel nicht notwendig ist - eine Funktion auf den Knoten OUTPUT gelegt.
1) starts-with( a, b )
a destination: item
b constant: DATA
Ist die Bedingung erfüllt, wird der Knoten betreten und die Zeile im Berechnungsfeld data_item um 30 Zeichen von links gekürzt, um die eigentlichen Datenfelder ab Index 1 zu erreichen.
Alle nachfolgenden Felder holen sich erst den für sie relevanten Teilstring mittels substring( a, start [,length] ) und fahren dann unter Umständen mit weiteren Funktionen mit der Konvertierung der Daten fort, wie exemplarisch am Feld FLDATE gezeigt werden soll.
1) substring( a, start [,length] )
a destination: data_item
b constant: 11
c constant: 8
2) create date(a, [adj. template b], template c, d [, force-empty e])
a result: 1
b constant: yyyyMMdd
c constant: dd.MM.yyyy
d constant: empty
e constant:
Ein beispielhaftes Ergebnis eines OUTPUT-Knotens kann wie folgt aussehen.