Inhaltselemente
Sobald Sie einen Inhaltstyp definiert haben, können Sie Elemente dieses Typs hinzufügen - die sogenannten Inhaltselemente.
1. Abfrage von Inhaltselementen
Ruft alle Inhaltselemente ab, unabhängig von ihrem Typ.
Beispiel:
GET https://dev.iclportal.com/api/content?$inlinecount=allpages&$top=20 HTTP1.1
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Die Antwort ist ein JSON-Array mit Inhaltselementen:
{
"result": {
"__count": 2932,
"results": [
{
"bezeichnung": "Wien, Hansonstrasse 23",
"adresse": "Hansonstrasse 23",
"ort": "Wien",
"nummer": "GB-00012",
"plz": "1100",
"contentItemId": "18c7a93c-0865-4922-af34-31d112e4d2ac",
"externalId": "OPTI-Q1",
"lastModificationTime": "2020-10-09T13:19:29.673Z",
"isDeleted": false,
"creatorUserId": null,
"creatorUser": null,
"lastModifierUserId": 2,
"lastModifierUser": "Antoine Gadget",
"title": "Wien, Hansonstrasse 23"
},
...
]
},
"targetUrl": null,
"success": true,
"error": null,
"unAuthorizedRequest": false,
"__abp": true
}
Sie können die API mit der OData v3 Abfragesyntax abfragen. Da dieser Endpunkt jedoch Elemente aller Typen liefert, können nur die allgemeinen Felder zum Filtern verwendet werden.
Diese sind: contentItemId
, title
, externalId
.
Alle benutzerdefinierten Felder, die vom Endpunkt zurückgegeben werden, können nicht zum Filtern verwendet werden.
Beispiel:
GET https://dev.iclportal.com/api/content?$filter=substringof('hansonstrasse',tolower(Title))&$inlinecount=allpages&$top=20 HTTP1.1
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Beachten Sie, dass die Eigenschaft Title
in der Abfragezeichenfolge in Großbuchstaben geschrieben wird. Dies ist eine Anforderung von OData v3.
Die Antwort ist ein JSON-Array mit Inhaltselementen:
{
"result": {
"__count": 1,
"results": [
{
"bezeichnung": "Wien, Hansonstrasse 23",
"adresse": "Hansonstrasse 23",
"ort": "Wien",
"nummer": "GB-00012",
"plz": "1100",
"contentItemId": "18c7a93c-0865-4922-af34-31d112e4d2ac",
"externalId": "OPTI-Q1",
"lastModificationTime": "2020-10-09T13:19:29.673Z",
"isDeleted": false,
"creatorUserId": null,
"creatorUser": null,
"lastModifierUserId": 2,
"lastModifierUser": "Antoine Gadget",
"title": "Wien, Hansonstrasse 23"
}
]
},
"targetUrl": null,
"success": true,
"error": null,
"unAuthorizedRequest": false,
"__abp": true
}
1. Abfrage von Inhaltselementen eines bestimmten Typs
Ruft alle Inhaltselemente eines bestimmten Typs ab.
Beispiel:
GET https://dev.iclportal.com/api/content/building?$inlinecount=allpages&$top=20 HTTP1.1
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Die Antwort ist ein JSON-Array mit Inhaltselementen:
{
"result": {
"__count": 2932,
"results": [
{
"bezeichnung": "Wien, Hansonstrasse 23",
"adresse": "Hansonstrasse 23",
"ort": "Wien",
"nummer": "GB-00012",
"plz": "1100",
"contentItemId": "18c7a93c-0865-4922-af34-31d112e4d2ac",
"externalId": "OPTI-Q1",
"lastModificationTime": "2020-10-09T13:19:29.673Z",
"isDeleted": false,
"creatorUserId": null,
"creatorUser": null,
"lastModifierUserId": 2,
"lastModifierUser": "Antoine Gadget",
"title": "Wien, Hansonstrasse 23"
},
...
]
},
"targetUrl": null,
"success": true,
"error": null,
"unAuthorizedRequest": false,
"__abp": true
}
Sie können die API mit der OData v3 Abfragesyntax abfragen.
Jedes benutzerdefinierte oder interne (title
, externalid
, contentItemId
) Feld kann verwendet werden.
Beispiel:
GET https://dev.iclportal.com/api/content/building?$filter=substringof('hansonstrasse',tolower(Adresse))&$inlinecount=allpages&$top=20 HTTP1.1
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Beachten Sie, dass die Eigenschaft Adresse
in der Abfragezeichenfolge in Großbuchstaben geschrieben wird, obwohl sie im Inhaltstyp kleingeschrieben definiert werden muss. Dies ist eine Anforderung von OData v3.
Die Antwort ist ein JSON-Array mit Inhaltselementen:
{
"result": {
"__count": 1,
"results": [
{
"bezeichnung": "Wien, Hansonstrasse 23",
"adresse": "Hansonstrasse 23",
"ort": "Wien",
"nummer": "GB-00012",
"plz": "1100",
"contentItemId": "18c7a93c-0865-4922-af34-31d112e4d2ac",
"externalId": "OPTI-Q1",
"lastModificationTime": "2020-10-09T13:19:29.673Z",
"isDeleted": false,
"creatorUserId": null,
"creatorUser": null,
"lastModifierUserId": 2,
"lastModifierUser": "Antoine Gadget",
"title": "Wien, Hansonstrasse 23"
}
]
},
"targetUrl": null,
"success": true,
"error": null,
"unAuthorizedRequest": false,
"__abp": true
}
Um die Abfrage zu erstellen, können Sie einfach die iCL Portal Datentabelle des jeweiligen Inhaltstyps verwenden und dort die Sortierungen und Filter angeben. Verwenden Sie dann die Entwicklungswerkzeuge Ihres Browsers, um die erstellte Abfrage auf der Registerkarte Netzwerk zu betrachten:
3. Erstellen eines Inhaltsartikels
Erzeugt einen neuen Inhaltsartikel. Beachten Sie, dass nur erforderliche Felder angegeben werden müssen.
Wenn Sie ein Element erstellen, das über ein Inhaltsfeld vom Typ ContentItem
auf ein anderes verweist (z.B. Sie erstellen ein Gebäude
, das zu einer Site
gehört), können Sie diese Site entweder über ihre contentItemId
oder externalId
angeben.
Beispiel
POST https://dev.iclportal.com/api/content/building
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
{
"externalId":"HG",
"buildingname":"HG10223",
"strasse":"Hansongasse 23",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien"
}
Die Antwort ist das vollständige JSON-Objekt - einschließlich aller internen Felder.
{
"buildingname":"HG10223",
"strasse":"Hansongasse 23",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien",
"contentItemId":"39d83715-b7d0-4a1e-88a7-bed24d5ab8a0",
"_id":"a8218840-e764-46b7-a289-9e52b65cff66",
"externalId":"HG",
"lastModificationTime":"2023-03-14T12:42:41.1951367Z",
"isDeleted":false,
"creatorUserId":2,
"creatorUser":"Antoine Gadget",
"lastModifierUserId":null,
"lastModifierUser":null
}
4. Abrufen eines Inhaltselements
Durch Angabe der internen _id
, contentItemId
oder externalId
können Sie ein Element abrufen.
Die folgenden Anfragen liefern alle das gleiche Ergebnis:
Beispiel: Verwendung der internen _id
Get https://dev.iclportal.com/api/content/building/a8218840-e764-46b7-a289-9e52b65cff66
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Beispiel: Verwendung der contentItemId
Get https://dev.iclportal.com/api/content/building/39d83715-b7d0-4a1e-88a7-bed24d5ab8a0
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Beispiel: Verwendung der externalId
Get https://dev.iclportal.com/api/content/building/HG
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Rückgabe:
{
"buildingname":"HG10223",
"strasse":"Hansongasse 23",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien",
"contentItemId":"39d83715-b7d0-4a1e-88a7-bed24d5ab8a0",
"_id":"a8218840-e764-46b7-a289-9e52b65cff66",
"externalId":"HG",
"lastModificationTime":"2023-03-14T12:42:41.1951367Z",
"isDeleted":false,
"creatorUserId":2,
"creatorUser":"Antoine Gadget",
"lastModifierUserId":null,
"lastModifierUser":null
}
5. Aktualisieren eines Inhaltselements
Aktualisiert ein bestehendes Inhaltselement.
Wenn Sie ein Element erstellen, das über ein Inhaltsfeld vom Typ ContentItem
auf ein anderes verweist (z.B. Sie erstellen ein Gebäude
, das zu einer Site
gehört), können Sie diese Site entweder über ihre contentItemId
oder externalId
angeben.
Sie können die interne _id
, contentItemId
oder externalId
verwenden, um ein Element zu identifizieren.
Diese Methode ist kein PATCH, sondern eine PUT Operation. Alle Attribute, die nicht in der Anfrage enthalten sind, werden aus dem Artikel gelöscht!
Beispiel - Verwendung von externalId
, aber Weglassen des Feldes strasse
PUT https://dev.iclportal.com/api/content/building/HG
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
{
"externalId":"HG",
"buildingname":"HG10223",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien"
}
Die Antwort ist das vollständige json-Objekt - einschließlich aller internen Felder.
Beachten Sie, dass das Feld strasse
in der Anfrage ausgelassen wurde und daher aus dem Objekt entfernt wird.
{
"buildingname":"HG10223",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien",
"contentItemId":"39d83715-b7d0-4a1e-88a7-bed24d5ab8a0",
"_id":"a8218840-e764-46b7-a289-9e52b65cff66",
"externalId":"HG",
"lastModificationTime":"2023-03-14T12:42:41.1951367Z",
"isDeleted":false,
"creatorUserId":2,
"creatorUser":"Antoine Gadget",
"lastModifierUserId":null,
"lastModifierUser":null
}
6. Löschen eines Inhaltselements
Löscht ein bestehendes Inhaltselement.
Sie können die interne _id
, contentItemId
oder externalId
verwenden, um ein Element zu identifizieren.
Inhaltselemente werden nie wirklich aus der Datenbank gelöscht, um Datenverluste zu vermeiden. Stattdessen wird ihre Spalte IsDeleted
auf true gesetzt und sie werden aus allen zukünftigen Anfragen herausgefiltert.
Beispiel - Verwendung von externalId
DELETE https://dev.iclportal.com/api/content/building/HG
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
Die Antwort wird leer sein und den entsprechenden Statuscode enthalten:
- 200 OK für Erfolg,
- 400 Fehlerhafte Anfrage, falls Sie etwas falsch gemacht haben
- 404 Nicht gefunden, falls das Objekt nicht existiert oder zuvor gelöscht wurde
7. Hinzufügen/Aktualisieren mehrerer Inhaltselemente auf einmal
Dieser Endpunkt ermöglicht es Ihnen, mehrere Inhaltselemente in einem Stapel hinzuzufügen oder zu aktualisieren.
Die Elemente werden durch ihre externalId
identifiziert. Wenn ein Element gefunden wird, wird es aktualisiert. Wenn nicht, wird ein neues Element erstellt.
Wenn ein vorhandenes Element gefunden wird, verhält sich die Aktualisierung wie eine PUT-Operation. Alle Attribute, die nicht in der Anfrage enthalten sind, werden aus dem Eintrag gelöscht!
Wenn ein Element Validierungsfehler aufweist, wird der gesamte Stapel zurückgesetzt.
Wenn ein Element ein anderes über ein Inhaltsfeld vom Typ ContentItem
referenziert (z.B. wenn Sie ein Gebäude
erstellen, das zu einer Site
gehört), können Sie diese Site entweder über ihre contentItemId
oder externalId
angeben.
Beispiel
PUT https://dev.iclportal.com/api/content/building/batch
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
[
{
"externalId":"HG",
"buildingname":"HG10223",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien"
},
{
"externalId":"LHS101",
"buildingname":"LANHS101",
"stiege":"10",
"strasse":"Landstraßer Hauptstraße",
"stock":1,
"topnr":"GO11",
"plz":"1030",
"ort":"Wien"
}
}
Die Antwort ist eine Zusammenfassung aller erfolgreichen oder fehlerhaften Hinzufügungen oder Aktualisierungen:
{
"errored": [
{
"externalId": "HG",
"error": "The field 'strasse' is required"
}
],
"succeeded": [
{
"externalId": "LHS101",
"id": "65942320-d1c4-420d-b768-b0ca1ca35fba" // die contentitemid des erstellten Elements
}
]
}
8. Hinzufügen/Aktualisieren mehrerer Inhaltselemente auf einmal - Fehler ignorieren
Dieser Endpunkt ermöglicht es Ihnen, mehrere Inhaltselemente in einem Stapel hinzuzufügen oder zu aktualisieren.
Die Elemente werden durch ihre externalId
identifiziert. Falls ein Element gefunden wird, wird es aktualisiert. Wenn nicht, wird ein neues Element erstellt.
Wenn ein vorhandenes Element gefunden wird, verhält sich die Aktualisierung wie eine PUT-Operation. Alle Attribute, die nicht in der Anfrage enthalten sind, werden aus dem Eintrag gelöscht!
Im Falle eines Fehlers wird die Operation fortgesetzt. Alle gültigen Einträge werden gespeichert. Es findet kein Rollback statt.
Dieser Endpunkt ist für Integrationsszenarien mit Tools wie SSIS oder Azure Data Factory gedacht. Im Falle eines Fehlers können Sie diesen z.B. per E-Mail an den Benutzer im Quellsystem zurücksenden, sodass er die Probleme mit den fehlgeschlagenen Elementen beheben kann
Wenn ein Element über ein Inhaltsfeld vom Typ ContentItem
auf ein anderes verweist (z.B. wenn Sie ein Gebäude
erstellen, das zu einer Site
gehört), können Sie diese Site entweder über ihre contentItemId
oder externalId
angeben.
Beispiel
PUT https://dev.iclportal.com/api/content/building/batch
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
[
{
"externalId":"HG",
"buildingname":"HG10223",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien"
},
{
"externalId":"LHS101",
"buildingname":"LANHS101",
"stiege":"10",
"strasse":"Landstraßer Hauptstraße",
"stock":1,
"topnr":"GO11",
"plz":"1030",
"ort":"Wien"
}
}
Die Antwort ist eine Zusammenfassung aller erfolgreichen oder fehlerhaften Hinzufügungen oder Aktualisierungen:
{
"errored": [
{
"externalId": "HG",
"error": "The field 'strasse' is required"
}
],
"succeeded": [
{
"externalId": "LHS101",
"id": "65942320-d1c4-420d-b768-b0ca1ca35fba" // die contentitemid des erstellten Elements
}
]
}
9. Änderungen von Elementen aller Typen abrufen
Dieser Endpunkt gibt alle Inhaltselemente unabhängig von ihrem Typ zurück, die seit einem bestimmten Zeitpunkt geändert wurden.
Dieser Zeitpunkt wird als changeToken
bezeichnet und als Abfrageargument angegeben.
Wenn Sie dieses changeToken
weglassen, erhalten Sie im Wesentlichen alle Inhaltselemente.
Dieser Endpunkt ist für Integrationsszenarien gedacht, bei denen Sie Inhaltselemente von iCL Portal mit einem externen System Ihrer Wahl synchronisieren müssen. Um so effizient wie möglich zu sein, ermöglicht er Ihnen, inkrementelle Änderungen zu erhalten, sodass Sie nicht eine ständig wachsende Liste von Objekten durchgehen müssen, bis Sie auf Timeouts stoßen.
Das folgende Beispiel zeigt die erste Anfrage (ohne den cangeToken
)
GET https://dev.iclportal.com/api/content/getchanges
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
0
für den changeToken
in swaggerLeider versteht Swagger nicht, dass chagneToken
ein optionaler Parameter ist. Um mit diesem Endpunkt in der Swagger-Benutzeroberfläche spielen zu können, verwenden Sie den Wert 0
. Der Endpunkt wird diesen magischen Wert einfach ignorieren
Die Antwort enthält alle Elemente, die seit diesem Zeitpunkt geändert wurden
und enthält ein NextChangeToken
, das verwendet werden kann, um die nächste Seite von Chagnes zu erhalten.
Alternativ können Sie auch den NextLink
verwenden.
Beachten Sie, dass die Ergebnismenge auf 500 Einträge begrenzt ist. Sie müssen die Daten durchblättern, wenn Sie mehr als 500 Einträge/Änderungen haben.
{
"Results": [
{
"bezeichnung": "LSHS101-1030",
"adresse": "Landstraßer Hauptstraße 101",
"ort": "Wien",
"nummer": "101",
"contentItemId": "683a34a9-b832-490a-8ab1-5d98aafc7d7f",
"externalId": "LSHS101-1030",
"lastModificationTime": "2018-11-20T15:21:43.767Z",
"isDeleted": true,
"$type": "gebaude"
},
{
"beschreibung": "Der DHL Bote findet den Eingang zu Opti-Q (Altstiege 2) nie",
"objektid": "683a34a9-b832-490a-8ab1-5d98aafc7d7f",
"gewerk": "Paketdienst",
"status": 0,
"frist": "2018-11-29T23:00:00Z",
"contentItemId": "f66ba90c-819d-40c4-acdc-984220ba04b0",
"externalId": null,
"lastModificationTime": "2018-12-11T15:55:05.963Z",
"isDeleted": true,
"$type": "mangel"
},
...
],
"NextChangeToken": "AAAAAAADRF8",
"NextLink": "https://testportal.opti-q.com/api/content/getchanges?changeToken=AAAAAAADRF8"
}
Da der Inhaltstyp nicht angegeben ist, enthält jedes Ergebnis ein Attribut $type
, das den Inhaltstyp des Elements angibt.
Sobald Sie die letzte Seite erreicht haben, ist das Array Results
leer und der NextChageToken
wird sich nicht mehr ändern.
Da dieser Endpunkt für Synchronisierungsszenarien gedacht ist, gibt er auch gelöschte Objekte zurück. In diesem Fall wird ihr Attribut isDeleted
auf true
gesetzt.
10. Änderungen von Elementen eines bestimmten Typs abrufen
Dieser Endpunkt gibt alle Inhaltselemente unabhängig von ihrem Typ zurück, die seit einem bestimmten Zeitpunkt geändert wurden.
Dieser Zeitpunkt wird als changeToken
bezeichnet und als Abfrageargument angegeben.
Wenn Sie dieses changeToken
weglassen, erhalten Sie im Wesentlichen alle Inhaltselemente.
Dieser Endpunkt ist für Integrationsszenarien gedacht, bei denen Sie Inhaltselemente von iCL Portal mit einem externen System Ihrer Wahl synchronisieren müssen. Um so effizient wie möglich zu sein, ermöglicht er Ihnen, inkrementelle Änderungen zu erhalten, sodass Sie nicht eine ständig wachsende Liste von Objekten durchgehen müssen, bis Sie auf Timeouts stoßen.
Das folgende Beispiel zeigt die erste Anfrage (ohne den cangeToken
)
GET https://dev.iclportal.com/api/content/building/getchanges
Content-Type: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate
Authorization: Bearer ..the auth_token...
0
für den changeToken
in swaggerLeider versteht Swagger nicht, dass chagneToken
ein optionaler Parameter ist. Um mit diesem Endpunkt in der Swagger-Benutzeroberfläche spielen zu können, verwenden Sie den Wert 0
. Der Endpunkt wird diesen magischen Wert einfach ignorieren
Die Antwort enthält alle Elemente, die seit diesem Zeitpunkt geändert wurden
und enthält ein NextChangeToken
, das verwendet werden kann, um die nächste Seite von Chagnes zu erhalten.
Alternativ können Sie auch den NextLink
verwenden.
Beachten Sie, dass die Ergebnismenge auf 500 Einträge begrenzt ist. Sie müssen die Daten durchblättern, wenn Sie mehr als 500 Einträge/Änderungen haben.
{
"Results": [
{
"bezeichnung": "LSHS101-1030",
"strasse": "Landstraßer Hauptstraße 101",
"ort": "Wien",
"topnr": "101",
"contentItemId": "683a34a9-b832-490a-8ab1-5d98aafc7d7f",
"externalId": "LSHS101-1030",
"lastModificationTime": "2018-11-20T15:21:43.767Z",
"isDeleted": true
},
{
"buildingname":"HG10223",
"strasse":"Hansongasse 23",
"stiege":"1",
"stock":4,
"topnr":"43",
"plz":"1010",
"ort":"Wien",
"contentItemId":"39d83715-b7d0-4a1e-88a7-bed24d5ab8a0",
"externalId":"HG",
"lastModificationTime":"2023-03-14T12:42:41.1951367Z",
"isDeleted":false
},
...
],
"NextChangeToken": "AAAAAAADRF8",
"NextLink": "https://testportal.opti-q.com/api/content/getchanges?changeToken=AAAAAAADRF8"
}
Da der Inhaltstyp explizit angegeben wird, enthalten die Elemente nicht das Attribut $type
.
Wenn Sie die letzte Seite erreicht haben, wird das Array Results
leer sein und der NextChageToken
wird sich nicht mehr ändern.
Da dieser Endpunkt für Synchronisierungsszenarien gedacht ist, gibt er auch gelöschte Objekte zurück. In diesem Fall wird ihr Attribut isDeleted
auf true
gesetzt.
Da es keine weiteren Änderungen mehr gibt, gibt das System einfach die letzte verfügbare Änderung zurück, was in der Regel genau der gleiche Änderungs-Token ist, den wir gerade in der Anfrage verwendet haben.
Sie können jedoch diesen Mechanismus nutzen, um direkt zur letzten Seite der geänderten Inhaltselemente zu gelangen, indem Sie den höchstmöglichen Änderungs-Token __________8
verwenden.
Dies ist praktisch, wenn Sie nur die Änderungen von jetzt abrufen wollen und nicht alle historischen Änderungen durchgehen wollen.
11. Herunterladen einer Excel-Vorlage
Mit diesem Endpunkt können Sie eine Excel-Arbeitsmappe herunterladen, mit der Sie Inhaltselemente in das iCL Portal importieren können. Füllen Sie dazu die Arbeitsmappe aus und ziehen Sie sie per Drag-and-Drop in ein beliebiges Inhaltselement-Datentraster.
Falls eines der importierten Elemente bereits existiert, werden die Elementeigenschaften mit den Werten aus der Importdatei aktualisiert. Wenn eine Spalte nicht angegeben ist, wird das Feld nicht aus dem Artikel gelöscht, sondern einfach nicht berührt. Auf diese Weise können Sie nur bestimmte Felder eines Inhaltsartikels aktualisieren, ohne etwas anderes zu löschen, das nicht angegeben ist!
Beachten Sie, dass die Spalte ExternalId
in diesem Fall erforderlich ist.
Damit wird sichergestellt, dass Benutzer nicht versehentlich dieselbe Excel Arbeitsmappe mehrfach hochladen und dadurch doppelte Daten erhalten!