Zum Inhalt

Manuelle Importkonfiguration

Über die manuelle Bearbeitung der Import-Konfigurationen ist die Nutzung weitreichender Funktionen und Einstellungen möglich. Die Konfiguration erfolgt über xml-Dateien, die vom ImPlex gelesen und verarbeitet werden. Der Aufruf erfolgt hierbei über die Aufrufparameter des ImPlex.

Hierbei gilt, dass für jede Quelle (csv-, xml-Datei, Cortex-Zugriff oder andere) eine separate Import-Konfigurationsdatei zu erstellen ist.

Weiterhin können innerhalb einer Konfiguration mehrere Datensatztypen als Ziel definiert werden, so dass aus einer Quelle mehrere Datensätze entstehen können.

Import ohne Datenmodell

Ein Datenimport ohne vorher ein Datenmodell zu konfigurieren ist möglich. Die Nutzung im CortexUniplex wird dadurch allerdings erschwert, da keine Felder oder Datensatztypen definiert wurden. Eine vorhergehende Konfiguration eines Datenmodells für den CortexUniplex wird daher empfohlen. Für individuelle Entwicklungen, ohne den CortexUniplex, kann darauf möglicherweise verzichtet werden. Die importierten Daten können dann nur mit eigenen Entwicklungen oder mit Hilfe der Anwendung CtxBrowser gefunden werden.

Aufrufparameter Implex.jar

Bei dem Importprogramm ImPlex handelt es sich um eine konsolen-basierte Java-Anwendung. Diese kann sowohl manuell, als auch über zeitgesteuerte Systemdienste aufgerufen werden. Hierfür stehen nachfolgende Aufrufparameter zur Verfügung.

Unter Windows-Systemen ist zu beachten, dass innerhalb der Umgebungsvariablen die Einträge für das installierte Java angegeben sein müssen.

Aufruf:

java -jar Implex.jar [OPTIONEN] ... [DEFINITIONS_DATEI] ...

Optionen:

-i, --import        Nachfolgende Importdefinitionsdateien (XML) verwenden.
-l, --link          Link-Definition auflösen.
-s, --simulate      Aktion simulieren. Es werden keine Schreibvorgänge
                    im Server ausgeführt.
-v, --verbose       Alle Logmeldungen zusätzlich auf Konsole ausgeben.
-h, --help          Diese Hilfe aufrufen

Die folgenden Schalter sollten nur von Experten eingesetzt werden:

-e, --emulate       Schreibt bei einer Definition für den Modus Import,
                    die interne Repräsentation des ersten gelesenen 
                    Datensatzes in eine Datei an und beendet dann das Programm 
                    (nur zur Entwicklung von Reader Modulen).
-d, --delay [ZAHL]  Anzahl Datensätze, nach den immer eine Logmeldung 
                    ausgegeben werden soll (Standard: 200)
--server [IP:PORT]  Hier kann ein Datenbankserver angegeben werden 
                    (Bsp.: 127.0.0.1:29000)
--source [DATEI]    Wenn das Lesemodul es zulässt, kann hier ein 
                    Quelldateiname angegeben werden 
                    (abhängig vom Lesemodul)
--getinfo [DATEI]   Liefert gefolgt von einem JSON-Dateinamen eine 
                    Modulspezifische Information 
                    (Abhängig von Lesemodul)
-- start [ZAHL]     Beginnt mit dem Import ab dem angegebenen Datensatz
-- end [ZAHL]       Liest soviele Datensätze, wie angegeben

Es können beliebig viele Definitions-Dateien hintereinander angegeben werden und es können in beliebiger Reihenfolge mehrere Optionen angegeben werden.

Hinweise

Der Parameter -s (Simulation) wirkt sich global auf alle im Aufruf übergebenen Modi aus!

Die Parameter --start und --end funktionieren nur für csv- und xml-Importe.

Java Aufrufparameter

Erfolgt der Aufruf manuell oder über ein Script, kann es notwendig sein, landesspezifische Parameter an Java zu übergeben, damit bspw. Zahlen und Währungen korrekt importiert werden.

Der Java-Aufruf wird dann um folgende Angaben erweitert:

-Duser.country=DE -Duser.language=de

Vollständig umfasst der Aufruf dann die Jar-Datei des Implex und weitere Parameter. Beispielsweise können so auch die Import- und Quelldatei übergeben werden:

java -jar -Duser.country=DE -Duser.language=de Implex.jar -i --server localhost:29000 --source www/Implex/sourceFile.xml ./www/implex/Import-Config.xml

Das Beispiel zeigt den Aufruf der Implex.jar mit zusätzlichen, landesspezfischen Java-Parametern und den Implex-Parametern für die Quell- und Import-Konfigurationsdatei.

Allgemeine Definitionen

Die Struktur einer Import-Konfiguration gliedert sich grundsätzlich in drei Hauptbereiche über die verschiedene Einstellungen möglich sind. Innerhalb dieser xml-Datei sind in den Bereichen "Global", "ReaderModule" und "ImportSection" die entsprechenden Anpassungen vorzunehmen.

Der Bereich "Global" definiert den Zugriff auf die Datenbank, das "ReaderModule" den Zugriff auf die Quelldaten und die "ImportSection" definiert die Feldzuweisung von Quell- zu Zielfeldern.

Änderungen des Implex ab Version 4.0

