Skip to main content
Skip table of contents

XML-Import-Schnittstelle

XML Import-Schnittstelle V 1.0

Schema XML-Import

Voraussetzung

  • In der Datei \client\jboss\custom\configuration.bat muss der Parameter SET XML_IMPORT_DIR= gesetzt werden. (z.B. SET XML_IMPORT_DIR=c:\Temp\xmlimport\ueberwacht)

  • Das Modul CURSOR-Webservice muss lizenziert sein.

  • Damit die Überwachung gestartet wird, muss das Verzeichnis existieren. Außerdem muss in diesem Verzeichnis ein Unterverzeichnis mit dem Windows-Benutzerkürzel des Anwenders existieren. Ist dies nicht vorhanden, wird die Überwachung des Verzeichnisses nicht gestartet

Start des Imports

Beim Start der Anwendung wird der Importer gestartet, wenn Folgendes erfüllt ist:

  • Der Parameter XML_IMPORT_DIR ist gesetzt

  • Das angegebene Verzeichnis existiert

  • Es existiert ein Unterverzeichnis mit dem Kürzel des angemeldeten Benutzers (Windows-Benutzername)

  • Es existiert keine Datei lock.txt im Unterverzeichnis mit dem Benutzerkürzel

Sind diese Vorraussetzungen erfüllt, wird die Überwachung des Import-Verzeichnisses gestartet.

Die Datei 'lock.txt'

Die Datei lock.txt stellt sicher, dass nur ein Client auf dem Rechner den Import starten kann. Wenn die Datei gelöscht wird, so wird die Import-Überwachung automatisch gestoppt.
Ist die Datei beim Start der Anwendung älter als 24 Stunden, so wird die Datei gelöscht und der Import gestartet.
Beim normalen Beenden der Anwendung wird die Datei gelöscht. Sollte die Datei z. B. durch einen Programmabsturz nicht gelöscht worden sein, kann sie manuell gelöscht werden, damit die Überwachung beim nächsten Start wieder gestartet wird.

Ablauf des Imports

Alle 10 Sekunden wird geprüft, ob neue Dateien mit der Endung xml vorhanden sind. Diese Zeit ist über einen PropertyMapper-Eintrag konfigurierbar:

SQL
 INSERT INTO PropertyMapper (Pk, id, property, PropertyType, principal, PropertyValue, CustLayer, Active, CreateDate, CreateUser, UpdateDate, UpdateUser, STATUS, WFInstanceId, RightPk, ClientNo, MassData, OfflineData)
VALUES ('SYSTEM.XMLImporter.ImportPeriod', '/de/cursor/jevi/client/swingclient/importer/SchemaXMLImporter$!!$ImportPeriod', '' ,'SYSTEM', '', '30000', 'CN' 1,
GETDATE(), 'TECH_USER', GETDATE(), 'TECH_USER', NULL, '#EMPTY-KEY#', NULL, NULL, 0, 0)

Die Zeit wird in Millisekunden angegeben, die '30000' steht also für 30 Sekunden. Der Eintrag kann auch aktualisiert werden:

SQL
 UPDATE propertymapper SET propertyvalue = '50000' WHERE pk = 'SYSTEM.XMLImporter.ImportPeriod'

Es wird als erstes geprüft, ob es sich um eine Datei für den bisherigen XML-Import, oder um eine Datei für den Import mittels Schema handelt. Ist ein Tag Config mit den gefüllten Attributen version und testRun vorhanden, so handelt es sich um den Schema Import. Ist dies nicht der Fall, wird die Datei in das Unterverzeichnis failure verschoben.
Dann wird der Import gestartet.
War der Import erfolgreich, so wird die XML-Datei in das Verzeichnis success verschoben. Das vom Import zurückgeliefert Ergebnis wird zusätzlich in das success-Verzeichnis verschoben. Die Datei hat den selben Namen wie die importierte Datei, nur ist hier der Zusatz _Result hinzugefügt. Existiert im success-Verzeichnis die zu verschiebende Datei, so wird das aktuelle Datum in Millisekunden (System.currentTimeMillis) an den Dateinamen angehängt, um den Dateinamen eindeutig zu machen.
War der Import nicht erfolgreich, wird die XML-Datei in das Verzeichnis failure verschoben. Gab es beim Import eine XMLImportException, so werden die zurückgelieferten Einträge auch in das Verzeichnis failure verschoben (mit der angehängten Endung _Result). Auch hier gilt, existiert die Datei schon im failure-Verzeichnis, werden die Millisekunden des aktuellen Datums angefügt.

Struktur

Eingabe

Tags und deren Attribute zur Eingabe

Tags

Attribute

Defaultwert

Mögliche Werte

Ab Version

Entries

-

-

-


Config

transactionTime

Wert muss gesetzt werden

Zeit in Sekunden die eine Transaktion dauern darf



version

Wert muss gesetzt werden

Die Version der Anwendung in die importiert werden soll



testRun

Wert muss gesetzt werden

true, false


Entry

entity

Wert muss gesetzt werden

Alle existenten Entitäten



action

Wert muss gesetzt werden

CREATE - Datensatz anlegen
UPDATE - Datensatz aktualisieren. Sucht, sofern abhängig verwendet, lediglich unterhalb des übergeordneten Satzes.
UPDATE_OR_CREATE - Datensatz aktualisieren, falls einer gefunden wurde, andernfalls neu anlegen. Sucht, sofern abhängig verwendet, lediglich unterhalb des übergeordneten Satzes.
LINK_AND_UPDATE - Datensatz aktualisieren und zum übergeordneten Satz verknüpfen. Sucht zunächst unterhalb des übergeordneten Satzes, und wenn nicht gefunden wurde noch einmal auf Hauptebene.
LINK_AND_UPDATE_OR_CREATE - Datensatz aktualisieren, falls einer gefunden wurde, andernfalls neu anlegen, und zum übergeordneten Satz verknüpfen. Sucht zunächst unterhalb des übergeordneten Satzes, und wenn nicht gefunden wurde noch einmal auf Hauptebene.
DELETE_DATA - Datensatz auf inaktiv setzen. Sucht, sofern abhängig verwendet, lediglich unterhalb des übergeordneten Satzes.
DELETE_LINK - Die Verknüpfung zwischen diesem Datensatz und dem übergeordneten entfernen. Sucht, sofern abhängig verwendet, lediglich unterhalb des übergeordneten Satzes.



found

Wert muss gesetzt werden

ZERO - Kein Datensatz gefunden
ONE - Genau ein Datensatz gefunden
N - Kein, ein oder mehrere Datensätze gefunden
NO_SEARCH - Es wird keine Suche ausgeführt



relation

Leerstring

Die passende Relation zwischen dem aktuellen und dem übergeordneten Entry



rightTemplate

Leerstring

Die zu setzende Rechtevorlage. Dies funktioniert nur bei Neuanlage, nicht beim Update. Die Vorlage muss vom Typ Satzrecht sein. Die Entität muss rechtebehaftet sein.


Field

name

Muss gesetzt werden

Der Attribute-Name des zu bearbeitenden Feldes



fieldType

VALUE

PK - Der Wert ist ein Primärschlüssel
VALUE - Der Wert ein Anzeigewert


identifyingField

false

true, false



clearUnknown

false

true, false

13.2


function

IS_EQUAL

IS_EMPTY - ist leer
IS_NOT_EMPTY - ist nicht leer
IS_EQUAL - ist gleich
IS_NOT_EQUAL - ist nicht gleich
STARTS_WITH - beginnt mit
STARTS_NOT_WITH - beginnt nicht mit
ENDS_WITH - endet mit
ENDS_NOT_WITH - endet nicht mit
CONTAINS - enthält
CONTAINS_NOT - enthält nicht
IS_SMALLER_THEN - ist kleiner als
IS_GREATER_THEN - ist größer als
IS_EQUAL_OR_SMALLER_THEN - ist gleich oder kleiner als
IS_EQUAL_OR_GREATER_THEN - ist gleich oder größer als

13.2

EntityLookupField

name

Muss gesetzt werden

Der Attribute-Name des zu bearbeitenden Feldes



identifyingField

false

true, false

11.2

Link

pk

Muss gesetzt werden

Der Pk des Datensatzes der verlinkt werden soll



entity

Muss gesetzt werden

Die Entität des Datensatzes der verlinkt werden soll



relation

Muss gesetzt werden

Die passende Relation zwischen dem zu verlinkenden und dem aktuellen Entry


Entries

Das 'Entries'-Tag ist das Grundelement der XML-Struktur. Es enthält bei der Eingabe keinerlei Attribute.

Entry

Für jeden zu bearbeitenden Datensatz muss das Entry-Tag verwendet werden.

  • entity enthält die Entität des Datensatzes.

  • action enthält die auszuführende Aktion.

  • found bestimmt bei wie vielen gefundenen Daten eine Aktion ausgeführt werden soll.

  • rightTemplate kann eine Rechtevorlage auf den Datensatz heften. Dies funktioniert nur bei Neuanlage, nicht beim Update. Die Vorlage muss vom Typ Satzrecht sein. Die Entität muss rechtebehaftet sein

  • relation wird gesetzt je nachdem ob das Entry-Tag geschachtelt oder auf Hauptebene verwendet wird und enthält die Relation zwischen den beiden Datensätzen.

XML
<Entry entity="Customer" action="CREATE" found="ZERO" rightTemplate="MSG-Dateien">
...
</Entry>

<Entry entity="Customer" action="CREATE" found="ZERO">
	...
	<Entry entity="Customer" action="DELETE_LINK" found="ONE" relation="rCuCu">
	...
	</Entry>
</Entry>
Config

