Vertec XML Schnittstelle

Vertec ist mit einer XML Schnittstelle ausgerüstet. Diese wird vom Vertec XML Server bereitgestellt. Mit dieser Schnittstelle können Anfragen in XML formuliert und via http an Vertec geschickt werden. Die Antwort kommt ebenfalls in XML formatiert.

Produktlinie

Standard

|

Expert

Betriebsart

CLOUD ABO

|

ON-PREMISES

Module

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 13.06.2022
Aktualisiert: 09.10.2024 | Beispiel für die Zuordnung zu einem Stichwort hinzugefügt.

Mit der XML Schnittstelle lassen sich alle Daten aus Vertec abfragen , erzeugen , ändern , oder löschen . Die Schnittstelle eignet sich demzufolge für Anbindungen von Drittsystemen aller Art.

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 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. 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 und als Unterelement 'Body':

<Envelope>
   <Body>
   </Body>
 </Envelope>

XML Server

Authentisierung

Die Authentisierung beim XML Server erfolgt via API Token , welches im Parameter api_token übergeben wird. Beispiel:

import requests
url = 'http://localhost:8081/xml'
api_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MGVhZmUzMzYtNmVhMi00MDdhLTgxNjQtZDYxZmI0NzU2MWZi._r16YlvWmZCMJ3qdDX3bK5_DJHwcczTYaWoKUYUNZuk'
headers = {'Authorization': 'Bearer %s' % 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)

Der Zugriff erfolgt direkt auf /xml.

Innerhalb des Timeout-Intervalls wird immer die gleiche Session verwendet.

Hinweis: In Vertec Versionen vor 6.6 erfolgte die Authentisierung über einen eigenen Endpoint /auth/xml. Das entsprechende Handling finden Sie im Artikel zuunterst .

Mehrere Sessions starten

Pro XML Session kann ein eigener Vertec.Session Prozess gestartet werden. Damit können Probleme mit langlaufenden Sessions vermieden werden.

Falls explizit eine neue (parallele) Session verwendet werden soll, kann optional ein HTTP Header VertecSessionTag mit einem beliebigen Wert (z.B. 1) mitgegeben werden. Es sind maximal 36 Zeichen erlaubt. Beispiel:

headers = {'Authorization': 'Bearer %s' % api_token, 'VertecSessionTag': '1'}

Pro VertecSessionTag wird eine neue Session gestartet. Somit basiert die Session Affinität auf der Kombination von API Token und Session-Id.

Session Handling

  • Bei einem XML Request auf /xml wird zuerst das Token auf Gültigkeit geprüft.
  • Anschliessend wird geprüft, ob für dieses Token bereits eine Vertec-Session läuft. Falls ja, wird der Request dieser Session übergeben.
  • Falls noch keine Session für die angegebene XML Session-ID existiert, wird eine angelegt (bzw. aus dem Idle Pool genommen).
  • Eine XML Session hat einen Session Timeout von 5 Minuten. Wenn während dieser Zeit kein neuer Request für die Session empfangen wird, wird die Session beendet. On-Premises kann dieser Wert bei Bedarf im Vertec.ini angepasst werden.
  • Wenn die Session aufgrund des Timeouts beendet wurde, wird einfach eine neue Session gestartet. Dank den Idle Sessions ist die Verzögerung auch bei einer neuen Session minimal.

Testen der XML Schnittstelle

Zum Testen von XML Request steht eine einfache Web-Oberfläche unter /xml/query zur Verfügung.

Im Feld API Token wird das API Token eingegeben.

Im Feld XML Request wird das Body-Element des XML Requests eingegeben.

Das Ergebnis-XML wird unterhalb dargestellt:

Beachten Sie bitte, dass Sie damit unter Umständen auf Ihre reale Datenbank zugreifen und sich Datenänderungen auf Ihre realen Daten auswirken können, sofern Sie nicht eine unabhängige Testinstallation eingerichtet haben.

Encoding

Der XML Server arbeitet mit UTF-8 Encoding, beim Senden und Empfangen von Daten.

XML Request

Der XML Request enthält einen Header, in welchem die Authentisierungs-Informationen übertragen werden.

<Envelope>
  <Header>
  </Header>
  <Body>
  </Body>
 </Envelope>

Der Body enthält dann die eigentliche Abfrage:

Objekte abfragen (Query)