Mit der Version 4.0 ändern sich die Bezeichner für die Parameter in den Import-Konfigurationen. Ab dieser Version ist eine Konfiguration und der Aufruf nur mit englischen Bezeichnern möglich. Alte Konfigurationen müssen daher zwingend angepasst werden!

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>

    <Global>
        <LoginIP>[.....]</LoginIP>              <!-- IP or server name -->
        <LoginPort>[.....]</LoginPort>          <!-- database port; also via parameter for implex available -->
        <LoginUser>[.....]</LoginUser>          <!-- user -->
        <LoginPW>[.....]</LoginPW>              <!-- password -->
        <ImportMode>[.....]</ImportMode>        <!-- import mode; n, u, nu/un for new and/or update-->
        <DeltaList>[.....]</DeltaList>          <!-- optional - DeltaListe means that all data records with no change will be deleted ("l") -->
    </Global>

    <ReaderModule type="[.....]">               <!-- e.g.: csv, xml, ctx or own type by using abstract class -->
        <Filename>[.....]</Filename>            <!-- relative path to implex in bin directory -->
        <Separator>[.....]</Separator>          <!-- field separator -->
        <Enclosure>[.....]</Enclosure>          <!-- field delimiter -->
        <RepSeparator>[.....]</RepSeparator>    <!-- seperator for repeated content in one field; e.g.: "email 1; email 2; email 3; ..." -->
        <ColumnMode>[.....]</ColumnMode>        <!-- column mode HEADER, NUMERIC, ABC -->
        <Charset>[.....]</Charset>
    </ReaderModule>

    <ImportSection recordtype="[....]">
        <FilterFunction>getChar('...') != ''</FilterFunction>   <!-- write data record only, if filter function returns true -->
        <IId>getChar('...')<IId>                <!-- internal database ID, if update exactly this data record -->
        <HashFilter>[.....]</HashFilter>        <!-- build hash value on all imported values and write it to this field --> 

        <Reference>PID</Reference>              <!-- reference to find data record if update is necessary -->

        <Field>... = getChar('...')</Field>
        <Field>... = getChar('...')</Field>
        <Field>... = getChar('...')</Field>

        <RepGroup reference="1">                                <!-- for update of group reference is needed -->
            <Field deltalist="d">... = getChar('...')</Field>   <!-- deltalist means that all data records without will be deleted -->
            <Field>... = getChar('...')</Field>
        </RepGroup>

    </ImportSection>
</CtxImport>

In dem Bereich "Global" konfigurieren Sie die Zugangsdaten zu Ihrer Datenbank und geben dort den gewünschten "ImportModus" an. Hier wählen Sie zwischen "n" (neu), "u" (update) oder "nu" bzw. "un" (für "update, sonst neu").

Entsprechend der genannten Möglichkeiten kann der Bereich "Global" beispielhaft konfiguriert werden:

<CtxImport>
 <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29001</LoginPort>
    <LoginUser>admin</LoginUser>
    <LoginPW>adm#13qzy2!</LoginPW>
    <ImportMode>nu</ImportMode>
 </Global>

Die Bereiche "ReaderModule" und "ImportSection" sind von der jeweiligen Datenquelle abhängig.

Hinweis

Aus einer Datenquelle können mehrere Datensätze unterschiedlicher Datensatztypen erstellt werden (z.B. aus einer Person ein Personen- und ein Adressdatensatz). Dafür braucht nur die "ImportSection" mehrfach angelegt werden.

Import von csv-Dateien

Die manuelle Konfiguration für den Import von csv-Dateien besteht aus einer xml-Konfigurationsdatei für das Importprogramm "ImPlex". Diese Datei ist in mehrere Abschnitte unterteilt, um den Login zur Datenbank, das Lesen der Quellen ("Reader-Modul") und das Mapping zwischen Quelle und Ziel sicherzustellen. Der Aufbau dieser Konfigurationsdatei ist grundsätzlich für jeden Import gleich und unterscheidet sich dementsprechend nur in den jeweiligen Parametern für Quellen, Reader-Modul und Ziel-Mapping.

Wie bereits im Abschnitt für das ImPlex-Plugin erläutert, bestehen csv-Dateien aus Einzelwerten, die durch ein einheitliches Trennzeichen voneinander getrennt sind. Zudem werden die Einzelwerte häufig durch sog. "Feldbegrenzer" eingefasst.

csv-Dateien ohne Header

Üblicherweise befinden sich in der ersten Zeile einer solchen Datei die Spaltenüberschriften (Feldbezeichner). Ist dieses nicht der Fall, ist in der Konfigurationsdatei im Abschnitt "ReaderModul" der Wert für den "SpaltenModus" zu ändern. Hier stehen die Möglichkeiten "HEADER" (wenn die erste Zeile die Bezeichner enthält), "NUMERIC" oder "ABC" zur Verfügung.

Beispiel einer csv-Datei (per Semikolon getrennte Werte):

"Name";"Vorname";"Ort";"HobbyNr";"Hobbies"
"Meier";"Max";"Hamburg";"1,2";"Fußball,Hockey"
"Müller";"Sandra";"Bielefeld";"1,2";"Tanzen,Reiten"

Beispiel einer csv-Datei (per Tab getrennte Werte):

"Name"    "Vorname"    "Ort"    "HobbyNr"    "Hobbies"
"Meier"    "Max"    "Hamburg"    "1,2"    "Fußball,Hockey"
"Müller"    "Sandra"    "Bielefeld"    "1,2"    "Tanzen,Reiten"

Reader-Modul für csv-Dateien

Das Beispiel einer csv-Datei zeigt zwei zu importierende Datensätze mit den jeweiligen Feldbezeichnern in der ersten Zeile. Der nachfolgende Abschnitt für den Bereich "ReaderModul" zeigt daher die dazu passenden Konfigurationseinstellungen (für Semikolon-getrennte Werte):

<ReaderModule type="csv">
    <Filename>/Data/import/2013Mai.csv</Filename>       <!-- relative path to implex in bin directory -->
    <Separator>;</Separator>                            <!-- field separator -->
    <Enclosure>"</Enclosure>                            <!-- field delimiter -->
    <RepSeparator>,</RepSeparator>                      <!-- seperator for repeated content in one field; e.g.: "email 1; email 2; email 3; ..." -->
    <ColumnMode>HEADER</ColumnMode>                     <!-- column mode HEADER, NUMERIC, ABC -->
    <Charset>UTF-8</Charset>
</ReaderModule>

Beachten Sie, dass die Angabe des Dateinamens den absoluten Pfad zu der Datei beinhalten muss.

Weiterhin ist darauf zu achten, dass Sie den richtigen Zeichensatz ("Charset") der Importdatei angeben. Ansonsten werden Umlaute nicht korrekt importiert. Hierfür stehen Ihnen drei Einstellungen zur Auswahl: UTF-8, windows-1251 und ISO-8859-1.

Werden für die Trennung der Werte anstatt Semikolons andere Zeichen verwendet, sind diese bei der Angabe FeldTrenner einzutragen. Der Spezialfall von Tabulatoren (Tab-Zeichen) erfordert die Nutzung des Ausdrucks {TAB}.

Beispiel Konfigurationsblock für Tab-getrennte Werte:

<ReaderModule type="csv">
    <Filename>/Data/import/2013Mai.csv</Filename>
    <Separator></Separator>
    <Enclosure>"</Enclosure>
    <RepSeparator>,</RepSeparator>
    <ColumnMode>HEADER</ColumnMode>
    <Charset>UTF-8</Charset>