Das Config Tag dient der Konfiguration des Aufrufs, ist vorgeschrieben und sieht immer gleich aus. Es ist das erste Element in jeder Datei bzw. jedem Aufruf.

  • transactionTime legt fest wie lange der Aufruf maximal dauern darf bevor zurückgerollt wird.

  • version sollte die Version der Anwendung enthalten, für die der Aufruf geschrieben wurde. So kann festgestellt werden ob die Anwendung zum Aufruf kompatibel ist.

  • testRun schaltet zwischen dem Test-Modus und dem tatsächlichen Import um. Der Test-Modus simuliert alle Vorgänge des Imports und rollt am Ende die Transaktion wieder zurück. Der Benutzer erhält Informationen wie der Import verlaufen wäre.

XML
 <Config transactionTime="300" version="9.2" testRun="false"/>

Der Parameter transactionTime definiert, wie lange der Import-Vorgang (in Sekunden) dauern soll. Maximal kann ein Import 24 Stunden dauern. (transactionTime = 86400)

Field

Alle Werte werden in 'Field'-Tags angegeben.

  • name enthält den Attribute-Namen des zu setzenden Feldes.

  • identifyingField legt fest ob bei der Suche nach bestehenden Daten dieses Feld mit einbezogen wird. Große Textfelder, wie z.B. der Aktivitätentext, dürfen nicht als identifizierend markiert werden.

  • fieldType kann im Fall eines Nachschlagefeldes festlegen, dass der Schlüssel nicht validiert wird. In diesem Fall müsste statt dem Schlüssel direkt der Pk des Schlüssel angegeben werden.

  • clearUnknown kann im Fall eines Nachschlagefeldes festlegen, dass der Leerschlüssel eingetragen wird, wenn auf dem Feld der Leerschlüssel erlaubt ist und der Nachschlagewert nicht gefunden wird.

  • function gibt an wie nach den identifizierenden Feldern gesucht wird. Standardmäßig wird nach dem angegebenen Wert mit Gleichheit gesucht. Es ist aber möglich anzugeben, dass er nur enthalten, größer oder klein sein muss etc. Es darf nicht auf jedem Feldtyp jede Funktion gesetzt werden. Siehe dazu in der Tabele unten.

XML
<Field name="FirstName.ContactPerson" identifyingField="true" function="STARTS_WITH">
    <FieldValue>
        <stringValue>Cornelia</stringValue>
    </FieldValue>
</Field>
 
<Field name="DelegatedBy.Activity" identifyingField="false" fieldType="PK">
    <FieldValue>
        <stringValue>ged-personpk34#employee19</stringValue>
    </FieldValue>
</Field>
 
<Field name="Priority.Activity" clearUnknown="true">
    <FieldValue>
        <stringValue>UNKNOWNKEY</stringValue>
    </FieldValue>
</Field>


Je nachdem was das Feld für einen Datentyp hat, müssen Unterschiedliche Tags verwendet werden:

CODE
Datum: 							<dateValue>2008-04-20</dateValue> 		oder 	<dateTimeValue>2008-04-20T17:00:00</dateTimeValue>
 
Text: 							<stringValue>mein Text</stringValue>
 
Nachschlagefeld: 				<stringValue>BNE</stringValue>
 
Ganzzahl: 						<intValue>532</intValue> 				oder 	<longValue>253456345</longValue>
 
Zahl: 							<doubleValue>34.34</doubleValue>


Zahl mit hoher Genauerigkeit:	<bigDecimalValue>1234567890.0987654321</bigDecimalValue>
 
Wahrheitswert: 					<booleanValue>true</booleanValue>

 

Funktion

Einsetzbar für Datentyp

IS_EMPTY

Text, Zahl, Große Textfelder, Datum

IS_NOT_EMPTY

Text, Zahl, Große Textfelder, Datum

IS_EQUAL

Text, Nachschlagefeld, Zahl, Wahrheitswert, Datum

IS_NOT_EQUAL

Text, Nachschlagefeld, Zahl, Datum

STARTS_WITH

Text, Nachschlagefeld, Große Textfelder

STARTS_NOT_WITH

Text, Nachschlagefeld, Große Textfelder

ENDS_WITH

Text, Nachschlagefeld, Große Textfelder

ENDS_NOT_WITH

Text, Nachschlagefeld, Große Textfelder

CONTAINS

Text, Nachschlagefeld, Datum

CONTAINS_NOT

Text, Nachschlagefeld, Datum

IS_SMALLER_THEN

Text, Nachschlagefeld, Zahl, Datum

IS_GREATER_THEN

Text, Nachschlagefeld, Zahl, Datum

IS_EQUAL_OR_SMALLER_THEN

Text, Nachschlagefeld, Zahl, Datum

IS_EQUAL_OR_GREATER_THEN

Text, Nachschlagefeld, Zahl, Datum

EntityLookupField

Um Lookup-Felder zu füllen, bei denen der Wert nicht bekannt ist, sollte das EntityLookupField-Tag verwendet werden. In name wird der Attributename des zu füllenden Feldes angegeben. Dann können beliebig viele Field-Tags angegeben werden um den Wert eindeutig zu identifizieren. Diese sollten jeweils das identifyingField Attribut auf true gesetzt haben.

XML
<EntityLookupField name="DefaultContactPerson.Activity">
	<Field name="FirstName.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>Cornelia</stringValue>
		</FieldValue>
	</Field>
	<Field name="LastName.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>Altenhain</stringValue>
		</FieldValue>
	</Field>
	<Field name="CustomerKey.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>CURSOR GIESSEN</stringValue>
		</FieldValue>
	</Field>
</EntityLookupField>

Ab Version 11.2 kann identifyingField analog zu dem Attribut auf dem Field-Tag genutzt werden. Dies legt fest ob bei der Suche nach bestehenden Daten dieses Feld mit einbezogen wird.

XML
<EntityLookupField name="DefaultContactPerson.Activity" identifyingField="true">
	<Field name="FirstName.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>Cornelia</stringValue>
		</FieldValue>
	</Field>
	<Field name="LastName.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>Altenhain</stringValue>
		</FieldValue>
	</Field>
	<Field name="CustomerKey.ContactPerson" identifyingField="true">
		<FieldValue>
			<stringValue>CURSOR GIESSEN</stringValue>
		</FieldValue>
	</Field>
</EntityLookupField>

Alternativ zur Schachtelung von Datensätzen kann das Link-Tag verwendet werden um Verknüpfungen zu erstellen.

  • pk muss den Primärschlüssel des zu verknüpfenden Datensatzes enthalten.

  • entity muss die Entität des zu verknüpfenden Datensatzes enthalten.

  • relation muss die Relation zwischen dem aktuellen und dem zu verknüpfenden Datensatzes enthalten.

XML
<Link pk="ged-activitypkToepper4" entity="Activity" relation="rCoPeAc"/>

Ausgabe

Zurückgegeben werden alle Field-Tags, die als identifizierend markiert sind, alle Link-Tags, sowie alle EntityLookupFields. Hinzu kommen eine Reihe weiterer informativer Tags. Ein Beispiel für eine Rückgabestruktur:

XML
<Entries success="true">
    <Config testRun="false" version="9.2" transactionTime="300"/>
    <Entry found="ZERO" action="CREATE" entity="Activity">
        <CompletionType>SUCCESS</CompletionType>
        <ModificationType>CREATE</ModificationType>
        <PrimaryKeys>
            <Pk value="3fnvmsi143btagn0Ac"/>
        </PrimaryKeys>
        <Field identifyingField="true" name="Subject.Activity">
            <FieldValue>
                <stringValue>Umstieg Lohn: Zentralverband Elektrotechnik</stringValue>
            </FieldValue>
        </Field>
        <Field identifyingField="true" name="FreeText2.Activity">
            <FieldValue>
                <stringValue>Umstieg kann erfolgen.</stringValue>
            </FieldValue>
        </Field>
    </Entry>
</Entries>


Tags und deren Attribute der Rückgabe

Tags

Attribute

Defaultwert

Mögliche Werte

Entries

success

Wert wird in Antwort gesetzt

Status des Imports: Erfolg/Misserfolg

ErrorMessage

-

-

-

CompletionType

type

Wird vom System passend gesetzt

SUCCESS, ERROR

ModificationType

type

Wird vom System passend gesetzt

CREATE, UPDATE, DELETE, LINK, UNLINK, NO_MODIFICATION

Pk

value

Wird vom System passend gesetzt

Der Pk des bearbeiteten Datensatzes

Entries

In der Rückgabestruktur hat das Entries-Tag das Attribut success. Anhand dieses Attributs kann auf den ersten Blick erkannt werden ob der Import funktioniert hat, oder ob irgendwo ein Fehler aufgetreten ist.

XML
<Entries success="true">
ErrorMessage

Im ErrorMessage-Tag werden jegliche Fehlermeldungen angezeigt. Es kann unterhalb von Entry, Field und EntityLookupField auftauchen.

XML
<ErrorMessage>Das Feld existiert nicht in dieser Entität!</ErrorMessage>
CompletionType

Das CompletionType-Tag zeigt an ob ein Entry erfolgreich bearbeitet wurde, oder nicht.

XML
<CompletionType>SUCCESS</CompletionType>
ModificationType

Der ModificationType gibt an was an dem Entry geändert wurde. Wurde der Datensatz beispielsweise aktualisiert wurde hier UPDATE stehen. Wenn nichts passiert ist wäre der Wert NO_MODIFICATION. Dabei kann auch im Erfolgsfall NO_MODIFICATION angegeben sein, beispielsweise wenn nur gelöscht werden soll, wenn exakt ein Datensatz gefunden wurde (found="ONE").