Um Objekte mittels XML Message abzufragen, wird der Abfrage-Block in ein Query-Element verpackt. Dieses Element enthält wiederum die Elemente Selection und Resultdef.

<Query>
  <Selection>
    <objref>676</objref>
    <ocl>offeneleistungen</ocl>
    <sqlwhere>datum between '01.10.2021' and '31.12.2021'</sqlwhere>
    <sqlorder>bold_id</sqlorder>
  </Selection>
  <Resultdef>
    <member>datum</member>
    <member>projekt</member>
    <member>text</member>
    <member>wertext</member>
  </Resultdef>
</Query>

Selection-Element

Im Selection-Element wird die eigentliche Abfrage zusammengestellt. Darin können folgende Unterelemente verwendet werden: <objref>, <ocl>, <sqlwhere> und <sqlorder>.

<objref>

Mit dem <objref> Element können Vertec Objekte mittels ihrer Objekt Id abgefragt werden.

Einzelobjekt:

<Selection>
  <objref>676</objref>
</Selection>

Oder Objektliste:

<Selection>
  <objref>676</objref>
  <objref>2895</objref>
</Selection>
<ocl>

Im <ocl> Element kann eine OCL Expression angegeben werden.

Ist ein (einzelnes) <objref> Element angegeben, wird das OCL darauf ausgeführt:

<Selection>
  <objref>676</objref>
  <ocl>eigprojekte</ocl>
</Selection>

Ist kein <objref> Element angegeben, wird das OCL global ausgeführt:

<Selection>
  <ocl>projektbearbeiter</ocl>
</Selection>

Sollen die Ergebnisse sortiert oder gefiltert werden, kann das mit den gewohnten OCL Listenoperatoren geschehen (->select(), ->orderby() etc.). Achten Sie auch hier auf einen performanten Zugriff .

<sqlwhere>

Im <sqlwhere> Element kann ein SQL-Filter angegeben werden. Das <ocl> Element gibt dabei den Klassennamen an (achten Sie dabei auf die Gross-/Kleinschreibung).

Der ausführende User muss über Administratorenrechte oder über das SQL Query Recht verfügen.

<Selection>
  <ocl>OffeneLeistung</ocl>
  <sqlwhere>datum between '01.01.2023' and '31.12.2023'</sqlwhere>
</Selection>

Möchte man alle Objekte einer Klasse via SQL abfragen, kann man sich des Tricks behelfen, ein <sqlwhere> anzugeben, welches immer True ist, z.B.

<Selection>
  <ocl>Projektbearbeiter</ocl>
  <sqlwhere>1=1</sqlwhere>
</Selection>
<sqlorder>

In Kombination mit <sqlwhere> können die Objekte mit <sqlorder> sortiert werden:

<Selection>
  <ocl>OffeneLeistung</ocl>
  <sqlwhere>datum between '01.01.2023' and '31.12.2023'</sqlwhere>
  <sqlorder>datum</sqlorder>
</Selection>

Resultdef-Element

Das Resultdef-Element gibt an, welche Informationen angefordert werden. Es können folgende Unterelemente verwendet werden:

  • member: Hier 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 projekt). Es können beliebig viele Members aufgelistet werden.
  • alias-expression: Möchte man ein member um if-else-Bedingungen oder Berechnungen erweitern, wird ein Alias in einer Expression verwendet. In dieser können OCL Expressions eingesetzt werden. Der Aufbau ist wie folgt:
    <expression>
     <alias>abgeschrieben</alias>
     <ocl>wertint-wertext</ocl>
    </expression>

    Im <ocl>-Bereich sind sämtliche OCL Expressions möglich.

Es muss nicht unbedingt ein Resultdef-Element angegeben werden. Wird nur ein einzelner Wert angefordert (und nicht, wie oben beschrieben, eine Liste von Objekten), kann dieses Element einfach weggelassen werden. Z.B. liefert die Selection <ocl>projektbearbeiter->size</ocl> die Anzahl Bearbeiter zurück. Die Response liefert dann einen <Value>Anzahl</Value> zurück.

XML Response

QueryResponse-Element

Das Resultat wird in einem QueryResponse-Element zurückgeliefert. Dieses enthält immer eine Auflistung von Objekten.

  • objid: Jedes zurückgelieferte Objekt wird als eigenständiges Element geliefert. Bei jedem dieser Result-Objekten wird eine objid mitgeliefert, welche die Vertec Objekt-ID enthält:
    <objid>7822</objid>

