Spezialknoten für Aggregat-Maps in Quellstruktur

Problemstellung


Oft hat man in den Eingangsdaten sich wiederholende Strukturen, die man auswerten möchte. In einem einfachen Fall kann das z. B. ein Feldwert sein, der einen Preis enthält und Sie möchten den Gesamtpreis ermitteln. Vielleicht möchten Sie aber auch in einer großen Bestellung nach bestimmten Kriterien die Daten gruppieren. Natürlich kann dies mit vorhandenen Bordmitteln in der Zielstruktur gelöst werden, aber das kann manchmal zu komplizierteren Konstrukten führen, die nicht immer ganz leicht zu erstellen und pflegen sind. Deshalb gibt es eine weitere Möglichkeit, um Aufgaben dieser Art komfortabler zu lösen und die ausgewerteten Daten auch bereits in der Quellstruktur zur Verfügung zu stellen, wodurch diese Daten auch schon im Mapping-Vorgang zur Verfügung stehen, anstatt nur in Konstrukten in der Zielstruktur.

Aber machen wir es etwas konkreter. Gehen wir von folgender Quellstruktur aus.


images/download/thumbnails/169638587/2049-version-1-modificationdate-1714039419697-api-v2.png


In diese Quellstruktur lesen wir folgende Datei ein.


1;2;a
1;2;a
1;2;b
1;2;b


Dadurch erhalten wir also (bei entsprechender Satzarterkennung) vier mal den Knoten row.


images/download/thumbnails/169638587/2051-version-2-modificationdate-1714040006562-api-v2.png

Aggregat-Funktionen und Spezialknoten


Wir möchten nun die Werte der Felder field_1 und field_2 für alle vier Iterationen zusammenfassen (z. B. die Summe bilden).

Markieren Sie dazu den Knoten row (1) in der Quellstruktur und wählen Sie im Kontextmenü die Option Aggregatfunktionen (2).

images/download/attachments/169638587/2053x-version-1-modificationdate-1714106196999-api-v2.png


Daraufhin öffnet sich ein neuer Dialog.

images/download/attachments/169638587/2066-version-1-modificationdate-1714546008120-api-v2.png


Wählen Sie im Dialog nun für die beiden Felder field_1 und field_2 die Aggregat-Funktion sum() aus (3) und klicken Sie auf (4). Alle anderen Einstellungen können wir vorerst ignorieren.

Als Ergebnis erhalten wir folgende Strukturen.


images/download/attachments/169638587/2055-version-1-modificationdate-1714106197003-api-v2.png


In der Quellstruktur wurde der Spezialknoten (5) erzeugt. Dieser Knoten dient der Aufnahme der aggregierten Feldwerte. Hinweis: Über (16) können Sie steuern, ob der Knoten (5) vor dem Einfügen der Daten geleert werden soll. Hinweis: In (17) können Sie den voreingestellten Wert verwenden. Wenn Sie aus irgendeinem Grund die Feldnamen in (5) anpassen möchten, können Sie in (17) stattdessen den Wert Copy as sequence verwenden, dann erfolgt das Füllen mit Daten nicht über gleiche Feldnamen, sondern über die Reihenfolge der Felder.

In der Zielstruktur wurde der Knoten (6) erzeugt. Dieser dient dazu die Aggregierung der Feldwerte durchzuführen und wird so oft durchlaufen, wie der Knoten row im Quellbaum vorkommt (→ Pfad). Auf Feld (6) wird eine spezielle Funktion ausgeführt, die in einer internen Map (Aggregat-Map) die Feldwerte zusammenfasst, wie Sie das im Dialog definiert hatten.

Im Feld des Zielstruktur-Knotens (7) wird diese Aggregat-Map dann in den Quellstruktur-Spezialknoten (5) kopiert und steht dann dort, ab diesem Zeitpunkt, für das weitere Mapping zur Verfügung. Sie kennen das evtl. bereits in ähnlicher Form aus der Funktionalität Spezialknoten für Listen/Maps hinzufügen. Mit dem Inhalt des Spezialknotens (5) können Sie wie gewohnt mappen. Sie können diesen auch komplett manuell in die Zielstruktur kopieren und mappen (über die Symbolleiste oben in Phase 3, bzw. das Kontextmenü) oder im Dialog die Checkbox (8) setzen, dann wird dies automatisch gemacht.

Hinweis: Sollten in der Zielstruktur bereits Knoten vorhanden sein, können Sie über (15) steuern, wo die Knoten (6) und (7) eingefügt werden.

Sehen wir uns nun das Ergebnis des Mapping-Tests an. Das Zielstruktur-Feld field_1 enthält den Wert 4, also die aufsummierten Werte des mehrfach auftretenden Quellstruktur-Feldes field_1 (1+1+1+1=4). Analog für Zielstruktur-Feld field_2 (2+2+2+2=8).


images/download/attachments/169638587/2056x-version-1-modificationdate-1714121677859-api-v2.png