XML
<ModificationType>CREATE</ModificationType>
PrimaryKeys

Das 'PrimaryKeys'-Tag dient nur dem sammeln der Pk-Tags und hat keine weiteren Attribute.

Pk

In Pk-Tags werden (im value-Attribute) die Pks aller Datensätze zurückgegeben, die Einfluss auf die abgearbeiteten Aktionen hatten. Beispielsweise werden die Pks von angelegten, aktualisierten, gelöschten oder verlinkten Datensätzen zurück gegeben. Aber auch die Pks aller anhand der identifizierenden Felder gefundener Datensätze, wenn nichts getan wurde weil so keine Eindeutigkeit bestand.

XML
<Pk value="3fnvmsi143btagn0Ac"/>

Tag Reihenfolge

Folgende Reihenfolge der Tags ist einzuhalten:

  • Config

  • Entry

    • Field

    • EntityLookupField

    • Link

    • Entry

      • Field

      • ...

  • Entry

  • ...

XML
<Entries>
    <Config transactionTime="" version="" testRun=""/>
 
    <Entry entity="" action="" found="" rightTemplate="">
        <Field name="" identifyingField="">
            <FieldValue>
                <stringValue></stringValue>
            </FieldValue>
        </Fields>
        <Field name="" identifyingField="">
            <FieldValue>
                <stringValue></stringValue>
            </FieldValue>
        </Fields>
        <EntityLookupField name="">
            <Field name="" value="" identifyingField=""/>
        </EntityLookupField>
        <EntityLookupField name="">
            <Field name="" value="" identifyingField=""/>
        </EntityLookupField>
 
        <Link pk="" entity="" relation=""/>
        <Link pk="" entity="" relation=""/>
        <Link pk="" entity="" relation=""/>
        <Entry entity="" action="" found="" relation="">
        ...
        </Entry>
    </Entry>
 
    <Entry entity="" action="" found="" rightTemplate="">
    ...
    </Entry>
</Entries>

Aktionen

Datensatz anlegen

Das folgende Beispiel importiert eine Aktivität, wenn keine andere Aktivität mit dem selben Betreff gefunden wird.

XML
<Entry entity="Activity" action="CREATE" found="ZERO">
    <Field name="Subject.Activity" identifyingField="true">
        <FieldValue>
            <stringValue>Bestätigung</stringValue>
        </FieldValue>
    </Field>
    <Field name="Text.Activity" identifyingField="false">
        <FieldValue>
            <stringValue>Der Eingang der Angebotsdokumente wurde bestätigt.</stringValue>
        </FieldValue>
    </Field>
    <Field name="DelegatedBy.Activity" identifyingField="false">
        <FieldValue>
            <stringValue>BNE</stringValue>
        </FieldValue>
    </Field>
    <Field name="DelegatedTo.Activity">
        <FieldValue>
            <stringValue>BNE</stringValue>
        </FieldValue>
    </Field>
    <Field name="ActStatusKey.Activity">
        <FieldValue>
            <stringValue>O</stringValue>
        </FieldValue>
    </Field>
    <Field name="ActTypeKey.Activity">
        <FieldValue>
            <stringValue>TELEIN</stringValue>
        </FieldValue>
    </Field>
    <Field name="StartDate.Activity">
        <FieldValue>
            <dateTimeValue>2008-04-20T17:00:00</dateTimeValue>
        </FieldValue>
    </Field>
    <Field name="EndDate.Activity">
        <FieldValue>
            <dateTimeValue>2008-04-27T17:00:00</dateTimeValue>
        </FieldValue>
    </Field>
    <Field name="FreeNumber1.Activity" identifyingField="false">
        <FieldValue>
            <doubleValue>42.0</doubleValue>
        </FieldValue>
    </Field>
    <Field name="DefaultOpportunity.Activity" identifyingField="false" fieldType="PK">
        <FieldValue>
            <stringValue>ged-opportunitypk3</stringValue>
        </FieldValue>
    </Field>
    <EntityLookupField name="DefaultContactPerson.Activity">
        <Field name="FirstName.ContactPerson" identifyingField="true">
            <FieldValue>
                <stringValue>Cornelia</stringValue>
            </FieldValue>
        </Field>
        <Field name="LastName.ContactPerson" identifyingField="true">
            <FieldValue>
                <stringValue>Altenhain</stringValue>
            </FieldValue>
        </Field>
        <Field name="CustomerKey.ContactPerson" identifyingField="true">
            <FieldValue>
                <stringValue>CURSOR GIESSEN</stringValue>
            </FieldValue>
        </Field>
    </EntityLookupField>
</Entry>

Datensatz löschen

Ein Datensatz kann nur durch den Modus DELETE_DATA entfernt werden und nicht durch setzen des Active-Feldes. Das folgende Beispiel löscht alle Anfragen mit einem Anfragewert von 42,42 und der Beschreibung "Meine Anfrage".

XML
 <Entry entity="Opportunity" action="DELETE_DATA" found="N">
    <Field name="OpName.Opportunity" identifyingField="true">
        <FieldValue>
            <stringValue>Meine Anfrage</stringValue>
        </FieldValue>
    </Field>
    <Field name="Projectvalue.Opportunity" identifyingField="true">
        <FieldValue>
            <doubleValue>42.42</doubleValue>
        </FieldValue>
    </Field>
</Entry>

Hier hingegen wird nur ein Datensatz gezielt gelöscht, erfüllen mehrere Datesätze die Suchkriterien passiert nichts.

XML
<Entry entity="Opportunity" action="DELETE_DATA" found="ONE">
    <Field name="OpName.Opportunity" identifyingField="true">
        <FieldValue>
            <stringValue>Meine Anfrage</stringValue>
        </FieldValue>
    </Field>
    <Field name="Projectvalue.Opportunity" identifyingField="true">
        <FieldValue>
            <doubleValue>42.42</doubleValue>
        </FieldValue>
    </Field>
</Entry>

Datensatz reaktivieren

Soll ein gelöschter Datensatz reaktivert werden, muss das Active-Feld auf true gesetzt werden. Im selben Durchlauf können auch weitere Aktualisierungen erfolgen. Dieses Beispiel reaktiviert den Ansprechpartner Carl Meyer, sofern dieser gelöscht ist, und setzt seinen Typ auf H. Existiert noch kein Carl Meyer, wird er angelegt.

XML
 <Entry entity="ContactPerson" action="UPDATE_OR_CREATE" found="ONE">
    <Field name="MatchCode.ContactPerson" identifyingField="true">
        <FieldValue>
            <stringValue>CARL MEYER</stringValue>
        </FieldValue>
    </Field>
    <Field name="FirstName.ContactPerson" identifyingField="true">
        <FieldValue>
            <stringValue>Carl</stringValue>
        </FieldValue>
    </Field>
    <Field name="LastName.ContactPerson" identifyingField="true">
        <FieldValue>
            <stringValue>Meyer</stringValue>
        </FieldValue>
    </Field>
    <Field name="Sex.ContactPerson">
        <FieldValue>
            <stringValue>H</stringValue>
        </FieldValue>
    </Field>
    <Field name="Active.ContactPerson">
        <FieldValue>
            <booleanValue>true</booleanValue>
        </FieldValue>
    </Field>
</Entry>

Datensätze verknüpfen

Um Datensätze zu verknüpfen, müssen sie geschachtelt werden. Dabei ist es egal ob sie erstellt, aktualisiert oder nur verknüpft werden. Dieses Beispiel verknüpft den Vertrag mit der Bezeichnung "Vertrag mit Kleingedrucktem" und der Nummer "4815162342" mit dem gerade erstellten Projekt. Da alle Felder als identifizierend markiert sind, wird dabei nichts aktualisiert. Existiert kein solcher Vertrag wird einer erstellt und dann verknüpft.

XML
<Entry entity="Project" action="CREATE" found="NO_SEARCH">
    <Field name="Matchcode.Project">
        <FieldValue>
            <stringValue>GROSSPROJEKT</stringValue>
        </FieldValue>
    </Field>
    <Field name="CoordinatorKey.Project">
        <FieldValue>
            <stringValue>BNE</stringValue>
        </FieldValue>
    </Field>
    <Field name="DefaultCustomer.Project">
        <FieldValue>
            <stringValue>DEUTSCHE BANK</stringValue>
        </FieldValue>
    </Field>
    <Entry entity="Contract" action="LINK_AND_UPDATE_OR_CREATE" found="ONE" relation="rCnPj">
        <Field name="ContTitle.Contract" identifyingField="true">
            <FieldValue>
                <stringValue>Vertrag mit Kleingedrucktem</stringValue>
            </FieldValue>
        </Field>
        <Field name="ContNo.Contract" identifyingField="true">
            <FieldValue>
                <stringValue>4815162342</stringValue>
            </FieldValue>
        </Field>
    </Entry>
</Entry>

Alternativ kann das Link-Tag verwendet werden.

Datensatzverknüpfung löschen

Um die Verknüpfung zwischen 2 Datensätzen zu entfernen, nicht aber die Datensätze selbst, ist die Aktion DELETE_LINK vorgesehen.

XML
 <Entry entity="Customer" action="UPDATE" found="ONE">
    <Field name="MatchCode.Customer" identifyingField="true">
        <FieldValue>
            <stringValue>ADAC MÜNCHEN ZENTRALE - INTERESSEN</stringValue>
        </FieldValue>
    </Field>
    <Field name="Name1.Customer" identifyingField="true">
        <FieldValue>
            <stringValue>ADAC e.V.</stringValue>
        </FieldValue>
    </Field>
    <Entry entity="Customer" action="DELETE_LINK" found="ONE" relation="rCuCu">
        <Field name="MatchCode.Customer" identifyingField="true">
            <FieldValue>
                <stringValue>CURSOR ENTWICKLUNG</stringValue>
            </FieldValue>
        </Field>
        <Field name="Name1.Customer" identifyingField="true">
            <FieldValue>
                <stringValue>CURSOR Software AG</stringValue>
            </FieldValue>
        </Field>
        <Field name="Name2.Customer" identifyingField="true">
            <FieldValue>
                <stringValue>Entwicklung</stringValue>
            </FieldValue>
        </Field>
    </Entry>
