Include: Unterschied zwischen den Versionen
| (2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1.058: | Zeile 1.058: | ||
Sollte es aus irgend einem Grund in anderen Sections nötig sein, so ließe sich das auch noch integrieren. | 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: $:: | + | 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 "ohne Fehler in der Verarbeitung"] -mode 1 | ||
CMD = LateTCL [list LogMessage "IMMER - egal ob Fehler oder nicht"] | CMD = LateTCL [list LogMessage "IMMER - egal ob Fehler oder nicht"] | ||
| − | |||
== LateNIData == | == LateNIData == | ||
| Zeile 1.937: | 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:
- Vorregistrierung des Dokumentes, wenn es noch nicht vorhanden ist, um Linkfehler zu vermeiden
_TMP_DOCREL = split [CheckDefinition %DOCREL%] [format %c 254]
- 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 < oder " 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 < oder " 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
[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:
[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.
[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:
[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:
[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:
[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.
[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.
[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.
[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