</ReaderModule>

Werden die bisher gezeigten Beispiele als Konfigurationsdatei zusammengefügt, stellt sich die xml-Datei wie folgt dar:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29001</LoginPort>
    <LoginUser>admin</LoginUser>
    <LoginPW>adm#13qzy2!</LoginPW>
    <ImportMode>nu</ImportMode>
</Global>
<ReaderModule type="csv">
    <Filename>/Data/import/2013Mai.csv</Filename>
    <Separator>;</Separator>
    <Enclosure>"</Enclosure>
    <RepSeparator>,</RepSeparator>
    <ColumnMode>HEADER</ColumnMode>
    <Charset>UTF-8</Charset>
</ReaderModule>
<ImportSection recordtype="[.......]">
    [.......]
</ImportSection>
</CtxImport>

Import-Sektion für csv-Dateien

Innerhalb der "ImportSection" legen Sie die Feldzuweisungen und Referenzen für den Import fest. Hier können Sie zudem Feldinhalte als Verlaufsinformation speichern und weitergehende Funktionen nutzen (z.B. Fallunterscheidungen anhand bestimmter Inhalte oder die Änderung von Inhalten definieren).

Zu dem oben aufgeführten csv-Beispiel kann die nachfolgende Import-Section dienen, wenn Datenbankfelder mit den Synonymen "perName", "perVorn" und "perAOrt" vorhanden sind:

<ImportSection recordtype="PERS">
    <Reference>perName</Reference>
    <Field>perName=getChar('Name')</Field>
    <Field>perVorn=getChar('Vorname')</Field>
    <Field>perAOrt=getChar('Ort')</Field>
</ImportSection>

Als Parameter für die "ImportSection" wird das Kürzel des Datensatztyps festgelegt (in dem gezeigten Beispiel "PERS"). Die nachfolgenden Feldzuweisungen beziehen sich damit auf diese Satzart. Ggf. werden neue Datensätze angelegt, wenn anhand der Referenz kein Datensatz für eine Aktualisierung gefunden werden kann und der "ImportModus" auf "nu" oder "n" gesetzt wurde.

Wenn Sie vorhandene Datensätze aktualisieren möchten, ist es notwendig, dass Sie ein Referenzfeld angeben. Dieses legen Sie über den Eintrag "Referenz" fest.

Alle weiteren Quellfelder weisen Sie dann einem Ziel zu, indem Sie für jede Zuweisung einen Eintrag "Feld" erstellen. Die Zuweisung besteht dann immer aus Ziel = Quelle.

Beispiel:

<Field>perName=getChar('Name')</Field>

Bei diesem Beispiel wird dem Zielfeld "perName" der Wert aus dem Feld "Name" zugewiesen. Beachten Sie, dass die Quellefelder in jedem Fall mit der Funktion "getChar" umschlossen werden.

Import von csv-Dateien ohne Header

Liegen csv-Dateien ohne Header vor und wurde im "ReaderModul" entweder "NUMERIC" oder "ABC" angegeben, müssen auch beim Lesen der Felder andere Angaben erfolgen. Die Funktion "getChar" kann in diesem Fall nicht auf einen Feldnamen angewendet werden. Statt dessen auf die numerischen oder alphabetischen Spaltenangaben.

Beispiel für numerische Header

<Field>perName=getChar('0')</Field>
<Field>perLNam=getChar('1')</Field>

Beispiel für alphabetische Header

<Field>perName=getChar('A')</Field>
<Field>perLNam=getChar('B')</Field>

Nutzung von Funktionen

Für die Konfiguration stehen Ihnen mehrere Funktionen zur Verfügung mit deren Hilfe Sie die Inhalte beliebig ändern können. Eine komplette Übersicht erhalten Sie im Abschnitt "Importfunktionen". Das folgende Beispiel zeigt daher nur eine Auswahl der Möglichkeiten.