</Entry>

Datensatz aktualisieren

Ein oder mehrere Datensätze können folgendermaßen aktualisiert werden.

XML
<Entry entity="ContactPerson" action="UPDATE" found="ONE">
    <Field name="MatchCode.ContactPerson" identifyingField="true">
        <FieldValue>
            <stringValue>BEN LINUS</stringValue>
        </FieldValue>
    </Field>
    <Field name="FirstName.ContactPerson">
        <FieldValue>
            <stringValue>Benjamin</stringValue>
        </FieldValue>
    </Field>
    <Field name="LastName.ContactPerson" identifyingField="true">
        <FieldValue>
            <stringValue>Linus</stringValue>
        </FieldValue>
    </Field>
    <Field name="Sex.ContactPerson">
        <FieldValue>
            <stringValue>H</stringValue>
        </FieldValue>
    </Field>
    <Link pk="ged-activitypkToepper4" entity="Activity" relation="rCoPeAc"/>
</Entry>

Behandlung von Rollen, Adressen und Telekommunikation

Das Anlegen von Rollen Geschäftspartner, Ansprechpartner bzw. Mitarbeiter ist besonderen Einschränkungen aufgrund der speziellen Datenstruktur unterworfen.

Legt der Benutzer eine Rolle an, so werden automatisch eine Person, eine Adresse sowie mehrere Telekommunikations-Datensätze angelegt. Im Geschäftspartner sind Felder der Adresse delegiert, welche bei der Neuanlage oder beim Update direkt gesetzt werden können. Gleiches gilt für die Telekommunikation. Eine Adresse und eine Telekommunikation kann immer nur abhängig von einer Rolle bearbeitet werden, d.h. der Entry-Eintrag muss verschachtelt angegeben sein.

Das erste Beispiel legt einen neuen Geschäftspartner an, bei dem die Adresse und Telefonnummern direkt gespeichert werden. Die Telekommunikation wird als Standard Telekommunikation gespeichert. Die Adresse wird als Anzeige-, Post- und Standard-Adresse gespeichert.

XML
 <Entries>
    <Config transactionTime="2000" version="9.2.0" testRun="false"/>
    <Entry entity="Customer" action="CREATE" found="ZERO">
        <Field name="MatchCode.Customer" identifyingField="true">
            <FieldValue><stringValue>MUSTERMANN AG</stringValue></FieldValue>
        </Field>
        <Field name="Name1.Customer" identifyingField="false" >
            <FieldValue><stringValue>Mustermann</stringValue></FieldValue>
        </Field>
        <Field name="Name2.Customer" identifyingField="false" >
            <FieldValue><stringValue>AG</stringValue></FieldValue>
        </Field>
        <Field name="PeAddressType.Customer" identifyingField="false" >
            <FieldValue><stringValue>STRASSE</stringValue></FieldValue>
        </Field>
        <Field name="PeStreet.Customer" identifyingField="false" >
            <FieldValue><stringValue>Hauptstraße</stringValue></FieldValue>
        </Field>
        <Field name="PeStreetNumber.Customer" identifyingField="false" >
            <FieldValue><stringValue>1</stringValue></FieldValue>
        </Field>
        <Field name="PeCity.Customer" identifyingField="false" >
            <FieldValue><stringValue>Hauptstadt</stringValue></FieldValue>
        </Field>
        <Field name="PeZIP.Customer" identifyingField="false" >
            <FieldValue><stringValue>10000</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoCountry.Customer" identifyingField="false" >
            <FieldValue><stringValue>+49</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoCity.Customer" identifyingField="false" >
            <FieldValue><stringValue>01234</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoBase.Customer" identifyingField="false" >
            <FieldValue><stringValue>56789</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoExtension.Customer" identifyingField="false" >
            <FieldValue><stringValue>0</stringValue></FieldValue>
        </Field>
    </Entry>
</Entries>

Sollen weitere Felder der Adresse eingetragen werden (z.B. Freifelder), so muss dies per Update auf der Adresse passieren, da die Adresse bei der Neuanlage des Geschäftspartner automatisch angelegt wird. Mit einem Geschäftspartner können mehrere Adressen verknüpft sein, so dass identifizierende Felder aufgenommen werden müssen. Bei Adressen zu Geschäftspartner sind das die Felder Anzeige- (DefaultCuAd.Address) bzw. Postadresse (LetterCuAd.Address).

Bei der Telekommunikation ist das Feld Standard Telekommunikation (IsDefault) das identifizierende Feld.

XML
<Entries>
    <Config transactionTime="2000" version="9.2.0" testRun="false"/>
    <Entry entity="Customer" action="CREATE" found="ZERO">
        <Field name="MatchCode.Customer" identifyingField="true">
            <FieldValue><stringValue>MUSTERMANN2 AG</stringValue></FieldValue>
        </Field>
        <Field name="Name1.Customer" identifyingField="false" >
            <FieldValue><stringValue>Mustermann2</stringValue></FieldValue>
        </Field>
        <Field name="Name2.Customer" identifyingField="false" >
            <FieldValue><stringValue>AG</stringValue></FieldValue>
        </Field>
        <Entry entity="Address" action="UPDATE" found="ONE" relation="rCuAd">
            <Field name="DefaultCuAd.Address" identifyingField="true">
                <FieldValue><booleanValue>true</booleanValue></FieldValue>
            </Field>
            <Field name="LetterCuAd.Address" identifyingField="true">
                <FieldValue><booleanValue>true</booleanValue></FieldValue>
            </Field>
            <Field name="City.Address" identifyingField="false">
                <FieldValue><stringValue>Hauptstadt</stringValue></FieldValue>
            </Field>
            <Field name="CountryKey.Address" identifyingField="false">
                <FieldValue><stringValue>D</stringValue></FieldValue>
            </Field>
            <Field name="AddressType.Address" identifyingField="false">
                <FieldValue><stringValue>STRASSE</stringValue></FieldValue>
            </Field>
            <Field name="NameKey.Address" identifyingField="false">
                <FieldValue><stringValue>BÜRO</stringValue></FieldValue>
            </Field>
            <Field name="Street.Address" identifyingField="false">
                <FieldValue><stringValue>Hauptstraße</stringValue></FieldValue>
            </Field>
            <Field name="StreetNumber.Address" identifyingField="false">
                <FieldValue><stringValue>1</stringValue></FieldValue>
            </Field>
            <Field name="StreetNumberAddition.Address" identifyingField="false">
                <FieldValue><stringValue>a</stringValue></FieldValue>
            </Field>
            <Field name="ZIPKey.Address" identifyingField="false">
                <FieldValue><stringValue>10000</stringValue></FieldValue>
            </Field>
            <Field name="State.Address" identifyingField="false">
                <FieldValue><stringValue>Berlin</stringValue></FieldValue>
            </Field>
        </Entry>
        <Entry entity="Telecom" action="UPDATE" found="ONE" relation="CuTe">
            <Field name="IsDefault.Telecom" identifyingField="true">
                <FieldValue><booleanValue>true</booleanValue></FieldValue>
            </Field>
            <Field name="PhoneNoCountry.Telecom" identifyingField="false">
                <FieldValue><stringValue>+49</stringValue></FieldValue>
            </Field>
            <Field name="PhoneNoCity.Telecom" identifyingField="false">
                <FieldValue><stringValue>01234</stringValue></FieldValue>
            </Field>
            <Field name="PhoneNoBase.Telecom" identifyingField="false">
                <FieldValue><stringValue>56789</stringValue></FieldValue>
            </Field>
            <Field name="PhoneNoExtension.Telecom" identifyingField="false">
                <FieldValue><stringValue>0</stringValue></FieldValue>
            </Field>
            <Field name="NameKey.Telecom" identifyingField="false">
                <FieldValue><stringValue>BÜRO</stringValue></FieldValue>
            </Field>
            <Field name="Email.Telecom" identifyingField="false">
                <FieldValue><stringValue>info@mustermannag.de</stringValue></FieldValue>
            </Field>
        </Entry>
    </Entry>
</Entries>

Um eine weitere Adresse, z.B. ein Postfach, anzulegen und diese als Postadresse des Geschäftspartner zu markieren, müssen die Felder Post- bzw. Anzeigeadresse korrekt gesetzt werden. Im Beispiel wird zu der bereits vorhandenen Adresse eine zweite Adresse angelegt und als Postadresse markiert.