Des Weiteren werden alle unter Resultdef angegebenen Members aufgelistet. Falls es sich dabei um eigenständige Objekte handelt, wird von diesen die Objektreferenz (Objekt-ID) mitgeliefert:

<Envelope>
  <Body>
    <QueryResponse>
      <OffeneLeistung>
        <objid>7822</objid>
        <datum>2021-11-14</datum>
        <projekt><objref>4164</objref></projekt>
        <text>Brief an Hr. Meier<text/>
        <wertExt>120.00</wertExt>
      </OffeneLeistung>
      ...

Anmerkung: Das Datumsformat ist ISO 8601.

Objekte erzeugen (Create)

Create-Element

Um ein Objekt zu erzeugen wird ein Create-Element verwendet. Dieses enthält eine Liste von zu erzeugenden Objekten. Als zu erzeugendes Objekt wird jeweils der entsprechende Klassenname angegeben. Die einzelnen Members enthalten entweder eine Objektreferenz (Objekt-ID) eines bestehenden Objektes in Vertec oder den beim Member einzutragenden Wert.

Als Beispiel wird eine offene Leistung erzeugt. Dieser wird ein bereits bestehender Bearbeiter und ein bereits bestehendes Projekt mittels Objekt-ID zugewisen. Als Aufwand wird im Attribut minutenint 45 Minuten eingetragen:

<Create>
    <OffeneLeistung>
      <bearbeiter><objref>4036</objref></bearbeiter>
      <projekt><objref>4132</objref></projekt>
      <minutenint>45</minutenint>
    </OffeneLeistung>
</Create>

CreateResponse-Element

Zurückgeliefert wird ein CreateResponse-Element. Dieses enthält eine Liste der erzeugten Objekten, die jeweils den Klassennamen des erzeugten Objektes angibt. Diese wiederum enthalten folgende Unterelemente:

  • objid: Gibt die Objekt-ID des neu erzeugten Objektes an.
  • 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>

Objekte ändern (Update)

Update-Element

Das Ändern von Objekten funktioniert ähnlich wie das Erzeugen, einfach wird dafür ein Update-Element verwendet. Dieses enthält eine Liste von zu ändernden Elementen. Angegeben wird jeweils der Klassenname des zu ändernden Objekts als Unterelement.

  • objref: Für jedes zu ändernde Element muss die Objektreferenz (Objekt-ID) angegeben werden. Wichtig ist, dass diese zuoberst angegeben wird, also vor den anderen Attributen, sonst wird die Änderung nicht durchgeführt.
  • Weiter müssen die zu ändernden Attribute angegeben werden. Im Beispiel wird bei einem Projektbearbeiter mit der Objekt-ID 4019 als Kürzel CKE eingetragen:
<Update>
    <Projektbearbeiter>
      <objref>4019</objref>
      <kuerzel>CKE</kuerzel>
    </Projektbearbeiter>
    ...
</Update>

Ändern von Zusatzfeldern

Das Ändern von Zusatzfeldern funktioniert gleich wie oben, als Membernamen wird einfach der Name des Zusatzfeldes eingesetzt. Im Beispiel wird im Zusatzfeld Projektstand auf einer Projektphase mit der ID 5491 der Text Angefangen eingetragen:

<Update>
  <Projektphase>
    <objref>5491</objref>
    <Projektstand>Angefangen</Projektstand>
  </Projektphase>
</Update>

Key-Values und Tags setzen

Ab Vertec 6.3 können Key-Values und Tags über den XML Server gesetzt bzw. entfernt werden. Dafür gibt es folgende Elemente:

  • <keyvalue> mit Sub-Elementen <key> und <value>
  • <tag> mit Sub-Elementen <add> und <remove>
<Update>
    <Projektbearbeiter>
        <objref>4019</objref>
        <kuerzel>ABC</kuerzel>
        <keyvalue>
            <key>ExternalId</key>
            <value>123465</value>
        </keyvalue>
        <tag>
            <add>selected</add>
        </tag>
    </Projektbearbeiter>
</Update>

Die Abfrage von bestehenden Key-Values bzw. Tags im Query-Element kann wie gewohnt via OCL erfolgen, hier gibt es keine speziellen Elemente:

<Query>
    <Selection>
        <ocl>projektbearbeiter->select(hasTag('selected'))</ocl>
    </Selection>
    <ResultDef>
        <member>kuerzel</member>
    </ResultDef>
</Query>