<ImportSection recordtype="PERS">
  <Reference>perName</Reference>
  <Field>perName=getChar('Name')</Field>
  <Field>perVorn=getChar('Vorname')</Field>
  <Field>perAOrt=getChar('Ort')</Field>
  <Field>Quelle=file_woext(sourceFileName()</Field>
  <Field>perGes=iif(getChar('Vorname')== 'Max','M','W')</Field>
  <Field>perSuch=getChar('Vorname')+getChar('Name')</Field>
</ImportSection>

Die abgebildeten Funktionen greifen auf verschiedene Daten zurück und erzeugen neue Informationen. Die Quelle wird so aus dem Dateinamen ohne Dateiendung gebildet (aus "2013Mai.csv" wird so "2013Mai"). Ergänzend dazu wird per "iif" eine Fallunterscheidung anhand des Vornamens durchgeführt. Im Falle von "Max" erhält das Feld "perGes" (für Geschlecht) den Wert "M", ansonsten "W". Ergänzend dazu werden die Quellefelder Vorname und Name zu einem Wert zusammengefügt und in das Feld "perSuch" geschrieben.

Hinweis

Beachten Sie bei Rechenoperationen, dass die Quellwerte zuvor als numerische Werte deklariert werden müssen ("casting"). Dieses führen Sie beispielsweise mit den Funktionen "cint" oder "cfloat" durch. Auch für weitere Typen ist ggf. eine Anpassung durchzuführen (z.B. für die Umwandlung von Zahlen in Text).

Wiederholfelder und Wiederholfeldgruppen

In der Feldkonfiguration können Sie definieren, dass ein Feld mehrfach innerhalb eines Datensatzes gespeichert werden soll (z.B. Hobby oder eMail-Adresse). Diese sog. "Wiederholfelder" können zudem als eine Gruppe zusammengefasst werden (z.B. die Bankverbindung mit Konto, BLZ, IBAN,...). Die entsprechenden Daten können Sie daher auch über die Import-Funktion in die Datenbank aus einer Quelle einlesen.

In der oben gezeigten csv-Datei sind die Hobbies und eine Nummer der Hobbies ersichtlich, die zusammen eine Wiederholfeldgruppe bilden und entsprechend konfiguriert werden müssen. Die Nummer und die Bezeichnung der Hobbies sollen nun als Wiederholfeldgruppe in die Satzart der Person importiert werden. Dafür ergänzen Sie die "ImportSection" um folgende Angaben:

<RepGroup>
  <Field>HobNr  = getChar('HobbyNr')</Field>
  <Field>HobBez = getChar('Hobbies')</Field>
</RepGroup>

Damit werden jeweils die erste Angabe der Nummer und des Hobbies als eine Gruppe definiert; dann je die zweiten Angaben usw. Im Falle eines einzelnen Wiederholfeldes ohne weitere Gruppierung schreiben Sie das einzelne Feld in die Wiederholfeldgruppe.

<RepGroup>
  <Field>HobBez = getChar('Hobbies')</Field>
</RepGroup>

Somit können Sie auch mehrere Wiederholfelder und Wiederholfeldgruppen in einem Datensatz aufnehmen.

Hinweis

Eine Gruppe von Feldern kann aktualisiert werden, wenn eine Referenz auf ein führendes Feld vorliegt und es kann die Gruppe gelöscht werden, die nicht mehr in der Quelle vorhanden ist.

Hierfür ist eine Erweiterung des oben genannten Beispiels notwendig

<RepGroup reference="1">
  <Field deltalist=" d">HobNr = getChar('HobbyNr')</Field>
  <Field>HobBez = getChar('Hobbies')</Field>
</RepGroup>

Das Attribut "referenz" aktiviert die Referenzierung der Gruppe. Hierbei gilt immer das erste Feld als Referenzfeld, um die Gruppe zu aktualisieren.

Das Attribut "deltaliste" legt fest, dass der Eintrag in der Datenbank vorhanden sein muss! Es werden also alle Informationen aus der Quelle importiert und die Einträge aus der Datenbank entfernt, die nicht in der Quelle vorhanden sind.

Vorsicht!

Die Kombination aller Attribute kann möglicherweise unbedachte Änderungen nach sich ziehen. Ein vorheriger Test ist daher empfehlenswert.

Vollständiges Beispiel für den csv-Import

Werden die bisher gezeigten Beispiele als Konfigurationsdatei zusammengefügt, stellt sich die xml-Datei wie folgt dar:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29001</LoginPort>
    <LoginUser>admin</LoginUser>
    <LoginPW>adm#13qzy2!</LoginPW>
    <ImportMode>nu</ImportMode>
  </Global>
  <ReaderModule type="csv">
    <Filename>/Data/import/2013Mai.csv</Filename>
    <Separator>;</Separator>
    <Enclosure>"</Enclosure>
    <RepSeparator>,</RepSeparator>
    <ColumnMode>HEADER</ColumnMode>
    <Charset>UTF-8</Charset>
  </ReaderModule>
  <ImportSection recordtype="PERS">
    <Reference>perName</Reference>
    <Field>perName=getChar('Name')</Field>
    <Field>perVorn=getChar('Vorname')</Field>
    <Field>perAOrt=getChar('Ort')</Field>
    <Field>Quelle=file_woext(sourceFileName()</Field>
    <Field>perGes=iif(getChar('Vorname')== 'Max','M','W')</Field>
    <Field>perSuch= getChar('Vorname')+getChar('Name')</Field>
    <RepGroup reference='1'>
      <Field>HobNr  = getChar('HobbyNr')</Field>
      <Field>HobBez = getChar('Hobbies')</Field>
    </RepGroup>
  </ImportSection>
</CtxImport>

Import von xml-Dateien

Mit Hilfe der manuellen Importkonfiguration des ImPlex ist ein Import von xml-Dateien möglich. Durch die unterschiedliche Komplexität dieser Art von Quelldateien wurde eine geführte Konfiguration per Plugin bisher nicht umgesetzt.

Bei xml-Dateien handelt es sich um ein standardisiertes Format, deren Inhalt in Form einer textbasierten, hierarchischen Struktur abgebildet wird. Der Inhalt besteht aus sog. "Elementen", "Element-Attributen" und "Element-Inhalten", die wiederum weitere Elemente und Attribute beinhalten können.

Beispiel einer einfachen xml-Datei:

<?xml version="1.0" ?>
<Elementname Attribut1=“1“ Attribut2=“abc“>
  <Element>Element-Inhalt</Element>
</Elementname>

Ausgehend von dem Beispiel im Abschnitt "manueller csv-Import" kann eine xml-Datei mit den gleichen Inhalten als Quelle genutzt werden:

<?xml version="1.0" ?>
<People>
    <Person Nr=“1“ Geschlecht=“M“ GebDat=“19670812“>
        <Name>Meier</Name>
        <Vorname>Max</Vorname>
        <Hobbies>
            <Hobby HobbyNr=“1“>Fußball</Hobby>
            <Hobby HobbyNr=“2“>Hockey</Hobby>
        </Hobbies>
    </Person>
    <Person Nr=“2“ Geschlecht=“W“ GebDat=“19781103“>
        <Name>Müller</Name>
        <Vorname>Sandra</Vorname>
        <Hobbies>
            <Hobby HobbyNr=“1“>Tanzen</Hobby>
            <Hobby HobbyNr=“2“>Reiten</Hobby>
        </Hobbies>
    </Person>
</People>

Jeder Inhalt eines Elementes und jeder Wert eines Attributes kann von der Import-Funktion des ImPlex genutzt werden. Hierfür steht eine Syntax zur Abfrage dieser Werte zur Verfügung.

Generell gilt auch hier der grundlegende Aufbau der Konfigurationsdatei mit den Bereichen "Global", "ReaderModul" und "ImportSection". Mit dem globalen Bereich werden die Datenbank und Login-Parameter festgelegt; der Bereich "ReaderModul" definiert die Lese-Parameter und die "ImportSection" die Feldzuweisung.

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>[....]</LoginIP>
    <LoginPort>[....]</LoginPort>
    <LoginUser>[....]</LoginUser>
    <LoginPW>[....]</LoginPW>
    <ImportMode>[....]</ImportMode>
  </Global>

Der oben gezeigte Aufbau des globalen Bereiches kann beispielhaft wie folgt aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29000</LoginPort>
    <LoginUser>importuser</LoginUser>
    <LoginPW>myPassWd</LoginPW>
    <ImportMode>nu</ImportMode>
  </Global>

In dem Bereich "ReaderModul" legen Sie die Quelldatei, das Haupt-Einstiegselement zum Auslesen der Datensätze und das Element eines Datensatzes fest.

<ReaderModule type="xml">
    <IN_FILE>[....]</IN_FILE>
    <MAIN_TAG>[....]</MAIN_TAG>
    <DATASET_TAG>[....]</DATASET_TAG>
</ReaderModule>

Beispiel anhand der o.g. xml-Datei:

<ReaderModule type="xml">
    <IN_FILE>/Pfad/zur/Quelle/2013Mai.xml</IN_FILE>
    <MAIN_TAG>People</MAIN_TAG>
    <DATASET_TAG>Person</DATASET_TAG>
</ReaderModule>

Alle Informationen innerhalb des "Person"-Elementes werden daher als ein Datensatz behandelt. Beachten Sie hierbei, dass der Pfad zur Quelldatei als absoluter Pfad angegeben wird.

Der Aufbau der Konfigurationsdatei für den Import zum Lesen einer xml-Datenquelle gliedert sich somit in die drei genannten Bereiche:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
    <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29001</LoginPort>
    <LoginUser>importuser</LoginUser>
    <LoginPW>myPasswd</LoginPW>
    <ImportMode>nu</ImportMode>
</Global>
<ReaderModule type="xml">
    <IN_FILE>/Pfad/zur/Quelle/2013Mai.xml</IN_FILE>
    <MAIN_TAG>People</MAIN_TAG>
    <DATASET_TAG>Person</DATASET_TAG>
</ReaderModule>
<ImportSection recordtype="[....]">
    <FilterFunction>[....]</FilterFunction>
    <Reference>[....]</Reference>
    <Field>[....] = [....]</Field>
    <RepGroup start="[....]">
        <Field>[....] = [....]</Field>
    </RepGroup>
</ImportSection>
</CtxImport>

In der "ImportSection" können Sie nun die Feldzuweisungen vornehmen. Dazu greifen Sie auf einzelne Elemente und Attribut-Werte über eine definierte Syntax zu.

Syntax für den Zugriff auf Inhalte einer xml-Datei

Ausgehend von der Festlegung im "ReaderModul" durchläuft der Import-Mechanismus die xml-Quelldatei und identifiziert einen Datensatz.

Die oben gezeigte Konfiguration des Reader-Moduls mit den Einträgen "MAIN_TAG" und "DATASET_TAG" legt den Einsprungspunkt in einen Datensatz fest. "People" gilt hier als umschließendes Element für weitere Inhalte und "Person" als Einzeldatensätze, durch die interiert wird.

<?xml version="1.0" ?>
<People>
    <Person Nr=“1“ Geschlecht=“M“ GebDat=“19670812“>
        <Name>Meier</Name>
        <Vorname>Max</Vorname>
        <Hobbies>
            <Hobby HobbyNr=“1“>Fußball</Hobby>
            <Hobby HobbyNr=“2“>Hockey</Hobby>
        </Hobbies>
    </Person>
    <Person Nr=“2“ Geschlecht=“W“ GebDat=“19781103“>
        <Name>Müller</Name>
        <Vorname>Sandra</Vorname>
        <Hobbies>
            <Hobby HobbyNr=“1“>Tanzen</Hobby>
            <Hobby HobbyNr=“2“>Reiten</Hobby>
        </Hobbies>
    </Person>
</People>

Um bei jedem Datensatz an eine bestimmte Information zu gelangen, wird wie bei csv-Quellen per "getChar" auf ein Feld zugegriffen. Das folgende Beispiel zeigt die Übernahme des Feldes "Name" in das entsprechende Datenbankfeld.

<ImportSection recordtype="PERS">
    <Field>PerNam = getChar('Name')</Field>
</ImportSection>
</CtxImport>

Die einfache Nutzung des Feldnamens führt zur direkten Nutzung eines Element-Inhaltes.

Um Attribute eines Elementes zu nutzen, ist das "#"-Zeichen (Hash) notwendig. Somit können also beispielsweise auch die Person-Nr, das Geschlecht oder Geburtsdatum übernommen werden:

<ImportSection recordtype="PERS">
    <Field>PerNam = getChar('Name')</Field>
    <Field>PerGes = getChar('#Geschlecht')</Field>
    <Field>PerNum = getChar('#Nr')</Field>
    <Field>PerGeb = getChar('#GebDat')</Field>
</ImportSection>
</CtxImport>

Wird ein Element mehrfach genutzt (z.B. "Hobby"), ist dieses innerhalb einer Wiederholgruppe zu importieren. Die Kombination mit weiteren Feldern der selben Gruppe ist entsprechend möglich:

<ImportSection recordtype="PERS">
    <Field>PerNam = getChar('Name')</Field>
    <Field>PerGes = getChar('#Geschlecht')</Field>
    <Field>PerNum = getChar('#Nr')</Field>
    <Field>PerGeb = getChar('#GebDat')</Field>
    <RepGroup start="Hobbies.Hobby">
        <Field>HobNr = getChar('#HobbyNr')</Field>
        <Field>Hobby = getChar()</Field>
    </RepGroup>
</ImportSection>
</CtxImport>

Wie in diesem Beispiel zu sehen ist, wird innerhalb des Elements "Hobby" interiert und auf ein einzelnes "Hobby" zurückgegriffen. Um auf ein Kind-Element zuzugreifen, wird das Zeichen "." (Punkt) genutzt. Jedes einzelne Kind-Element wird somit gelesen und importiert.

Ergänzend dazu wird das Feld "Hobby" direkt ausgelesen. Hierfür wird die Funktion "getChar()" ohne weitere Parameter verwendet.

Hinweis

Unabhängig von den o.g. Beispielen ist es möglich, die Nutzung von "#" und "." zu kombinieren, wenn tiefergeschachtelte Strukturen vorliegen. Ein Zugriff per "Hobbies.Hobby#HobbyNr" wäre also möglich.

Import aus einer CortexDB

Innerhalb Ihrer Datenbank können Sie Inhalte von Datensätzen und auch das komplette Datenmodell mit Hilfe dieser Import-Funktion ändern. Bei der Daten-Quelle und dem Ziel handelt es sich somit um dieselbe Datenbank. Generell setzt sich dafür die Quelle aus einer Listendefinitionen und den Datensätzen einer Selektion oder eines Datensatztyps zusammen. Die Datensätze werden dann auf Basis der Listenkonfiguration aufbereitet. Dadurch können Sie auch berechnete Listeninhalte für die Änderung der Datensätze nutzen.

Import von einer CortexDB in einer andere CortexDB

Sie können mit weiteren, optionalen Parametern eine CortexDB als Quelle für den Import in einer andere CortexDB heranziehen.

Dadurch, dass für diese Import-Funktion eine Listendefinition als Grundlage herangezogen wird, sind die globalen Einstellungen und die "ImportSection" identisch mit dem csv-Import. Nur der Bereich für die Einstellungen des "ReaderModul" ist entsprechend anzupassen. Dem "ReaderModul" ist der Typ "ctx" zuzuweisen. Dieser Konfigurationsblock enthält dann die Angaben für die Listendefinitionen ("ListDef") und den Datensatztypen oder Selektion.

Wenn alle Datensätze eines Datensatztyps geändert werden sollen, ist die Angabe für den Datensatztyp zu setzen:

<ReaderModule type="ctx">
  <ListDef>[.......]</ListDef>
  <Recordtype>[....]</Recordtype>
</ReaderModule>

Sollen nur die Datensätze einer zuvor gespeicherten Selektion geändert werden, ist die Angabe für den Selektionsnamen zu setzen:

<ReaderModule type="ctx">
  <ListDef>[.......]</ListDef>
  <Selection>[....]</Selection>
</ReaderModule>

Soll eine andere CortexDB als Quelle genutzt werden, sind folgende Parameter zu ergänzen: Server, Port, User, Pwd - Sind diese Parameter identisch mit den Login-Parametern im Global-Block oder sind diese nicht vorhanden/leer, wird der Global-Block herangezogen.

<ReaderModule type="ctx">
  <Server>[....]<Server>
  <Port>[....]<Port>
  <User>[....]<User>
  <Pwd>[....]<Pwd>
  <ListDef>[.......]</ListDef>
  <Recordtype>[....]</Recordtype>
</ReaderModule>

Beachten Sie, dass eine Aktualisierung der Datensätze anhand der Datensatz-ID durchgeführt werden kann. Damit entfällt die Angabe einer Referenz, weil ein Datensatz bereits eindeutig gefunden wird. Das Quellfeld für die ID wird daher in der Konfiguration als "#IId" angegeben.

Das nachfolgende Beispiel zeigt die Aktualisierung aller Datensätze einer Satzart anhand der Datensatz-ID und einer erstellten Liste:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29001</LoginPort>
    <LoginUser>admin</LoginUser>
    <LoginPW>adm#13qzy2!</LoginPW>
    <ImportMode>u</ImportMode>
  </Global>
  <ReaderModule type="ctx">
    <ListDef>Personenliste</ListDef>
    <Recordtype>PERS</Recordtype>
  </ReaderModule>
  <ImportSection recordtype="PERS">
    <Reference></Reference>
    <IId>getChar('#IId')</IId>
    <Field>perName=getChar('Name')</Field>
    <Field>perVorn=getChar('Vorname')</Field>
    <Field>perAOrt=getChar('Ort')</Field>
    <Field>perSuch=getChar('Vorname')+getChar('Name')</Field>
  </ImportSection>
</CtxImport>

Hinweise

Beachten Sie, dass in diesem Beispiel in der "ImportSection" die Referenz leer bleibt, weil folgende Angabe automatisch als Referenz behandelt wird:

<IId>getChar('#IId')</IId>

Alternativ können Sie in der Listendefinition auch das Systemfeld "Datensatz-ID" einblenden und dieses in dem genannten IId-Knoten eintragen:

<IId>getChar('Datensatz-ID')</IId>

Hier ist zu beachten, dass die zweite Möglichkeit ggf. schneller abgearbeitet wird, als die zuerst genannte.\  

Beachten Sie ferner, dass die genutzte Liste sequentiell je Datensatz abgearbeitet wird. Die Nutzung von berechneten Feldern ist also nur bedingt möglich. Listen-übergreifende Berechnungen können daher nicht genutzt werden.

Wiederholfelder

Wiederholfelder können ab der Implex-Version 2.0.10 geschrieben und geändert werden. Um die eingesetzte Version festzustellen verwenden Sie folgenden Implex-Aufruf:

java -jar Implex.jar --version

Die allgemeine Form für den Import eines Wiederholfeldes aus einer Listendefinition besteht aus dem Knoten "WiederholGruppe" mit einem start-Attribut und beinhaltet dann eine Feld-Angabe:

<RepGroup start="___WDHL___">
    <Field deltalist=" d">Synonym=getChar('soureField')</Field>
</RepGroup>

Hier ist zu beachten, dass das start-Attribut den Wert ___WDHL___ beinhaltet (drei Unterstriche vor und hinter WDHL). Dadurch wird festgelegt, dass der Inhalt des Knotens als Wiederholfeld zu behandelt ist.

Ergänzend dazu können Sie das Attribut deltalist=" d" für das Feld angeben. Damit bleiben bei einer Aktualisierung des Datensatzes nur die Feldinhalte bestehen, die als Daten geliefert werden. Die Inhalte, die nicht in der Quelle vorliegen, werden entfernt.

Hinweise

Beachten Sie hierbei, dass die Auswirkungen der einzelnen Parameter bei Wiederholfeld-Gruppen unerwartete Auswirkungen haben kann. Eine Aktualisierung von Gruppen wird daher nicht empfohlen.

Weiterhin ist zu beachten, dass das Quellfeld (also: getChar('sourceField')...) ein "echtes" Datenbank-Wiederhofeld sein muss. Der Inhalt dieses Feldes kann per JavaScript überschrieben werden; relevant ist hierbei der Typ des Feldes, damit der ImPlex feststellen kann, dass ein Wiederholfeld gelesen wird. Ein per JavaScript gesetztes Objekt reicht an dieser Stelle nicht aus.

Werte mit Gültigkeitsdatum

Ein Wert für ein Feld in einem Datensatz kann mit einem Gültigkeitsdatum versehen werden. Ab diesem Datum ist Wert so lange gültig, bis ein weiterer Wert mit einem neuen Datum in das Feld geschrieben wird. Der alte Wert bleibt erhalten und ist jederzeit einsehbar und kann auch in Listen und Pivotlisten ausgegeben werden. Nur eine Selektion ist im Standard nicht möglich, dafür muss das Feld schon bei der Feldkonfiguration mit der Option mit Verlaufsindex angelegt werden.

Um Werte mit Gültigkeitsdatum zu importieren, wird die entsprechende Importzeile ergänzt.

Beispiel für eine Datenquelle mit Werten im zeitlichen Verlauf:

AcctNumber;Date;Value
DE123456789;01.01.2018;150
DE123456789;02.01.2018;200
DE123456789;03.01.2018;95
DE123456789;04.01.2018;80
DE123456789;05.01.2018;110

Importsection für o.g. Beispiel

<ImportSection recordtype="ACCT">
    <Reference>AccNr</Reference>
    <Field>AccNr=getChar('AcctNumber')</Field>
    <Field>Value[time(date('dd.MM.yyyy',getChar('Date'))]=getChar('Value')</Field>
</ImportSection>

Update-Modus für den Datenimport

Um Werte im zeitlichen Verlauf zu speichern müssen die Datensätze aktualisiert werden können. Dieses kann nur durchgeführt werden, wenn der ImportModus auf u (update) oder nu (neu und update) gesetzt wird.

Import aus SQL-Quelle

Der SQL-Import des Implex erlaubt das direkte Lesen von Informationen aus einem SQL-Quellsystem, ohne die Daten in ein anderes Format exportieren zu müssen. Hierfür wir eine sog. "Reader-Klasse" bereitgestellt, die verschiedene Connectoren (JDBC-Treiber) der entsprechenden SQL-Datenbank nutzen kann. Die Konfiguration erfolgt hierfür über die Import-Konfigurationsdatei des Implex.

Voraussetzungen

Bei dem Implex handelt es sich um eine Java-Anwendung. Daher werden hierfür die entsprechenden Module und Java-Versionen vorausgesetzt

Allgemeine Definition

Grundsätzlich entspricht die Konfiguration des Implex den Konfigurationsparametern der anderen Importmöglichkeiten (für csv, xml und CortexDB zu CortexDB). Anzupassen ist lediglich der Abschnitt ReaderModule. Hier erfolgen die Angaben zur Klassen-Datei (in einem Unterverzeichnis), zum SQL-Server mit den Login-Angaben, ein SQL-Select-Statement und die Angabe zum Treiber und Trennzeichen.

    <ReaderModule type="user" class="......" >
        <hostname>......</hostname>
        <dbname>......</dbname>
        <port>......</port>
        <user>......</user>
        <password>......</password>
        <select><![CDATA[......]]></select>
        <driver>......</driver>
        <RepSeparator>......</RepSeparator>
    </ReaderModule>

Hinweis zum SQL-Statement

Das SQL-Statement muss in einem CDATA-Block eingeschlossen werden, da durch die SQL-Anweisungen ansonsten eine ungültige XML-Konfigurationsdatei entstehen würde.

Die Angabe des Attributs class orientiert sich an der Verzeichnisstruktur der Reader-Klasse. Wurde die Klasse in Relation zur Import-Konfiguration im Verzeichnis com/cortex_ag/SqlReader abgelegt, lautet die Class-Angabe: com.cortex_ag.SqlReader.

Nachfolgende Beispiele zeigen die Konfiguration für unterschiedliche Treiber und Klassen-Verzeichnisse.

Beispiele

Generell können aus jeder SQL-Datenbank Daten importiert werden. Hierfür ist jeweils der SQL-JDBC-Connector der jeweiligen Quelle notwendig. Diese sind vom Hersteller der SQL-Datenbank verfügbar.

Folgende Konfigurationen zeigen beispielhaft entsprechende Konfigurationen, die für die jeweilige Quelle angepasst werden müssen.

MariaDB

    <ReaderModule type="user" class="com.cortex_ag.SqlReader">
        <hostname>relational.fit.cvut.cz</hostname>
        <port>3306</port>
        <dbname>twitterfromsearch4_20101001</dbname>
        <user>guest</user>
        <password>relational</password>
        <select>
            <![CDATA[
                SELECT user_id, GROUP_CONCAT(follower_id SEPARATOR ',') as follower FROM twitterfromsearch4_20101001.active_follower_real GROUP BY user_id;
            ]]>
        </select>
        <driver>mariadb</driver>
        <RepSeparator>,</RepSeparator>
        <RepColumn>follower as followers</RepColumn><!-- dieser Knoten kann sich wiederholen, so oft wie es wiederholfelder gibt. -->
    </ReaderModule>

Firebird

    <ReaderModule type="user" class="com.FireBird.FireBirdSQLReader" >
        <hostname>my.host.local</hostname>
        <dbname>myFirebirdDB</dbname>
        <port>3050</port>
        <user>_admin_</user>
        <password>_admin_</password>
        <select>
            <![CDATA[
                SELECT m.*
                    FROM accounts m
                    WHERE m.ACTIVE >= 1
                    AND m.KDN is not null
                    AND m.ZIP is not null
            ]]>
        </select>
        <driver>firebirdsql</driver>
        <RepSeparator>,</RepSeparator>
    </ReaderModule>

Verweisauflösung per Linker

Wie im Abschnitt für die manuelle Linker-Ausführung beschrieben, ist es innerhalb der Datenbank möglich, dass über sog. "Verweisfelder" Relationen zwischen Datensätzen hergestellt werden, um Beziehungen untereinander abzubilden. Die Ausführung mit Hilfe des Plugins ermöglicht dieses zu jeder Zeit. Über eine Konfigurationsdatei kann die Java-Applikation ImPlex auch über Systemdienste aufgerufen werden, um die Verweise regelmäßig und automatisch herzustellen.

Bei der Konfigurationsdatei für den Linker handelt es sich wie bei den Import-Konfigurationen um eine xml-Datei. Diese besteht aus den zwei grundlegenden Abschnitten "Global" für die Login-Parameter und "Linker" für die eigentliche Konfiguration.

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>_IP-Adresse_</LoginIP>
    <LoginPort>_DB-Port_</LoginPort>
    <LoginUser>_Benutzerkonto_</LoginUser>
    <LoginPW>_Passwort_</LoginPW>
    <ImportMode>u</ImportMode>
  </Global>

  <Linker>
    <Link>...=...</Link>
  </Linker>
</CtxImport>

Im Abschnitt "Linker" wird die Zuweisung des entsprechenden Feldes vorgenommen. Hier wird definiert, über welches Feld in einem Datensatz (links vom Gleichheitszeichen) auf ein Ziel verwiesen werden soll. Zu beachten ist hierbei, dass ein Zielfeld angegeben wird, ein gültiger Link aber auf einen kompletten Datensatz zeigt. Wenn das Zielfeld also in mehreren Datensatztypen verwendet wird, sind entsprechende Felder oder zusätzliche Parameter zu setzen (siehe untenstehende Beispiele).

Beispiel mit Login und einfacher Zielfeld-Zuweisung:

<?xml version="1.0" encoding="UTF-8"?>
<CtxImport>
  <Global>
    <LoginIP>127.0.0.1</LoginIP>
    <LoginPort>29000</LoginPort>
    <LoginUser>importusr</LoginUser>
    <LoginPW>importpwd</LoginPW>
    <ImportMode>u</ImportMode>
  </Global>
  <Linker>
    <Link>lPerFir=FirNam</Link>
  </Linker>
</CtxImport>

In dem hier gezeigten Beispiel wird der Inhalt vom Feld mit dem Synonym "lPerFir" in dem Feld "FirNam" gesucht. Wird genau ein Datensatz gefunden, erfolgt die Verweis-Auflösung.

optionale Quellfelder

Wurde während des Datenimportes ein anderes Feld gefüllt und das eigentliche Verweisfeld leer gelassen, kann das gefüllte Feld als optionales Quellfeld herangezogen werden. Der Inhalt aus diesem Feld wird also gesucht und der endgültige Link in das Verweisfeld geschrieben. Der Inhalt in dem optionalen Quellfeld bleibt dabei erhalten.

<Linker>
  <Link optSource="myFirN">lPerFir=FirNam</Link>
</Linker>

optionale Quell- und Ziel-Datensatztypen

Werden dieselben Felder in unterschiedlichen Datensatztypen verwendet, sind eindeutige Links für den Linker möglicherweise nicht eindeutig festzustellen. Um dieses sicherzustellen, eigenet sich die Angabe von Quell- und Ziel-Datensatztypen. Diese werden als Attribut angegeben:

<Linker>
  <Link sourceType="Pers" targetType="Firm">lPerFir=FirNam</Link>
</Linker>

Die Kombination mit optionalen Quellfeldern ist hierbei selbstverständlich möglich:

<Linker>
  <Link sourceType="Pers" targetType="Firm" optSource="myFirN">lPerFir=FirNam</Link>
</Linker>

mehrere Angaben für die Zielsuche

Um einen eindeutigen Zieldatensatz zu finden, können mehrere Felder angegeben werden. Der Linker sucht dann den Inhalt des noch nicht aufgelösten Verweisfeldes (oder des optionalen Quellfeldes) innerhalb der Datenbank und löst den Verweis auf, wenn die Kombination der Felder einen eindeutigen Datensatz zurückliefert.

Beispielsweise könnten das Quellfeld mehrere Inhalte (durch Komma getrennt) aufweisen:

Argus Verlag, 30916, Hannover

Innerhalb der Datenbank muss der Linker nunmehr die Inhalte für den Firmennamen, die Postleitzahl und den Ort in den entsprechenden Feldern suchen, um eindeutig einen Datensatz zu finden. Um es weiterhin noch genauer einzuschränken, werden Quell- und Ziel-Typ angegeben.

<Linker>
  <Link sourceType="Pers" targetType="Firm" optSource="myFirN">lPerFir=FirNam,FirPLZ,FirOrt</Link>
</Linker>

Beachten Sie hierbei, dass diese Art der Konfiguration natürlich zu einer längeren Suche führt, da mehrere Felder überprüft werden müssen. In umfangreichen Datenbeständen wäre es daher unter Umständen erheblich schneller, in einem optionalen Quellfeld einen eindeutigen Wert zu erfassen, der innerhalb eines Feldes als eindeutige Referenz im Zieldatensatz gespeichert wurde.

Ergänzende Filterparameter

Ergänzend zu den oben gezeigten Konfigurationen besteht die Möglichkeit, weitere Filterparameter anzugeben. Diese werden einfach hinter die Suchfelder aufgeführt:

<Linker>
  <Link sourceType="Pers" targetType="Firm" optSource="myFirN">lPerFir=FirNam,FirPLZ,FirOrt,FirActv=yes</Link>
</Linker>

In dem hier gezeigten Beispiel würde der Link daher nur gesetzt (aufgelöst) werden, wenn folgende Kriterien zutreffen:

  • das Linkfeld wird im Datensatztyp "Pers" genutzt
  • der Verweis soll auf den Datensatztyp "Firm" verweisen
  • es existiert ein optionales Quellfeld "myFirN"
  • das optionale Quellfeld besitzt die Inhalt für Firnemname, Postleitzahl und Ort in genau der Reihenfolge, durch Komma getrennt
  • die Zieldatensätze besitzen in dem Feld mit dem Synonym "FirActv" den Eintrag "yes"

Nur wenn diese Kriterien vollständig zutreffen, wird der Verweis gesetzt.

Import ohne Datenmodell

Für den Import von Daten, ohne vorher ein Datenmodell für den Uniplex zu definieren, müssen für jedes zu importierende Feld weitere Attribute genutzt werden. Diese beschreiben den Feldtyp, wie dieser im Uniplex genutzt wird (und ggf. auch für eigene Anwendungen) und wie das Datenbanksystem die Daten verwalten soll (sog. "Basisfeldtyp"). Beide Attribute sind zwingend notwendig.

<Field fieldType="[.....]" baseType="[.....]">

Beispiel

<Field fieldType="C" baseType="0">[.....] = [.....]</Field>
<Field fieldType="M" baseType="2">[.....] = [.....]</Field>

Für die Feldtypen und Basis-Feldtypen können folgende Werte eingesetzt werden.

Nur erlaubte Kombinationen verwenden!

Zwingend zu beachten sind die erlaubten Kombinationen. Einige Feldtypen sind nur mit bestimmten Basis-Feldtypen erlaubt.

Feldtypen

Typ Bedeutung
C Zeichen
N positive Ganzzahlen (Integer)
F Gleitkommazahlen (Float/Double)
D Datum
T Timestamp (zwingend Konvertierung mit der Funktion time() )
I interner Verweis
J JSON-Feld (nur Basistyp 1!)
B Datei (nur Basistyp 1!)
M Mehrzeiliges Textfeld (nur Basistyp 2!)

Basis-Feldtypen

Typ Bedeutung
0 Felder mit Feldindex
1 Daten-Container / JSON Felder
2 Felder ohne Feldindex (mehrzeilige, kurze binärdaten o.ä.)
3 Felder mit Feldindex der auch die Zeitscheibeninformationen umfasst