XML
<Entries>
    <Config transactionTime="2000" version="9.2.0" testRun="true"/>
    <Entry entity="Customer" action="CREATE" found="ZERO">
        <Field name="MatchCode.Customer" identifyingField="true">
            <FieldValue><stringValue>MUSTERMANN3 AG</stringValue></FieldValue>
        </Field>
        <Field name="Name1.Customer" identifyingField="false" >
            <FieldValue><stringValue>Mustermann3</stringValue></FieldValue>
        </Field>
        <Field name="Name2.Customer" identifyingField="false" >
            <FieldValue><stringValue>AG</stringValue></FieldValue>
        </Field>
        <Field name="PeAddressType.Customer" identifyingField="false" >
            <FieldValue><stringValue>STRASSE</stringValue></FieldValue>
        </Field>
        <Field name="PeStreet.Customer" identifyingField="false" >
            <FieldValue><stringValue>Hauptstraße</stringValue></FieldValue>
        </Field>
        <Field name="PeStreetNumber.Customer" identifyingField="false" >
            <FieldValue><stringValue>1</stringValue></FieldValue>
        </Field>
        <Field name="PeCity.Customer" identifyingField="false" >
            <FieldValue><stringValue>Hauptstadt</stringValue></FieldValue>
        </Field>
        <Field name="PeZIP.Customer" identifyingField="false" >
            <FieldValue><stringValue>10000</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoCountry.Customer" identifyingField="false" >
            <FieldValue><stringValue>+49</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoCity.Customer" identifyingField="false" >
            <FieldValue><stringValue>01234</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoBase.Customer" identifyingField="false" >
            <FieldValue><stringValue>56789</stringValue></FieldValue>
        </Field>
        <Field name="PhoneNoExtension.Customer" identifyingField="false" >
            <FieldValue><stringValue>0</stringValue></FieldValue>
        </Field>
        <Entry entity="Address" action="CREATE" found="ZERO" relation="rCuAd">
            <Field name="AddressType.Address" identifyingField="true">
                <FieldValue><stringValue>POSTFACH</stringValue></FieldValue>
            </Field>
            <Field name="DefaultCuAd.Address" identifyingField="false">
                <FieldValue><booleanValue>false</booleanValue></FieldValue>
            </Field>
            <Field name="LetterCuAd.Address" identifyingField="false">
                <FieldValue><booleanValue>true</booleanValue></FieldValue>
            </Field>
            <Field name="City.Address" identifyingField="false">
                <FieldValue><stringValue>Hauptstadt</stringValue></FieldValue>
            </Field>
            <Field name="CountryKey.Address" identifyingField="false">
                <FieldValue><stringValue>D</stringValue></FieldValue>
            </Field>
            <Field name="NameKey.Address" identifyingField="false">
                <FieldValue><stringValue>BÜRO</stringValue></FieldValue>
            </Field>
            <Field name="ZIPKey.Address" identifyingField="false">
                <FieldValue><stringValue>10001</stringValue></FieldValue>
            </Field>
            <Field name="Street.Address" identifyingField="false">
                <FieldValue><stringValue>Postfach</stringValue></FieldValue>
            </Field>
            <Field name="State.Address" identifyingField="false">
                <FieldValue><stringValue>Berlin</stringValue></FieldValue>
            </Field>
        </Entry>
    </Entry>
</Entries>

Beim Update oder Neuanlage von Adressen und Telekommunikation werden die Daten in den abhängigen Rollen aktualisiert.

Übernahme von Adressen

Ein weitere Sonderbehandlung gibt es zwischen Ansprechpartner und Geschäftspartner:

Bei dieser XML Struktur erhält der Ansprechpartner Verknüpfungen zu allen Geschäftspartneradressen:

XML
 <Entries>
    <Config transactionTime="350" version="13.1" testRun="false" />
    <Entry entity="Customer" action="UPDATE" found="ONE">
        <Field name="MatchCode.Customer" identifyingField="true">
            <FieldValue><stringValue>BEISPIEL GMBH</stringValue></FieldValue>
        </Field>
        <Entry entity="ContactPerson" action="CREATE" relation="rCustomerKey_ContactPerson" found="ZERO">
            <Field name="LastName.ContactPerson" identifyingField="true">
                <FieldValue><stringValue>Müller</stringValue></FieldValue>
            </Field>
            <Field name="FirstName.ContactPerson" identifyingField="true">
                <FieldValue><stringValue>Hans</stringValue></FieldValue>
            </Field>
        </Entry>
    </Entry>
</Entries>

Bei dieser nicht:

XML
<Entries>
    <Config transactionTime="350" version="13.1" testRun="false" />
    <Entry entity="ContactPerson" action="CREATE" found="ZERO">
        <Field name="LastName.ContactPerson" identifyingField="true">
            <FieldValue><stringValue>Müller</stringValue></FieldValue>
        </Field>
        <Field name="FirstName.ContactPerson" identifyingField="true">
            <FieldValue><stringValue>Hans</stringValue></FieldValue>
        </Field>
        <Entry entity="Customer" action="LINK_AND_UPDATE" found="ONE">
            <Field name="MatchCode.Customer" identifyingField="true" relation="rCustomerKey_ContactPerson">
                <FieldValue><stringValue>BEISPIEL GMBH</stringValue></FieldValue>
            </Field>
        </Entry>
    </Entry>
</Entries>

Besonderheit: Aktionen auf Schlüsseltabellen (S_Keytab/KeyTabNum oder KeyRange)

Grundsätzlich werden die Aktionen in der XML-Datei auf die gleiche Weise wie beschrieben definiert. Allerdings gibt es bei Aktionen auf Schlüsseltabellen einige Einschränkungen, auf die bei der Verwendung des XML-Imports geachtet werden muss.

  • Die Aktionen werden immer auf höchster Ebene (TopLevel) ausgeführt. Es ist nicht möglich, mehrere <Entry>-Einträge zu schachteln, weil keine Relationen unter Schlüsseln existieren.

  • Folgende Aktionen sind bei Schlüsseltabellen nicht anwendbar:

    • LINK_AND_UPDATE, LINK_AND_UPDATE_OR_CREATE, DELETE_LINK:

      • Da keine Relationen existieren, können auch keine LINK-Operationen durchgeführt werden.

    • UPDATE_OR_CREATE (ONE / N)

      • Da für eine UPDATE oder CREATE Aktion verschiedene Vorbedingungen geprüft werden müssen (siehe unten) und dazu bereits im Parser Suchen ausgeführt werden müssten, um die korrekte Syntax zu prüfen, wurden diese Aktionen verboten.

  • Es ist aktuell nicht möglich, in einer einzigen XML-Datei zuerst eine KeyRange anzulegen und zu dieser Range direkt im Anschluss neue Schlüssel anzulegen. Die neu angelegte Range kann in der gleichen Transaktion noch nicht verwendet werden (wird in 9.2.50 bearbeitet).

Neben diesen grundsätzlichen Einschränkungen, müssen für die verbleibenden Aktionen bestimmte Vorbedingungen eingehalten werden.

  • CREATE

    • S_Keytab/KeyTabNum --- Bei der Neuanlage von Schlüsseln müssen zwingend die Felder KeyName + KeyRange angegeben werden.

Beispiel:

XML
 <Entry entity="KeytabNum" action="CREATE" found="ZERO">
    <Field name="Pk.KeytabNum" identifyingField="true">
        <FieldValue>
            <stringValue>TESTKEY1</stringValue>
        </FieldValue>
    </Field>
    <!-- Error: KeyName.KeytabNum muss bei dieser Aktion zwingend angegeben werden.-->
    <Field name="DisplayName.KeytabNum" identifyingField="false">
        <FieldValue>
            <stringValue>Testschlüssel</stringValue>
        </FieldValue>
    </Field>
    <!-- Error: KeyRange.KeytabNum muss bei dieser Aktion zwingend angegeben werden. -->
</Entry>
    • KeyRange --- Bei der Neuanlage von Schlüsselbereichen müssen zwingend die Felder Pk + DataType angegeben werden.

Beispiel:

XML
<Entry entity="KeyRange" action="CREATE" found="ZERO">
    <!-- Error: Pk.KeyRange muss bei dieser Aktion zwingend angegeben werden. -->
    <Field name="Description.KeyRange" identifyingField="true">
        <FieldValue>
            <stringValue>Testrange String 1</stringValue>
        </FieldValue>
    </Field>
    <Field name="DataType.KeyRange" identifyingField="false">
        <FieldValue>
            <stringValue>java.lang.String</stringValue>
        </FieldValue>
    </Field>
</Entry>

<Entry entity="KeyRange" action="CREATE" found="ZERO">
    <Field name="Pk.KeyRange" identifyingField="true">
        <FieldValue>
            <stringValue>TEST_RANGE_STRING2</stringValue>
        </FieldValue>
    </Field>
    <Field name="Description.KeyRange" identifyingField="false">
        <FieldValue>
            <stringValue>Testrange String 1</stringValue>
        </FieldValue>
    </Field>
    <!-- Error: DataType.KeyRange muss bei dieser Aktion zwingend angegeben werden. -->
</Entry>
  • UPDATE + N

    • S_Keytab/KeyTabNum --- Diese Aktion liefert im Normalfall mehrere Datensätze als Suchergebnis. In allen Datensätzen werden dann die angegebenen Felder auf die gleichen Werte gesetzt. Daher müssen bei dieser Aktion die Felder Pk + KeyName als IdentifyingFields definiert werden oder weggelassen werden. Werden sie als Id-Fields definiert, liefert die Suche nur noch ein einziges Ergebnis und die Aktion ist äquivalent zu UPDATE + ONE. Es ist nicht möglich, bei mehreren Datensätzen diese Felder auf den gleichen Wert zu setzten. Dadurch ginge die Eindeutigkeit der Schlüssel verloren.

Beispiel:

