Mapping und Transformationen
Für jede Operation muss ein Mapping definiert werden. Dabei gibt es zwei Möglichkeiten, ein Mapping anzugeben:
Das mapping Request Schema ist hier unter operations → mapping zu finden.
-
SingleMappingDto: Hierbei wird ein sourceField auf ein targetField abgebildet. Der Wert aus dem sourceField kann optional über die Eigenschaft transform transformiert werden, bevor er dem targetField zugewiesen wird. Das
mappingkann in diesem Fall eine Liste von SingleMappingDto-Objekten oder ein einzelnes SingleMappingDto-Objekt sein. -
GroupMappingDto: In diesem Fall werden Einträge anhand der in groupByFields angegebenen Felder gruppiert. Über die Eigenschaft keyInGroupResult eines groupByFields-Eintrags kann gesteuert werden, ob und wie das Feld in die Ausgabe übernommen wird:
- Wenn true, wird das Feld mit seinem Originalnamen in den Ausgabedatensatz aufgenommen.
- Wenn ein String angegeben wird, wird das Feld unter diesem Namen in die Ausgabe übernommen.
Im groupByFields kann zusätzlich über die Eigenschaft transform eine oder mehrere Transformationen definiert werden, die auf den Feldwert angewendet werden, bevor dieser für die Gruppierung verwendet wird.
Die gruppierten Einträge werden anschließend unter dem Feld itemsTargetField in der Ausgabe zusammengeführt. Die Mappings für die einzelnen gruppierten Elemente werden in itemsMapping definiert.
Wird ein GroupMappingDto verwendet, darf das mapping ausschließlich genau ein GroupMappingDto-Objekt enthalten.
TransformObject und Transformer
Die Mappings nutzen Transformationen der Daten. Beispiele dafür finden Sie hier, welche Sie anschließend in den jeweiligen SingleMappingDto oder GroupMappingDto verwenden können.
Beispiele
Beispiel 1
{
"transform": {
"transformerType": "trim",
"trim": true
}
}
Beispiel 2
{
"transform": [
{
"transformerType": "substring",
"start": 6,
"end": -2
},
{
"transformerType": "parseFloat",
"parseFloat": true
},
{
"transformerType": "formatDate",
"targetFormat": "YYYY-MM-DD"
}
]
}
Beispiel 3
{
"transform": {
"transformerType": "replace",
"isRegExp": true,
"searchValue": "[A-Za-z]+",
"replaceValue": ""
}
}
Beschreibung
transform TransformObject oder Array von TransformObject, optional, default: undefined
- Transformations Optionen die nach dem holen der Daten und vor dem senden der Daten ausgeführt werden. Wenn ein Array von Transformations Optionen übergeben wird, dann werden diesen nacheinander vom ersten bis zum letzten Element verarbeitet. Dabei ist die Ausgabe einer Transformations Option die Eingabe der nächsten Transformations Option.
Beschreibung TransformObject
- Beschreibt die auszuführende Transformation.
transformerType string
- Gibt die Aktion der Transformation an.
Beschreibung TrimTransformer
- Entfernt Leerzeichen am Anfang und Ende des Strings.
transformerType = "trim"
- Gibt die Aktion der Transformation an.
Beschreibung TakeTransformer
- Nimmt die ersten in
takeangegebenen Zeichen des Strings.
transformerType = "take"
- Gibt die Aktion der Transformation an.
take number
- Gibt an wie viele Zeichen vom Anfang genommen werden.
Beschreibung SubstringTransformer
- Extrahiert einen Substring aus dem String.
transformerType = "substring"
- Gibt die Aktion der Transformation an.
start number
- Startindex des Substrings; negative Werte zählen vom Ende des Strings.
end number, optional, default: Länge des inputs
- Endindex des Substrings (nicht inklusive); negative Werte zählen vom Ende des Strings.
Beschreibung ReplaceTransformer
- Ersetzt alle Vorkommen eines Strings durch einen anderen.
transformerType = "replace"
- Gibt die Aktion der Transformation an.
searchValue string
- Suchwert, der ersetzt werden soll.
- Wird als reguläre Expression (RegExp) interpretiert, wenn
isRegExpauftruegesetzt ist. - Aufgrund von Encoding-Problemen kann momentan kein
\in der RegExp verwendet werden.
replaceValue string
- Ersetzungswert.
isRegExp boolean, optional, default: false
- Wenn
true, wirdsearchValueals reguläre Expression behandelt, andernfalls als normaler String.
Beschreibung RoundTransformer
- Rundet eine Zahl auf in
roundangegebenen Nachkommastellen.
transformerType = "round"
- Gibt die Aktion der Transformation an.
round number
- Gibt die Anzahl der Nachkommastellen an, auf die die Zahl gerundet wird.
Beschreibung FormatDateTransformer
- Formatiert ein Datum, das als String, Number oder Date übergeben wird.
transformerType = "formatDate"
- Gibt die Aktion der Transformation an.
format string, optional, default: "YYYY-MM-DD"
- Format des Datums des Inputs.
- Ist das Feld leer, wird versucht, das Datum im Format "YYYY-MM-DD" einzulesen.
- Im hintergrund wird day.js verwendet und daher können alle in day.js verwendeten Input Formate verwendet werden. (Siehe auch)
targetFormat string, optional, default: "YYYY-MM-DDTHH:mm:ssZ[Z]"
- Ziel-Format des Datums, ist das Feld leer, wird das Datum im ISO8601-Format zurückgegeben.
- Im hintergrund wird day.js verwendet und daher können alle in day.js verwendeten Output Formate verwendet werden. (Siehe auch)
Beschreibung ParseFloatTransformer
- Konvertiert einen String in eine Fließkommazahl.
transformerType = "parseFloat"
- Gibt die Aktion der Transformation an.
Beschreibung ParseFloatToStringTransformer
- Konvertiert eine Zahl in einen String.
transformerType = "parseFloatToString"
- Gibt die Aktion der Transformation an.
Beschreibung ParseBooleanTransformer
- Konvertiert einen String oder eine Zahl in einen Boolean.
- Bei einem String wird
"true"zutrue, alle anderen Strings zufalse. - Bei einer Zahl wird
1zutrue, alle anderen Zahlen zufalse. - Bei anderen Datentypen bleibt der Wert unverändert.
transformerType = "parseBoolean"
- Gibt die Aktion der Transformation an.
SingleMappingDto
Das SingleMappingDto Request Schema ist hier unter operations → mapping → SingleMappingDto zu finden.
Beispiele
Beispiel 1
{
"sourceField": "CostCenter._CostCenter.name",
"targetField": "cost_center_id",
"transform": {
"transformerType": "trim",
"trim": true
}
}
Beispiel 2
{
"sourceField": "CostCenter._CostCenter.creationDate",
"targetField": "cost_center_creation_date",
"isUpdateKey": false,
"transform": [
{
"transformerType": "substring",
"start": 6,
"end": -2
},
{
"transformerType": "parseFloat",
"parseFloat": true
},
{
"transformerType": "formatDate",
"targetFormat": "YYYY-MM-DD"
}
]
}
Beispiel 3
{
"sourceField": "CostCenter._CostCenter.name",
"targetField": "cost_center_id",
"isUpdateKey": true,
"transform": {
"transformerType": "replace",
"isRegExp": true,
"searchValue": "[A-Za-z]+",
"replaceValue": ""
}
}
Beschreibung
sourceField string
- Pfad zum Feld in den Quelldaten, der auch auf verschachtelte Objekte und Arrays zugreifen kann.
Beispiel:"user.address.city"greift auf dascity-Feld imaddress-Objekt desuser-Objekts zu.
targetField string
- Pfad zum Feld in den Zieldaten, der auch auf verschachtelte Objekte und Arrays zugreifen kann.
Beispiel:"order.items[0].quantity"greift auf das erste Element imitems-Array und dessenquantity-Feld zu.
isUpdateKey boolean, optional, default: false
- Kennzeichnet, ob das jeweilige Mapping-Feld als Identifikationsschlüssel für Datenupdates dient. Wird
isUpdateKeyauftruegesetzt, so werden beim Aktualisieren der Datenbank alle Felder, die als UpdateKeys markiert sind, in die WHERE-Klausel der Update-Abfrage einbezogen. Die Bedingung stellt sicher, dass die Werte dieser Felder aus den SAP-Daten exakt mit den entsprechenden Werten in der Datenbank übereinstimmen, wodurch die Eindeutigkeit des zu aktualisierenden Datensatzes gewährleistet wird. Beispiel: Bei einem Mapping-Eintrag mitsourceField: "Kundennummer",targetField: "customer_id"undisUpdateKey: truewird sichergestellt, dass beim Update in der Datenbank nur der Datensatz geändert wird, dessencustomer_idexakt dem Wert derKundennummeraus den SAP-Daten entspricht. - Hinweis: Diese Option wird nur berücksichtigt, wenn ein Update von SAP in die Datenbank erfolgt. Konkret gilt: Wenn in der Konfiguration im entsprechenden Objekt des
operations-Arrays, in dem dieses Mapping definiert ist, diedirectionauf den WertSAP_TO_DBund in der Konfiguration in derdatabaseConnectiondie Optionclearauffalsegesetzt ist.
GroupMappingDto
Das GroupMappingDto Request Schema ist hier unter operations → mapping → GroupMappingDto zu finden.
Beispiele
Beispiel 1
- groupByFields: Die Daten werden anhand des Werts im Feld id (
key) gruppiert und im Ausgabedatensatz unter dem Feldnamen ID (keyInGroupResult) übernommen. - itemsTargetField: Die gruppierten Einträge werden im Ausgabedatensatz als Array im Feld items abgelegt.
- itemsMapping: Das Feld itemId aus den Eingabedaten (
sourceField) wird in den einzelnen Items des Arrays im Ausgabedatensatz unter id (targetField) gespeichert.
Input
[
{ "id": 0, "itemId": 0 },
{ "id": 0, "itemId": 1 },
{ "id": 0, "itemId": 2 },
{ "id": 1, "itemId": 0 },
{ "id": 1, "itemId": 1 },
{ "id": 1, "itemId": 2 },
{ "id": 2, "itemId": 0 },
{ "id": 2, "itemId": 1 },
{ "id": 2, "itemId": 2 }
]
Mapping
{
"groupByFields": { "key": "id", "keyInGroupResult": "ID" },
"itemsTargetField": "items",
"itemsMapping": { "sourceField": "itemId", "targetField": "id" }
}
Output
[
{
"ID": 0,
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": 1,
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": 2,
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
}
]
Beispiel 2
- groupByFields: Die Daten werden anhand des Werts im Feld id gruppiert und im Ausgabedatensatz unter dem Feldnamen ID (
keyInGroupResult) übernommen. Die zugehörigen Werte werden dabei in einen String konvertiert (transform) auf dessen Basis auch die Gruppierung stattfindet. - itemsTargetField: Die gruppierten Einträge werden im Ausgabedatensatz als Array im Feld items abgelegt.
- itemsMapping: Das Feld itemId aus den Eingabedaten (
sourceField) wird in den einzelnen Items des Arrays im Ausgabedatensatz unter id (targetField) gespeichert.
Input
[
{ "id": 0, "itemId": 0 },
{ "id": 0, "itemId": 1 },
{ "id": 0, "itemId": 2 },
{ "id": 1, "itemId": 0 },
{ "id": 1, "itemId": 1 },
{ "id": 1, "itemId": 2 },
{ "id": 2, "itemId": 0 },
{ "id": 2, "itemId": 1 },
{ "id": 2, "itemId": 2 }
]
Mapping
{
"groupByFields": {
"key": "id",
"keyInGroupResult": "ID",
"transform": { "transformerType": "parseFloatToString" }
},
"itemsTargetField": "items",
"itemsMapping": { "sourceField": "itemId", "targetField": "id" }
}
Output
[
{
"ID": "0",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": "1",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": "2",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
}
]
Beispiel 3
- groupByFields: Die Daten werden anhand des Werts im Feld id gruppiert und im Ausgabedatensatz unter dem Feldnamen ID (
keyInGroupResult) übernommen. Dabei wird vor der Gruppierung eine Substring-Transformation angewendet, um nur das erste Zeichen der id zu berücksichtigen. - itemsTargetField: Die gruppierten Einträge werden im Ausgabedatensatz als Array im Feld items abgelegt.
- itemsMapping: Das Feld itemId aus den Eingabedaten (
sourceField) wird in den einzelnen Items des Arrays im Ausgabedatensatz unter id (targetField) gespeichert.
Input
[
{ "id": "01", "itemId": 0 },
{ "id": "02", "itemId": 1 },
{ "id": "03", "itemId": 2 },
{ "id": "11", "itemId": 0 },
{ "id": "12", "itemId": 1 },
{ "id": "13", "itemId": 2 },
{ "id": "21", "itemId": 0 },
{ "id": "22", "itemId": 1 },
{ "id": "23", "itemId": 2 }
]
Mapping
{
"groupByFields": {
"key": "id",
"keyInGroupResult": "ID",
"transform": { "transformerType": "substring", "start": 0, "end": 1 },
},
"itemsTargetField": "items",
"itemsMapping": [{ "sourceField": "itemId", "targetField": "id" }]
}
Output
[
{
"ID": "0",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": "1",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
},
{
"ID": "2",
"items": [{ "id": 0 }, { "id": 1 }, { "id": 2 }]
}
]
Beispiel 4
- groupByFields: Die Daten werden anhand des Werts im Feld id und subId gruppiert und im Ausgabedatensatz unter dem Feldnamen ID (
keyInGroupResult) übernommen. Die zugehörigen Werte werden dabei in einen String konvertiert (transform) auf dessen Basis auch die Gruppierung stattfindet. Das Feld subId wird dabei nicht in den Ausgabedatensatz übernommen. - itemsTargetField: Die gruppierten Einträge werden im Ausgabedatensatz als Array im Feld items abgelegt.
- itemsMapping: Das Feld itemId aus den Eingabedaten (
sourceField) wird in den einzelnen Items des Arrays im Ausgabedatensatz unter id (targetField) gespeichert.
Input
[
{ "id": 0, "subId": 1, "itemId": 0 },
{ "id": 0, "subId": 1, "itemId": 1 },
{ "id": 0, "subId": 2, "itemId": 0 },
{ "id": 0, "subId": 2, "itemId": 1 },
{ "id": 1, "subId": 1, "itemId": 0 },
{ "id": 1, "subId": 1, "itemId": 1 },
{ "id": 1, "subId": 2, "itemId": 0 },
{ "id": 1, "subId": 2, "itemId": 1 }
]
Mapping
{
"groupByFields": [{ "key": "id", "keyInGroupResult": "ID" }, "subId"],
"itemsTargetField": "items",
"itemsMapping": [{ "sourceField": "itemId", "targetField": "id" }]
}
Output
[
{
"ID": 0,
"items": [{ "id": 0 }, { "id": 1 }]
},
{
"ID": 0,
"items": [{ "id": 2 }, { "id": 3 }]
},
{
"ID": 1,
"items": [{ "id": 0 }, { "id": 1 }]
},
{
"ID": 1,
"items": [{ "id": 2 }, { "id": 3 }]
}
]
Beschreibung
GroupMappingDto
groupByFields string | GroupByField | (string | GroupByField)[]
- Gibt an, nach welchen Feldern die Eingabedaten gruppiert werden.
- Einfache Gruppierung erfolgt über einen Feldnamen (z. B.
"id"). - Mit einem
GroupByFieldkönnen über dietransform-Eigenschaft Transformationen auf den Gruppierungswert angewendet werden. - Mehrfach-Gruppierung ist per Array aus Strings und/oder
GroupByFieldmöglich.
itemsTargetField string
- Gibt den Feldnamen im Ausgabedatensatz an, unter dem die gruppierten Items als Array abgelegt werden.
itemsMapping SingleMappingDto | SingleMappingDto[] | GroupMappingDto
- Beschreibt, wie die Felder der gruppierten Items in die Zieldaten übertragen werden.
GroupByField
key string
- Pfad zum Feld in den Quelldaten, das als Gruppierungskriterium dient.
keyInGroupResult string | boolean, optional, default: false
Bestimmt, ob und unter welchem Schlüssel ein Wert aus den Quelldaten in den Ausgabedatensatz übernommen wird.
string: Der Wert unterkeywird aus den Quelldaten gelesen und im Ausgabedatensatz unter dem angegebenenstring-Schlüssel gespeichert.true: Der Wert unterkeywird aus den Quelldaten gelesen und im Ausgabedatensatz unter dem gleichen Schlüssel (key) gespeichert.falseoder nicht definiert: Der Wert unterkeywird nicht in den Ausgabedatensatz übernommen.
transform object oder Array von Objekten, optional, default: undefined
- Transformation(en), die auf den Wert angewendet werden, bevor er für die Gruppierung verwendet wird (siehe Beschreibung
transformunterSingleMappingDto).
Die Verwendung von GroupMappingDto ist nur dann sinnvoll, wenn Daten aus der Datenbank zu SAP übertragen werden sollen und SAP eine verschachtelte Datenstruktur erwartet. Die Datenbank hingegen erwartet stets ein Array von Key‑Value‑Objekten in flacher Struktur.
Um verschachtelte SAP‑Daten in das flache Datenbankformat zu transformieren, kann einfach das Feld sourceField des Typs SingleMappingDto genutzt werden. Dort lässt sich ein Pfad angeben, um direkt auf beliebige verschachtelte Felder zuzugreifen.