Import Connectors
Import connectors zijn de standaard methode in Ultimo om externe data geautomatiseerd te importeren. Ze ondersteunen zowel bestandsgebaseerde imports als webservice-imports, met XSLT transformaties om externe dataformaten om te zetten naar het Ultimo XML importformaat. Elke connector heeft ingebouwde logging en optionele rollback bij fouten.
Beschikbaarheid: Premium, Enterprise
Wat is een Import Connector?bewerken
Een import connector is een configuratie in Ultimo die bepaalt: - Waar de data vandaan komt (bestand of webservice) - Hoe de data wordt getransformeerd (XSLT) - Wat er met de data gebeurt (insert, update, delete) - Welke entiteiten worden bijgewerkt (Equipment, Job, Aoc, etc.)
Import connectors worden geconfigureerd in de Ultimo Configuration Tool (UCT) onder het menu Business Integration.
Connector eigenschappenbewerken
| Eigenschap | Beschrijving |
|---|---|
Id |
Unieke identifier van de connector (bijv. AOC_GMG_IMPORT) |
Description |
Beschrijving van het doel |
DataProvider |
Naam van de externe bron (bijv. GMG, SAP, Emtec) |
FileType |
Type bronbestand: xml, csv, json |
Culture |
Cultuurinstelling voor dataparsing (EN, NL) |
IsActive |
Connector is actief ja/nee |
EndpointEnabled |
Kan worden aangestuurd via endpoint |
Process |
Automatisch verwerken na ontvangst |
RollbackOnError |
Alle wijzigingen terugdraaien bij fout |
AllowTruncate |
Sta truncatie toe |
Xslt |
Pad naar het XSLT transformatiebestand |
LogErrorToEventLog |
Fouten loggen in event log |
LogSuccessToEventLog |
Successen loggen in event log |
SendResultToEmailSuccess |
E-mail versturen bij succes |
Databronnenbewerken
Bestandsgebaseerde importbewerken
De connector leest bestanden van een geconfigureerde locatie. Ondersteunde formaten: - XML - CSV - JSON
Let op bij Azure: Ultimo omgevingen op Azure hebben geen directe toegang tot FTP-servers of netwerkshares. Overweeg webservice-gebaseerde imports als alternatief.
Webservice importbewerken
De connector roept een externe webservice aan en verwerkt de response. Configuratie-opties:
| Eigenschap | Beschrijving |
|---|---|
WebServiceUrl |
URL van de externe webservice |
WebServiceMethod |
HTTP methode: GET of POST |
WebServiceHttpHeaders |
Extra HTTP headers (bijv. Content-Type: text/xml;charset=UTF-8) |
WebServicePostData |
POST body (bij POST methode) |
WebServiceHttpUserName |
Gebruikersnaam voor authenticatie |
WebServiceHttpPassword |
Wachtwoord voor authenticatie |
Voorbeeld: GET webservice
WebServiceUrl: https://aoc-codering.nl/aoc/export/xml/#licensecodeofcustomer#
WebServiceMethod: GET
Voorbeeld: POST naar SOAP webservice
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap="https://webservice.emtec.de/imt/soap.php">
<soapenv:Header>
<login>
<username>${ImportConnector.WebServiceHttpUserName}</username>
<password>${ImportConnector.WebServiceHttpPassword}</password>
</login>
</soapenv:Header>
<soapenv:Body>
<soap:getDevicesRequest>
<soap:datetime>#formatdate(${ImportConnector.LastImportSuccess} "yyyy-MM-dd" true)</soap:datetime>
</soap:getDevicesRequest>
</soapenv:Body>
</soapenv:Envelope>
Beschikbare variabelen in webservice configuratiebewerken
| Variabele | Beschrijving |
|---|---|
${ImportConnector.WebServiceHttpUserName} |
Geconfigureerde gebruikersnaam |
${ImportConnector.WebServiceHttpPassword} |
Geconfigureerd wachtwoord |
${ImportConnector.LastImportSuccess} |
Datum/tijd van de laatste succesvolle import |
Authenticatie voor externe webservicesbewerken
| Type | Beschrijving |
|---|---|
| Basic authentication | Pre-emptive; Authorization header wordt direct met het eerste request meegestuurd |
| OAuth 2.0 | Ondersteunde grant types: Authorization code, Password, Client credentials |
XSLT Transformatiebewerken
De kern van een import connector is de XSLT transformatie. Deze zet de externe data om naar het Ultimo XML importformaat.
Ultimo XML importformaatbewerken
Het doelformaat waar de XSLT naartoe moet transformeren:
<Data>
<Object Type="Equipment" Action="InsertOrUpdate" ChangeStatusTo="EquipmentStatus.Active">
<Property Name="Id" Value="00001" />
<Property Name="Description" Value="Koelinstallatie" />
<Property Name="ExternalId" Value="EXT-001" />
<Property Name="Department.Id" Value="01" />
</Object>
</Data>
Object attributenbewerken
| Attribuut | Beschrijving | Waarden |
|---|---|---|
Type |
De Ultimo entiteit | Equipment, Job, Aoc, Article, etc. |
Action |
De uit te voeren actie | InsertOrUpdate, InsertOrSkip, UpdateOrSkip, Delete |
ChangeStatusTo |
Optionele statuswijziging | Bijv. EquipmentStatus.Active, AocStatus.Active |
Voorbeeld XSLT: AOC import vanuit GMGbewerken
Deze XSLT transformeert een extern XML formaat van de GMG (Gemeentelijke Model Gemeenten) naar het Ultimo importformaat:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/Aocs">
<Data>
<xsl:apply-templates />
</Data>
</xsl:template>
<xsl:template match="Aoc">
<Object Type="Aoc" Action="InsertOrUpdate" ChangeStatusTo="AocStatus.Active">
<Property Name="Id">
<xsl:attribute name="Value">
<xsl:choose>
<xsl:when test="string-length(Id) <= 8">
<xsl:value-of select="concat(Id, '.00')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="Id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</Property>
<Property Name="ExternalId" Value="{Id}" />
<Property Name="Description" Value="{Descr}" />
<Property Name="MainGroup" Value="{MainGroupAocId}" />
</Object>
</xsl:template>
</xsl:stylesheet>
Voorbeeld XSLT: Criticality import vanuit Optimizer+bewerken
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/CriticalityUpdate">
<Data>
<xsl:for-each select="Changes/CriticalityChange">
<Object Type="{OriginType}" Action="UpdateOrSkip">
<Property Name="Id" Value="{OriginId}" />
<xsl:choose>
<xsl:when test="IsCritical = '0'">
<Property Name="ImportedCriticality" Value="2" />
</xsl:when>
<xsl:otherwise>
<Property Name="ImportedCriticality" Value="1" />
</xsl:otherwise>
</xsl:choose>
<Property Name="ExternalStatus" Value="CriticalityUpdate" />
</Object>
</xsl:for-each>
</Data>
</xsl:template>
</xsl:stylesheet>
Voorbeeld XSLT: Geneste objecten (CAD import)bewerken
Bij geneste objecten (parent-child relaties) gebruik je ${Parent.Id} met Evaluate="true":
<Data>
<Object Type="CadImportRun" Action="InsertOrUpdate">
<Property Name="Context" Value="CadImportRunContext.CadImportRunSpace" />
<Property Name="Status" Value="CadImportRunStatus.Created" />
<xsl:for-each select="Rooms/Room">
<Object Type="CadImportLine" Action="InsertOrUpdate">
<Property Name="CadImportRun.Id">
<xsl:attribute name="Value">${Parent.Id}</xsl:attribute>
<xsl:attribute name="Evaluate">true</xsl:attribute>
</Property>
<Property Name="BimGuid" Value="{BimGuid}" />
<Property Name="ImportedSpaceCode" Value="{RoomId}" />
</Object>
</xsl:for-each>
</Object>
</Data>
Response XSLTbewerken
Sommige connectors hebben ook een Response XSLT geconfigureerd. Deze transformeert het Ultimo verwerkingsresultaat terug naar het formaat dat de externe partij verwacht:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Data">
<CriticalityUpdate>
<xsl:for-each select="Object">
<CriticalityChange>
<IdentityTag><xsl:value-of select="Property[@Name='Id']/@Value"/></IdentityTag>
<Result><xsl:value-of select="@Action"/></Result>
<OriginType><xsl:value-of select="@Type"/></OriginType>
<OriginId><xsl:value-of select="Property[@Name='Id']/@Value"/></OriginId>
</CriticalityChange>
</xsl:for-each>
</CriticalityUpdate>
</xsl:template>
</xsl:stylesheet>
Loggingbewerken
Import connectors bieden ingebouwde logging:
| Instelling | Beschrijving |
|---|---|
LogErrorToEventLog |
Log fouten naar de Ultimo Event Log |
LogSuccessToEventLog |
Log succesvolle imports naar de Event Log |
SendResultToEmailSuccess |
Stuur een e-mail bij succesvolle verwerking |
De Event Log in Ultimo toont per import: - Tijdstip van uitvoering - Aantal verwerkte records - Eventuele foutmeldingen per record - De connector die is gebruikt
Rollbackbewerken
Met RollbackOnError="true" worden alle wijzigingen van een import teruggedraaid als er een fout optreedt. Dit garandeert data-integriteit: ofwel alle records worden succesvol verwerkt, ofwel geen enkel record wordt gewijzigd.
| Instelling | Gedrag |
|---|---|
RollbackOnError="true" |
Alles terugdraaien bij fout (transactioneel) |
RollbackOnError="false" |
Succesvolle records behouden, alleen foutieve overslaan |
Advies: Gebruik
RollbackOnError="true"voor kritieke imports waar data-consistentie essentieel is (bijv. financiele data). Gebruik"false"voor bulk imports waar partiele verwerking acceptabel is.
Praktische tips voor consultantsbewerken
- Naamgeving: Gebruik duidelijke connector ID's die de bron en het doel beschrijven (bijv.
AOC_GMG_IMPORT,EQUIPMENT_SAP_SYNC) - DataProvider: Stel altijd een unieke DataProvider in per externe bron voor traceerbaarheid
- Testen: Test XSLT transformaties eerst lokaal met een XML editor voordat je ze in Ultimo configureert
- Foutafhandeling: Activeer
LogErrorToEventLogaltijd, ook in productie - Incrementele imports: Gebruik
${ImportConnector.LastImportSuccess}om alleen gewijzigde data op te halen - Azure migratie: Bij migratie naar Azure moeten bestandsgebaseerde imports worden omgezet naar webservice-imports
Gerelateerde artikelenbewerken
- export-connectors -- Export connectors configuratie
- rest-api -- REST API als alternatief
- http-post -- HTTP POST integratie
- soap -- SOAP/WCF integratie
- Integraties overzicht