CODE
<Entry entity="KeytabNum" action="UPDATE" found="N">
    <!-- Error: Pk kann nicht mit UPDATE + N verändert werden. Entweder identifyingField = true oder Feld entfernen. -->
    <Field name="Pk.KeytabNum" identifyingField="false">
        <FieldValue>
            <stringValue>TESTKEY1</stringValue>
        </FieldValue>
    </Field>
    <Field name="DisplayName.KeytabNum" identifyingField="true">
        <FieldValue>
            <stringValue>Testschlüssel</stringValue>
        </FieldValue>
    </Field>
    <!-- Error: KeyName kann nicht mit UPDATE + N verändert werden. Entweder identifyingField = true oder Feld entfernen. -->
    <Field name="KeyName.KeytabNum" identifyingField="false">
        <FieldValue>
            <intValue>212345</intValue>
        </FieldValue>
    </Field>
    <Field name="KeyRange.KeytabNum" identifyingField="false">
        <FieldValue>
            <stringValue>S_PRJSTA</stringValue>
        </FieldValue>
    </Field>
    <Field name="ParentPk.KeytabNum" identifyingField="false">
        <FieldValue>
            <stringValue>S_PRJSTA-100</stringValue>
        </FieldValue>
    </Field>
</Entry>

Besonderheit: Aktionen auf Angebotspositionen (QuoteItem)

Angebotspoisitonen müssen immer unterhalb eines ANgebots angelegt werden und zusätzlich muss der Positions-Satz den QuotePK enthalten.

CODE
<Entry entity="Quote" action="UPDATE" found="ONE">    
    <Field name="Quoteno.Quote" identifyingField="true">
        <FieldValue>
            <stringValue>ANG 0000002</stringValue>
        </FieldValue>
    </Field>
    <Entry entity="QuoteItem" action="CREATE" found="NO_SEARCH" relation="rQuotePK_QuoteItem">
        <Field name="QuotePK.QuoteItem" fieldType="PK">
            <FieldValue>
                <stringValue>fvvvvvv7hk88i1am8op7sgQu</stringValue>
            </FieldValue>
        </Field>
        ...
    </Entry>
</Entry>

Probleme/Lösungen

Folgende Probleme bei der Benutzung der Schnittstelle sind bekannt:

Composed-Felder

Die Felder ComposedAddress, ComposedFax, ComposedMobilePhone und ComposedPhone auf den verschiedenen Rollen können nicht gesetzt werden. Die XML-Import-Schnittstelle ignoriert entsprechende Eingaben, da diese Felder aus mehreren anderen Feldern zusammengesetzt werden und in der Anwendung schreibgeschützt sind. Hier bitte die einzelnen Felder füllen (Beispiel ComposedPhone: PhoneNoCountry, PhoneNoCity, PhoneNoBase und PhoneNoExtension) .

Gelöschte Daten

Die Rückgabestruktur zeigt an, dass ein entsprechender Datensatz bereits existiert, in der Anwendung kann aber keiner gefunden werden? Die XML-Import Schnittstelle findet auch gelöscht Datensätze um diese auf Wunsch reaktivieren zu können. Mit hoher Wahrscheinlichkeit existiert ein entsprechender Eintrag bereits und ist lediglich deaktiviert.

Sonderzeichen

Sollen die Zeichen &, < oder > genutzt werden, muss um das entsprechende Feld ein CDATA-Block gesetzt werden, da sonst kein valides XML mehr gegeben wäre. Beispiel:

XML
 <Entries>
    <Config transactionTime="36000" version="9.2" testRun="false"/>
    <Entry entity="Activity" action="CREATE" found="ZERO">
        <Field name="Subject.Activity" identifyingField="true">
            <FieldValue>
                <stringValue><![CDATA[Anruf Müller & Söhne]]></stringValue>
            </FieldValue>
        </Field>
    </Entry>
</Entries>

Nachschlagefelder mit Validierungsfeldern

Nachschlagefelder mit eingetragenen Validierungsfeldern können nicht korrekt behandelt werden und erzeugen die Nachricht "Die Validierung des Nachschlagefeldes ist fehlgeschlagen.". In der Auslieferungsversion trifft dies nur auf das Feld 'DefaultContactPerson.Activity' zu. Um das Problem zu umgehen sollte hier das 'EntityLookupField'-Tag eingesetzt oder statt dem Wert der Pk genutzt werden (fieldType="PK").

Zu viele Datensätze gefunden 

Die XML-Import Schnittstelle findet auch inaktive Datensätze.

Wenn für die eingegebenen Kriterien mehr Datensätze gefunden werden als erwartet, handelt es sich dabei eventuell um inaktive Datensätze. Um diese auszuschließen muss das 'Active' Feld als identifizierend makriert werden. Beispiel auf der Aktivität:

CODE
<Field name="Active.Activity" identifyingField="true">
    <FieldValue>
        <stringValue>true</stringValue>
    </FieldValue>
</Field>

Falsche Codierung der Templatedatei

Tritt eine Fehlermeldung folgender Art auf, ist sehr wahrscheinlich der CURSOR-Importer genutzt worden und dessen Templatedatei wurde falsch codiert. Zur Erinnerung: Sie muss "UTF-8 ohne BOM" codiert sein.

CODE
org.apache.axis2.AxisFault: de.cursor.util.xml.binding.XMLBindingException: javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-complex-type.2.3: Element 'Entries' cannot have character [children],
because the type's content type is element-only.]

Felder leeren

Versucht man ein Feld zu "leeren", kommt es bei Zahl-, Boolean- oder Datumsfeldern zu einer Fehlermeldung dieser Art:

CODE
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '' is not a valid value for 'double'.]

In Diesem Fall sind zwei Änderungen an der XML-Struktur nötig:

XML
 <Entries xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">

Das Entries-Tag benötigt ein neues Attribut.

XML
<FieldValue>
	<dateTimeValue xs:nil="true"/>
</FieldValue>

Das entsprechende Feld muss als leer deklariert werden.

Leerzeichen am Textende

MSSQL, Informix und Oracle verhalten sich bei Leerzeichen am Textende unterschiedlich. Im folgenden XML-Code zum Anlegen von Aktivitäten:

XML
 <Entries>
    <Config transactionTime="300" version="9.2" testRun="false"/>
    <Entry entity="Activity" action="CREATE" found="ZERO">
        <Field name="Subject.Activity" identifyingField="true">
            <FieldValue>
                <stringValue>Mein Betreff</stringValue>
            </FieldValue>
        </Field>
    </Entry>
    <Entry entity="Activity" action="CREATE" found="ZERO">
        <Field name="Subject.Activity" identifyingField="true">
            <FieldValue>
                <stringValue>Mein Betreff </stringValue>
            </FieldValue>
        </Field>
    </Entry>
</Entries>

Dieser Code würde unter Oracle dazu führen, dass zwei Aktivitäten angelegt werden. Die erste würde mit dem Betreff "Mein Betreff" angelegt, der zweite Eintrag würde keine Aktivität mit dem Betreff "Mein Betreff " finden und noch eine Aktivität anlegen.

Unter MSSQL, Informix und DB2(unter Windows) würde ebenfalls zunächst eine Aktivität mit dem Betreff "Mein Betreff" angelegt. Der zweite Eintrag würde allerdings bei der Suche nach "Mein Betreff " auch Aktivitäten mit dem Betreff "Mein Betreff" finden, da MSSQL, Informix und DB2(unter Windows) hier ein automatisches Trimmen vornehmen. Das Ergebnis ist, dass hier nur eine Aktivität angelegt wird.

Um diese Probleme zu umgehen, sollten nur Daten ohne Leerzeichen am Textbeginn und Ende angelegt, beziehungsweise die bestehenden Daten bereinigt werden.

XML Import-Schnittstelle V 0.5

Der XML-Import kann Daten aus einer XML-Datei in CURSOR-CRM/EVI anlegen und verknüpfen.

Ablaufbeschreibung

  • In ein definiertes Verzeichnis wird eine XML-Datei mit den zu importierenden Datensätzen abgelegt.

  • Ein Client überwacht das Verzeichnis in einem Intervall von 10 Sekunden. Diese Zeit ist über einen PropertyMapper-Eintrag konfigurierbar:

SQL
INSERT INTO PropertyMapper (Pk, id, property, PropertyType, principal, PropertyValue, CustLayer, Active, CreateDate, CreateUser, UpdateDate, UpdateUser, STATUS, WFInstanceId, RightPk, ClientNo, MassData, OfflineData)
VALUES ('SYSTEM.XMLImporterOld.ImportPeriod', '/de/cursor/jevi/client/swingclient/controller/InitController$!!$ImportPeriod', '' ,'SYSTEM', '', '30000', 'CN', 1,
GETDATE(), 'TECH_USER', GETDATE(), 'TECH_USER', NULL, '#EMPTY-KEY#', NULL, NULL, 0, 0)

Die Zeit wird in Millisekunden angegeben, die '30000' steht also für 30 Sekunden. Der Eintrag kann auch aktualisiert werden:

SQL
 UPDATE propertymapper SET propertyvalue = '50000' WHERE pk = 'SYSTEM.XMLImporterOld.ImportPeriod'
  • Wird eine Datei vorgefunden, so versucht der Client, die Datei zu importieren. Hierzu werden die Datensätze der XML Struktur an den Applikationsserver übertragen. Nach erfolgter Übertragung wird die XML Datei in ein anderes Verzeichnis verschoben um ein neuerliches Importieren nach 10 Sekunden zu verhindern.

  • Der Server überprüft anhand bestimmter Kriterien, ob ein Datensatz vorhanden ist und generiert aus der XML Struktur INSERT- bzw. UPDATE-Statements. Dabei versucht er, diese in einer einzelnen Transaktion abzusetzen.

  • In einer Logdatei wird protokolliert, wie viele Datensätze angelegt wurden und ob es Probleme gab.

  • Der Import erfolgt ohne weitere Aufforderung oder Information an den Anwender.

Aktivieren der Verzeichnisüberwachung

  • Legen Sie das Verzeichnis an, welches für den Datenimport überwacht werden soll. Ort und Bezeichnung können Sie frei wählen.

  • Öffnen Sie die Datei ...\EVI\Client\jboss\bin\runjboss.bat.

  • Ergänzen Sie in der Batchdatei die Zeile