Einen Wert auf NULL setzen

Um 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) setzen

Ja/Nein-Werte (Booleans) werden mit 0 und 1 gesetzt:

  • 0: Nein
  • 1: Ja
<Update>
    <Projekt>
        <objref>2880</objref>
        <aktiv>1</aktiv>
        <myboolean>0</myboolean>
    </Projekt>
</Update>

Etwas verwirrlich ist, dass es bei der Abfrage von Boolean-Werten einen Unterschied von eingebauten Feldern und Zusatzfeldern gibt. Eingebaute Boolean-Felder wie z.B. aktiv auf Projekten liefern 1 und 0, die Boolean-Zusatzfelder jedoch Y und N zurück.

Das Setzen erfolgt jedoch in beiden Fällen gleich, nämlich wie oben beschrieben mit 0 und 1.

Benötigt man einen einheitlichen XML-Response, kann man anstelle der einfachen <member>-Abfrage eine Expression angeben, die den Rückgabewert steuert:

<expression><alias>myboolean</alias><ocl>if zusatzfeldbool('myboolean') then 1 else 0 endif</ocl></expression>

MLString-Feld setzen

Bei MLString -Feldern braucht es nach dem Sprachtext einen "record separator" (RS) mit dem Code 30 (Hex 1E). Dafür wird die XML Entity &#30; eingesetzt:

<Update>
    <zusatzfeldklasse>
        <objref>552293</objref>
        <bezeichnung>DE&#30;Geschäfts-/Projektidee&#30;EN&#30;Business Idea&#30;</bezeichnung>
    </zusatzfeldklasse>
</Update>

UpdateResponse-Element

Zurückgeliefert wird ein UpdateResponse-Element mit folgendem Unterelement:

  • text: Gibt an, wieviele Objekte geändert wurden.
    <Envelope>
      <Body>
        <UpdateResponse>
          <text>Updated 1 Objects</text>
        </UpdateResponse>
      </Body>
    </Envelope>

Objekte löschen (Delete)

Delete-Element

Um ein Objekt zu löschen, wird ein Delete-Element verwendet. Dieses enthält eine Liste der zu löschenden Objekte:

  • objref: Für jedes zu löschende Element wird die entsprechende Objektreferenz (Objekt-ID) angegeben.
    <Delete>
        <objref>11764</objref>
        ...
    </Delete>
    

DeleteResponse-Element

Zurückgeliefert wird ein DeleteResponse-Element mit folgendem Unterelement:

  • text: Gibt an, wie viele Objekte gelöscht wurden.
    <Envelope>
      <Body>
        <DeleteResponse>
          <text>Deleted 1 Objects</text>
        </DeleteResponse>
      </Body>
    </Envelope>

Authentisierung ab Vertec Version 6.7

Mit Version 6.6 wurden API Tokens für die Erhöhung der Anmeldesicherheit von Web API Zugriffen eingeführt. Die API Tokens erhöhen die Anmeldesicherheit der Vertec XML Schnittstelle und der BI API Schnittstelle.

Das alte System – die Authentisierung via Username und Passwort – wird ab Vertec Version 6.7 nicht mehr unterstützt. Der XML Server und das BI API erlauben nur noch Authentisierungen via API Token. Der Endpunkt /auth/xml wurde entfernt und Calls gegen diesen Endpunkt melden einen Fehler

Beispiele für die Verwendung der Schnittstelle

In der folgenden Tabelle sind Beispiel XML Queries zum Erzeugen und Updaten von Adresseinträgen beschrieben.

Query XML Response

Suche nach Firma mit Referenznummer:

<Query>
  <Selection>
    <ocl>Firma</ocl>
    <sqlwhere>referenz like '123456789'</sqlwhere>
  </Selection>
</Query>

Die Antwort ist eine Liste von objid, welche dem Suchkriterium entsprechen.

Antwort bei keinem Resultat/leere Liste:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Envelope>
<Body>
<QueryResponse/>
</Body>
</Envelope>

Antwort mit mehreren Resultaten:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Envelope>
<Body>
<QueryResponse>
<Firma>
<objid>8803185</objid>
</Firma> <Firma> <objid>8803206</objid>
</Firma>
</QueryResponse>
</Body>
</Envelope>

Firma erzeugen:

<Create>
  <Firma>
    <name>Goldhaus AG</name>
    <zusatz>Standort Entenhausen</zusatz>
    <bemerkung></bemerkung>
    <referenz>123456789</referenz>
    <sprache>1</sprache>
    <betreuer><objref>4721</objref></betreuer>
  </Firma>
