System-Skriptsprache: Allgemeine Funktionen, Funktionen für Dateien

Mithilfe der Befehle und Funktionen für Dateien können Dateien im Knowledge Store gelesen und geschrieben werden:

Grundlegende Informationen zu den allgemeinen Funktionen der System-Skriptsprache erhalten Sie im Dokument System-Skriptsprache: Allgemeine Funktionen.

readFile

Name readFile
Beschreibung readFile gibt den Inhalt einer Datei als Bytestream (Bytes) zurück.
Signaturen Bytes readFile(String path)
Parameter path ist der absolute Pfad der Datei. Die Datei kann aus unterschiedlichen Quellen geöffnet werden:

  • Dateisystem – Dateien können mit der Angabe des Pfades aus dem Dateisystem geöffnet werden. Beim Pfad müssen die Backslashes (\, umgekehrter Schrägstrich) als Steuerzeichen mithilfe eines weiteren Backslashes ausgezeichnet werden, z. B.: C:\\Windows\\Test.txt. Bei Slashes (/, Schrägstrich) ist dies nicht nötig, z. B.: C:/Windows/Test.txt.
  • Knowledge Store – Liegt die Datei im Knowledge Store, so muss die Pfadangabe mit kstore:// beginnen, z. B.: kstore://ADV62010/Documents/Workflow/Test.txt.
  • http – Soll die Datei per http von einem Web-Server geöffnet werden, so muss die Pfadangabe mit http:// beginnen.
  • https – Soll die Datei per https (Hypertext Transfer Protocol Secure) von einem Web-Server geöffnet werden, so muss die Pfadangabe mit https:// beginnen.