POWERSHELL
@start "EVI Client" "%~dp0..\jre1.6.0_01\bin\javaw" -  DDEBUG.MODE=%DEBUG_MODE% -cp %CP% %START_OPTIONS% %START_CLASS%


um den Eintrag

POWERSHELL
-Dde.cursor.importer.dir=Pfad

zu

POWERSHELL
@start "EVIJET Client" "%~dp0..\jre1.6.0_01\bin\javaw"
-Dde.cursor.importer.dir=Pfad -DDEBUG.MODE=%DEBUG_MODE% -cp %CP% %START_OPTIONS% %START_CLASS%

wobei Pfad den Pfad angibt, welcher zu dem zu überwachenden Verzeichnis führt.

  • Speichern Sie die Änderung in der Datei runjboss.bat ab.

Struktur der XML-Dateien

Die XML-Dateien sollten immer UTF-8 codiert sein. Das Tool Notepad++ beispielsweise kann in UTF-8 konvertieren.

Kopf- und Fußbereich des Dokuments sind immer gleich:

XML
<Entries testRun="false" logFile="C:\temp\Import.log">
 
</Entries>

Zunächst wird das Grundelement definiert. Es muss immer "Entries" heißen. Das Entries-Element hat zwei Attribute:

  1. "testRun" ist optional und legt fest ob tatsächlich importiert wird (false) oder nur überprüft wird, ob der Import korrekt funktionieren würde (true).Der Defaultwert ist hier 'true'.

  2. "logFile" ist optional und spezifiziert den Pfad wo die Log-Datei hinterlegt werden soll. Ist keine Datei angegeben, wird auf die Standardausgabe geloggt.

XML
<Entry entity="Customer" createIfNotFound="true">
 
</Entry>

Für jede Entität die importiert oder aktualisiert werden soll, wird innerhalb des Grundelements ein Entry genanntes Element definiert. Auch Entry hat wiederum vier Attribute, drei werden hier erklärt, das vierte, relation, folgt weiter unten:

  1. "entity" ist Pflicht und gibt die zu importierende Entität an.

  2. "createIfNotFound" ist optional und legt fest, ob nur bestehende Daten aktualisiert (false) oder auch neue angelegt werden (true). Der Defaultwert ist false

    Hinweis

    Wird hier false gesetzt, muss ein Feld innerhalb des Datensatzes mit identifyingField="true" markiert sein. Mehr dazu weiter unten.

  3. In "rightTemplate" kann ein Pk einer Rechtevorlage hinterlegt werden, die für diesen Datensatz verwendet werden soll.

    Hinweis

    Das funktioniert nur, wenn die entsprechende Entität rechtebehaftet ist.

XML
 <Field name="MatchCode.Customer" value="TEST GMBH DATENSATZ 1 35390" identifyingField="true"/>

Innerhalb eines Datensatzes werden schließlich die Felder angegeben die gesetzt werden sollen. Alle nicht angegebenen Felder werden mit Default-Werten belegt. Jedes Feld wird durch ein "Field"-Element repräsentiert. Es muss mindestens ein "Field"-Element angegeben werden. Das "Field"-Element hat drei Attribute:

  1. Das zwingend notwendige Attribut "name" gibt den Namen des Feldes an.

  2. Ebenfalls zwingend ist das Attribut "value" welches den zu setzenden Wert angibt.

  3. "identifyingField" ist Standardmäßig auf "false" gesetzt und optional. Es sollte für jedes Feld auf "true" gesetzt werden, das genutzt werden soll um den zu aktualisierenden Datensatz zu finden. Für CLOB-Felder darf dieses Attribut NICHT auf "true" gesetzt werden.

Hinweis

 Werden mehrere oder kein Datensatz gefunden,  bestehen zwei Möglichkeiten:

  1. Ist "createIfNotFound" des "Entry"-Elements auf "true" gesetzt wird der Datensatz neu angelegt.

  2. Ist "createIfNotFound" des "Entry"-Elements hingegen auf "false" gesetzt wird der Import abgebrochen werden.

Daher sollten immer ausreichend viele Felder mit "identifyingField ="true"" gekennzeichnet sein. Da ohne das "identifyingField"-Attribut niemals ein eindeutiger Datensatz bestimmt werden kann, ist es im Fall von "createIfNotFound="false"" zwingend vorgeschrieben zumindest ein Feld damit zu kennzeichnen.

Einfaches Beispiel

Ein vollsändiges Beispiel für den Import eines Geschäftspartners würde folgendermaßen aussehen:

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<Entries testRun="false" logFile="C:\temp\Import.log">
    <Entry entity="Customer" createIfNotFound="true" rightTemplate="Feldberechtigungen Users">
        <Field name="MatchCode.Customer" value="TEST GMBH DATENSATZ 1 35390" identifyingField="true"/>
        <Field name="CustomerNo1.Customer" value="1020304050" identifyingField="true"/>
        <Field name="PeCountryKey.Customer" value="D"/>
        <Field name="PeZIP.Customer" value="35390"/>
    </Entry>
</Entries>

Hier würde ein Geschäftspartner angelegt werden, sofern er anhand der Felder "MatchCode" und "CustomerNo1" nicht gefunden würde. Die Felder "MatchCode", "CustomerNo1", "PeCountryKey" und "PeZIP" werden gesetzt. Alle anderen Felder würden mit Standardwerten belegt. Der Datensatz würde mit einer Rechtevorlage belegt. Im Verzeichnis C:\temp würde die Log-Datei Import.log angelegt.

Geschachtelte Elemente

Um Datensätze miteinander zu verknüpfen können diese verschachtelt angegeben werden. Innerhalb eines "Entry"-Elements können also beliebig viele geschachtelte "Entry"-Elemente platziert werden. Dabei muss das geschachtelte "Entry"-Element das bereits weiter oben angesprochene Attribut "relation" enthalten das den Beziehungstyp angibt.

XML
<Entry entity="Customer" createIfNotFound="true">
    <Field name="MatchCode.Customer" value="TEST GMBH DATENSATZ 1 35390" identifyingField="true"/>
    <Field name="Name1.Customer" value="TEST GmbH Datensatz 1" identifyingField="false"/>
    <Field name="CustomerNo1.Customer" value="1020304050" identifyingField="true"/>
    <Field name="PeCountryKey.Customer" value="D" identifyingField="false"/>
    <Entry entity="ContactPerson" createIfNotFound="true" relation="rCustomerKey_ContactPerson">
        <Field name="MatchCode.ContactPerson" value="MÜLLER 1, ERWIN 1" identifyingField="true"/>
        <Field name="Sex.ContactPerson" value="H" identifyingField="false"/>
    </Entry>
</Entry>

In diesem Beispiel wird ein Geschäftspartner und ein diesem Geschäftspartner zugeordneter Ansprechpartner angelegt. Dabei kann beliebig tief geschachtelt werden.

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<Entries testRun="false" logFile="C:\temp\Import.log">
    <Entry entity="Activity" createIfNotFound="true">
        <Field name="Subject.Activity" value="Wichtiger Anruf" />
        <Field name="Text.Activity" value="Derundder hat angerufen" />
        <Field name="ActTypeKey.Activity" value="TELEIN" />
        <Field name="ActStatusKey.Activity" value="O" />
        <EntityLookupField name="DefaultContactPerson.Activity">
            <Field name="LastName.ContactPerson" value="Altenhain" identifyingField="true"/>
            <Field name="FirstName.ContactPerson" value="Cornelia" identifyingField="true"/>
            <Field name="CustomerKey.ContactPerson" value="CURSOR GIESSEN" identifyingField="true"/>
        </EntityLookupField>
    </Entry>
</Entries>

Um Nachschlagefelder zu füllen, bei denen der Wert nicht bekannt ist, kann das "EntityLookupField"-Element genutzt werden. Dies steht erst ab Version 9.2.x zur Verfügung. Im "name"-Attribut ist der Name des zu füllenden Feldes anzugeben. Innerhalb des Elements werden dann "Field"-Elemente genutzt um einen eindeutigen Datensatz zu identifizieren. Wird keiner oder mehrere Datensätze gefunden bricht der Import ab. Aus diesem Grund muss mindestens ein "Field"-Element angegeben werden.

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<Entries testRun="false" logFile="C:\temp\Import.log">
    <Entry entity="ContactPerson" createIfNotFound="true">
        <Field name="MatchCode.ContactPerson" value="OTBA" identifyingField="true"/>
        <Field name="LastName.ContactPerson" value="Baeuscher" identifyingField="true"/>
        <Field name="FunctionKey.ContactPerson" value="EKL" identifyingField="true"/>
        <Link pk="ged-activitypkToepper4" entity="Activity" relation="rCoPeAc"/>
    </Entry>
</Entries>

Das "Link"-Element kann genutzt werden um den Datensatz mit bereits bestehenden Einträgen zu verknüpfen. Im Beispiel wird der Ansprechpartner mit einer bereits bestehenden Aktivität verknüpft. Dazu sind folgende drei Attribute zu setzen:

  1. "pk" Hier wird der Primärschlüssel des bestehenden Datensatzes angegeben.

  2. "entity" muss die Entität des bestehenden Datensatzes enthalten.

  3. "relation" gibt den Beziehungstyp zwischen den zu verknüpfenden Entitäten an.

Komplettes Beispiel

