Mithilfe der Funktionen für Listen lassen sich Listen erzeugen und bearbeiten. Zu den Funktionen für Listen gehören:
Grundlegende Informationen zu den allgemeinen Funktionen der System-Skriptsprache erhalten Sie im Dokument System-Skriptsprache: Allgemeine Funktionen.
add
Name | add |
Beschreibung | add fügt einer Liste ein weiteres Element hinzu. |
Signaturen | add(Unknown[] list, Unknown element) |
Parameter | list ist eine Liste.
element ist ein Element, das der Liste list hinzugefügt werden soll. |
Ergebnis | Das Element element wird der Liste list als letztes Element hinzugefügt. Der Elementdatentyp von element bleibt dabei erhalten. |
Fehlerquellen | Ein Element element kann nur dann der Liste list hinzugefügt werden, wenn der Datentyp des Elements mit dem Elementdatentyp der Liste übereinstimmt oder in diesen umgewandelt werden kann. Besitzt die Liste list1 beispielsweise den Datentyp Number[] , dann führt der Ausdruck add(list1, "1") zu einem syntaktischen Fehler, da eine Zeichenkette nicht in eine Zahl umgewandelt werden kann. Ist list1 dagegen als String[] deklariert, dann ist der Ausdruck add(list1, 1) syntaktisch korrekt, da eine Zahl in eine Zeichenkette umgewandelt werden kann. |
Beispiele | add(list1, 3) fügt der Liste list1 das Element 3 hinzu.
|
Kontext | ALL |
Hinweise | |
Siehe auch | addAll, list, union |
Folgendes Beispiel aus der Aktivitätsdefinition help.add erzeugt eine Liste vom Datentyp String[] mit einem Element für jedes Wort im Text parameters.TEXT:
function create() { var p_text := trim(parameters.TEXT); var p_text := trim(parameters.TEXT); var r_wordList as String[]; var word as String; var startPos := 0; var i := 0; while (i < length(p_text)) { if (substring(p_text, i, i + 1) = " ") { word := trim(substring(p_text, startPos, i)); startPos := i; if (word <> "") add(r_wordList, word); } i := i + 1; } word := trim(substring(p_text, startPos)); if (word <> "") add(r_wordList, word); result.VALUE := r_wordList; }
Beispiel: Parametersliste mit verschiedenen Datentypen
Besitzt die Liste den Datentypen Unknown[]
, dann können Elemente beliebiger Datentypen hinzugefügt werden, da alle Datentypen in Unknown
umgewandelt werden können. Daher können Sie die Funktion add
beispielsweise dazu verwenden, eine Parameterliste für die Funktion getCisObjectList
zu erzeugen, wenn die OQL-Abfrage Parameter unterschiedlicher Datentypen besitzt, die nicht automatisch in den Datentyp des ersten Parameters umgewandelt werden können.
Das folgende Beispiel verwendet eine Parameterliste vom Datentyp Unknown[]
, um mithilfe der Funktion getCisObjectList
die ersten 100 internen Personen zu ermitteln und auf der Konsole auszugeben:
const PartnerType as valueSet(com.cisag.app.general.PartnerType); const BlockSize := 100; function create() { var partnerList as CisObject(com.cisag.app.general.obj.Partner)[]; var params as Unknown[]; var OQL := "SELECT FROM com.cisag.app.general.obj.Partner p " + "WHERE p:type = ? AND p:human = ? " + "ORDER BY p:number"; add(params, PartnerType.INTERNAL); add(params, true); var cisObjectList := getCisObjectList(OQL, params, BlockSize); for (p as CisObject(com.cisag.app.general.obj.Partner) : cisObjectList) echo(p:number); }
addAll
Name | addAll |
Beschreibung | addAll fügt einer Liste alle Elemente einer weiteren Liste hinzu. |
Signaturen | addAll(Unknown[] list, Unknown[] listToAdd) |
Parameter | list ist eine Liste, der Elemente einer anderen Liste hinzugefügt werden sollen.
listToAdd ist eine Liste, deren Elemente der Liste list hinzugefügt werden sollen. |
Ergebnis | Die Liste list wird um alle Elemente der Liste listToAdd erweitert. Die Elementdatentypen der Elemente der Liste listToAdd bleiben dabei erhalten. |
Fehlerquellen | Ein Element der Liste listToAdd kann nur dann hinzugefügt werden, wenn der Datentyp des Elements mit dem Elementdatentyp der Liste list übereinstimmt oder in diesen umgewandelt werden kann. Besitzt list beispielsweise den Datentyp Number[] und ein Element der Liste listToAdd besitzt den Elemendatentypen String , dann kann das Element list nicht hinzugefügt werden, da eine Zeichenkette nicht in eine Zahl umgewandelt werden kann. Besitzt list dagegen den Datentyp String[] und ein Element der Liste listToAdd den Elementdatentyp Number , dann kann das Element list hinzugefügt werden, da eine Zahl in eine Zeichenkette umgewandelt werden kann. |
Beispiele | addAll(list1, list2) fügt der Liste list1 alle Elemente der Liste list2 hinzu. Die Elementdatentypen bleiben dabei erhalten.
|
Kontext | ALL |
Hinweise | Die Funktion union(list1, list2) gibt die Vereinigungsmenge der Listen list1 und list2 zurück. Verwenden Sie die Funktion union, um doppelte Werte auszuschließen. |
Siehe auch | add, list, union |
Folgendes Beispiel aus der Aktivitätsdefinition help.AddAll fügt einer Liste alle Elemente einer weiteren Liste hinzu:
function create() { var p_list1 as Unknown[]; var p_list2 as Unknown[]; add(p_list1, "carpe"); add(p_list1, "diem"); add(p_list2, now()); addAll(p_list1, p_list2); result.VALUE := p_list1; }
contains
Name | contains |
Beschreibung | contains prüft, ob eine Liste ein bestimmtes Element enthält. |
Signaturen | Boolean contains(Unknown[] list, Unknown element) |
Parameter | list ist eine Liste.
element ist ein Element. |
Ergebnis | Enthält die Liste list das Element element, so wird der Wahrheitswert true zurückgegeben, andernfalls false. |
Fehlerquellen | Keine. |
Beispiele | contains(list(1, 2, 3), 1) gibt true zurück.
|
Kontext | ALL |
Hinweise | |
Siehe auch | intersection |
Folgendes Beispiel aus der Aktivitätsdefinition help.contains prüft, ob ein Zeichen in einer Zeichenkette vorkommt:
function create() { var p_text := parameters.TEXT; var p_element := parameters.ELEMENT; var p_list := new(String[], length(p_text)); var i := 0; while (i < size(p_list)) { p_list[i] := substring(p_text, i, i + 1); i := i + 1; } result.VALUE_LIST := p_list; result.VALUE := contains(p_list, p_element); }
intersection
Name | intersection |
Beschreibung | intersection gibt die Schnittmenge von zwei oder mehr Listen zurück. |
Signaturen | Unknown[] intersection(Unknown[] list1 ,
|
Parameter | list1 ist die erste Liste.
list2 ist die zweite Liste. listN ist die letzte Liste. |
Ergebnis | Die Schnittmenge der übergebenen Listen als Liste mit demselben Datentyp wie list1. Die Schnittmenge besteht aus den Elementen, die in allen übergebenen Listen list1, list2,…, listN enthalten sind und den gleichen Elementdatentyp besitzen. |
Fehlerquellen | Um die Differenzmenge bilden zu können, müssen die Elementdatentypen der Listen list2, list3,…,listN in den Elementdatentyp der Liste list1 umgewandelt werden können. Ist z. B. list1 als Number[] und list2 als String[] deklariert, dann verursacht intersection(list1, list2) einen syntaktischen Fehler, intersection(list2, list1) aber nicht. |
Beispiele | intersection(list(1, 2, 3), list(1, 2), list(2, 3)) gibt eine Liste vom Datentyp Number[] mit der Schnittmenge 2 mit dem Elementdatentyp Number zurück.
|
Kontext | ALL |
Hinweise | |
Siehe auch | contains, minus, union |
Folgendes Beispiel aus der Aktivitätsdefinition help.intersection ermittelt alle Zeichen, die in beiden Zeichketten parameters.TEXT1
und parameters.TEXT2
enthalten sind:
function create() { var p_text1 := parameters.TEXT1; var p_text2 := parameters.TEXT2; var p_list1 := new(String[], length(p_text1)); var p_list2 := new(String[], length(p_text2)); var i := 0; while (i < size(p_list1)) { p_list1[i] := substring(p_text1, i, i + 1); i := i + 1; } i := 0; while (i < size(p_list2)) { p_list2[i] := substring(p_text2, i, i + 1); i := i + 1; } result.VALUE := intersection(p_list1, p_list2); }
Beispiel: Bearbeiter einer Workflow-Aktivität ermitteln
Sie können die Funktionen union
, intersection
und minus
verwenden, um die Bearbeiter einer Workflow-Aktivität kontextbezogen zu ermitteln, wie das folgende Beispiel zeigt.
Die Bearbeiter einer Workflow-Aktivität zur Genehmigung eines Beschaffungsauftrags sollen mithilfe der Workflowrolle PO_APPROVERS ermittelt werden. Dazu wählen Sie zunächst den Bearbeiter Ausdruck in der Aktivitätsdefinition. Im Feld Ausdruck für Bearbeiter tragen Sie workers
ein und deklarieren die globale Variable workers
außerhalb der Funktionen.
var workers as Guid[];
Innerhalb der Funktion create
weisen Sie workers
die Benutzer-Guids der Inhaber der Workflowrolle zu.
function create() { /* approvers of purchase orders */ workers := resolveRole("PO_APPROVERS"); }
Übersteigt der Bruttobetrag des Beschaffungsauftrags 10.000,00 Euro (in der 1. Hauswährung), dann soll zusätzlich der zuständige Mitarbeiter des Rechnungsempfängers den Beschaffungsauftrag genehmigen.
In der Funktion create
verwenden Sie dazu die Funktion union
. Um zu verhindern, dass die Funktion union
den Wert Null
zurückgibt, wenn für den Rechnungsempfänger kein zuständiger Mitarbeiter hinterlegt ist, prüfen Sie das Ergebnis der Funktion loadResponsibleOfPartner
mithilfe der Funktion isNull
.
/* additional approver of large purchase orders */ if (parameters.object:totalValues.grossValueDomestic.amount1 > 10000) { var responsibleOfPartner := loadResponsibleOfPartner(parameters.object->InvoiceRecipientData:partner); if (not isNull(responsibleOfPartner)) workers := union(workers, resolvePartner(responsibleOfPartner:guid)); }
Falls der Antragssteller seinen eigenen Beschaffungsauftrag nicht genehmigen darf, schließen Sie den Auslöser des Ereignisses und den zuständigen Mitarbeiter des Beschaffungsauftrags mithilfe der Funktion minus
aus der Menge der Bearbeiter aus.
/* remove requester */ workers := minus(workers, list(parameters.userGuid)); if (not isNull(parameters.object:responsible)) workers := minus(workers, resolvePartner(parameters.object:responsible), list(parameters.userGuid));
Um auch Mitarbeiter, die gerade abwesend sind, als Bearbeiter auszuschließen, verwenden Sie die Funktion minus
.
/* remove absent workers */ var absentees as Guid[]; for (u as Guid : workers) if (userAbsent(u)) add(absentees, u); workers := minus(workers, absentees);
Ist die Menge der Bearbeiter leer, dann soll der Vorgesetzte des Auslösers des Ereignisses den Beschaffungsauftrag genehmigen. Wenn Sie Stellen verwenden, können Sie den Vorgesetzten mithilfe der Funktion superior
ermitteln.
/* use superior of user who triggered the event as default */ if (isEmpty(workers)) workers := superior(parameters.userGuid);
Das fertige Beispiel sieht dann wie folgt aus:
var workers as Guid[]; function create() { /* approvers of purchase orders */ workers := resolveRole("PO_APPROVERS"); /* additional approver of large purchase orders */ if (parameters.object:totalValues.grossValueDomestic.amount1 > 10000) { var responsibleOfPartner := loadResponsibleOfPartner(parameters.object->InvoiceRecipientData:partner); if (not isNull(responsibleOfPartner)) workers := union(workers, resolvePartner(responsibleOfPartner:guid)); } /* remove requester */ workers := minus(workers, list(parameters.userGuid)); if (not isNull(parameters.object:responsible)) workers := minus(workers, resolvePartner(parameters.object:responsible), list(parameters.userGuid)); /* remove absent workers */ var absentees as Guid[]; for (u as Guid : workers) if (userAbsent(u)) add(absentees, u); workers := minus(workers, absentees); .. /* use superior of user who triggered the event as default */ if (isEmpty(workers)) workers := superior(parameters.userGuid); }
Ist die Menge der Bearbeiter leer und in der Anwendung Stellen ist keine Vorgesetzten-Beziehung für den Auslöser definiert, dann werden die Inhaber der in der Customizing-Funktion Workflow-Management hinterlegten OLTP-Workflowrolle für Administratoren als Bearbeiter herangezogen. Ist in der Customizing-Funktion keine Workflowrolle hinterlegt oder sie besitzt keine gültigen Inhaber, dann wird der Benutzer ADMINISTRATOR als Bearbeiter herangezogen.
isEmpty
Name | isEmpty |
Beschreibung | isEmpty bestimmt, ob eine Liste leer ist. |
Signaturen | Boolean isEmpty(unknown[] list) |
Parameter | list ist die Liste, die geprüft werden soll. |
Ergebnis | Die Funktion gibt true zurück, wenn list leer ist. Besitzt list mindestens ein Element, dann wird false zurückgegeben. |
Fehlerquellen | Keine |
Beispiele | isEmpty(list()) gibt true zurück.
|
Kontext | ALL |
Hinweise | |
Siehe auch | size |
Folgendes Beispiel aus der Aktivitätsdefinition help.isEmpty bestimmt, ob eine Liste leer ist:
function create() { var p_element := parameters.ELEMENT; var r_isEmpty as Boolean; var elementList as String[]; if (p_element <> "") add(elementList, p_element); result.VALUE := isEmpty(elementList); result.VALUE_LIST := elementList; }
list
Name | list |
Beschreibung | list erzeugt eine neue Liste mit den angegebenen Elementen. |
Signaturen | List list(Unknown e1, Unknown e2,…,Unknown eN) |
Parameter | e1, e2,…, eN sind die Elemente der zu erzeugenden Liste. Alle Parameter sind optional. |
Ergebnis | Die Funktion list erzeugt eine neue, gefüllte Liste mit den Elementen e1, e2,…,eN. Der Elementdatentyp des ersten Elements e1 bestimmt den Datentyp der Liste. Wird kein Parameter angegeben, dann gibt die Funktion eine leere Liste vom Datentyp Unknown[] zurück.
Weisen Sie mithilfe von list einer vorhandenen Liste Werte zu, dann steht der Datentyp der Liste bereits fest und wird nicht mehr geändert. In diesem Fall können Sie nur Elemente zuweisen, deren Elementdatentypen in den Datentyp der Liste umgewandelt werden können. Die Elemente nehmen dann den Elementdatentyp der Liste an. Möchten Sie eine Liste mit Elementen unterschiedlicher Elementdatentypen erzeugen (z. B. als Parameterliste einer Hintergrundanwendung), dann müssen Sie das erste Element so wählen, dass die weiteren Elemente in dessen Elementdatentyp umgewandelt werden können. Beispielsweise können Zahlen in Zeichenketten umgewandelt werden, aber nicht umgekehrt. Ist das nicht möglich, dann können Sie die Liste als |
Fehlerquellen | Sind die Elemente e2, e3,…, eN nicht vom gleichen Elementdatentyp wie e1 und können nicht in den Elementdatentyp von e1 umgewandelt werden, dann verursacht die Funktion einen syntaktischen Fehler. |
Beispiele | list() gibt eine leere Liste vom Datentyp Unknown[] zurück.
|
Kontext | ALL |
Hinweise | Beim Verwenden der Listenelemente übernehmen diese zunächst den Datentyp der Liste. Besitzt die Liste Elemente unterschiedlicher Elementdatentypen, müssen Sie ggf. die Elemente mithilfe der Funktion cast typisieren, bevor Sie sie verwenden können.
Beispiel var list1 as Unknown[]; list1 := list(null, now(), 1, "zwei", 3); result.VALUE := cast(Number, list1[2]) + cast(Number, list1[4]); /* -> 4 */ |
Siehe auch | add, addAll |
Folgendes Beispiel aus der Aktivitätsdefinition help.list erzeugt eine Liste mit zwei Elementen:
function create() { var p_element1 := parameters.ELEMENT1; var p_element2 := parameters.ELEMENT2; var r_list as String[]; r_list := list(p_element1, p_element2); result.VALUE := r_list; }
minus
Name | minus |
Beschreibung | minus gibt die Differenzmenge von zwei oder mehr Listen zurück. |
Signaturen | Unknown[] minus(Unknown[] list1, Unknown[] list2)
|
Parameter | list1 ist die erste Liste.
list2 ist die zweite Liste. listN ist die letzte Liste. |
Ergebnis | Die Differenzmenge der übergebenen Listen als Liste mit demselben Datentyp wie list1. Die Differenzmenge besteht aus allen Elementen der Liste list1, die mit dem gleichen Elementdatentyp nicht in einer der Listen list2, list3,…,listN enthalten sind. |
Fehlerquellen | Um die Differenzmenge bilden zu können, müssen die Elementdatentypen der Listen list2, list3,…,listN in den Elementdatentyp der Liste list1 umgewandelt werden können. Ist z. B. list1 als Number[] und list2 als String[] deklariert, dann verursacht minus(list1, list2) einen syntaktischen Fehler, minus(list2, list1) aber nicht. |
Beispiele | minus(list(1, 2, 3), list(1), list(2)) gibt eine Liste vom Datentyp Number[] mit der Schnittmenge 3 und dem Elementdatentyp Number zurück.
|
Kontext | ALL |
Hinweise | |
Siehe auch | intersection, union |
Folgendes Beispiel aus der Aktivitätsdefinition help.minus ermittelt alle Zeichen, die in der ersten Zeichenkette parameters.TEXT1
, aber nicht in der zweiten Zeichenkette parameters.TEXT2
enthalten sind:
function create() { var p_text1 := parameters.TEXT1; var p_text2 := parameters.TEXT2; var p_list1 := new(String[], length(p_text1)); var p_list2 := new(String[], length(p_text2)); var i := 0; while (i < size(p_list1)) { p_list1[i] := substring(p_text1, i, i + 1); i := i + 1; } i := 0; while (i < size(p_list2)) { p_list2[i] := substring(p_text2, i, i + 1); i := i + 1; } result.VALUE_LIST1 := p_list1; result.VALUE_LIST2 := p_list2; result.VALUE := minus(p_list1, p_list2); }
size
Name | size |
Beschreibung | size bestimmt die Anzahl der Elemente einer Liste oder einer HashMap. |
Signaturen | Number size(Unknown[] list)
|
Parameter | list ist eine Liste.
hashMap ist eine Hash-Tabelle (HashMap). |
Ergebnis | Die Anzahl der Elemente der Liste list bzw. der Hash-Tabelle hashMap. |
Fehlerquellen | Keine |
Beispiele | size(list(1, 2, 3)) gibt 3 zurück.
|
Kontext | ALL |
Hinweise | Die beiden Ausdrucke size(list1) = 0 und isEmpty(list1) prüfen beide, ob die Liste list1 leer ist. |
Siehe auch | isEmpty |
Folgendes Beispiel aus der Aktivitätsdefinition help.size bestimmt die Anzahl der Wörter in einem Text, indem es jedes Wort einer Liste hinzufügt und anschließend mithilfe der Funktion size die Länge der Liste ermittelt:
function create() { var p_text := trim(parameters.TEXT); var r_wordList as String[]; var word as String; var startPos := 0; var i := 0; while (i < length(p_text)) { if (substring(p_text, i, i + 1) = " ") { word := trim(substring(p_text, startPos, i)); startPos := i; if (word <> "") add(r_wordList, word); } i := i + 1; } word := trim(substring(p_text, startPos)); if (word <> "") add(r_wordList, word); result.VALUE_WORD_LIST := r_wordList; result.VALUE := size(r_wordList); }
toCharList
Name | toCharList |
Beschreibung | toCharList wandelt eine Zeichenkette in eine Liste von Zeichen um. |
Signaturen | String[] toCharList(String text) |
Parameter | text ist eine Zeichenkette. |
Ergebnis | Eine Liste mit einem Element für jedes Zeichen in der Zeichenkette. |
Fehlerquellen | Keine |
Beispiele | toCharList("ABC") gibt eine Liste mit den Elementen [„A“], [„B“] und [„C“] zurück. |
Kontext | ALL |
Hinweise | |
Siehe auch |
Folgendes Beispiel aus der Aktivitätsdefinition help.toCharList wandelt eine Zeichenkette in eine Liste von Zeichen um:
function create() { var p_text := parameters.TEXT; var r_toCharList := ""; var charList := new(String[]); var lenText := length(p_text); var i := 0; while (i < lenText) { add(charList, substring(p_text, i, i + 1)); i := i + 1; } for (char : charList) r_toCharList := r_toCharList + " [" + char + "]"; result.IS_EMPTY := isEmpty(charList); result.VALUE := trim(r_toCharList); }
union
Name | union |
Beschreibung | union gibt die Vereinigungsmenge von zwei oder mehr Listen zurück. |
Signaturen | Unknown[] union(Unknown[] list1, Unknown[] list2)
|
Parameter | list1 ist die erste Liste.
list2 ist die zweite Liste. listN ist die letzte Liste. |
Ergebnis | Die Vereinigungsmenge der übergebenen Listen als Liste mit demselben Datentyp wie list1. Die Vereinigungsmenge besteht aus allen Elementen, die in einer der Listen list1, list2,…, listN enthalten sind und vom selben Elementdatentyp sind. |
Fehlerquellen | Um die Vereinigungsmenge bilden zu können, müssen die Elementdatentypen der Listen list2, list3,…,listN in den Elementdatentyp der Liste list1 umgewandelt werden können. Ist z. B. list1 als Number[] und list2 als String[] deklariert, dann verursacht union(list1, list2) einen syntaktischen Fehler, union(list2, list1) aber nicht. |
Beispiele | union(list(1, 2, 3), list(1), list(2)) gibt eine Liste vom Datentyp Number[] mit den Elementen 1, 2, 3 vom Elementdatentyp Number zurück.
|
Kontext | ALL |
Hinweise | |
Siehe auch | add, intersection, minus |
Folgendes Beispiel aus der Aktivitätsdefinition help.minus ermittelt alle Zeichen, die in entweder der ersten Zeichenkette parameters.TEXT1
oder der zweiten Zeichenkette parameters.TEXT2
enthalten sind:
function create() { var p_text1 := parameters.TEXT1; var p_text2 := parameters.TEXT2; var p_list1 := new(String[], length(p_text1)); var p_list2 := new(String[], length(p_text2)); var i := 0; while (i < size(p_list1)) { p_list1[i] := substring(p_text1, i, i + 1); i := i + 1; } i := 0; while (i < size(p_list2)) { p_list2[i] := substring(p_text2, i, i + 1); i := i + 1; } result.VALUE_LIST1 := p_list1; result.VALUE_LIST2 := p_list2; result.VALUE := union(p_list1, p_list2); }