</Create>

Sprache:
0=DE
1=EN
2=FR
3=IT

Betreuer ist die Interne Id eines Bearbeiters in Vertec. Diese muss vorgängig eruiert werden.

Gibt die Interne Id der erzeugten Firma zurück:

<CreateResponse>
  <Firma>
    <objid>8803185</objid>
    <isValid>1</isValid>
  </Firma>
</CreateResponse>

Die neu erstellte Firma nach der internen Id der Defaultadresse fragen:

<Query>
  <Selection>
    <objref>8803185</objref>
    <ocl>defaultadresse</ocl>
  </Selection>
</Query>

Die Interne Id des automatisch erzeugten Adresslayouts:

<QueryResponse>
  <AdressLayout>
    <objid>8803183</objid>
  </AdressLayout>
</QueryResponse> 

Klasse Adresse erzeugen mit

<Create>
  <Adresse>
    <layouts><objref>8803183</objref></layouts>
    <owner><objref>8803185</objref></owner>
    <adresse>Talerhügel 1</adresse>
    <plz>9999</plz>
    <ort>Entenhausen</ort>
  </Adresse>
</Create>

Interne Id der erzeugten Adresse:

<CreateResponse>
  <Adresse>
    <objid>8803189</objid>
  </Adresse>
</CreateResponse>

Kommunikationsmittel erstellen

  • typ = Interne Id des Kommunikationsmittels in Vertec (einmalig abfragen und im Code hinterlegen).
  • eintrag = Interne Id der Firma
<Create>
  <KommMittel>
    <typ><objref>4392</objref></typ>
    <eintrag><objref>8803185</objref></eintrag>
    <zieladresse>077 789 45 61</zieladresse>
    <bezeichnung></bezeichnung>
  </KommMittel>
</Create>

Gibt die Interne Id des erzeugten Kommmittels zurück:

<CreateResponse>
  <KommMittel>
    <objid>92503184</objid>
    <isValid>1</isValid>
  </KommMittel>
</CreateResponse>

Adresse updaten statt erzeugen

<Update>
  <Firma>
    <objref>8803185</objref>
    <name>Goldhaus AG</name>
    <zusatz>Standort Entenhausen</zusatz>
    <bemerkung>ein Text in Bemerkung</bemerkung>
    <referenz>123456789</referenz>
    <sprache>1</sprache>
    <betreuer><objref>4721</objref></betreuer>
  </Firma>
</Update>
<UpdateResponse>
  <text>Updated 1 Objects</text>
</UpdateResponse>

 

Kontakt erstellen

<Create>
  <Kontakt>
    <firma><objref>8803185</objref></firma>
    <name>Duck</name>
    <vorname>Donald</vorname>
    <gender>male</gender>
  </Kontakt>
</Create>

Gibt die Interne Id des erzeugten Kontakts zurück:

<CreateResponse>
  <Kontakt>
    <objid>8803216</objid>
    <isValid>1</isValid>
  </Kontakt>
</CreateResponse>

Ein Kommunikationsmittel auf dem Kontakt erstellen:

<Create>
  <KommMittel>
    <typ><objref>4395</objref></typ>
    <eintrag><objref>8803216</objref></eintrag>
    <zieladresse>donald.duck@geldspeicher.ent</zieladresse>
    <bezeichnung></bezeichnung>
  </KommMittel>
</Create>

Gibt die
Interne Id des erzeugten Kommmittels zurück:

<CreateResponse>
  <KommMittel>
    <objid>8803219</objid>
  </KommMittel>
</CreateResponse>

Ein Projekt einem Stichwortordner zuordnen.

<Update>  
  <Projekt>
    <objref>1170</objref>
    <ordner><objref>31426</objref></ordner>
  </Projekt>
</Update>

Weist dem Projekt (hier mit ID 1170) einen Stichwortordner (hier mit ID 31426) zu. Die ID ist im Eigenschaften-Dialog  > Interne ID zu finden.

<UpdateResponse>
  <text>Updated 1 Objects</text>
</UpdateResponse>

Ein-/Ausschalten des XML Servers (On-Premises)

Damit der XML Server aktiv ist, muss im Vertec.ini folgende Einstellung gesetzt sein:

[CloudServer]
XML Server = true
Bitte wählen Sie Ihren Standort