Abschließend ein Beispiel das alle oben genannten Elemente enthält:

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<Entries testRun="false" logFile="C:\temp\Import.log">
    <Entry entity="Activity" createIfNotFound="true">
        <Field name="Subject.Activity" value="Wichtiger Anruf" identifyingField="true"/>
        <Field name="Text.Activity" value="Derundder hat angerufen" identifyingField="true"/>
        <Field name="ActTypeKey.Activity" value="TELEIN" identifyingField="true"/>
        <Field name="ActStatusKey.Activity" value="O" identifyingField="true"/>
        <EntityLookupField name="DefaultContactPerson.Activity">
            <Field name="LastName.ContactPerson" value="Altenhain" identifyingField="true"/>
            <Field name="FirstName.ContactPerson" value="Cornelia" identifyingField="true"/>
            <Field name="CustomerKey.ContactPerson" value="CURSOR GIESSEN" identifyingField="true"/>
        </EntityLookupField>
    </Entry>
    <Entry entity="ContactPerson" createIfNotFound="true">
        <Field name="MatchCode.ContactPerson" value="OTBA" identifyingField="true"/>
        <Field name="LastName.ContactPerson" value="Baeuscher" identifyingField="true"/>
        <Field name="FunctionKey.ContactPerson" value="EKL" identifyingField="true"/>
        <Link pk="ged-activitypkToepper4" entity="Activity" relation="rCoPeAc"/>
    </Entry>
    <Entry entity="Customer" createIfNotFound="true">
        <Field name="MatchCode.Customer" value="TEST GMBH DATENSATZ 1 35390" identifyingField="true"/>
        <Field name="Name1.Customer" value="TEST GmbH Datensatz 1" identifyingField="false"/>
        <Field name="CustomerNo1.Customer" value="1020304050" identifyingField="true"/>
        <Field name="PeCountryKey.Customer" value="D" identifyingField="false"/>
        <Entry entity="ContactPerson" createIfNotFound="true" relation="rCustomerKey_ContactPerson">
            <Field name="MatchCode.ContactPerson" value="MÜLLER 1, ERWIN 1" identifyingField="true"/>
            <Field name="Sex.ContactPerson" value="H" identifyingField="false"/>
        </Entry>
    </Entry>
</Entries>

Beispiel zum Import von Adressen

XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<Entries logFile="c:/temp/file1.txt" testRun="false">
    <Entry entity="Customer" createIfNotFound="true">
        <Field name="MatchCode.Customer" value="MeinGeschäftspartner" identifyingField="false"/>
        <Field name="CustomerNo1.Customer" value="MeinGeschäftspartner" identifyingField="true"/>
        <Field name="Name1.Customer" value="Name1" identifyingField="false"/>
        <Field name="PersontypeKey.Customer" value="U" identifyingField="false"/>
        <Field name="PeCity.Customer" value="München" identifyingField="false"/>
        <Field name="PeStreetNumber.Customer" value="2" identifyingField="false"/>
        <Field name="PeCountryKey.Customer" value="D" identifyingField="false"/>
        <Field name="PeZIP.Customer" value="81373" identifyingField="false"/>
        <Field name="PeStreet.Customer" value="Leonhard-Moll-Bogen" identifyingField="false"/>
        <Field name="PeStreetNumberAddition.Customer" value="" identifyingField="false"/>
        <Entry entity="Address" createIfNotFound="true" relation="rCuAd">
            <Field name="LetterCuAd.Address" value="true" identifyingField="false"/>
            <Field name="DefaultCuAd.Address" value="true" identifyingField="false"/>
            <Field name="City.Address" value="Giessen" identifyingField="false"/>
            <Field name="StreetNumber.Address" value="33" identifyingField="false"/>
            <Field name="CountryKey.Address" value="D" identifyingField="false"/>
            <Field name="ZIPKey.Address" value="47328" identifyingField="false"/>
            <Field name="Street.Address" value="Floriansgasse" identifyingField="false"/>
            <Field name="NameKey.Address" value="BÜRO" identifyingField="false"/>
        </Entry>
    </Entry>
</Entries>

Importiert wird ein Geschäftspartner mit einer Adresse. Zusätzlich wird diesem eine weitere Adresse zugeordnet die über die Flags LetterCuAd.Address und DefaultCuAd.Address als Post- und Anzeigeadresse deklariert wird. Würden mehrere solcher Adressen deklariert würde diejenige als Post- oder Anzeigeadresse markiert, die dies als letztes angibt.

XML-Datei generieren (Beispiel "GP Import.xls")

Die Datei (GP Import.xls) stellt ein einfaches Beispiel dar, wie eine Excel-Vorlage aussehen könnte, die, für den XML Import verwertbare, XML-Dateien erzeugt. Sie erzeugt Geschäftspartnereinträge jedoch keine geschachtelten Elemente oder Links. Bie Verwendung des XML-Imports muss immer mit entsprechender Sorgfalt erfolgen, dies gilt auch bei der Nutzung dieser Vorlage. Sie besteht aus einem Tabellenblatt CONFIG zur Konfiguration und einem Tabellenblatt mit den Importdaten (in der Vorlage Geschäftspartner genannt).

Tabellenblatt CONFIG

Entität

Tabellenname der Entität, z.B. Customer oder ContactPerson.

Falls nicht vorhanden, anlegen

Bei true werden die Datensätze übertragen. Ist ein Datensätze in der Datenbank bereits vorhanden, wird dieser nicht noch einmal angelegt. Bei false werden keine Datensätze übertragen.

Import Pfad

Hier geben Sie den vom EVI Client überwachte Pfad an, in welchen die XML-Datei geschrieben werden soll. Dieser ordner muss existieren, sonst erscheint eine Fehlermeldung beim Klick auf "übertragen".

LogPfad

In diesem Verzeichnis wird die Log-Datei des Importvorganges abgelegt.

TempPfad

In diesem Verzeichnis wird die XML-Datei während des EXCEL-XML-Exports abgelegt. Damit wird ein doppelter Zugriff durch den noch schreibenden EXCEL und durch den bereits einlesenden Client verhindert. Nach Abschluss des EXCEL-XML-Exports wird die erzeugte Datei aus dem Temp-Ordner in den Import-Ordner verschoben.

tmpFileName

Hier geben Sie den Namen der temporären XML-Datei an.

xmlFile

Hier geben Sie den Namen der endgültigen XML-Datei an.

logFile

Hier geben Sie den Namen der Log-Datei an

Datenblatt

Hier geben Sie an, auf welchem Tabellenblatt sich die zu importierenden Daten befinden.

Testlauf?

Bei 'true' wird der Import vorgenommen, die Log-Datei geschrieben und anschließend ein Rollback auf der Datenbank vorgenommen. Es werden keine Änderungen an der Datenbank vorgenommen. Bei 'false' werden die Daten in die Datenbank geschrieben.


Tabellenblatt mit den Importdaten

Zeile 5 (benannte Zelle START ff.)

In die jeweilige Zelle tragen Sie den Spaltennamen der CURSOR-CRM / EVI Jet-Entität ein. Achten Sie auf eine genaue Schreibweise (Groß- und Kleinschreibweise, sowie den durch einen Punkt getrennten Entitätsnamen, ebenfalls in Groß- und Kleinschreibweise). Aktuell können maximal 100 Spalten übergeben werden.

Zeile 6

Stehen sämtliche Einträge auf 'false', werden ohne Kontrollen alle Datensätze in der Datenbank neu angelegt. Sind ein oder mehrere Spalten mit einem 'true' gekennzeichnet, wird auf der Datenbank nach den entsprechenden Feldern gesucht. Wird ein Datensatz gefunden, z.B. mit dem entsprechenden Kurznamen und der Telefonnummer, wird der Datensatz in der Datenbank mit den Einträgen der XML-Datei überschrieben und es wird kein neuer Datensatz angelegt.


Mit einem Klick auf den Schalter Übertragen wird die XML-Datei in das definierte Verzeichnis geschrieben. In EXCEL müssen VBA-Makros aktiviert sein.

Der Export läuft so lange, bis in Spalte A eine leere Zelle gefunden wird.

Probleme/Lösungen

Folgende Probleme bei der Benutzung der Schnittstelle sind bekannt:

Person

Auf der Entität Person können über den XML-Import keine Operationen ausgeführt werden. Hier sollte über die Rollen (Geschäftspartner, Ansprechparter, Mitarbeiter) gearbeitet werden.

Nachschlagefelder mit Validierungsfeldern

Nachschlagefelder mit eingetragenen Validierungsfeldern können nicht korrekt behandelt werden und erzeugen die Nachricht "Could not transform [...] into a LookupVO for field [...]". In der Auslieferungsversion trifft dies nur auf das Feld "DefaultContactPerson.Activity" zu. Um das Problem zu umgehen sollte hier das "EntityLookupField"-Tag eingesetzt werden.

Mehrfachverknüpfungen

Sind zwei Entitäten mehrfach miteinander verknüpft, muss der Pk der entsprechenden Relation mit angegeben werden. Beispiel:

XML
 <Entry entity="Project" createIfNotFound="true" >
    <Field name="Projectno.Project" value="PRJ 0000001" identifyingField="false"/>
    <Field name="Pk.Project" value="myProjectPk" identifyingField="true"/>
    <Field name="RelationPKrPjCoPe.Project" value="DER PASSENDE RELATION PK" identifyingField="true"/>
    <Entry entity="ContactPerson" createIfNotFound="true" relation="rPjCoPe">
        <Field name="CustomerKey.ContactPerson" value="MyCustomer" identifyingField="true"/>
        <Field name="Sex.ContactPerson" value="H" identifyingField="false"/>
        <Field name="LastName.ContactPerson" value="Lastname" identifyingField="true"/>
        <Field name="FirstName.ContactPerson" value="Firstname" identifyingField="true"/>
    </Entry>
</Entry>

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.