Ergebnis Die Funktion readFilegibt den Inhalt einer Datei als Bytestream (Bytes) zurück.
Fehlerquellen Die Funktion gibt den Wert nullzurück, wenn die Datei nicht existiert oder ein Fehler beim Lesen entsteht.
Beispiele readFile("kstore:// + getDatabaseName() + "/Documents/Workflow/Mailtemplate_en.html") gibt den Inhalt der Datei Test.txt als Bytestream (Bytes) zurück.
Kontext ALL
Hinweise Die Funktion readFilekann mit dem Befehl addMailAttachmentkombiniert werden, sodassreadFileden Inhalt des Anhangs liefert:

addMailAttachment("Anhang.txt", readFile("kstore://" + getDatabaseName() + "/Documents/Workflow/Mailtemplate_en.html "))Beispielsweise kann ein E-Mail-Knoten ein im Knowledge Store bereits abgelegtes Belegdokument an einen Empfänger versenden.

Siehe auch readTextFile, writeFile

Folgendes Beispiel aus der Aktivitätsdefinition help.readFile liest die Artikelbilder eines Artikels aus dem Knowledge Store und hängt sie einer E-Mail an:

function create()
{
var p_item := parameters.ITEM;
var r_imageFiles as String;
var r_total_bytes as Number;
var imageFileName as String;
var imageFile as Bytes;

var item := loadItem(p_item);
if (not isNull(item)) {

/* get item images */
var params as Unknown[];
add(params, 4);
add(params, item:number);
add(params, 1);
var entityImages := getCisObjectList("SELECT FROM com.cisag.app.general.docman.obj.Document doc WHERE doc:status = ? AND doc:guid IN (SELECT ref:document FROM com.cisag.app.general.docman.obj.DocumentReference ref JOIN com.cisag.app.general.docman.obj.DocumentReferenceType typ ON ref:type = typ:guid JOIN com.cisag.app.general.obj.Item i ON ref:instance = i:guid WHERE i:number = ? and typ:type = ? and typ:code = „ENTITY_IMAGE“)", params, 100);

for (document as CisObject(com.cisag.app.general.docman.obj.Document) : entityImages) {
imageFileName := document:folder + document:document;
imageFile := readFile("kstore://" + databaseName() + "/Documents/" + imageFileName);
/* use addMailAttachment to attach the image file to an e-mail */
/*
addMailAttachment(document:document, imageFile);
*/
r_imageFiles := r_imageFiles + imageFileName + " ";
}

result.ENTITY_IMAGES := trim(r_imageFiles);
}
}

 

readTextFile

Name readTextFile
Beschreibung readTextFile gibt den Inhalt einer Datei als eine Zeichenkette zurück.
Signaturen Bytes readTextFile(String path)
Parameter path ist der absolute Pfad der Datei.

Die Datei kann aus unterschiedlichen Quellen geöffnet werden:

  • Dateisystem – Dateien können mit der Angabe des Pfades aus dem Dateisystem geöffnet werden. Beim Pfad müssen die Backslashes (\, umgekehrter Schrägstrich) als Steuerzeichen mithilfe eines weiteren Backslashes ausgezeichnet werden, z. B.: C:\\Windows\\Test.txt. Bei Slashes (/, Schrägstrich) ist dies nicht nötig, z. B.: C:/Windows/Test.txt.
  • Knowledge Store  – Liegt die Datei im Knowledge Store, so muss die Pfadangabe mit kstore:// beginnen, z. B.: kstore://ADV62010/Documents/Workflow/Test.txt.
  • http – Soll die Datei per http von einem Web-Server geöffnet werden, so muss die Pfadangabe mit http:// beginnen.
  • https – Soll die Datei per https (Hypertext Transfer Protocol Secure) von einem Web-Server geöffnet werden, so muss die Pfadangabe mit https:// beginnen.
Ergebnis Die Funktion readTextFilegibt den Inhalt einer Datei als Zeichenkette zurück.
Fehlerquellen Die Funktion gibt den Wert null zurück, wenn die Datei nicht existiert oder ein Fehler beim Lesen entsteht.
Beispiele readFile("kstore:// + getDatabaseName() + "/Documents/Workflow/Mailtemplate_en.html") gibt den Inhalt der Datei Test.txt als Zeichenkette zurück.

readFile("http://www.zoll.de/SiteGlobals/Functions/Kurse/KursExport.xml?view=xmlexportkursesearchresultZOLLWeb&kursart
=1&iso2code2=AU&startdatum_tag2=01&startdatum_monat2=01&startdatum_jahr2
=2018&enddatum_tag2=31&enddatum_monat2=12&enddatum_jahr2=2018&sort=asc&spalte=gueltigkeit")
gibt die Wechselkurse gemäß Parameter von der Generalzolldirektion in Bonn zurück.

readTextFile("https://www.newyorkfed.org/medialibrary/media/xml/data/fx/EUR10.xml")gibt die historischen Wechselkurse der Federal Reserve Bank of New York zurück.

Hinweis
Comarch übernimmt keine Haftung für externe Links.
Kontext ALL
Hinweise
Siehe auch readFile, writeFile

Folgendes Beispiel aus der Aktivitätsdefinition help.readTextFile liest die E-Mail-Vorlage Mailtemplate_de.html aus dem knowledge Store:

function create()
{
var r_mailTemplate as String;

r_mailTemplate := readTextFile("kstore://" + databaseName() + "/Documents/Workflow/" + "Mailtemplate_de.html");

result.MAIL_TEMPLATE := r_mailTemplate;
}

 

writeFile

Name writeFile
Beschreibung writeFile erzeugt eine neue Datei mit einem angegebenen Inhalt im Knowledge Store.
Signaturen writeFile(String path, Bytes content)

writeFile(String path, String text)

writeFile(String path, String text, String encoding)

Parameter path ist der absolute Pfad im Knowledge Store der zu erzeugende Datei. Die Pfadangabe muss mit kstore:// beginnen, z. B.: kstore://ADV62010/Documents/Workflow/Test.txt.

content ist der Inhalt der zu erzeugenden Datei als ein Bytestream (Bytes),

text ist der Inhalt der zu erzeugenden Datei als eine Zeichenkette.

encoding ist die Zeichkodierung von „text“. Beispiele für die Zeichenkodierung (encoding) sind:

  • US-ASCII
  • ISO-8859-1
  • UTF-8
  • UTF-16BE
  • UTF-16

Eine vollständige Dokumentation der möglichen Kodierungen ist im Java-Doc für java.nio.charset.Charsethinterlegt.

Ergebnis Der Befehl writeFileerzeugt eine neue Datei mit einem angegebenen Inhalt im Knowledge Store. Der Dateipfad wird analog zu der Funktion readFileangegeben. Der Inhalt der Datei kann entweder mit dem Datentyp Bytes binär oder mit dem Datentyp String eine Zeichenkette sein. Wenn eine Zeichenkette in die Datei geschrieben werden soll, dann kann optional die Zeichenkodierung (encoding) angegeben werden. Falls die Zeichenkodierung nicht angegeben wird, dann ist die Zeichenkodierung abhängig von dem Rechner, auf dem der Application-Server läuft.
Fehlerquellen Die Funktion gibt den Wert nullzurück, wenn ein Fehler beim Schreiben entsteht.
Beispiele writeFile("kstore:// + getDatabaseName() + "/Documents/Workflow/Test.txt", "Hello world!", "UTF-8") erzeugt eine Textdatei im Knowledge Store.
Kontext ALL
Hinweise Der Befehl writeFilekann zusammen mit den Funktionen readTextFileund formatverwendet werden, um eine Vorlagedatei mit Platzhaltern zu lesen, die Platzhalter auszufüllen und die fertige Datei im Knowledge Store abzulegen.
Siehe auch readFile, readTextFile

Folgendes Beispiel aus der Aktivitätsdefinition help.writeFile schreibt eine Textdatei ins tmp-Verzeichnis im Knowledge Store. Anschließend fragt die Aktivitätsdefinition das erzeugte Business Object vom Typ com.cisag.sys.kstore.obj.KnowledgeDocument ab und gibt den Pfad und Namen der erzeugten Datei sowie den Erfassungszeitpunkt und den Benutzer zurück, der das Business Object erfasst hat.

function create()
{
var p_content := parameters.CONTENT;
var r_file as String;
var r_creator as String;
var r_creationDate as Timestamp;

var folder := "tmp/";
var fileName := cast(String, newGuid()) + ".txt";

writeFile("kstore://" + databaseName() + "/" + folder + fileName, p_content, "UTF-8");

var docs := getCisObjectList("SELECT FROM com.cisag.sys.kstore.obj.KnowledgeDocument o WHERE o:pathName = ? ORDER BY o:creationDate DESC", list(folder + fileName), 1);
for (doc as CisObject(com.cisag.sys.kstore.obj.KnowledgeDocument) : docs) {
r_creator := userName(doc:creator);
r_creationDate := doc:creationDate;
}

result.FILE_NAME := folder + fileName;
result.CREATOR := r_creator;
result.CREATION_DATE := r_creationDate;
}

 

Beispiel: Inventurrückmeldung für einen leeren Lagerplatz importieren

Folgendes Beispiel ist einer Prozessdefinition für eine sogenannte Nulldurchgangsinventur entnommen, die beim Kommissionieren eine Inventurrückmeldung für einen leeren Lagerplatz importiert, nachdem der Kommissionierer per Workflow-Aufgabe bestätigt hat, dass der Lagerplatz nach dem Kommissionieren leer war.

Zuerst liest ein Serviceknoten eine Vorlagendatei aus dem Knowledge Store und ergänzt diese um prozessspezifische Informationen. Anschließend wird die Datei im Knowledge Store unter einem anderen Namen wieder abgelegt, um als Importdatei für eine Inventurrückmeldung zu dienen. Die für die Inventurrückmeldung erforderlichen Informationen, wie z. B. die Identifkation der Inventur und die Inventurzählliste, sind in Prozessvariablen gespeichert.

var importFile as String;

function create()
{
/* get partner of process initiator */
var userPartner := getByPrimaryKey(CisObject(com.cisag.app.general.obj.UserAssignment), userGuid(process.Initiator))->Partner:number;

/* read template file and replace parameters */
var templateFile := "kstore://" + getDatabaseName() + "/" + "Documents/Workflow/EmptyStorageLocationsTemplate_Create.xml";
var importFileContent := readTextFile(templateFile);
importFileContent :=
format(importFileContent,
list(userPartner, process.inventoryCountList:number, process.inventoryCount:number, process.inventoryCount->Type:code, process.warehouse:code, process.zone:code, process.location));

/* write import file to import folder */
importFile := "kstore://" + getDatabaseName() + "/Documents/Workflow/EmptyStorageLocations/EmptyStorageLocation_" + + format(now(), "yyyyMMddHHmmssSSS") + "_" + process.warehouse:code + "-" + process.zone:code + "-" + process.location + ".xml";
writeFile(importFile, importFileContent, "UTF-8");
}

In der Aktivitätsdefinition des Serviceknotens ist die Hintergrundanwendung com.cisag.pgm.bi.Importmit folgenden Werten für die Anwendungsparameter hinterlegt:

  • ContentType: “text/xml; charset=utf-8
  • CorrectionMode:1
  • Database: getDatabaseName()
  • ErrorFileMode: 1
  • FilterName: “EMPTY_STORAGE_LOCATIONS
  • ImportFile: importFile
  • ImportFileMode: 1
  • ObjectType: “com.cisag.app.inventory.physical.obj.PhysicalInventoryCountList
  • WarningsMode: 2

Eine Beschreibung der Anwendungsparameter finden Sie im Kapitel Anwendung Import des Hilfedokuments Programmier-Schnittstellen für den Datenaustausch.

Für dieses Beispiel wurde folgende Vorlagendatei verwendet:

<?xml version="1.0" encoding="UTF-8"?><semiramis xmlns="com.cisag.app.inventory.physical.obj.PhysicalInventoryCountList" locale="en-US-XMLSchemaCompliant" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PhysicalInventoryCountList xmlns="com.cisag.app.inventory.physical.obj.PhysicalInventoryCountList">
<ResponsibleEmployee>
<number>{0}</number> <!-- Partner number -->
</ResponsibleEmployee>
<number>{1}</number> <!-- Count list number -->
<PhysicalInventory>
<number>{2}</number> <!-- Inventory count number -->
<Type>
<code>{3}</code> <!-- Inventory count type code -->
</Type>
</PhysicalInventory>
<CountListReporting mode="create"> <!-- Mode: create -->
<Storage>
<warehouse>{4}</warehouse> <!-- Warehouse -->
<zone>{5}</zone> <!-- Zone -->
<location>{6}</location> <!-- Storage location -->
</Storage>
</CountListReporting>
</PhysicalInventoryCountList>
</semiramis>

 

Beispiel: Neue Mitarbeiter durch Import anlegen

Im folgenden Beispiel soll eine Prozessdefinition erfasst werden, mit dessen Hilfe die Basisdaten von neuen internen Mitarbeitern angelegt werden. Dabei soll die Identifikation des Partners aus dem im Customizing hinterlegten Nummernkreis für Partner ermittelt werden.

Als erstes erfassen Sie eine Prozessdefinition mit einem Skriptknoten, um die Importdatei im Knowledge Store abzulegen, und einen Serviceknoten, um die abgelegte Datei mithilfe der Hintergrundanwendung com.cisag.pgm.bi.Importzu importieren.

In der Aktivitätsdefinition für den Startknoten erfassen Sie Ergebnisfelder für diejenigen Daten, die der Benutzer beim Starten des Prozesses eingeben muss bzw. kann, wie z. B.:

  • Name und Vorname
  • Adresse incl. Postleitzahl und Land
  • Arbeitgeber und Tätigkeit
  • Zuständiger Mitarbeiter oder Vorgesetzter (über Partnerbeziehungen)

Die Identifikation und Pflichtfelder eines Partners entnehmen Sie dem Hilfedokument Partner importieren.

Im Startknoten erzeugen Sie eine neue Nummer aus dem im Customizing für den Mandanten hinterlegten Nummernkreis für Partner.

var company := getCustomizingValue("com.cisag.app.General"):company;
var numberRange := getCustomizingValue("com.cisag.app.general.Partners", company):customerNumberRange;
var newNumber := nextNumberRangeNumber(numberRange);

Ist im Customizing kein Nummernkreis hinterlegt, dann hat die neue Nummer den Wert null. In diesem Fall geben Sie in der Funktion validatemithilfe der Funktion sendMessageeine Fehlermeldung aus, um den Prozessstart zu verhindern. Haben Sie ein Ergebnisfeld auch für die Partnernummer erfasst, dann können Sie die Ausgabe der Fehlermeldung abhängig von dessen Wert ausgeben.

if (isNull(newNumber) and not validatePartner(results.partnerNumber))
sendMessage(results.partnerNumber_id, "EDU-00001", list());

Die Bedingungen für die eingegebene Partnernummer legen Sie in der Funktion validatePartnerfest.

In der Funktion closespeichern Sie die eingegebenen Ergebnisse in Prozessvariablen, die Sie vorher in der Prozessdefinition erfasst haben. Hat beispielsweise sowohl das Ergebnis als auch die Prozessvariable den Namen employeeFirstName, dann übertragen Sie den Wert wie folgt:

process.employeeFirstName := result.employeeFirstName;

Als nächstes legen Sie im Skriptknoten eine Importdatei für den neuen Mitarbeiter ab. Zunächst lesen Sie mithilfe der Funktion readTextFileeine Vorlagendatei für den Import aus dem Knowledge Store. Danach ersetzen Sie mithilfe der Funktion formatdie in der Vorlagendatei enthaltenen Platzhalter durch die zu importierenden Werte. Schließlich legen Sie die ausgefüllte Datei unter einem anderen Namen im Knowledge Store ab. Eine ausführliche Beschreibung dieser Schritte finden Sie im vorherigen Beispiel. Den vollständigen Pfad und Namen der Importdatei speichern Sie in einer Prozessvariablen.

Im anschließenden Serviceknoten Importieren Sie mithilfe der Hintergrundanwendung com.cisag.pgm.bi.Importdie Importdatei.

Zwischen dem Startknoten und den Skript- und Serviceknoten für den Import können Sie weitere Benutzerknoten hinzufügen, um die Informationen des neuen Mitarbeiters zusammenzustellen. Auch können Sie dem Prozess weitere Aktivitätsknoten zur Prüfung und Genehmigung der Informationen vor dem Importieren hinzufügen.

Czy ten artykuł był pomocny?