Verarbeitung von Tabellen
AddLineItem()
Diese Funktion fügt eine künstliche Zeile zu einer Indexdatentabelle des aktuellen Dokumentes hinzu. Die Parameterliste ist variabel lang und besteht abwechselnd aus dem vollständigen Namen des Zielfeldes in der Tabelle, wie dieser im Feldkatalog definiert ist, d.h. {Tabellenname}.{Spaltenname}, und dem in dieses Feld einzufügenden Wert.
Innerhalb eines Funktionsaufrufs dürfen nur Felder derselben Zieltabelle angesprochen werden. Wenn nicht für alle Felder der betreffenden Tabelle ein Wert angegeben wird, behalten die übrigen Felder ihren Initialwert.
Die Adressierung von Untertabellen ist ebenfalls möglich, jedoch ist dann für die übergeordnete Tabelle die Nummer einer konkreten, bereits existierenden Zeile mit anzugeben:
{Tabellenname}[{Zeilennummer}].{Untertabellenname}.{Spaltenname}.
Parameter | Datentyp | Beschreibung |
|---|---|---|
1 | Text | erster Name eines Tabellenfeldes |
2 | (variabel) | Wert des zuvor genannten Tabellenfeldes |
… | ||
n-1 | Text | letzter Name eines Tabellenfeldes |
n | (variabel) | Wert des zuvor genannten Tabellenfeldes |
Beispiele
AddLineItem("Items.Field1", "ABC", "Items.Field2", 123) hängt eine Zeile an die Tabelle Items an und belegt die Tabellenfelder Field1 und Field2 mit Werten.
AddLineItem("Items.LineNo", LineItemCount("Items") + 1) hängt eine fast leere Zeile an die Tabelle Items, in der nur das Feld LineNo mit der Zeilennummer vorbelegt wird. Die Zeilennummer ergibt sich durch das Hochzählen der aktuellen Zeilenanzahl der Zieltabelle.
AggregateLineItems()
Diese Funktion aggregiert die Werte zu bildender Gruppen von Zeilen einer Indexdatentabelle zu jeweils einer einzigen Zeile. Die Aggregation erfolgt separat pro Feld über alle Zeilen einer Gruppe, wobei nur elementare Datentypen unterstützt werden. Die Parameterliste ist variabel lang und besteht ab der dritten Position abwechselnd aus dem vollständigen Namen eines zu aggregierenden Tabellenfeldes, wie dieser im Feldkatalog definiert ist, d.h. {Tabellenname}.{Spaltenname}, und dem Aggregationsmodus (s.u.). Wenn ein vorhandenes Tabellenfeld dabei nicht aufgeführt ist, wird implizit nur dessen Wert aus der ersten Zeile der Gruppe übernommen.
Die Adressierung von Untertabellen ist ebenfalls möglich, jedoch ist dann für die übergeordnete Tabelle die Nummer einer konkreten, bereits existierenden Zeile mit anzugeben:
{Tabellenname}[{Zeilennummer}].{Untertabellenname}.{Spaltenname}.
Parameter | Datentyp | Beschreibung |
|---|---|---|
1* | Text | Modus, wie die Gruppen der Zeilen gebildet werden, die jeweils zu einer Zeile zusammenzufassen sind:
|
2* | (variabel) | Makroausdruck, der abhängig von obigem Modus die Bedingung oder den Wert zurückliefern muss, auf Basis dessen die Gruppierung erfolgt Das Makro wird – abgesehen vom Modus
|
3 | Text | erster Name eines zu aggregierenden Tabellenfeldes |
4 | Text | Modus, wie die Werte des zuvor genannten Tabellenfeldes aggregiert werden:
|
… | ||
n-1 | Text | letzter Name eines zu aggregierenden Tabellenfeldes |
n | Text | Modus, wie die Werte des zuvor genannten Tabellenfeldes aggregiert werden |
Beispiele
Eine Tabelle umfasst beispielsweise die folgenden Felder und Werte:
LineItems.KeyField | LineItems.Field_A | LineItems.Field_B | LineItems.Field_C |
|---|---|---|---|
"Key1" | "A1" | "B1" | 1 |
"Key2" | "A2" | "B2" | 2 |
"Key1" | "A3" | "B3" | 3 |
"Key2" | "A4" | "B4" | 4 |
Bei der Ausführung dieses Makroausdrucks werden die Zeilen 1 und 3 sowie die Zeilen 2 und 4 wie folgt zusammengefasst:
AggregateLineItems("RepeatCondition", @LineItems.KeyField, "LineItems.Field_A", "Array", "LineItems.Field_B", "Join", "LineItems.Field_C", "Sum")LineItems.KeyField | LineItems.Field_A | LineItems.Field_B | LineItems.Field_C |
|---|---|---|---|
"Key1" | ["A1","A3"] | "B1,B3" | 4 |
"Key2" | ["A2","A4"] | "B2,B4" | 6 |
ClearLineItems()
Diese Funktion löscht alle vorhandenen Zeilen aus einer Indexdatentabelle.
Parameter | Datentyp | Beschreibung |
|---|---|---|
1 | Text | optionaler Name der betreffenden Tabelle, d.h. der im Feldkatalog für Tabellenfelder genutzte Namensanteil für die übergeordnete Tabelle Wenn der Name nicht angegeben wird, wird die erste im Dokument vorhandene Tabelle herangezogen. |
Beispiele
ClearLineItems("Items") leert die Tabelle Items.
ForEachLineItem()
Diese Funktion läuft in einer Schleife über alle Zeilen einer Indexdatentabelle und führt im Kontext der jeweiligen Zeile einen Makroausdruck aus. Optional kann die Ausführung an eine Bedingung gebunden werden.
Parameter | Datentyp | Beschreibung |
|---|---|---|
1* | Text | Name der Tabelle, d.h. der im Feldkatalog für Tabellenfelder genutzte Namensanteil für die übergeordnete Tabelle |
2 | Bool | optionaler Wahrheitswert, ob für eine Zeile das Makro tatsächlich ausgeführt wird, sinnvollerweise in Form eines dynamischen Makroausdrucks |
3* | (keiner) | Makroausdruck, der für eine Tabellenzeile ausgeführt wird Ein möglicher Rückgabewert des Makros wird nicht ausgewertet. Stattdessen ist der Ausdruck in Form einer Zuweisung zu formulieren, um Werte in der betreffenden Zeile oder in den Kopfdaten zu ändern. |
Beispiele
Eine Tabelle umfasst die folgenden Felder und Werte. Es gibt ein Kopfdatenfeld "Sum" mit dem Initialwert 0.
LineItems.Field_A | LineItems.Field_B | LineItems.Field_C |
|---|---|---|
"A1" | "B1" | 1 |
"A2" | "B2" | 2 |
Mit dem folgenden Makroausdruck werden je Zeile 2 verschiedene, als Block zusammengefasste Aktionen ausgeführt. Der Wert im zweiten Tabellenfeld wird verändert und die Werte des dritten Tabellenfeldes werden in dem Kopfdatenfeld "Sum" aufsummiert.
ForEachLineItem("LineItems", , { @LineItems.Field_B = @LineItems.Field_B + "!"; @Sum = @Sum + @LineItems.Field_C })Im Ergebnis lauten die neuen Werte des zweiten Tabellenfeldes und des Kopfdatenfeldes "B1!", "B2!" und 3.
RemoveLineItems()
Diese Funktion löscht bestimmte Zeilen aus einer Indexdatentabelle abhängig von einer Bedingung.
Parameter | Datentyp | Beschreibung |
|---|---|---|
1 | Text | optionaler Name der betreffenden Tabelle, d.h. der im Feldkatalog für Tabellenfelder genutzte Namensanteil für die übergeordnete Tabelle Wenn der Name nicht angegeben ist, wird die erste im Dokument vorhandene Tabelle herangezogen. |
2* | Bool | Makroausdruck, der pro Tabellenzeile ausgeführt wird und einen Wahrheitswert zurückliefern muss, ob die betreffende Zeile gelöscht werden soll Der Makroausdruck sollte Feldvariablen nutzen, die sich auf die Tabellenfelder beziehen. |
Beispiele
RemoveLineItems("Items", IsEmpty(@Items.Field1)) löscht alle Zeilen aus der Tabelle Items, in denen das Feld Field1 leer ist.