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:
|
Ergebnis | Die Funktion readFile gibt den Inhalt einer Datei als Bytestream (Bytes) 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 Bytestream (Bytes) zurück. |
Kontext | ALL |
Hinweise | Die Funktion readFile kann mit dem Befehl addMailAttachment kombiniert werden, sodassreadFile den Inhalt des Anhangs liefert:
|
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:
|
Ergebnis | Die Funktion readTextFile gibt 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.
|
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)
|
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.
Eine vollständige Dokumentation der möglichen Kodierungen ist im Java-Doc für |
Ergebnis | Der Befehl writeFile erzeugt eine neue Datei mit einem angegebenen Inhalt im Knowledge Store. Der Dateipfad wird analog zu der Funktion readFile angegeben. 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 null zurü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 writeFile kann zusammen mit den Funktionen readTextFile und format verwendet 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.Import
mit 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.Import
zu 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 validate
mithilfe der Funktion sendMessage
eine 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 validatePartner
fest.
In der Funktion close
speichern 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 readTextFile
eine Vorlagendatei für den Import aus dem Knowledge Store. Danach ersetzen Sie mithilfe der Funktion format
die 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.Import
die 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.