Sie müssen hier selbst keinerlei weitere Einstellungen durchführen. Fortgeschrittene Benutzer können sich die hier verwendeten Funktionen create aggregated map(a,b,c) und copy aggregated map to source tree(a,b,c[d,e]) ansehen, im Normalfall ist dies aber nicht notwendig.

Sie müssen nicht direkt mit der Aggregat-Map arbeiten und können es mit den "normalen" Map-Funktionen auch nicht. Beachten Sie bitte auch, dass der Inhalt der Aggregat-Map im Mapping-Test nicht angezeigt wird. Die Aggregat-Map ist in erster Linie eine interne Datenstruktur.

Es besteht aber mit der Funktion convert aggregated map(a,b,c,[d]) die Möglichkeit die Aggregat-Map in eine "normale" Map umzuwandeln, die dann im Mapping-Test sichtbar ist und auch normal bearbeitet werden kann. Zudem könnten Sie dann die "normale" Map in serialisierter Form an andere Profile weiterreichen. Mit der Funktion clear aggregated map(a) map(a,b,c) kann die Aggregat-Map gelöscht werden.

Verfügbare Aggregat-Funktionen:

first() - Der zuerst auftretende Wert des Quellstruktur-Feldes.

min() - Der kleinste auftretende Wert des Quellstruktur-Feldes.

max() - Der grösste auftretende Wert des Quellstruktur-Feldes.

sum() - Summe aller Werte des Quellstruktur-Feldes.

avg() - Der Durchschnitt aller Werte des Quellstruktur-Feldes.

count() - Wie viele Werte des Quellstruktur-Feldes kommen vor.

Gruppierungen


Sehen wir uns nun das Feld field_3 an. Hier tauchen die Werte a und b auf. Über diese Werte möchten wir nun eine Gruppierung durchführen, d. h. wir möchten jeweils alle Daten-Zeilen zusammenfassen, die in field_3 den selben Wert haben.


images/download/attachments/169638587/2067-version-1-modificationdate-1714546008122-api-v2.png


Setzen Sie dazu im Dialog den Haken in der Spalte GroupBy für das Feld field_3 (9). Hinweis: Der Wert first() in Spalte Aggregieren wird hier automatisch gesetzt und ist lediglich für interne Zwecke notwendig. Sie können diesen Wert ignorieren.

Die Gruppierung findet dabei intern in der Aggregat-Map statt über die Funktion create aggregated map(a,b,c) und die Daten werden auch entsprechend automatisch in die entsprechenden Knoten eingefügt. Auch hier ist keine manuelle Konfiguration notwendig.


images/download/attachments/169638587/2058-version-1-modificationdate-1714375580479-api-v2.png


Wir sehen das dabei zwei Iterationen des Knotens _GroupBy_row entstehen. In der ersten Iteration (10) werden alle Datenzeilen mit dem Wert a auf field_3 zusammengefasst (2 Stück) und in der zweiten Iteration (11) alle mit dem Wert b auf field_3.

Sortierungen


Es kann zudem eine Sortierung durchgeführt werden. Die Sortierung passiert nach der Gruppierung, wird also angewendet auf die erzeugten Iterationen.

Die Sortierung wird intern beim Kopieren der Aggregat-Map in den Spezialknoten der Quellstruktur mit der Funktion copy aggregated map to source tree(a,b,c[d,e]) durchgeführt. Auch hier ist keine manuelle Konfiguration notwendig.


Wir sortieren hier aufgrund des Wertes von Feld field_3 (12). Erlaubte Werte für die Sortierung: desc (absteigend), asc (aufsteigend). Hinweis: Sind die Feldwerte nicht numerisch, findet eine alphabetische Sortierung statt.


images/download/attachments/169638587/2068-version-1-modificationdate-1714546008123-api-v2.png


Folgend das neue Ergebnis. Wir sehen, dass nun die Iterationen absteigend (alphabetisch) sortiert sind. Zuerst kommt die Iteration mit dem Wert b für Feld field_3 und dann die Iteration mit dem Wert a für Feld field_3.


images/download/attachments/169638587/2060-version-1-modificationdate-1714378458212-api-v2.png

Erneuter Dialog-Aufruf


Wenn Sie den Dialog über das Kontextmenü erneut aufrufen, gibt es mehrere Möglichkeiten, je nachdem, an welcher Stelle Sie den Dialog aufrufen.


Zielstruktur

Die zuvor erstellte Gruppierung kann angepasst werden.

Quellstruktur → Der ursprüngliche Daten-Knoten (hier row)

Es kann eine weitere Gruppierung erstellt werden.

Quellstruktur → Der erzeugte Gruppierungs-Knoten (hier _GroupBy_row)

Es kann eine Gruppierung innerhalb dieser Gruppierung erstellt werden.

Aggregat-Maps


Allgemein

Siehe Abschnitt Datenstrukturen.

Geltungsbereich / Lebensdauer

Leben im Profil (und nicht in anderen Profilen) während des Profil-Laufs/-Tests. Ausnahme: Serialisierung (siehe oben).

Kein direkter Zugriff. Nur durch Umwandlung in "normale" Map (siehe oben).

Vorhanden, aber nicht angezeigt in Mapping-Test.