Über die Vertec XML Schnittstelle lassen sich von aussen Daten in Vertec abfragen, erzeugen, ändern und löschen. Sie eignet sich demzufolge für Anbindungen von Vertec an Drittsysteme aller Art.
Betriebsart
Cloud Abo
|ON-PREMISES
Module
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
Die Vertec XML Schnittstelle wird vom XML Server bereitgestellt, welcher im Cloud Server integriert ist und somit automatisch läuft, sobald ein laufender Cloud Server vorhanden ist.
Hinweis On-Premises: Damit der XML Server aktiv ist, muss im Vertec.ini folgende Einstellung gesetzt sein:
[CloudServer] XML Server = true
Die Kommunikation basiert auf dem Request / Response Schema. Ein Client schickt via HTTP POST eine in XML formulierte Anfrage und erhält als Ergebnis eine Antwort in XML. Das Encoding ist UTF-8, sowohl beim Senden als auch beim Empfangen von Daten.
Das Format der dabei verwendeten XML Messages basiert auf der SOAP Spezifikation. Vollständige SOAP Kompatibilität ist nicht umgesetzt, insbesondere die Behandlung von XML Namespaces fehlt. Namespaces können in Requests verwendet werden, finden aber keine Beachtung. Auch die Response Messages verwenden keine Namespace Informationen.
Der Aufbau der XML Messages ist grundsätzlich immer gleich. So enthält jede Message, ob Request oder Response, immer das Grundelement Envelope
mit einem Unterelement Body
, in welchem die Message transportiert wird:
<Envelope> <Body> </Body> </Envelope>
Die Authentisierung beim XML Server erfolgt via API Token. Dieses muss als Bearer
Token in einem Authorization
Header mitgegeben werden. Die ebenfalls mitgegebene URL
entspricht Ihrer Vertec Adresse, also der URL, mit welcher Sie z.B. via Web App auf Ihr Vertec zugreifen, gefolgt von /xml
.
Beispiel in Python:
import requests url = 'https://firma.vertec-cloud.com/xml' api_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ODc5ZDQ3OTItZmQxNi00ZWFjLWI5MzUtYT...' headers = {'Authorization': 'Bearer {}'.format(api_token)} xmlquery = """ <Envelope> <Body> <Query> <Selection> <ocl>projektbearbeiter</ocl> </Selection> </Query> </Body> </Envelope> """ response = requests.post(url, headers=headers, data=xmlquery) print(response.text)
/xml
wird zuerst das Token auf Gültigkeit geprüft.Pro XML Session kann ein eigener Vertec Session Prozess gestartet werden, um Performanceprobleme mit laufenden Sessions zu vermeiden.
Dafür kann dem Authorization
Header optional ein VertecSessionTag
mit einem beliebigen String Wert (z.B. '1') mitgegeben werden. Es sind maximal 36 Zeichen erlaubt.
headers = {'Authorization': 'Bearer {}'.format(api_token), 'VertecSessionTag': '1'}
Für jede unterschiedliche Kombination von API Token und VertecSessionTag wird dann automatisch eine neue Session gestartet.
Folgende Vorgänge sind via XML Request möglich:
Um Requests zu testen, stellt Vertec den Endpunkt /xml/query
zur Verfügung. Eine genaue Beschreibung dazu finden Sie im Abschnitt Testen der XML Schnittstelle. Die nachfolgenden Beispiele sind deshalb so verfasst, dass Sie sie direkt in den Body
Teil einfügen können.
Um Objekte mittels XML Message abzufragen, wird der Abfrage-Block in ein <Query>
-Element verpackt.
Darin gibt es die Unterelemente:
<Selection>
: Im Selection Element wird angegeben, welche Objekte abgefragt werden.<Resultdef>
: Im Resultdef Element wird angegeben, welche Informationen der selektierten Objekte zurückgeliefert werden sollen.Die Response auf eine Abfrage (Query) wird in einem QueryResponse Element zurückgeliefert.
Im Selection
Element werden die Objekte abgefragt. Darin können folgende Unterelemente verwendet werden:
Element | Beschreibung | Beispielcode |
---|---|---|
<objref> |
Abfrage von EinzelobjektenMit dem In der gleichen Für eine globale Abfrage via OCL oder SQL wird das |
Einzelobjekt: <Query> <Selection> <objref>676</objref> </Selection> </Query> Mehrere Einzelobjekte: <Query> <Selection> <objref>676</objref> <objref>12345</objref> </Selection> </Query> |
<ocl> |
Abfrage via OCLIm
Das Filtern und Sortieren der Ergebnisliste erfolgt direkt im OCL mit den gewohnten OCL Operatoren ( Achten Sie auf einen performanten Zugriff. |
OCL auf ein <Query> <Selection> <objref>1206</objref> <ocl>ownprojects</ocl> </Selection> </Query> Globale OCL Abfrage:
<Query>
<Selection>
<ocl>projektbearbeiter->orderby(name)</ocl>
</Selection>
</Query>
|
<sqlwhere> |
Abfrage via SQLDie Abfrage via SQL ist immer global und kann weder mit einer OCL Expression noch mit einem Einzelobjekt kombiniert werden. Sie dient dazu, gefilterte Listen performanceoptimiert direkt auf der Datenbank abzufragen. Für ungefilterte Listen (alle Objekte einer Klasse) verwenden Sie stattdessen die Abfrage via OCL. Eine SQL Abfrage wird wie folgt aufgebaut:
Der ausführende Bearbeiter muss über Administratorenrechte oder über das SQL Query Recht verfügen. |
<Query> <Selection> <ocl>OffeneLeistung</ocl> <sqlwhere>fixedprice = 1</sqlwhere> <sqlorder>datum</sqlorder> </Selection> </Query> |
Im Resultdef
Element werden via OCL die gewünschten Werte abgefragt. Diese werden dann pro Objekt der Selection
zurückgeliefert.
Als Basis für das OCL dient das Ergebnis respektive die Ergebnisliste der Selection
. Um gültige OCL Expressions zu erstellen, muss man also wissen, von welchem Typ (Klasse) diese Ergebnisse sind. Darauf sind alle Members verfügbar, die auf der entsprechenden Klasse im Vertec Model Browser aufgelistet sind (auch berechnete Datenfelder (Derived Attributes).
Wie gewohnt in OCL können nicht nur einzelne Members abgefragt, sondern auch im Modell weiternavigiert und Werte berechnet werden. Bedenken Sie, dass die Abfrage für jedes Objekt der Ergebnisliste angewandt wird, und achten Sie auch hier auf einen performanceoptimierten Zugriff.
Eine komfortable Variante, gültige OCL Expressions zusammenzustellen, ist der OCL Expression Editor in den Listeneinstellungen einer Liste in Vertec, die Objekte des gleichen Typs enthält wie die Ergebnisse aus der Selection
.
Im Resultdef
Element können folgende Unterelemente verwendet werden:
Element | Beschreibung | Beispielcode |
---|---|---|
<member> |
Abfrage eines einzelnen MembersHier wird in OCL ein Member des Resultat-Objekts angegeben. Handelt es sich beim angegebenen Member um ein eigenständiges Objekt, wird davon die Vertec Objekt-ID zurückgeliefert (im Beispiel für das Member |
<Query> <Selection> <ocl>Session.allInstances->first.login.ownprojects</ocl> </Selection> <Resultdef> <member>code</member> <member>betreffend</member> </Resultdef> </Query> |
<expression> |
Abfrage via OCL ExpressionFür Bedingungen (
|
<Query> <Selection> <ocl>Session.allInstances->first.login.ownprojects</ocl> </Selection> <Resultdef> <member>code</member> <member>betreffend</member> <expression> <alias>OffeneLeistungen</alias> <ocl>offeneLeistungen.wertext->sum</ocl> </expression> </Resultdef> </Query> |
Ein Resultdef
Element muss nicht zwingend angegeben werden. Wird nur ein einzelner Wert angefordert, kann dieses Element auch weggelassen werden. Die (globale) Selection <ocl>projektbearbeiter->size</ocl>
liefert beispielsweise die Anzahl Bearbeiter zurück. Die QueryResponse gibt dann <Value>Anzahl</Value>
zurück.
Um ein Objekt zu erzeugen, wird ein Create
Element verwendet.
Für jedes Objekt, das erzeugt werden soll, wird ein Unterelement mit dem <Klassennamen>
des Objekts eingefügt.
Darin kann für jedes Member und jede Association, das geschrieben werden soll, ein Unterelement mit dem <membernamen>
eingefügt werden.
<objref>
eingefügt, welches die interne ID des zu verlinkenden Objekts enthält.<Create> <OffeneLeistung> <bearbeiter><objref>1206</objref></bearbeiter> <projekt><objref>1195</objref></projekt> <minutenint>45</minutenint> </OffeneLeistung> </Create>
Zur Verfügung stehen alle Klassen im Vertec Model Browser, die Persistent
sind und kein Häkchen bei Abstract
haben, und alle Members, die nicht Derived
sind. Beachten Sie, dass Klassennamen immer Gross, Member- und Associations immer klein geschrieben werden.
Die Response auf einen Create Request wird in einem CreateResponse Element zurückgeliefert.
Um ein bestehendes Objekt zu ändern, wird ein Update
Element verwendet.
Für jedes Objekt, das geändert werden soll, wird ein Unterelement mit dem <Klassennamen>
des Objekts eingefügt. Darin gibt es folgende Unterelemente:
<objref>
: Hier wird die interne ID des Objekts angegeben, das geändert werden soll. Wichtig ist, dass diese zuoberst angegeben wird, also vor den anderen Attributen, sonst werden die Änderungen nicht durchgeführt.<membernamen>
eingefügt:
<objref>
eingefügt, welches die interne ID des zu verlinkenden Objekts enthält.<Update> <Projektbearbeiter> <objref>1206</objref> <kuerzel>CKE</kuerzel> <eigProjekte><objref>1192</objref></eigProjekte> </Projektbearbeiter> </Update>
Die Response auf einen Update Request wird in einem UpdateResponse Element zurückgeliefert.
Um ein Objekt zu löschen, wird ein Delete
Element verwendet.
Dieses enthält als Unterelemente die zu löschenden Objekte.
<objref>
: Hier wird die interne ID des Objekts angegeben, welches gelöscht werden soll.<Delete> <objref>12345</objref> <objref>25088</objref> </Delete>
Die Response auf einen Delete Request wird in einem DeleteResponse Element zurückgeliefert.
Die Response für einen Query Request wird in einem QueryResponse
Element zurückgeliefert.
Dieses enthält folgende Unterelemente:
Rückgabewert | Beschreibung | Beispielresponse |
---|---|---|
Objekt |
Mit Resultdef Definition
|
<Envelope> <Body> <QueryResponse> <Projekt> <objid>1195</objid> <betreffend>Prozessberatung</betreffend> <code>PROCESS CONSULTING</code> <OffeneLeistungen>15’037.75</OffeneLeistungen> </Projekt> <Projekt> <objid>1192</objid> <betreffend>Laufende Betreuung</betreffend> <code>JOB MANAGEMENT</code> <OffeneLeistungen>16’644.85</OffeneLeistungen> </Projekt> </QueryResponse> </Body> </Envelope> |
Wert |
Ist das Resultat des Query Requests kein Objekt, sondern ein Wert, wird dieser in einem
|
<Envelope> <Body> <QueryResponse> <Value>7</Value> </QueryResponse> </Body> </Envelope> |
Kein |
Gibt es keinen Rückgabewert, wird einfach ein leeres |
<Envelope> <Body> <QueryResponse/> </Body> </Envelope> |
Datumswerte werden im Format ISO 8601 zurückgeliefert.
Die Response auf einen Create Request werden in einem CreateResponse
Element zurückgeliefert.
Dieses enthält für jedes erzeugte Objekt folgende Unterelemente:
<Klasse>
: Für jedes Objekt wird ein Element mit der Klasse des Objekts zurückgeliefert, mit folgenden Unterelementen:
<objid>
: Liefert die interne ID des neu erzeugten Objekts<isValid>
: Gibt an, ob das erzeugte Objekt in Vertec gültig ist (1
) oder nicht (0
).<Envelope> <Body> <CreateResponse> <OffeneLeistung> <objid>12019</objid> <isValid>1</isValid> </OffeneLeistung> </CreateResponse> </Body> </Envelope>
Ungültige Objekte werden trotzdem erzeugt im System. Diese müssen aktiv ergänzt (Update) oder gelöscht (Delete) werden. Alternativ kann eine Vertec full-featured App geöffnet werden und die Einträge manuell bearbeitet werden resp. werden beim Schliessen der App automatisch gelöscht.
Die Response auf einen Update Request wird in einem UpdateResponse
Element zurückgeliefert, mit einem Unterelement:
<text>
: Gibt an, wieviele Objekte geändert wurden.
<Envelope> <Body> <UpdateResponse> <text>Updated 1 Objects</text> </UpdateResponse> </Body> </Envelope>
Die Response auf einen Delete Request wird in einem DeleteResponse
Element zurückgeliefert, mit einem Unterelement:
<text>
: Gibt an, wie viele Objekte gelöscht wurden.
<Envelope> <Body> <DeleteResponse> <text>Deleted 1 Objects</text> </DeleteResponse> </Body> </Envelope>
Beschreibung | Beispielcode |
---|---|
ZusatzfelderDas Schreiben von Werten in Zusatzfeldern funktioniert gleich wie bei normalen Members. Als Element wird einfach der Die verschiedenen Zusatzfeldarten werden via XML wie folgt geschrieben:
Die Abfrage von Zusatzfeldern erfolgt via OCL. |
Zusatzfeld Projektstand auf einer Projektphase: <Update> <Projektphase> <objref>5491</objref> <Projektstand>1</Projektstand> </Projektphase> </Update> |
Schreiben von Keys/TagsFür das Setzen von Keys und Tags via XML gibt es folgende Elemente:
|
<Update> <Projektbearbeiter> <objref>4019</objref> <kuerzel>ABC</kuerzel> <keyvalue> <key>ExternalId</key> <value>123465</value> </keyvalue> <tag> <add>selected</add> </tag> </Projektbearbeiter> </Update> |
Abfragen von Keys/TagsDie Abfrage von bestehenden Keys und Tags erfolgt via OCL direkt auf den abgefragten Objekten. |
<Query> <Selection> <ocl>projektbearbeiter->select(hasTag('selected'))</ocl> </Selection> </Query> |
Einen Wert auf NULL setzenUm einen Wert, der bereits gesetzt ist, wieder zu leeren (auf NULL setzen), können Sie dem Attribut einen leeren Wert zuweisen. Im Beispiel wird die Tagespauschale auf dem Bearbeiter geleert. |
<Update> <Projektbearbeiter> <objref>300</objref> <tagespauschaleext/> </Projektbearbeiter> </Update> |
Ja/Nein Werte (Boolean)Ja/Nein-Werte (Booleans) werden mit
Bei der Abfrage von Boolean-Werten gibt es einen Unterschied von eingebauten Feldern und Zusatzfeldern gibt. Eingebaute Boolean-Felder wie z.B. aktiv auf Projekten liefern ![]() Das Setzen erfolgt jedoch in beiden Fällen gleich, nämlich wie oben beschrieben mit |
<Update> <Projekt> <objref>2880</objref> <aktiv>1</aktiv> </Projekt> </Update> Benötigt man eine einheitliche QueryResponse, kann man bei Zusatzfeldern anstelle der einfachen <expression> <alias>myboolean</alias> <ocl>if zusatzfeldbool('myboolean') then 1 else 0 endif</ocl> </expression> |
MLString-Feld setzenBei MLString-Feldern braucht es nach Sprache und Begriff jeweils einen "record separator" mit dem Code 30 (Hex 1E). Dafür wird die XML Entity Es können keine einzelnen Sprachen gesetzt werden, es werden immer alle Sprachen gesetzt. Gibt man also eine der Sprachen nicht an, ist sie nachher leer, auch wenn vor dem Update Request etwas angegeben war. Beachten Sie dazu folgende Anmerkungen:
|
<Update> <Report> <objref>34741</objref> <designation>NVProjektideeENProject idea</designation> </Report> </Update> |
Datumswerte setzenDatumswerte müssen unabhängig von den Regionaleinstellungen im Format ISO 8601 angegeben werden.
|
<Update> <OffeneLeistung> <objref>34743</objref> <datum>2025-07-01</datum> </OffeneLeistung> </Update> |
Anwendung | Request | Beispielcode |
---|---|---|
Firma mit ReferenznummerDas Feld Referenznummer auf der Firma ist ein String-Feld, kann also sowohl Text als auch Ziffern enthalten. |
Query |
<Query> <Selection> <ocl>Firma</ocl> <sqlwhere>referenz like '123456789'</sqlwhere> </Selection> </Query> |
Firma erzeugenDie Sprache der Firma wird mit einem Integer angegeben:
Die Adresse sowie die Kommunikationsmittel sind eigenständige Objekte und müssen separat geschrieben werden (siehe unten). Die CreateResponse liefert die interne ID der neu erstellten Firma zurück, damit kann dann weitergearbeitet werden. |
Create |
<Create> <Firma> <name>Goldhaus AG</name> <zusatz>Standort Testenhausen</zusatz> <referenz>123456789</referenz> <sprache>1</sprache> <betreuer><objref>1206</objref></betreuer> </Firma> </Create> |
Adressobjekt ermittelnDie Adresse resp. das entsprechende Adressobjekt wird beim Erzeugen eines Adresseintrags automatisch von Vertec angelegt. Um das Adressobjekt zu ermitteln, fragen wir - z.B. auf der neu erstellten Firma - nach |
Query |
<Query> <Selection> <objref>4562</objref> <ocl>defaultadresse.adresse</ocl> </Selection> </Query> |
Adressdaten schreibenAuf dem ermittelten Adressobjekt können wir nun die Adresse schreiben. |
Update |
<Update> <Adresse> <objref>2865</objref> <adresse>Hauptstrasse 1</adresse> <plz>9999</plz> <ort>Testenhausen</ort> <kanton>Zürich</kanton> <land>Schweiz</land> </Adresse> </Update> |
Kommunikationsmittel erstellenUm ein Kommunikationsmittel (Klassenname:
Folgende Felder werden geschrieben:
Soll das neu erzeugte KommMittel auf dem Adresseintrag als Standard markiert werden, muss es zusätzlich je nach internem Typ des KommMittelTyps mit dem Adresseintrag wie folgt verlinkt werden:
Zu beachten: Falls bereits ein KommMittel dieses Typs als Standard markiert ist auf dem Adresseintrag, wird dieses dadurch als bisheriger Standard entfernt. |
Create |
Abfrage des Typs, hier 'T' für Telefon: <Query> <Selection> <ocl>kommMittelTyp->select(internerTyp='T')</ocl> </Selection> </Query> KommMittel erstellen und als Standard verlinken: <Create> <KommMittel> <typ><objref>142</objref></typ> <eintrag><objref>4562</objref></eintrag> <zieladresse>043 219 87 65</zieladresse> <bezeichnung>Zentrale</bezeichnung> <fromDefaultTelefon><objref>4562</objref></fromDefaultTelefon> </KommMittel> </Create> |
Kontakt erstellen
|
<Create> <Kontakt> <firma><objref>4562</objref></firma> <name>Duck</name> <vorname>Donald</vorname> <gender>male</gender> </Kontakt> </Create> |
|
Ein Projekt einem Stichwortordner zuordnenWeist einem Projekt (hier mit interner ID |
<Update> <Projekt> <objref>1170</objref> <ordner><objref>31426</objref></ordner> </Projekt> </Update> |
Zum Testen von XML Requests steht eine einfache Web-Oberfläche unter /xml/query
zur Verfügung. Diese Endung fügen Sie im Browser hinten an Ihre Vertec URL an.
Beachten Sie bitte, dass Sie damit auf Ihre reale Datenbank zugreifen und sich Datenänderungen auf Ihre realen Daten auswirken. Wir empfehlen, für das Testing eine unabhängige Testinstallation einzurichten.
Im Feld API Token
wird das API Token eingegeben.
Im Feld XML Request
wird das Body-Element des XML Requests eingegeben.
Die XML Response wird unterhalb dargestellt nach Klick auf Submit Request
: