Include: Unterschied zwischen den Versionen

Aus IMPS
Zur Navigation springen Zur Suche springen
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 1.936: Zeile 1.936:
 
   LogMessage "#269.INI Test IF nur für %_TMP_ELEMENT% >= 2"
 
   LogMessage "#269.INI Test IF nur für %_TMP_ELEMENT% >= 2"
 
  ENDIF
 
  ENDIF
 +
 +
 +
== CASE / CASECON / DEFAULT / ENDCASE ==
 +
 +
'''Verfügbar ab Version 23.21, nur in der Section FIELDS der Mappingdatei erlaubt'''
 +
 +
CASE definiert den Anfang eines Case-Blocks, ENDCASE das Ende. Jede Bedingung wird mit CASECON eingeleitet, DEFAULT wird ausgeführt, wenn nichts anderes getroffen hat.
 +
 +
Hiermit wird eine klassische Case-Funktion abgebildet, wobei maximal eine Bedingung ausgeführt wird.
 +
 +
Beispiel
 +
  Set _TMP_VALUE 3
 +
  CASE
 +
 
 +
    CASECON {%_TMP_VALUE% == 1}
 +
      LogMessage "CASECON 1"
 +
     
 +
    CASECON {%_TMP_VALUE% < 4}
 +
      IF {%_TMP_VALUE% == 2}
 +
        LogMessage "CASECON 2"
 +
      ELSE
 +
        LogMessage "CASECON 3"
 +
      ENDIF   
 +
       
 +
    DEFAULT
 +
      LogMessage "CASECON DEFAULT"
 +
     
 +
  ENDCASE
  
 
== FOREACH <vari> {<list>} / ENDFE ==
 
== FOREACH <vari> {<list>} / ENDFE ==

Aktuelle Version vom 13. Mai 2025, 10:57 Uhr

Detailbeschreibung aus Konfiguration

Diese Funktionen werden mit dem Importservice ausgeliefert und können in allen Konfigurationsbereichen verwendet werden. Damit diese Funktionen verwendet werden können ist es notwendig sie zu installieren. Hierzu muss die gleichnamige Datei aus dem Ordner "D:\StratOz\apps\ImportService\Include\Optional" in das Verzeichnis "D:\StratOz\apps\ImportService\Include" verlinkt werden. Dies erfolgt mit Hilfe von [mklink] um bei Updates kompatibel zu bleiben(Zum Beispiel: mklink D:\stratoz\apps\Importservice\Include\Optional\ErrorIfNotExists.tbc D:\stratoz\apps\Importservice\Include\ErrorIfNotExists.tbc). Alternativ (nicht empfohlen!) kann die Datei auch kopiert werden, bei Updates muss dies dann berücksichtigt und die Datei auch erneut kopiert werden!

ScriptDir

liefert den Root der integrationPlatform

Rex_1

liefert den ersten geklammerten regulären Teilausdruck.

WebserviceCall

wird verwendet, um aus dem mapping.ini-Regelwerk Operationen auf dem Webserviceobjekt ausführen zu können.

WebserviceCall führt eine Funktion aus und übergibt an sie als ersten Parameter das Webserviceobjekt.

Wird der Zusatz Direct verwendet, so wird direkt eine Methode des Webservice ausgeführt. Somit müssen die Methoden nicht mehr als eigene Funktionen im Includeverzeichnis abgebildet werden (s.DeleteObject).

Der WebserviceCall sorgt für ein geregeltet Reconnect, wobei er die Einstellungen aus [TIMEOUT,CONNECT] beachtet. Mit WebserviceCall direct <methode> -retryToConnect <value> kann die Retryeinstellung aus der system.ini überschrieben werden.

Oft wird mit Hilfe des WebserviceCall z.B. eine Vorregistrierung vorgenommen:

_TMP_OID = WebserviceCall ::CreateObject::DocumentByQuery DOK *DUMMY* [list [list qrtReference BATTODO qcAnd qoEqual %tmp_1%]] [list [list ws-ps_ob.object_type P] [list ws-ps_ob.object_id 00000.01]] [list [list BATTODO %_tmp_1%]]
ws-ps_ob.object_id = [lindex [WebserviceCall Direct GetFields "E" %Value_1% [] [list oOrgaId]] 1]

DelayStartAPI

zur Verzögerung des IS-Starts, bis die Corsa-API bereit ist


GetContactByCase

VERALTET!!! SIEHE: ::GetContact::ByCase

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen.

INPUT:

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- ID des Workflows

OUTPUT:

Liste mit den Elementen:

- Kontakttyp (P/E)
- Kontakt-ID

::CreateObject

Namespace, der dem folgenden Prozeduren voranzustellen ist.


::DocumentByQuery

!Achtung: Ab der CORSA Version 2019 muss der Parameter Dokument-ID leer sein ("") wenn eine automatische ID erzeugt werden soll.

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen Sie wird genutzt, um eine Vorregistrierung vorzunehmen. Das Szenario kann z.B. sein, dass Autonummerierung verwendet wird, wenn bestimmte Voraussetzungen aber gegeben sind, ein vorhandenes Objekte verwendet werden soll.

In jedem Fall muss aber die korrekte ObjektID zurückgegeben oder ein Fehler ausgelöst (wenn mehrere Treffer da sind) werden.

INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Dokumentart
- Dokument-ID 
- Query (in Jobservicesyntax)
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]] 
- Key/Value-Liste der Zusatzfelder
- weitere Minusparameter (z.B. -DuplicateID und -DSPTemplateID seit der Version 17.1 des Importservice) ACHTUNG! Diese Parameter funktionieren nur bei neuen Registrierungen nicht bei bestehenden! Deswegen an dieser Stelle besser nicht verwenden sondern Include#::Document verwenden.


OUTPUT:

Die ObjekteID des gefundenen bzw. angelegten Objektes


Intern wird die Variable ::mapping::objectCreated auf 1 gesetzt, wenn ein Dokument neu angelegt wird. Wird ein vorhandenes Objekt verwendet, so hat sie den Wert 0.

Im Fehlerfall kann es notwendig sein das Objekt in der ERROR Section wieder zu löschen. Das Szenario ist unter CMD beschrieben.


Beispiel:

WebserviceCall ::CreateObject::DocumentByQuery DOK "" [list [list qrtReference dRef1 qcAnd qoEqual "WV4714"]] {} [list [list dRef1  "WV4714"]]
WebserviceCall ::CreateObject::DocumentByQuery DOK "" [list [list qrtDbField poststuk_id qcAnd qoEqual %DocId%]] {} {}

::OrganisationByQuery

!Achtung: Ab der CORSA Version 2019 muss der Parameter Organisations-ID leer sein ("") wenn eine automatische ID erzeugt werden soll.

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen Sie wird genutzt, um eine Vorregistrierung vorzunehmen. Das Szenario kann z.B. sein, dass Autonummerierung verwendet wird, wenn bestimmte Voraussetzungen aber gegeben sind, ein vorhandenes Objekte verwendet werden soll.

In jedem Fall muss aber die korrekte ObjektID zurückgegeben oder ein Fehler ausgelöst (wenn mehrere Treffer da sind) werden.

INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Organisationsart
- Organisations-ID
- Query (in Jobservicesyntax)
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder


OUTPUT:

Die ObjekteID des gefundenen bzw. angelegten Objektes


Intern wird die Variable ::mapping::objectCreated auf 1 gesetzt, wenn ein Dokument neu angelegt wird. Wird ein vorhandenes Objekt verwendet, so hat sie den Wert 0.

Im Fehlerfall kann es notwendig sein das Objekt in der ERROR Section wieder zu löschen. Das Szenario ist unter CMD beschrieben.


Beispiel:

WebserviceCall ::CreateObject::OrganisationByQuery CUSTOMER "" [list [list [qrtReference oRef1 qcAnd qoEqual "10015"]] {} [list [list oRef1 "10015"]]

::PersonByQuery

!Achtung: Ab der CORSA Version 2019 muss der Parameter Person-ID leer sein ("") wenn eine automatische ID erzeugt werden soll.

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen Sie wird genutzt, um eine Vorregistrierung vorzunehmen. Das Szenario kann z.B. sein, dass Autonummerierung verwendet wird, wenn bestimmte Voraussetzungen aber gegeben sind, ein vorhandenes Objekte verwendet werden soll.

In jedem Fall muss aber die korrekte ObjektID zurückgegeben oder ein Fehler ausgelöst (wenn mehrere Treffer da sind) werden.

INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Personart
- Person-ID
- Query (in Jobservicesyntax)
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder


OUTPUT:

Die ObjekteID des gefundenen bzw. angelegten Objektes


Intern wird die Variable ::mapping::objectCreated auf 1 gesetzt, wenn ein Dokument neu angelegt wird. Wird ein vorhandenes Objekt verwendet, so hat sie den Wert 0.

Im Fehlerfall kann es notwendig sein das Objekt in der ERROR Section wieder zu löschen. Das Szenario ist unter CMD beschrieben.


Beispiel:

WebserviceCall ::CreateObject::PersonByQuery EMPLOYEE "" [list [list [qrtReference pRef1 qcAnd qoEqual "10015"]] {} [list [list pRef1 "10015"]]

::FolderByQuery

!Achtung: Ab der CORSA Version 2019 muss der Parameter Akten-ID leer sein ("") wenn eine automatische ID erzeugt werden soll.

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen Sie wird genutzt, um eine Vorregistrierung vorzunehmen. Das Szenario kann z.B. sein, dass Autonummerierung verwendet wird, wenn bestimmte Voraussetzungen aber gegeben sind, ein vorhandenes Objekte verwendet werden soll.

In jedem Fall muss aber die korrekte ObjektID zurückgegeben oder ein Fehler ausgelöst (wenn mehrere Treffer da sind) werden.

INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Aktenart
- Akten-ID
- Query (in Jobservicesyntax)
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder


OUTPUT:

Die ObjekteID des gefundenen bzw. angelegten Objektes


Intern wird die Variable ::mapping::objectCreated auf 1 gesetzt, wenn ein Dokument neu angelegt wird. Wird ein vorhandenes Objekt verwendet, so hat sie den Wert 0.

Im Fehlerfall kann es notwendig sein das Objekt in der ERROR Section wieder zu löschen. Das Szenario ist unter CMD beschrieben.


Beispiel:

WebserviceCall ::CreateObject::FolderByQuery INV "" [list [list qrtReference dRef1 qcAnd qoEqual "INV04711"]] {} [list [list dRef1  "INV04711"]]

::RealEstateByQuery

!Achtung: Ab der CORSA Version 2019 muss der Parameter Immobilien-ID leer sein ("") wenn eine automatische ID erzeugt werden soll.

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen Sie wird genutzt, um eine Vorregistrierung vorzunehmen. Das Szenario kann z.B. sein, dass Autonummerierung verwendet wird, wenn bestimmte Voraussetzungen aber gegeben sind, ein vorhandenes Objekte verwendet werden soll.

In jedem Fall muss aber die korrekte ObjektID zurückgegeben oder ein Fehler ausgelöst (wenn mehrere Treffer da sind) werden.

INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Immobilienart
- Immobilien-ID
- Query (in Jobservicesyntax)
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder


OUTPUT:

Die ObjekteID des gefundenen bzw. angelegten Objektes


Intern wird die Variable ::mapping::objectCreated auf 1 gesetzt, wenn ein Dokument neu angelegt wird. Wird ein vorhandenes Objekt verwendet, so hat sie den Wert 0.

Im Fehlerfall kann es notwendig sein das Objekt in der ERROR Section wieder zu löschen. Das Szenario ist unter CMD beschrieben.


Beispiel:

WebserviceCall ::CreateObject::RealEstateByQuery OBJECT "" [list [list [qrtReference vRef1 qcAnd qoEqual "HO_SCHW"]] {} [list [list vRef1 "HO_SCHW"]]

::Folder

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen. Sie legt eine Akte an, wenn sie noch nicht existiert. Die Rückgabe ist die Akten-ID, sollte keine Akte angelegt werden können oder stimmt die erzeugte ID nicht mit der vorgegebenen überein, so wird eine Fehlermeldung geworfen.


INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Aktenart
- Akten-ID
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder

optionale Minusparameter:

-contactType <Kontakttyp des zu verlinkenden Kontaktes>
-contactID <KontaktID des zu verlinkenden Kontaktes>


OUTPUT: Die ID der Akte, wenn es geklappt hat


Globale Werte, die in der Prozedur gesetzt werden:

::mapping::objectCreated: Ein neues Objekte wurde angelegt (1) oder nicht (0)
::mapping::createdObjectID: Die Nummer, unter der das Objekt angelegt wurde (z.B. für das Löschen in der ERROR-Section im Fall von eingestellter Autonummerierung


ERROR

- Das Objekt kann nicht angelegt werden
- Das Objekt wurde unter einer abweichenden Nummer angelegt (Autonummerierung eingeschaltet?)

::Person

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen. Sie legt eine Person an, wenn sie noch nicht existiert. Die Rückgabe ist die PersonenID, sollte keine Person angelegt werden können, so wird eine Fehlermeldung geworfen.


INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Personenart
- Personen-ID
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder

optionale Minusparameter:

-contactType <Kontakttyp des zu verlinkenden Kontaktes>
-contactID <KontaktID des zu verlinkenden Kontaktes>


OUTPUT: Die ID der Person, wenn es geklappt hat


ERROR: wenn ein Fehlerereignis vorliegt

::Organisation

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen. Sie legt eine Organisation an, wenn sie noch nicht existiert. Die Rückgabe ist die Organisations-ID, sollte keine Organisation angelegt werden können, so wird eine Fehlermeldung geworfen.


INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Organisationsart
- OrganisationsID
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder

optionale Minusparameter:

-contactType <Kontakttyp des zu verlinkenden Kontaktes>
-contactID <KontaktID des zu verlinkenden Kontaktes>


OUTPUT: Die ID der Organisation, wenn es geklappt hat


ERROR: wenn ein Fehlerereignis vorliegt

::Document

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen. Sie legt ein Dokument an, wenn es noch nicht existiert. Die Rückgabe ist die Dokument-ID, sollte kein Dokument angelegt werden können, so wird eine Fehlermeldung geworfen.


INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Dokumentart
- Dokument-ID
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder
- weitere Minusparameter (z.B. -DuplicateID und -DSPTemplateID seit der Version 17.1 des Importservice)

optionale Minusparameter:

-contactType <Kontakttyp des zu verlinkenden Kontaktes>
-contactID <KontaktID des zu verlinkenden Kontaktes>


OUTPUT: Die ID des Dokumentes, wenn es geklappt hat


ERROR: wenn ein Fehlerereignis vorliegt


Beispiel:

  1. Vorregistrierung des Dokumentes, wenn es noch nicht vorhanden ist, um Linkfehler zu vermeiden

_TMP_DOCREL = split [CheckDefinition %DOCREL%] [format %c 254]

  1. Rechnungsnummernformat ist REA* und steht auf manuell

_TMP_CREATEDOC = catch {foreach _element %_TMP_DOCREL% { if {[string toupper [string range $_element 0 2]] eq "REA"} {WebserviceCall ::CreateObject::Document REA $_element {} {} }}}

::RealEstate

Diese Prozedur wird mit dem Wrapper WebserviceCall aufgerufen. Sie legt eine Immobilie an, wenn sie noch nicht existiert. Die Rückgabe ist die Immobilien-ID, sollte keine Immobilien angelegt werden können, so wird eine Fehlermeldung geworfen.


INPUT

- Webserviceobject (wird automaitsch von WebserviceCall übergeben)
- Immobilienart
- Immobilien-ID
- Key/Value-Liste der Systemfelder ([list [list key1 value1] ... [list key<n> value <n>]]
- Key/Value-Liste der Zusatzfelder

optionale Minusparameter:

-contactType <Kontakttyp des zu verlinkenden Kontaktes>
-contactID <KontaktID des zu verlinkenden Kontaktes>


OUTPUT: Die ID der Immobilie, wenn es geklappt hat


ERROR: wenn ein Fehlerereignis vorliegt

::DocVersion

::DocVersion::NextVersion

 ::DocVersion::NextVersion <webservice object> <document id>

Die nächste freie Versionnummer für ein Objekt wird zurückgegeben. Die alte Syntax ohne den Namespace sollte möglichst nicht mehr verwendet werden.

 NATVERSION = WebserviceCall ::DocVersion::NextVersion DOC0007411

::DocVersion::ActualVersion

::DocVersion::ActualVersion <webservice object> <document id> [-correctFirstVersion <ccorrectFirstVersion (0,1)>]

Die letzte verwendete Versionsnummer wird zurückgegeben, um diese Dateiversion z.B. überschreiben zu können (dabei müssen die Corsarechte beachtet werden). Ist noch keine Version vorhanden, so wird anstelle der 0 die 1 zurückgegeben, falls correctFirstVersion auf 1 steht.

 NATVERSION = WebserviceCall ::DocVersion::ActualVersion %OBJECTID%

::DocVersion::CorrectFirstVersion

::DocVersion::CorrectFirstVersion <@version>

Mit dieser Funktion wird die Version 0 auf Version 1 gesetzt, die dann bei NAT, ARC, OCR und TMB verwendet werden kann (0 zählt jedes Mal hoch).

::DocVersion::DeleteVersion

::DocVersion::DeleteVersion <webservice object> <document id>

Die letzte Dokumentversion wird, falls die Rechte das zulassen, gelöscht. Der Erfolgsstatus wird zurückgegeben (0/1).

::DocVersion::DeleteToVersion

::DocVersion::DeleteToVersion <webservice object> <document id> [-version <version,0> -correctFirstVersion <correctFirstVersion,(0,1)> -protDeleteActionOk <protDeleteActionOk,"P"> -protDeleteActionError <protDeleteActionError,"P">] 

Die Funktion löscht, sofern es die Rechte zulassen, mit der höchsten Versionnummer beginnend bis zur angegebenen Version, alle Versionen. Wenn alle Versionen gelöscht werden (version = 0), dann kann über correctFirstVersion gesteuert werden, ob 1 oder 0 zurückgegeben wird. Die Protokollierung im Erfolgs- und Fehlerfall kann ebenfalls konfiguriert werden. Die aktuell höchste Versionsnummer wird zurückgegeben.

NATVERSION  = WebserviceCall ::DocVersion::DeleteToVersion %OBJECTID% -correctFirstVersion 1

::ErrorIfNotExists::ErrorIfNotExists

Diese Funktion meldet eine Fehler an den Import, wenn eine Datei nicht vorhanden ist, um später scheiternde Transaktionen, die die integrationPlatform in eine Endlosschleife schicken würden, erst gar nicht zu erzeugen.

Sinnvoll ist diese Funktion z.B. bei NAT, ARC, OCR und TMB.


INPUT: Pfad+Dateiname der zu untersuchenden Datei


OUTPUT: Pfad+Datei wie übergeben, falls die Datei vorhanden ist


ERROR: Ein Fehlerevent, wenn die Datei nicht vorhanden ist


Achtung: Die alte Aufrufvariante ::ErrorIfNotExists bleibt weiterhin, auch längerfristig, gültig, sollte aber nicht mehr verwendet werden.

Return

Die Prozedur Return reicht einen String durch. Sie macht das gleiche wie return, wird jedoch vom catch {} nicht abgefangen.

Es sollte immer Return anstelle von return bei der Definition von Mappingdatei verwendet werden!

Sollen nicht definierte Werte nicht als *NOT_DEF* sondern als Leerstring durchgereicht werden, so ist CheckDefinition zu verwenden.

Set <field> <value> -storeToUpliad <0,1>

Set setzt eine Mappingvariable. Diese Variable kann dann in der Folge mit %<varname>% oder [Get <varname>] verwendet werden. Neu ab 23.17: Der Parameter -updateList (Standard [<channel>,SetStoreToUpload] oder [SetStoreToload] oder 1) steuert, ob die Variable in die Uploaddatenliste geschrieben wird. Für nähere Details s. die Beschreibung innerhalb der Mappingregelwerks. (s.a. https://imps.stratoz.de/index.php/Mapping.ini#gesammelte_Schl.C3.BCssel)

Get

Mit Get kann eine Mappingvariable ausgelesen werden. Meistens verhält sich der Ausdruck wie %varname%, bei komplexen Ausdrücken ist es manchmal aber notwendig Get zu verwenden. (s. a. https://imps.stratoz.de/index.php/Mapping.ini#gesammelte_Schl.C3.BCssel)

Lappend <field> <value> -storeToUpload (0,1)

Lappend erweitert eine Liste als Mappingvariable, so wie lappend das mit einer Tcl-Variablen tut. Der Parameter -storeToUpload (Standard [<channel>,LappendStoreToUpload] oder [LappendStoreToload] oder 1) steuert, ob die Variable in die Uploaddatenliste geschrieben wird.

Lappend _TMP_List "269"

Required

Wenn der Wert einer Variablen leer oder 'NOT_DEF* ist, so wird ein Fehler ausgelöst, ansonsten der Wert zurückgegeben.


INPUT:

- value: Wert der Variable
- fieldName: Name der Variable für den Fehlertext


Beispiel:

dDate = Required %DATE% Dokumentdatum

CheckEmpty

CheckEmpty <arg1> prüft, ob das Argument den Wert "*NOT_DEF*" hat, der anzeigt, dass eine Variable nicht definiert wurde (im Gegensatz zum Leerstring, der einen leeren Wert definiert).

In diesem Fall wird ein Leerstring zurückgegeben, sonst der Wert des Arguments.


CheckDefinition

INPUT:

- Feldwert
- Initalisierungswert (optional), Vorbelegung ""

Wenn der Feldwert ungleich *NOT_DEF* oder *UNDEFINED* ist, so wird er selbst zurückgegeben, sonst der Initialisierungswert.

CheckDefinition entfernt nun außenstehende Leerzeichen und Zeilenumbrüche. Zeilenumbrüche sind Beispielsweise immer beim letzten Feldwert in CORSA idx-Dateien enthalten, da sie immer eine Leerzeile am Ende haben


LogMessage

Mit LogMessage können Logevents erstellt werden. Der frühere Befehl Protokoll ist nicht mehr unterstützt.

LogMessage <MessageText> <<optionale Parameter>>

Folgende Minusparameter werden unterstützt:

- type: Protokollflags; optional, Standard "P" (s. Dokumentation der Events)
- label: Label aus der messages.ini; optional, Standard ""
- nocommands: Kommandos werden nicht substituiert; optional, Standard 1
- novariables: Variablen werden nicht substituiert; optional, Standard 1
- nobackslashes: Backslashes werden nicht substituiert; optional, Standard 0
- ignorePauseMessage: Meldung, dass der Kanal pausiert wird, unterdrücken; optional, Standard 0

SafeGlob

SafeGlob findet auch Dateien mit "[" und "$" und versucht es noch einmal, wenn der Ordner gerade nicht verfügbar ist (SecureGlob). Die Syntax entspricht dem glob <<param>> Befehl von TCL.

MappingBasedOnField

Die Funktion kann in der system.ini beim Parameter "MAPPINGRULE" angegeben werden. Durch die Funktion kann anhand von Feldwerten eines IDX Feldes eine spezifische mapping.ini für die Verarbeitung gewählt werden


INPUT:

- totalText, Inhalt der IDX-Datei, wird mittels der Variable $totalText übergeben
- counter, Zähler des Aktiven ImportKanals, wird mittels der Variable $counter übergeben
- idxFieldName, Name des HeaderFeldes in der IDX-Datei
- possibleValues, TCL Liste der Werte die in dem "idxFieldName" enthalten sein dürfen, damit die angegebene mapping.ini verwendet wird


Beispiel:

MAPPINGRULE               = MappingBasedOnField $totalText $counter DOKTYP [list ZMVEB ZMVBNW]
MAPPINGFILEIF             = D:/Programme/CIMiner/ImportServiceWEB/mapping/IMPORT34_ZMV_AUTOMATIC_mapping.ini
MAPPINGRULE               = MappingBasedOnField $totalText $counter DOKTYP [list ZMVR ZMVO]
MAPPINGFILEIF             = D:/Programme/CIMiner/ImportServiceWEB/mapping/IMPORT34_ZMV_MANUAL_mapping.ini


In diesem Beispiel wird die "IMPORT34_ZMV_AUTOMATIC_mapping.ini" verwendet, wenn in dem IDX-Feld "DOKTYP" entweder der Wert "ZMVEB" oder "ZMVBNW enthalten ist.

Sollte das Feld den Wert "ZMVR" oder "ZMVO" enthalten wird hingegen die "IMPORT34_ZMV_MANUAL_mapping.ini" verwendet.

::simpleSplit

Splitadapter


 ::simpleSplit::PDF   


Splitadapter für PDF- und Textdateien (mit Formfeedzeichen zur Seitentrennung).


Dieser Adapter wird in Function eingehängt und kann optionale -Parameter benutzen.


Der Aufruf hat folgendes Format:

::simpleSplitPDF <-optionale Minusparameter>


Beispiel:

FUNCTION = ::SimpleSplit::PDF -generateTXT 1

oder

FUNCTION = ::SimpleSplit::PDF -noPDF 1 -ignoreLastFF 0 -insertFFCMD {regsub -all -- {\n01} $content "\n\f01"} -pdftk "C:\\Program Files (x86)\\PDFtk Server\\bin\\pdftk.exe" 


-splitStamp

Interner Splitstring, der in der Regel nicht verändert werden muss.


-lockFile

Name der Lockdatei.

Default: lock.dat


-pdftk

Angabe von Pfad und Dateinamen des Tools pdftk. Standardmäßig wird unter Importservice/tools nachgeschaut.


-rex

Der reguläre Ausdruck der beschreibt, auf welchen Seiten getrennt werden soll. Getrennt wird immer am Seitenumbruch.

Default: {(?=\f)}


-insertFFCMD

Befehl, mit dem der Textinhalt manipuliert werden kann (in der Regel zum Einfügen von FF, kann aber auch anders verwendet werden). Das ist immer dann erforderlich, wenn die Daten keine FF enthalten oder nicht an allen trennbaren Stellen.

Default: ""

-insertFFCMD {regsub -all -- {\n01} $content "\n\f01"}


-protEvent

Event für die Protokolleinträge.

Default: P


-sourceDir

Importverzeichnis, in dem die Dateien erwartet werden (nicht numeriert). Unter diesem Verzeichnis werden die numerierten Verzeichnisse angelegt.

Default: SourceDir


-ageOfFile

Mindestalter der Quelldatei in Sekunden.

Default: 1


-ignoreLastFF

Am abschließenden Formfeed der letzten Seite wird nicht gesplittet, da es sonst eine Leerseite gäbe.

Default: 1


-pdftotext

Angabe von Pfad und Dateinamen des Tools pdftotext. Standardmäßig wird unter Importservice/tools nachgeschaut.


-generateTXT

Aus einer Text-PDF wird selbständig mit dem -pdftotext Tool eine Textdatei erstellt, wenn sie noch nicht vorhanden ist.

Default: 0


-noPDF

Falls der Adapter verwendet werden soll, um lediglich Textdatei zu bearbeiten, so kann die PDF auch deaktiviert werden (-noPDF 1).

Default: 0


-writeIfFunction

Pro gesplittetem Text wird die definierte writeIfFunction aufgerufen, die darüber entscheidet, ob eine Splitdatei geschrieben wird oder nicht. Erlaubte Rückgaben sind 0 (es wird keine Datei geschrieben) und 1 (es wird eine Datei geschrieben).

Wird keine Funktion definiert, so wird immer geschrieben.


Es gibt bereits eine vordefinierte Funktion ::SimpleSplit::WriteIfNew <args>, mit der es möglich ist, nur neuen Inhalt zu schreiben (weil z.B. immer wieder alle Daten aus dem Vorsystem übergeben werden und nicht nur die, die sich geändert haben).

Folgende Parameter können dabei übergeben werden

 -splitDBHandle Handle auf die geöffnete Datenbank des DataTables (MUSS)
 
 optionale Protokollparameter:
   -notOpenMessage      (Default: "P")
   -badHandleMessage    (Default: "P")
   -emptyContentMessage (Default: "P")
   -protHash            (Default: "")

::MakeSubDir::MakeSubDir

Mit MakeSubDir werden numerische Importordner unterhalb des SourceDir erstellt und die Dateien mit der IDXFileExtension und zugehörige (gleicher Name - andere Extension) aus dem SourceDir in die neue erstellten Verzeichnisse verschoben.


Der Aufruf hat folgendes Format:

::MakeSubDir::MakeSubDir <-optionale Minusparameter>


Beispiel:

FUNCTION = ::MakeSubDir::MakeSubDir -seconds 10


-seconds

Mindestalter der Datei in Sekunden (dabei wird bei verschiedenen Zeitstempeln an der Datei der neuste genommen!)

Wird der Wert nicht angegeben, so werden 20 Sekunden verwendet.

-targetDir

Wo sollen die numerischen Ordner angelegt werden (optional, default == SOURCEDIR)

-originalDir

Von wo sollen die Dateien kopiert werden (optional, default == SOURCEDIR)

-fileMask

Es kann ein Filter für die Indexdatei definiert werden (optional, default = "*.IDXFILEEXTENSION)

 ::MakeSubDir::MakeSubDir -seconds 2 -originalDir "d:/stratoz/dataIn/customer" -fileMask "*customer_*.xml"

-createIndex

Es kann eine Dummyindexdatei generiert werden (optional, default == 0), wenn keine im Indexdatei im Prozess vorhanden ist. Mit -indexContent (default == "") kann der Inhalt angegeben werden.

-indexExtension

Wenn die Extension der Indexdatei von der IDXFILEEXTENSION abweicht, dann kann das hier definiert werden.

-batchSize

Die batchSize definiert, wieviel Dateien in einen Ordner geschoben werden (optional, default == 1). Eine batchSize von 0 schieb alle passenden Dateien in einen Ordner.

::MakeSubDir::MakeClusterDirs clusterName args

macht das gleiche wie MakeSubDir für CLUSTER. Die Parameter -seconds, -targetDir, -originalDir und -fileMask werden auch hier unterstützt.

-timeType

Es kann definiert werden, welche Zeit als Referenz für die Sortierung verwendet wird (atime, ctime oder mtime). (Optional, default <import>,CLUSTERTIMETIMETYPE, sonst CLUSTERTIMETIMETYPE, sonst mtime)

::IMPSxmlOO

Über das automatisch angelegt Objekt $::impsXML stehen Methoden bereit, um einfach auf XML-Inhalte zugreifen zu können


Folgende Funktionen existieren:

::IMPSxmlOO::New

New ruft den Konstruktor auf.


optionale Minusparameter:

- nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: 1


::IMPSxmlOO::DeleteObject

Ein Objekt kann entfernt werden.

INPUT:

Objekt: Die ID des Objektes, das zerstört werden soll


Folgende Methoden existieren

GetXMLValue

Werte zwischen Tags können ausgelesen werden.


INPUT:

TAG
Die Bezeichnung des Tags ohne spitze Klammern, Slashes und Parameter
XML Textblock


optionale Minusparameter:

-nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: Einstellung am Objekt mit New
-all
Beschreibung: sollen alle vorkommenden Werte übergeben werden (oder nur einer)
default: 0
-unquote
Macros wie &lt oder &quot werden vor der Rückgabe in ihre Character konvertiert
default: 1
-exact
Das Tag muss genau übereinstimmen, ein Teilstring geht nicht
default: 0

OUTPUT:

Inhalt zwischen den Tags


Beispiel:

NATDOCUMENTNAME       = $::impsXML GetXMLValue LVO:bestandsnaamOrigineel %BIJLAGE_BLOCK%

GetXMLBlocks

XML-Blöcke können (ohne die begrenzenden Tags!) aufgerufen werden


INPUT:

TAG
Die Bezeichnung des Tags, das den XML (Teil-)Block eröffnet

XML Textblock

optionale Minusparameter:

-nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: Einstellung am Objekt mit New
-onlyOne
Beschreibung: Sollen alle vorkommenden Werte übergeben werden oder nur einer
default: 0
-useValueTags
Beschreibung: Sollen auch Blöcke, die nur einen Wert enthalten, zurückgegeben werden? 
default: 0
-unquote
Macros wie &lt oder &quot werden vor der Rückgabe in ihre Character konvertiert
default: 1
-exact
Das Tag muss genau übereinstimmen, ein Teilstring geht nicht
default: 0


OUTPUT:

XML Block zwischen den Tags

GetXMLValuesFromBlocks

Die Werte eines Tags aus bestimmten Blöcken auslesen. Dabei können sowohl die Blöcke als auch die Werte innerhalb eines Blocks mehrfach vorkommen.


INPUT:

Block-TAG
Die Bezeichnung des Tags, das den XML (Teil-)Block eröffnet
Wert-TAG
Die Bezeichnung des Tags, das den Wert eröffnet
XML Textblock


optionale Minusparameter:

- nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: Einstellung am Objekt mit New
- onlyOne
Beschreibung: sollen alle vorkommenden Blöcke übergeben werden oder nur einer
default: 0
- all
Beschreibung: sollen innerhalb eines Blocks alle gefundenen Werte übergeben werden oder nur einer?
default: 1


OUTPUT:

Eine Liste aller gefundener Werte

Werte zwischen Tags können ausgelesen werden.


INPUT:

TAG
Die Bezeichnung des Tags ohne spitze Klammern, Slashes und Parameter
XML Textblock

optionale Minusparameter:

- nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: Einstellung am Objekt mit New
- all
Beschreibung: sollen alle vorkommenden Werte übergeben werden (oder nur einer)
default: 0


OUTPUT:

Inhalt zwischen den Tags


GetXMLAttributes

Attribute des öffnenden Tags können ausgelesen werden.


INPUT:

TAG
Die Bezeichnung des Tags ohne spitze Klammern, Slashes und Parameter
XML Textblock


optionale Minusparameter:

-nocase
Beschreibung: Groß-/Kleinschreibung ignorieren
default: Einstellung am Objekt mit New
-exact
Das Tag muss genau übereinstimmen, ein Teilstring geht nicht
default: 0

OUTPUT: key/value Liste mit den Attributen und ihren Werte


Beispiel:

_TMP_Attributes = $::impsXML GetXMLAttributes AV269 %XML_BLOCK%

KillTags

Entfernt Tag-Bereiche (auch Blöcke) aus dem übergebenen XML-Text

INPUT:

TagList
Liste der zu entfernenden Tags
XML Textblock

OUTPUT:

Die übergebene XML ohne die Bereiche, die von den definierten Tags umschlossen werden

::DataTable

Klasse zur Speicherung und Verarbeitung eines Wertes pro Schlüssel

::DataTable::CreateObject

CreateObject ruft den Konstruktor auf.


optionale Minusparameter:

- fileName
Beschreibung: Pfad und Dateiname der Datei, in der die Daten persistent gespeichert werden. Wird das nicht angegeben, so wird intern leer initialisiert und auf einer reinen In-Memory Datenbank gearbeitet.
default: ""
- autoBackup
Beschreibung: steuert, ob vor jedem Schreiben der Datenbank automatisch eine Kopie (*.bak) erstellt werden soll
default: 1
- encoding
Beschreibung: definiert das Encoding der Datendatei
default: utf-8
-keyDB 
Beschreibung: Alternativ zur Speicherung in einer CSV-Datei lässt sich über das Package OZ::database::KeyDB auch eine SQLite3-Datenbank verwenden. Der Wert für den Parameter -keyDB muss dann entsprechend mit "1" übergeben werden. Um die KeyDB-Funktionalität nutzen zu können, ist auch zwingend eine Datei über den Parameter "-fileName" zu setzen. Alle u.g. Methoden stehen auch für die Verwendung mit der KeyDB zur Verfügung.
default: 0

::DataTable::DeleteObject

Ein Objekt kann entfernt werden.

INPUT:

Objekt: Die ID des Objektes, das zerstört werden soll


Folgende Methode existieren

GetAllIndexes

Liefert alle in der Datenbank vorhandenen Schlüssel, um z.B. alle Werte abfragen zu können.

set allIndexes [$object GetAllIndexes]


Get

Liefert den gespeichert Wert für einen Schlüssel, oder "*INVALID_ARRAY_ELEMENT*", wenn der Schlüssel nicht existiert

INPUT:

Key: eindeutiger Schlüssel

OUTPUT:

Value: der gespeichert Wert oder "*INVALID_ARRAY_ELEMENT*", wenn der Key nicht existiert

Set

Schreibt einen neuen Wert für einen Schlüssel


INPUT

Key: eindeutiger Schlüssel
Value: der zu speichernde Wert

Delete

Löscht den Eintrag für einen Key

INPUT:

Key: eindeutiger Schlüssel

OUTPUT:

1/0: Es wurde etwas gelöscht (1) oder nicht (0)

SaveToFile

Aktualisiert die Daten, aber nur, wenn etwas geändert wurde

Backup

Erstellt eine Kopie der Datendatei (*.bak)


BEISPIELEINRICHTUNG:

System.ini
[IMPORT10_SUPPLIER]
INITCMD = set ::import10DataOO [::DataTable::CreateObject -fileName c:/importservice/db/IMPORT10_SUPPLIER.csv]


Mapping_Supplier.ini
[FIELDS]
....
_TMP_STRING = Return %supplier/name%#%PLZ%#%ORT%#%STRASSE%#%IBAN%#%IBAN%#%USTID%#%supplier/searchname%
_TMP_STORED = Return "[$::import10DataOO Get %ID%]"   
            = if {%_TMP_STRING% eq %_TMP_STORED%} { IGNORE; set _changedSupplier 0 } else {$::import10DataOO Set %ID% %_TMP_STRING%; set _changedSupplier 1}

[LATECOMMANDS]
; nach jeder Änderung wird sofort die Datei gespeichert. Das könnte auch alternativ in der system.ini anders eingestellt werden
CMD = if $_changedSupplier {LateTCL {$::import10DataOO SaveToFile}}

AppendContent

VORSICHT: NUR FÜR ERFAHRENE UND GESCHULTE EINRICHTER!

Mit AppendContent ist es möglich in der frühen Interpretation Befehl für die späte Interpretation zu generieren, die an der Stelle, wo sie definiert sind eingefügt werden. Die möglichen Befehle sind der Jobservicedokumentation zu entnehmen. Der Befehl macht nichts, wenn vorher schon ein IGNORE verarbeitet wurde.

Folgendes Beispiel speichert eine ID in der frühen Interpretation und macht sie auch in der späten Interpretation verfügbar, wenn der Service in der Zwischenzeit neu gestartet wird.

 mapping.ini
 [FIELDS]
 supplier/uniqueID   = Return %ID%
 ...
 = AppendContent  "#TCL set ::custommap::supplier_UniqueID %ID%\n"    
 system.ini
 [IMPORT_SAMPLE]
 ...
 JOBS4_CHECKUPLOADFUNC = WebCheckSupplier ew-jclassix64t:5454/WEB_CHECK_SUPPLIER $::custommap::supplier_UniqueID [$this GetGeneratedData]

LateTCL

LateTCL sorgt dafür, dass Befehle in der späten Interpretation ausgeführt werden. Dabei kann ein optionaler Parameter -mode 0/1 übergeben werden, mit dem definiert werden kann, dass Befehle nur im Transaktionsfehlerfall bzw. im Nichtfehlerfall ausgeführt werden. Wird -mode weggelassen, so wird der Befehl immer ausgeführt. Dieser Befehl kann in der mapping.ini/[LATECOMMANDS] oder in der system.ini/Import<n> (bei CMD) verwendet werden. Sollte es aus irgend einem Grund in anderen Sections nötig sein, so ließe sich das auch noch integrieren.

 CMD             = LateTCL [list LogMessage "mit Fehler in der Verarbeitung und Initwert: $::custommap::testValue"] -mode 0
 CMD             = LateTCL [list LogMessage "ohne Fehler in der Verarbeitung"] -mode 1
 CMD             = LateTCL [list LogMessage "IMMER - egal ob Fehler oder nicht"]

LateNIData

Ein Key-/Valuepaar wird für die Übergabe an LateTCL vorbereitet. Dabei werden die Daten so konvertiert, dass kritische Zeichen nicht mehr stören und danach werden Key und Value in eine Liste gestellt.

[LATECOMMANDS]
CMD  = LateTCL [list NewImport TEST_CALL_NI_JSON_Channel [list [LateNIData v1 %_TMP_Value1%] [LateNIData v2 %_TMP_Value2%] [LateNIData pos %_TMP_POS%] [LateNIData data/references/additionalDocumentReferences %_TMP_FROMJ%] [LateNIData json %_TMP_LATEJSON%] ]] -mode 1

LateData

Daten so konvertiert, dass kritische Zeichen nicht mehr in der späten Verarbeitung stören

[FIELDS]
  ...
  FOREACH field $fieldList
    lappend ::custommap::newImportData [list $field [LateData $valueList($field)]
  ENDFE

NewImport

NewImport IMPORTxxx {{header value} {header value} ... {header value}} <optionale Minusparameter> erstellt einen Importjob für den angegebenen Import.


Dabei werden automatisch folgende Informationen von der Definition des Ziel-Kanals (ggf. auch aus einer externen INI) geholt.

Folgende Werte werden ausgelesen (wobei optionale Parameter weiterhin optional sind!):

  • SourceDir
  • LockFileName
  • ColSep // veraltet - IDX sollte nicht mehr verwendet werden
  • RecordSep // veraltet - IDX sollte nicht mehr verwendet werden
  • IDXFileExtension
  • Encoding
  • NI_ExportFormat
  • nobackslashes
  • writeFieldNames
  • writeXMLHeader
  • outerTag

Folgende Minusparameter werden unterstüzt:

  • -ini: Die Definition werden nicht aus der aktuellen system.ini ausgelesen, sondern aus der angegebenen INI. Dabei ist der Name (nicht der Dateipfad und -name) zu verwenden, der in [ExternalINI] definiert wurde. Der Name der eigenen INI lautet fix this->ini.
  • -documents: Liste aller Dokumente (mit kompletten Pfad), die zu der erstellten Importdatei abgelegt werden sollen (default == {})
  • -move: Verschieben der Dokumente (1) oder kopieren (0) (default == 1)
  • -adaptDocNames: Die Dokumente bekommen bis auf die Extension den gleichen Namen wie die Indexdatei. (default == 1)

VORSICHT: Einstellung 1 ist logischerweise nicht erlaubt, wenn es mehrere Dateien mit gleicher Extension gibt!

  • -idxFileName: Der Name der zu ertellenden Indexdatei (default == [::String::GetTimeStamp])
  • -idxFileExtension: Die Extension der Indexdatei (default == <zugehöriger Wert aus system.ini>)
  • -colSep: Spaltentrenner (default == <zugehöriger Wert aus system.ini und bei Nichtdefinition {Return \;}>) // nur beim veralteten IDX-Format
  • -recordSep: Zeilentrenner (default == <zugehöriger Wert aus system.ini und bei Nichtdefinition {Return \n}>) // nur beim veralteten IDX-Format
  • -encoding: Encoding (default = <zugehöriger Wert aus system.ini> und bei Nichtdefinition utf-8)
  • -noVariables: Variablensubstitution aus (default == 1)
  • -noCommands: Befehlssubstitution aus (default == 1)
  • -noBackslashes: Backslashsubstitution aus (default == 1)
  • -NI_ExportFormat: Das Format XML ist standardmäßig aktiviert
  • -writeXMLHeader: Einstellung, ob ein XML-Header geschrieben werden soll (default == 1)
  • -writeFieldNames: XML-Tag, mit dem die Feldnamen gekennzeichnet werden (default == "NI_FIELDS")
  • -outerTag: Tag, das die NewImport-Daten umschließt (default == "NEWIMPORT_FIELDS")
  • -xmlMapping: Mappinganweisung zum Quoten von bestimmten Sonderzeichen. In der Regel sollte der Standard funktionieren. // {< *#*lessssel*#* > *#*greaterretaerg*#* & *#*amppma*#* " *#*quottouq*#* ' *#*apossopa*#* \n *#*\crrc*#*}
  • -writeIndexFile: Definiert, ob die Indexdatei (idx, XML, JSON) geschrieben werden soll (default == <zugehöriger Wert aus system.ini und bei Nichtdefinition 1)

Beispiel:

_TMP_NEWIMPORT  = NewImport IMPORT9000 {{akte 4711} {Kontakttyp P} {ZUSATZ 12345}} 

Trick: Soll z.B. eine Akte per Job generiert werden, so kann der Link auf das gerade verarbeitete Dokument übergeben werden und die Verknüpfung vom Aktenimport erledigt werden.

Trick: Wenn der Kontakt nicht vorhanden ist aber Workflows gestartet werden sollen, so könnte das Dokument registriert werden, mit NewImport der Kontaktimport angestoßen werden und ein weiterer Dokumentenimport mit den Vorgangstypen generiert werden (die richtige Reihenfolge wird dann durch die checkDependencies erreicht).


Sollen mehrere aufeinanderfolgende Importdateien des gleichen Imports in einem Verzeichnis gesammelt werden, so gibt es ab der Version 19.09.1965 zwei neue Funktionen, mit denen da möglich ist:

OpenNewImportLoop

 OpenNewImportLoop ImportXXX <-force (0/1)>

Ein neues Verzeichnis zur Sammlung der Importdateien wird geöffnet, wenn der Import sich vom letzten Import unterscheidet oder wenn -force auf 1 gesetzt wurde.

CloseNewImportLoop

 CloseImportLoop

Beendet die aktuelle Sammlung der Importdateien und sorgt dafür, dass die Lockdatei entfernt wird. Der Ordner mit den Dateien steht danach zum Import bereit

Wiederholen von Verarbeitungszeilen (seit Version 15.9)

Für den Fall, dass ein Fehlerzustand vorhanden ist, der sich von selbst lösen kann (z.B. wegen einer getrennten Netzwerkressource), kann ein Retry definiert werden. Dazu gibt es einen eigenen Befehl.

Retry {Codeblock} [-params]

Beispiel

NAT = Retry {curl::transfer  -url ftp://ftps.wettquoten.de:21/256552/bestClub/Historie_Borussia_ab_2000.PDF -ftpssl try -userpwd HejaBVB:1909  -file c:/test/Historie_Borussia_ab_2000.PDF -slverifypeer 0} -wait 1000 -okCode 0


Dabei ist ein Codeblock, der ggf. wiederholt werden soll, Pflicht. Außerdem gibt es diverse optinonale Minusparameter:

  • -rollback: Codeblock, der ausgeführt wird, wenn es beim eigentlichen Aufruf zum Fehler kommt
  • -maxRetries: wie oft soll es maximal ausgeführt werden (also strenggenommen eigentlich maxTries), (default == 0 (unendlich))
  • -wait: Pause zwischen den Versuchen in Millisekunden (AFTERTIME aus der system.ini-Datei)
  • -errorCode: welcher Code zeigt einen Fehlerstatus an
  • -okCode: welcher Code zeigt einen Ok-Status an (kann nicht mit errorCode kombiniert werden!)
  • -protText: Protokolltext beim ersten Scheitern der Ausführung
  • -protEvent: Maske die steuert, wo protokolliert wird (default == "P")
  • -protRText: Protokolltext, wenn es nach mindestens einem Scheitern wieder funktioniert
  • -protREvent: Maske die steuert, wo protokolliert wird (default == "P")
  • -catch: steuert, ob der Block gecatched ausgeführt wird (default == 1)


SystemValue

Mit SystemValue <SECTION,FELD> [optionaler Defaultwert] kann das entsprechende Feld ausgelesen werden. Ist weder Defaultwert definiert noch Feld in der system.ini vorhanden, so wird *NOT_DEF* zurückgeliefert.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt.

ImportValue

Mit ImportValue <FELD> [optionaler Defaultwert] kann das entsprechende Feld des aktuellen Importes ausgelesen werden. Ist weder Defaultwert definiert noch Feld in der system.ini vorhanden, so wird *NOT_DEF* zurückgeliefert.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt.

ImpSysValue

Mit ImpSysValue <FELD> [optionaler Defaultwert] kann das entsprechende Feld des aktuellen Importes ausgelesen werden. Ist der Wert nicht in der Importsection vorhanden, so wird als nächstes geschaut, ob das Feld im globalen Bereich (ohne Section) der system.ini definiert ist. Ist weder Defaultwert definiert noch Feld in der system.ini vorhanden, so wird *NOT_DEF* zurückgeliefert.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt.

ServiceValue

Mit ServiceValue <FELD> kann ein Serviceparameter ausgelesen werden. Dabei prüft die Funktion, ob es sich um eine SERVICE oder JOB<n> Anbindung handelt und sucht als ersten, ob der entsprechende Parameter des Kanals existiert. Wenn nicht, dann wird der Wert vom SERVICE bzw. JOB geholt. Enthält ein Parameter des Kanals im SERVICE Modus das Wort *self*, so wird dieser Teilstring durch die Definition desselben Parameters vom SERVICE textersetzt. Ist weder Defaultwert definiert noch kann der Wert gezogen werden, so wird *NOT_DEF* zurückgeliefert.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt, allerdings nur bei einer Servicedeklaration, nicht bei den veralteten Jobs.

optionale Minusparameter:

-defaultValue (alternativ -dv)
Standardwert
optional, default == "*NOT_DEF*"
-serviceName
Service, der verwendet werden soll
optional, standardmäßig wird der Service des Imports, in dem ServiceValue verwendet wird, benutzt
-forceHeaderValue
Wenn der Wert auf 1 gesetzt wird, dann wird der Parameter der Servicedeklaration erzwungen und nicht der des aktuellen Importes
optional, default == 0 

Verfügbar ab Version 21.0

ExternalValue

Mit ExternalValue<INI> <FELD> [optionaler Defaultwert] kann ein Wert aus ein Inidatei einer anderen integrationPlatform geholt werden.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt. Dabei wird die Definition aus der externen Inidatei verwendet!

ExternalImpSysValue

Mit ExternalImpSysValue <INI> <SECTION,FELD> [optionaler Defaultwert] kann ein Wert aus ein Inidatei einer anderen integrationPlatform geholt werden. Die Funktion verhält sich wie ImpSysValue, nur dass sie sich auf eine externe Inidatei bezieht.

Experimentell wird hier EXEC_PARAM_<parametername> (s. system.ini/GLOBAL und system.ini/Kanäle) berücksichtigt. Dabei wird die Definition aus der externen Inidatei verwendet!

Hiermit können auch mehrfach verschachtelte Szenarios aufgebaut werden! Im folgenden Beispiel ist der eigentliche Wert erst in external_system2.ini hinterlegt, die system.ini weist auf external_system.ini und diese wiederum auf external_system2.ini. Das Ergebnis ist, dass die integrationPlatform den Pfad aus external_system2.ini in der system.ini verwendet.

system.ini:

[ExternalINI]
Testini  = c:/importservice/system/external_system.ini
Testini2 = c:/importservice/system/external_system2.ini

[xRechnungParseXMLData]
...
EXEC_PARAM_SourceDir = 1
SourceDir            = ExternalImpSysValue Testini "xRechnungParseXMLData,SourceDir"

external_system.ini:

[xRechnungParseXMLData]
EXEC_PARAM_SourceDir = 1
SourceDir            = ExternalImpSysValue Testini2 "xRechnungParseXMLData,SourceDir"

external_system2.ini:

[xRechnungParseXMLData]
SourceDir            = c:/test/importtest/xRechnung/xRechnungXMLData/input

ExternalINIObject

Mit ExternalINIObject <INI> kann das ganze Iniobjekt einer anderen integrationPlatform geholt werden, um direkt auf dem Objekt zu arbeiten.

SystemParam

Dieser Parameter ist antiquiert und sollte, außer bei Events, nicht mehr verwendet werden! Bei Events ist die Syntax wie folgt:

SystemParam <PARAM> -defaultValue <KEYLIST>

also z.B.

SystemParam INVALIDTASK -defaultValue "P"

geholt wird dann [<channel>,EVENTS_<PARAM>] oder, wenn nicht definiert [EVENTS,<PARAM>]

SectionName

Der Befehl SectionName gibt den Namen des aktuellen Imports zurück.

SetErrorDir

SetErrorDir <alternative dirname> verbiegt das Errorverzeichnis für den aktuellen Vorgang, um z.B. im Fehlerfall die Inputdaten für eine Nachverarbeitung in einem separatem Verzeichnis zu speichern

IGNORE

kann in der bei UseJobservice > 1 in der FIELDS-Section verwendet werden, was dazu führt, dass zwar alle Befehle der frühen Interpretation ausgeführt werden, aber viele nicht in die späte Interpretation gelangen.


FileArchive

basiert auf der FileArchive.tbc und benötigt zusätzliche Konfigurationen in der system.ini und in der mapping.ini. Diese Funktion durchsucht das konfigurierte RootDir oder dessen Unterordner nach Dateien und legt für jede gefundene Datei ein neuen Import an. Das RootDir kann als ImportValue oder Minusparameter übergeben werden, muss aber zwingend angegeben werden.

Die Funktion wird in der system.ini unter Function des Imports konfiguriert. Folgende optionale Minusparameter werden unterstützt:

- rootDir
Beschreibung: Das Quellverzeichnis, welches nach Dateien durchsucht wird. Bei -subFolder = 0 wird nur das rootDir durchsucht, bei -subFolder = 1 werden alle Unterordner des RootDir nach den Dateien durchsucht.
Default: ""

- subFolder:
Beschreibung: Soll das RootDir (0) oder alle Unterordner des RootDir (1) durchsucht werden.
Default: 1

- globFileExt:
Beschreibung: Gibt an, welche Dateitypen gesucht werden sollen. Erwartet eine "|" getrennte Liste von Dateiendungen.
Beispiel: -globFileExt "pdf|doc|txt"
Default: "*"

- excludedFileExt:
Beschreibung: Bei einer Suche nach allen Dateitypen (-globFileExt "*") können bestimmte Dateitypen ausgeschlossen werden. Erwartet eine "|" getrennte Liste von Dateiendungen.
Beispiel: -excludedFileExt "url|prk"
Default: "URL"

- fileDB:
Beschreibung: Wenn angegeben, werden die Dateien nach dem Import nicht gelöscht, sondern bleiben vorerst liegen und werden nach einer gewissen Anzahl an Tagen gelöscht.
              Erwartet einen vollständigen Pfad zu einer .db Datei. Wenn angegeben müssen auch die Parameter -cleanupInterval, -cleanupTime und in der mapping.ini der "::FileArchive::WriteFileDB" konfiguriert werden.
Beispiel: -fileDB "./work/import/DataTable/FileDB.db"
Default: ""

- cleanupInterval:
Beschreibung: Gibt den die Anzahl an Tagen an, nachdem die importierten Daten gelöscht werden sollen.
Default: 30

- cleanupTime:
Beschreibung: Gibt die Uhrzeit an, an welcher das Cleanup an jedem Tag ausgeführt wird.
Default: "20:00"
- debug:
Beschreibung: Gibt zusätzliche Protokollierungen aus.
Default: 0

::FileArchive::WriteFileDB

Der folgende Eintrag muss in der Mapping.ini vorgenommen werden, wenn -fileDB konfiguriert wurde:

[LATECOMMANDS]
CMD                   = LateTCL "::FileArchive::WriteFileDB %OrgFileName% [::String::GetTimeStamp]" -mode 1


BEISPIELEINRICHTUNG: system.ini

[FileArchive]
 RootDir                       = D:/FOLDERSTRUCTURE
 CheckLockfile                 = 1
 Delete_Linked_Uploadfile_Dir  = 0
 Function                      = ::FileArchive::GetData $counter -subFolder 1 -fileExtension ".pdf|.doc|.txt" -fileDB "./work/CorsaTest/DataTable/FileDB.db" -cleanupInterval 2 -cleanupTime 22:00
 IdxFileExtension              = idx

mapping.ini

[LATECOMMANDS]
CMD                   = LateTCL "::FileArchive::WriteFileDB %OrgFileName% [::String::GetTimeStamp]" -mode 1


Eine komplette Beispielkonfiguration gibt es hier: Examples_FileArchive_mapping.ini

IMAPFolderManager

Die Funktion IMAPFolderManager.tbc bietet die Möglichkeit Ordnerstrukturen in einem IMAP Postfach anzulegen. Diese können später dann z.B. vom MailService wieder abgeholt und basierend auf den Ordnerinformationen in Corsa abgelegt werden. In der System.ini müssen die Variablen "FunctionIfData", "ImapRootFolder" und "ImapArchiveFolder" gesetzt werden. Die Werte können in der mapping.ini mit "[ImportValue ImapRootFolder]" und "[ImportValue ImapArchiveFolder]" verwendet werden.

Folgende Funktionen sind mit der Funktion verfügbar:

- ::IFM::CheckFunc <Postfach> <Mailser> <Benutzername> <Passwort PassCrypt-verschlüsselt>
  Dieser Aufruf stellt die Verbindung mit dem Mailserver Postfach her.
- ::IFM::DeleteBadChar <$string>
  Entfernt ungültige Zeichenfolgen aus dem String. Dies ist notwendig um in Outlook bei der Anzeige der Ordnernamen keine Probleme mit ungültigen Zeichen zu bekommen.
- ::IFM::CreateFolder <Postfach> <IMAPPath>
  Erstellt in dem angegebenen Postfach den Ordner inklusive aller nötigen Unterordner. Bsp.: INBOX/_Ablage/StratOz GmbH (604)/Corsa Upgrade 2018 (PRJ0002018) legt den Ordner "_Ablage" an sofern nicht existent, den Ordner "StratOz GmbH (604)" darunter an und den Ordner "Corsa Upgrade 2018 (PRJ0002018)" darunter an.
- ::IFM::GetFolder <Postfach> -path <IMAPPath> -subFolder <1/0>
  Gibt die Unterstruktur des angegebenen IMAP Pfades und auf Wunsch auch mit all deren Unterordnern als Liste zurück.
- ::IFM::RenameFolder <Postfach> <oldIMAPPath> <newIMAPPath>
  Benennt den angegebenen alten IMAP Ordner in den angegebenen neuen Ordner um. Hierbei können sich auch Unterverzeichnisse ändern um einen Ordner zu verschieben.
- ::IFM::FindExistingFolder <Postfach> <IMAPPath> <folderName>
  Prüft ob der angegebene Ordner unter dem definierten Pfad bereits existiert. Rückgabe ist 1 oder 0.

BEISPIELEINRICHTUNG:

system.ini

[IMPORTIMAP]
FunctionIfData            = ::IFM::CheckFunc Mailablage mail.stratoz.de mailablagecorsa@stratoz.de RxXvZZVqW25d1EaiDsfdD+iWCUshc+sd+x4NE2kHE3xe0IIdF0xpcOioHRSCq3eJTHuVmdKTRaVgBMs0FIAozg
ImapRootFolder            = INBOX/_Ablage
                            # Definiert den Ordner von dem ausgehend neue Ordner erstellt werden. Dient als Hilfsvariable für die mapping.ini.
ImapArchiveFolder         = Gelöschte Elemente/_Ablage
                            # Definiert den Ordner an den die gelöschten Objekte verschoben werden. Dient als Hilfsvariable für die mapping.ini.

mapping.ini

[FIELDS]
;; Get organisation name from Corsa based on %ORGID%
                      = LogMessage "IMAP Mailablage Input: %ORGID% %ID% %TITEL% %STATUS%"
_TMP_OrgName          = lindex [WebserviceCall Direct GetFields "E" %ORGID% [list ext_rela.naam1] {}] 1
                      = LogMessage "Organisation: %_TMP_OrgName% (%ORGID%)"
_TMP_Titel            = ::IFM::DeleteBadChar %TITEL% 
_TMP_EXISTING_DIR     = lindex [::IFM::FindExistingFolder Mailablage "[ImportValue ImapRootFolder]/%_TMP_OrgName% (%ORGID%)/" "%ID%*"] 0
_TMP_PATH             = Return "[ImportValue ImapRootFolder]/%_TMP_OrgName% (%ORGID%)/%ID% - %_TMP_Titel%"
                      = LogMessage "IMAP Mailablage Projektpfad: %_TMP_PATH%"
_TMP_DELPATH          = Return "[ImportValue ImapArchiveFolder]/%_TMP_OrgName% (%ORGID%)/%ID% - %_TMP_Titel%"

                      = if {%STATUS% eq "angelegt" || %STATUS% eq "in Bearbeitung"} { if {[string length %_TMP_EXISTING_DIR%] == 0} { set _tmpResult [::IFM::CreateFolder Mailablage "%_TMP_PATH%"]; LogMessage "IMAP Mailablage %_TMP_PATH% angelegt. $_tmpResult"} else { ::IFM::RenameFolder Mailablage "%_TMP_EXISTING_DIR%" "%_TMP_PATH%"; LogMessage "IMAP Mailablage %_TMP_EXISTING_DIR% nach %_TMP_PATH% umbenannt." } } else {::IFM::RenameFolder Mailablage "%_TMP_PATH%" "%_TMP_DELPATH%"; LogMessage "IMAP Mailablage nach %_TMP_DELPATH% verschoben."}

::CreatePDF::Create

Das Include CreatePDF.tbc stellt die Funktion ::CreatePDF::Create zu Verfügung. Mit dieser Funktion kann eine Originaldatei an Neevia übergeben werden um daraus eine PDF Datei zu erstellen. Die Funktion erwartet einen Pfad zu der Datei die über die Neevia IN/OUT/ERROR Ordner zu einer PDF gewandelt wird. Die Datei wird bei Übergabe an Neevia mit ihrem SHA256-Wert als Dateiname übergeben um Überschreibungen unmöglich zu machen.

Folgende Parameter können konfiguriert werden:

-sourceFile <Dateipfad>

  Der Pfad zur Datei die in PDF gewandelt werden soll.

-retry <n>

  OPTIONAL Default: 1
  Gibt an wie oft Neevia die PDF Erstellung wiederholen soll, sofern sie fehlgeschlagen ist.

-waitSec <n>

  OPTIONAL Default: 30
  Legt fest wie viele Sekunden gewartet wird um die PDF Datei zu erstellen, bevor die Wandlung abgebrochen wird.

neeviaPath <Pfad>

  OPTIONAL Default: "D:/bct/tds/ds72/3party/neevia"
  Definiert den Neevia Ordner in dem die Unterordner IN, OUT und ERROR liegen.

neeviaIn <Pfad>

  OPTIONAL Default: "$neeviaPath/IN"
  Definiert den Neevia IN Ordner in dem die Originaldatei zur PDF Wandlung abgelegt wird. Kann verwendet werden wenn sich dieser Ordner nicht in gleicher Unterstruktur wie "neeviaPath" befindet.

neeviaOut <Pfad>

  OPTIONAL Default: "$neeviaPath/OUT"
  Definiert den Neevia OUT Ordner in dem die PDF Datei erwartet wird. Kann verwendet werden wenn sich dieser Ordner nicht in gleicher Unterstruktur wie "neeviaPath" befindet.

neeviaError <Pfad>

  OPTIONAL Default: "$neeviaPath/ERROR"
  Definiert den Neevia ERROR Ordner in dem die Originaldatei bei Fehlern abgelegt wird. Kann verwendet werden wenn sich dieser Ordner nicht in gleicher Unterstruktur wie "neeviaPath" befindet.

Rückgabewert <Dateipfad zur PDF>

  Es wird der Pfad zur erstellten PDF Datei zurückgegeben, wenn die Erstellung erfolgreich war. Ansonsten ist die Rückgabe leer.

Beispielkonfiguration:

mapping.ini

[REFERENCE]
;Erstellung von pdf, txt und thumb                          
_TMP_PDF_FILE                = ::CreatePDF::Create -sourceFile [file root %_FILENAME%][Return .docx] -waitSec "60" -neeviaPath "D:/StratOz/data/Neevia"
_TMP_TXT_FILE                = if {[file exists %_TMP_PDF_FILE%]} {::FileConvert::pdf2txt %_TMP_PDF_FILE%} else {Return ""}
_TMP_PNG_FILE                = if {[file exists %_TMP_PDF_FILE%]} {::FileConvert::pdf2png %_TMP_PDF_FILE%} else {Return ""}
_TMP_TMB_FILE                = if {[file exists %_TMP_PNG_FILE%]} {::FileConvert::png2jpg %_TMP_PNG_FILE%} else {Return ""}
                             = if {[file exists %_TMP_PNG_FILE%]} {file delete -force %_TMP_PNG_FILE%} 
                             = if {%_TMP_THUMB_FILE% eq ""} {Protokoll $::FileConverter::errorInfo}
[UPLOAD]
;; Versuche in 20 Sekunden eine PDF zu erstellen um diese Arbeit dem CORSA/DS abzunehmen.
ARC     = Return %_TMP_PDF_FILE%
ARCDSACTION = Return "-action {DSAction {}}"

IgnoreTranslateCRLF

TranslateCRLF wird nicht ausgeführt. Aber Vorsicht, das kann zu Fehlern führen.

VALUE_WO_CRLF = IgnoreTranslateCRLF; OwnTranslation %_TOTALTEXT%


::DataFromOffice

Das Include BCT/GetDataFromOffice.tbc stellt die Funktionen zum Auslesen von Informationen aus der MS Office XML (Word, Excel, Powerpoint) bereit. Für die Funktion wird 7z.exe und 7z.dll im /tools Verzeichnis der IntegrationPlatform benötigt ([ScriptDir]/tools/7z.exe).


::DataFromOffice::ExtractCustomXML

Extrahiert aus dem Office Dokument die XML als zusätzliche Information für den Import.

Beispielkonfiguration:

system.ini

[PROPERTIESfromOFFICE]
Name                  = Get properties from office document
Active                = 1
Priority              = 1
UseJobservice         = 2
sourceDir             = c:/test/PROPERTIESfromOFFICE/input
errorDir              = c:/test/PROPERTIESfromOFFICE/error
backupDir              = c:/test/PROPERTIESfromOFFICE/backup
FUNCTION              = ::DataFromOffice::ExtractCustomXML
IDXFileExtension      = XML
isCSV                 = 0
MappingFile           = ./mapping/PROPERTIESfromOFFICE.ini

::DataFromOffice::GetCustomProperty

Liest selbst definierte Dokumenteneigenschaften aus. Hierzu wird der Name der Eigenschaft {CORSA_OBJECTID} und der Dokumenteninhalt %_TOTALTEXT% an die Funktion übergeben.

Beispielkonfiguration:

mapping.ini

[FIELDS]
_TMP_ID   = ::DataFromOffice::GetCustomProperty {CORSA_OBJECTID} %_TOTALTEXT%
          = LogMessage " ==> CORSA_OBJECTID == %_TMP_ID% "

_TMP_ONDE = ::DataFromOffice::GetCustomProperty {Ondernemingsnummer\[0\]} %_TOTALTEXT%
          = LogMessage " ==> Ondernemingsnummer == %_TMP_ONDE% "       

_TMP_RIJK = ::DataFromOffice::GetCustomProperty {Rijksregisternummer\[0\]} %_TOTALTEXT%
          = LogMessage " ==> Rijksregisternummer== %_TMP_RIJK% "

[UPLOAD]
NAT  =  glob -noc [file join [file dirname %_FILENAME%] "*.docx"]


::GetContact

Die Funktion GetContact ermittelt von einer Akte, einem Dokument oder einem Workflow den Hauptkontakt. Das zugehörige Include GetContact.tbc liegt unter Include\BCT und muss zur Verwendung per Symlink in das Include Verzeichnis gemappt werden. Der Aufruf erfolgt mit Hilfe der ::WebServiceCall::Call Funktion.

::GetContact::ByDocument

Der Aufruf erfolgt mit einer gültigen Dokument ID und liefert eine Liste mit dem Kontakttyp und zugehöriger Kontakt ID zurück. {E ORGA123} Wenn kein Kontakt ermittelt wurde, wird *NOT_DEF* zurückgegeben.

mapping.ini

[FIELDS]
_TMP_GetContact        = ::WebserviceCall::Call ::GetContact::ByDocument %_TMP_DOCID%
_TMP_CONTACT_TYPE      = lindex %_TMP_GetContact% 0
_TMP_CONTACT           = lindex %_TMP_GetContact% 1

::GetContact::ByFolder

Der Aufruf erfolgt mit einer gültigen Akten ID und liefert eine Liste mit dem Kontakttyp und zugehöriger Kontakt ID zurück. {E ORGA123} Wenn kein Kontakt ermittelt wurde, wird *NOT_DEF* zurückgegeben.

mapping.ini

[FIELDS]
_TMP_GetContact        = ::WebserviceCall::Call ::GetContact::ByFolder %_TMP_FOLDERID%
_TMP_CONTACT_TYPE      = lindex %_TMP_GetContact% 0
_TMP_CONTACT           = lindex %_TMP_GetContact% 1

::GetContact::ByCaser

Der Aufruf erfolgt mit einer gültigen Workflow ID und liefert eine Liste mit dem Kontakttyp und zugehöriger Kontakt ID zurück. {E ORGA123} Wenn kein Kontakt ermittelt wurde, wird *NOT_DEF* zurückgegeben.

mapping.ini

[FIELDS]
_TMP_GetContact        = ::WebserviceCall::Call ::GetContact::ByCase %_TMP_WFID%
_TMP_CONTACT_TYPE      = lindex %_TMP_GetContact% 0
_TMP_CONTACT           = lindex %_TMP_GetContact% 1

::CheckByHash

::CheckByHash::File

Es wird geprüft, ob sich die zu importierende Datei von der letzten Version unterscheidet. Dabei sind das Dateihandle auf ein Datafile-DB und der Dateiname verpflichtend.

::CheckByHash::File dbHandle filename args

Folgende Parameter können verwendet werden:

-protOK  Welche Protokollierung erfolgt, wenn kein Fehler vorliegt? (optional, default "P")
-protError  Welche Protokollierung erfolgt, wenn ein Fehler vorliegt? (optional, default "P-S600")
-valueType  Wie wird der HashCode angezeigt? (optional, default "-hex")
-deleteFile  Soll die Datei gelöscht werden, wenn sie der letzten Importdatei entspricht? (optinal, default 1)
-key  Unter welchem Key soll der Hashwert in der DB gespeichert werden? (optional, default [SectionName])
-catchDelete  Soll der Versuch die Datei zu löschen gecatched werden? (optional, default 1)
-setValue  Der neue Hashwert wird automatisch in die DB eingetragen (optional, default 0) - VORSICHT wegen der Transaktionssicherheit
-saveToFile Die Hashdatei wird automatisch auf den Datenträger geschrieben (optional, default 0) - VORSICHT wegen der Transaktionssicherheit

Beispiel:

FunctionIfData = if {[::CXAvailable::WS $counter]} then { ::CheckByHash::File $::pC_fileChanged_DataTable [lindex [lsort [glob -noc *Norm.xml]] 0] } else { LogMessage "Webservice is not available" "P-S60"; Return 0 }

::CheckByHash::LastHashValue

Der letzte Hashwert wird zurückgeliefert

::CheckByHash::SetAndSave

Der Hashwert wird in die Datei eingetragen und diese wird, wenn nicht anders eingestellt, auf den Datenträger geschrieben.

::CheckByHash::SetAndSave dbHandle args

Folgende Parameter können verwendet werden:

-key  Unter welchem Key soll der Hashwert in der DB gespeichert werden? (optional, default [SectionName])
-saveToFile Die Hashdatei wird auf den Datenträger geschrieben (optional, default 1)

Beispiel:

LateCMD = LateTCL { catch {::CheckByHash::SetAndSave $::pC_fileChanged_DataTable } } -mode 1


LogSilent

Funktion, die entweder direkt oder im V() der Events verwendet werden kann. Ziel ist es, dass eine identische LogMessage eines Importes nur nach einem definierten Intervall erneut gemeldet wird. In der Darstellung als Event kann das sogar mit der eigentlichen Message gemischt werden (z.B. jedes Mal Protokollierung ins Log, aber nur alle 12 Stunden per Mail versenden).

Folgende Minusparameter werden unterstützt:

-label:
  Label aus der messages.ini
  Default: ""
-type:
  Events
  Default: ""
-name:
  Eindeutiger Name
  Default: Im laufenden Import der Name der Section
-silentTime
  Zeit bis zur nächsten Meldung in Sekunden
  Default: 43200
-nocommands (1)
-novariables (0)
-nobackslashes (0)
-ignorePauseMessage (0)

Beispiel:

DIRECTORY_NOT_DELETED = P S300 V(LogSilent $text -type IW -label CANNOT_DELETE_IMPORT_DIRECTORY -novariables 0 -nocommands 0 -silentTime 43200 )


SetSectionSleepState

Mit SetSectionSleepState ist es möglich die aktuelle oder andere Verarbeitungssections bis zu einen definierten Zeitpunkt schlafen zu legen, zu deaktivieren oder wieder zu aktivieren. Das gilt auch für Sections, die mit ACTIVE = 0 gestartet wurden!

Folgende Minusparameter werden unterstützt:

-section: 
   Section, auf die sich die Aktion bezieht
   Default: aktuelle Section
- interval:
    Zeit in Sekunden, für die eine Verarbeitungssection angehalten wird
    Default: 0 Sekunden
    Hinweis: die Einstellung wird nur verwendet, wenn dateTime "" ist
- dateTime:
    Datum und Zeit, bis wann die Section schlafen gelegt wird. Wird nur Uhrzeit angegeben, so wird das nächste Vorkommen des Zeitstempels verwendet.
    Default: ""
    Gültige Formate: dd.mm.YYYY-HH:MM:SS oder HH:MM:SS oder ""
- sleep:
    Die Section wird in den Schlafmoduls gesetzt, nicht nur der Schlusszeitpunkt angepasst (0/1).
    Default: 0
-activate:
   Die Section wird aktiviert. Wenn -interval oder -dateTime verwendet wird, so wird die Section aber solange schlafen gelegt.
   Default: 0
   ACHTUNG, nur für geübte Benutzer!
-deactivate:
   Die Section wird deaktiviert. Alle Schlafinformationen gehen verloren. Die Section kann nur mit einem neuen Aufruf mit -activate 1 wieder aktiviert werden.
   Default: 0
   ACHTUNG, nur für geübte Benutzer!

Beispiel:

[FIELDS]
= SetSectionSleepState -section TEST_ACTIVATE2 -interval 30 -activate 1


::MailGraph::Send <subject> <body>

Mit dieser Funktion ist es möglich E-Mails aus dem Regelwerk zu versenden. Dabei werden, wenn nichts anderes über Minusparameter definiert ist, die Voreinstellungen aus system.ini/[MS_GRAPH_API] verwendet. Sie ist im Include optional/sendMailGiP.tbc enthalten.

Folgende Parameter sind erforderlich:

subject:
  Betreff der E-Mail
body
  Body der E-Mail

Folgende Werte werden nur aus system.ini/[MS_GRAPH_API] geholt:

TENANT_ID
CLIENT_ID
CLIENT_SECRET

Folgende Minusparameter werden unterstützt (optional, als Standard werden die Vorbelegungen von system.ini/[MS_GRAPH_API] verwendet):

-user 
-sender
-receiver
-cc
-bcc
-attachments
 Anhänge werden als Liste übergeben, und zwar in der Form <mimetype1> <file1> ... <mimetype<n>> <file<n>>

::OnLateError::Retry

Wenn bei der späten Interpretationn ein Fehler auftritt, so kann mit dieser Funktion dafür gesorgt werden, dass die Operation wiederholt wird. Die Daten werden wieder in den Quellordner gelegt (aber an das Ende, um hier blockierende Endlosschleifen zu verhindern!)

Folgende Parameter können konfiguriert werden:

- pauseChannel <n>
 OPTIONAL Default: 60
 Definiert die Pausenzeit im Fehlerfall in Sekunden


-rexFlags <n>
 OPTIONAL Default: 65536
 Bitmaske, mit der die einzelnen Ausdrücke aus den rexdKeywords ein- oder ausgeschlossen werden können (1. Ausdruck ist Bit 0 etc.)


-rObject <object>
 OPTIONAL Default: *NOT_DEF*
 Retry-Objekt, mit dem der Status der Retries für diesen Kanal verwaltet wird. Ist es nicht definiert und ein Begriff aus der rexKeyword-Liste trifft, so wird das Errorverzeichnis für diese Aktion auf dem Inputverzeichnis umgelenkt


-retryID <id>
 OPTIONAL Default: *NOT_DEF*
 Eindeutige Bezeichnung für die Entität, für die geprüft wird, ob ein Retry erforderlich ist


-rexKeywords <list>
 OPTIONAL Default: Bekannte Meldungen bei z.B. einem Deadlock
 Liste mit regulären Ausdrücken, die bei Treffer im Fehlertext des Kanals dafür sorgt, dass ein Retry ausgeführt wird (wenn nicht andere Regeln das verhindern)


Beispiel:

PROCESSTAERROR       = P J M V(::OnLateError::Retry "$text" -rObject $::retryObject([ChannelName]) -retryID [$::retryObject([ChannelName]) IDFromFilename $filename])

::CountByKey

::CountByKey::New <args>

Ein neues Objekt wird erstellt und die objectID zurückgeliefert.

- path       
  Pfad zur DataTable
- dbName     
  OPTIONAL Default: Names des Kanals
  Name der DataTable
- maxRetries
  OPTIONAL Default: 50
  Anzahl der Wiederholungen
- autobackup 
  OPTIONAL Default 0: 
  Das Autobackup der DataTable wird an- oder ausgeschaltet

::CountByKey::DeleteObject <objectID>

Das Objekt objectID wird zerstört.

<obj> Incr <id>

Erhöht den Counter für eine definierte ID oder setzt sie auf 1, wenn sie noch nicht existiert

<obj> IDFromFilename <filename>

Erstellt einen SHA265 aus dem Dateinamen. 

<obj> State <id>

Liefert den Status der übergebenen ID (ERROR, SKIP, RETRY)

<obj> SetMaxRetries <retries>

Setzt die maximale Anzahl der Wiederholungen neu.

<obj> GetMaxRetries

Liefert dei maximale Anzahl der Wiederholungen.  

<obj> CleanUp <args>

 - cmd
 - logLevel
 
 Räumt die DataTable auf und entfernt nicht mehr benötigte Einträge

<obj> AdjustLateCommand <state> <args>

Setzt das Fehlerverzeichnis in Abhängigkeit vom Status
- pauseAfterRetry
- errorDir
- retryDir

WEBSERVICEFUNCTIONEN

Wenn der Webserver aktiviert ist, dann sind folgende Webservices verfügbar. Webservices werden im folgenden Format

http://<url>:<port>/<function> 

aufgerufen.

About

Mit About können Informationen über die integrationPlatform abgerufen werden:

http://localhost:269/About

zurück kommt ein JSON

{
   "version": "21.900.5",
   "hostname": "EW-Tekhaus-2.stratoz.de"
}


Encode

Mit Encode können Passworte für die Systemdateien verschlüsselt werden:

http://localhost:269/Encode
{
   "string": "TESTString"
}

zurück kommt ein JSON

{
   "encoded": "mYMJZkOJ+k7au/9VZfYBf1kjHrceYsJAfjB14TBcOoNq8RspeKH79z91z/n/HLrMODJmGDkfRfRKcOzGAXL0PQ"
}

Das ganze funktioniert natürlich auch mit cURL, das es ja in der Regel auf jedem Rechner gibt

C:\Users\tekhaus>curl http://ew-Tekhaus-2:2690/Encode -X POST -H "Content-Type: application/json"  -d "{\"string\": \"TESTString\"}"
=> 
{
  "encoded": "W2yaNukUUdktoy7j9cFvb4HVdtBE6kHyhkWiK4FaAijVTX7EYMXn1rC9RdF8maTfQp/q+kpitlq0SRZW3nrJAA"
}

SetSectionSleepState

Mit SetSectionSleepState kann der Schlaf- und Wachstatus von Kanälen gesetzt werden. Alle Parameter der SetSectionSleepState-Funktion der integrationPlatform werden unterstützt.

http://localhost:2690/SetSectionSleepState
{
    "section": "TEST",
    "dateTime": "20.12.2023-11:15:09",
    "sleep": "1"
}

zurück kommt ein JSON, der den Status anzeigt

{
   "ok": true
}

oder

{
   "error" : true,
   "warning" : false,
   "messageText" : "SetSectionSleepState ERROR: no rights to upload to TEST"

}

UploadFiles

Mit UploadFiles können Datenpakete direkt an einen Kanal geschickt werden. Das ist dann sinnvoll, wenn Daten nicht über Verzeichnisse ausgetauscht werden sollen. Dabei können beliebig viele (base64-kodierte) Dateien übergeben werden. Das Encoding kann für alle Dateien zusammen gesetzt werden oder als Liste von Encodings für jede Datei einzelnen.

http://localhost:269/UploadFiles
{
    "section": "TEST",
    "encoding": "utf-8",
    "files": "UploadFiles.XML {Hello World.txt}",
    "UploadFiles.XML": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGJlZ2luPgogIDxpbm5lcj52YWx1ZSB3aXRoIPwgYW5kINY8L2lubmVyPgo8L2JlZ2luPgo=",
    "Hello World.txt": "aGFsbG8gd2VsdPbk/NbE3Kc=" 
}

zurück kommt ein JSON, der den Status anzeigt

{
   "ok": true
}

oder

{

 "error" : true,
 "warning" : false,
 "messageText" : "UploadFiles ERROR: internal error can't read 'utf': no such variable\n while executing\n'# Compiled --
no source code available\nerror 'called a copy of a compiled script"

}


ReloadChannels

Die Kanäle aus der system.ini werden neu angelesen und mit der Anfangskonfiguration neu gestartet. So können sogar zur Laufzeit Einstellungen in den Kanälen geändert angepasst werden.

http://localhost:269/ReloadChannels 

zurück kommt folgende Antwortet

{
   "channels": "reloaded"
}


Befehle für die Mappingdateien

Folgende Befehle sind nur in den Mappingdateien verfügbar und das auch nicht zwangsweise in allen Sections!

BREAK / RESETBREAK / BREAKELSE

Verfügbar ab Version 21.0, außer BREAKELSE, das erst mit 22.23 Version kam

Mit BREAK kann die Verarbeitung in einer Mappingdatei nach der Zeile, die das BREAK enthält, abgebrochen werden. Die nachfolgenden Zeilen werden (bis auf interne technische notwendige Zeilen wie das Löschen des Includeordners etc.) dann nicht mehr interpretiert. Allerdings kann die Verarbeitung mit einer Zeile, in der nur RESETBREAK ohne Parameter oder anderem Code aufgerufen wird, jederzeit wieder aufgenommen werden. Werden beide Befehle kombiniert, so ist es möglich ganze Bereiche eines Mappingregelwerkes zu überspringen.

Erweiterung ab 22.19: BREAK und RESETBREAK können jetzt eine Liste von IDs enthalten. Sobald ein BREAK mit einer ID gestartet wird, wird das RESETBREAK nur dann ausgeführt, wenn es mit einer geöffneten BREAK-ID oder ganz ohne IDs verwendet wird. Dadurch müssen nach einem RESETBREAK nicht mehr alle noch aktuellen BREAKs jedes Mal wieder neu gesetzt werden. Die Verarbeitung wird erst wieder aufgenommen, wenn alle IDs zurückgesetzt wurden!

Erweiterung ab 22.20: RESETBREAK kann jetzt auch innerhalb einer Anweisung verwendet werden, so dass es z.B. in eine if-Anweisung eingebettet werden kann.

Achtung: ein RESETBREAK schaltet nicht nur das BREAK aus, sondern ebenfalls ein laufendes IGNORE!

BREAKELSE <<ids (1,n)>> greift genau dann, wenn der zugehörige BREAK-Block nicht gegriffen hat.


Beispiel 1

_TMP_IsTicket    = expr {$::custommap::process_type_id == [ImpSysValue Ticket_processTypeID 1]}
...
_TMP_TICKETCLOSE = expr {%_TMP_DATETIME% ne "*NOT_DEF*"}                  
                 = if {%_TMP_TICKETCLOSE%} then { set ::mapping::overwriteInitArgs(METHOD) "WEB_IMPORT_PORTAL_CLOSE_TICKET"; BREAK } else { set ::mapping::overwriteInitArgs(METHOD) "WEB_IMPORT_PORTAL_OPEN_TICKET" }                  

; eigentlich  registration_date aus dem abgerufenen Event, aber da ist momentan keine Uhrzeit enthalten, also verwenden wir die Uhrzeit der subscribed_norification(s)
; die Zeitzone ist angegeben (z.B. Zulu-Zeit, also noch in die lokale Zone wandeln)
_TMP_DATETIME    = clock scan [regsub {([\d-]+).(\d{2}:\d{2}:\d{2}).*(alpha:)$} [::rl_json::json get %_TMP_PROCESSJSON% registration_date] "\\1 \\2"] -gmt 1
openDate         = clock format %_TMP_DATETIME% -format \x25d.\x25m.\x25Y 
openTime         = clock format %_TMP_DATETIME% -format \x25H:\x25M:\x25S

                 = RESETBREAK
                 = if {!%_TMP_IsTicket% || !%_TMP_TICKETCLOSE%} { BREAK }


Beispiel 2 mit erweiterten Möglichkeiten

_TMP_TESTFLAG  = Return 2
 = if {[Get _TMP_TESTFLAG] > 1} then { BREAK #269.01 }
 = LogMessage " #269.01.01"
 = if {[Get _TMP_TESTFLAG] > 0} then { BREAK #269.02 #269.01 }
 = LogMessage " #269.02.01"
 = if {[Get _TMP_TESTFLAG] > 0} then { RESETBREAK #269.02 }
 = LogMessage " #269.02.02"
 = if {[Get _TMP_TESTFLAG] > 1} then { RESETBREAK #269.01 }
 = LogMessage " #269.01.02"


IF / ELSE / ENDIF

Verfügbar ab Version 23.0, nur in der Section FIELDS der Mappingdatei erlaubt

Die Funktionsweise ist analog zu den TCL-Befehlen if {} else {} end, allerdings kann das in den erlaubten Bereichen zeilenübergreifend erfolgen, ohne dass die ini-Zeilen mit ;\ zusammengefügt werden müssen.

Beispiel

IF {%_TMP_ELEMENT% < 2}
  LogMessage "#269.INI Test IF nur für %_TMP_ELEMENT% < 2"
ELSE 
  LogMessage "#269.INI Test IF nur für %_TMP_ELEMENT% >= 2"
ENDIF


CASE / CASECON / DEFAULT / ENDCASE

Verfügbar ab Version 23.21, nur in der Section FIELDS der Mappingdatei erlaubt

CASE definiert den Anfang eines Case-Blocks, ENDCASE das Ende. Jede Bedingung wird mit CASECON eingeleitet, DEFAULT wird ausgeführt, wenn nichts anderes getroffen hat.

Hiermit wird eine klassische Case-Funktion abgebildet, wobei maximal eine Bedingung ausgeführt wird.

Beispiel

 Set _TMP_VALUE 3
 CASE
 
   CASECON {%_TMP_VALUE% == 1}
     LogMessage "CASECON 1"
     
   CASECON {%_TMP_VALUE% < 4}
     IF {%_TMP_VALUE% == 2}
       LogMessage "CASECON 2"
     ELSE
       LogMessage "CASECON 3"
     ENDIF    
       
   DEFAULT
     LogMessage "CASECON DEFAULT"
     
 ENDCASE

FOREACH <vari> {<list>} / ENDFE

Verfügbar ab Version 23.0, nur in der Section FIELDS der Mappingdatei erlaubt

Die Funktionsweise ist analog zu den TCL-Befehlen foreach <vari> {<<list>>} {}, allerdings kann das in den erlaubten Bereichen zeilenübergreifend erfolgen, ohne dass die ini-Zeilen mit ;\ zusammengefügt werden müssen. CONTINUE und BREAKLOOP wird ebenfalls unterstützt!

Beispiel:

Set _TMP_LIST { 1 2 3 }
FOREACH ::custommap::element %_TMP_LIST%
  LogMessage "der aktuelle Wert ist %_TMP_LIST%"
ENDFE

ForEach <vari> {<list>} / ENDFE

Verfügbar ab Version 23.0, nur in der Section FIELDS der Mappingdatei erlaubt

Die Funktionsweise ist analog zu den TCL-Befehlen foreach <vari> {<<list>>} {}, allerdings kann das in den erlaubten Bereichen zeilenübergreifend erfolgen, ohne dass die ini-Zeilen mit ;\ zusammengefügt werden müssen. Im Gegensatz zu FOREACH wird hier aber keine TCL-Variable gesetzt, sondern eine Mappingvariable! CONTINUE und BREAKLOOP wird ebenfalls unterstützt!

Beispiel:

Set _TMP_LIST { 1 2 3 }
ForEach _TMP_ELEMENT %_TMP_LIST%
  LogMessage "der aktuelle Wert ist %_TMP_ELEMENT%"
ENDFE

WHILE {<condition>} / ENDWH

Verfügbar ab Version 23.0, nur in der Section FIELDS der Mappingdatei erlaubt

Die Funktionsweise ist analog zu den TCL-Befehlen while {<condition>} {}, allerdings kann das in den erlaubten Bereichen zeilenübergreifend erfolgen, ohne dass die ini-Zeilen mit ;\ zusammengefügt werden müssen. CONTINUE und BREAKLOOP wird ebenfalls unterstützt!

Beispiel:

Set _TMP_Counter 10
WHILE {%_TMP_Counter% > 0} 
  LogMessage "der aktuelle Counterwert beträgt %_TMP_Counter%"
  Set _TMP_Counter [expr {%_TMP_Counter% - 1}]
ENDWH

REPEAT / UNTIL {<condition>}

Verfügbar ab Version 23.0, nur in der Section FIELDS der Mappingdatei erlaubt

Die Funktionsweise ähnelt dem WHILE/ENDWH-Block, allerdings gibt es immer mindestens einen Durchlauf und beendet wird die Schleife erst, wenn ein gewisse Zustand erreicht wird. CONTINUE und BREAKLOOP wird ebenfalls unterstützt!

Beispiel:

Set _TMP_TIME [clock seconds]
REPEAT
  LogMessage "the sands of time are running low!"
UNTIL {[expr {%_TMP_TIME % + 10 < [clock seconds]}]}

FUNC / ENDFU / CALL / RETURN

Verfügbar ab Version 23.3, nur in der Section FIELDS der Mappingdatei erlaubt

Es können für wiederkehrende Strukturen kurze Codeblöcke definiert werden, die im folgenden Regelwerk aufgerufen werden können. Dem Block können Parameter übergeben werden und args wird ebenfalls unterstützt. Der Codeblock wird mit FUNC eingeleitet und mit ENDFU beendet. Mit RETURN kann ein Wert zurückgeliefert werden. Mit Call <Funcname> <<param>> wird der Codeblock aufgerufen.

Achtung! RETURN darf nicht innerhalb von Bedingungen und Schleifen verwendet werden! Stattdessen kann der Rückgabewert zwischengespeichert und am Ende übergeben werden.

Beispiel:

                       FUNC CIIGetDate {block blockTag dateTag}
_TMP_DATE_BLOCK      =   $::impsXML GetXMLBlocks $blockTag $block -nocase %_TMP_NOC% -onlyOne 1
_TMP_DATE            =   $::impsXML GetXMLValue $dateTag %_TMP_DATE_BLOCK%  -nocase %_TMP_NOC%
                         IF {%_TMP_DATE% eq ""}
_TMP_RETVALUE        =     Return ""
                         ELSE
_TMP_DATE_F          =     lindex [regexp %_TMP_NOC_STRING% -inline "<%_TMP_NS%$dateTag format=.(\\d+)" %_TMP_DATE_BLOCK%] 1
_TMP_RETVALUE        =     if {%_TMP_DATE_F% eq "102" || %_TMP_DATE_F% eq "201"} then { Return "[string range %_TMP_DATE% 6 7].[string range %_TMP_DATE% 4 5].[string range %_TMP_DATE% 0 3]" } else { Return "[string range %_TMP_DATE% 8 9].[string range %_TMP_DATE% 5 6].[string range %_TMP_DATE% 0 3]" }
                         ENDIF
                         RETURN %_TMP_RETVALUE%
                       ENDFU
...
_TMP_DUE_DATE        = CALL CIIGetDate %_TMP_TRADE_SETTLEMENT% DueDateDateTime DateTimeString