Über mehrere Flow Runs hochzählen und Counter (?) Variable speichern

Hallo Synesty,

ich möchte in einem Flow eine fortlaufende Nummer in den Datensätzen verwenden. Ich habe einen Startwert und ausgehend von diesem soll jeder Bestellung (Bestellkopfzeile im Spreadsheetmapper) eine fortlaufende Nummer zugeordnet werden. Die Variable muss also zwischen den Flowruns gespeichert werden.


Wie löst man das am elegantesten? (insbesondere die Speicherung des aktuellen Zählwertes).


Vielen Dank für eure Hilfe.

Diana

Hallo Diana,


du könntest hier den Step AddUpdateMappingset nehmen. Hier gibtst du ein Spredsheet rein und generierst eine Key-Value Map mit dem die Zählvariable als Value und einem einem festen Key. (zB. ds=3)

Vorher legst du das Mappingset mit ds=0 an.


Das Mappingset kannst du dann im nächste Run wieder in einen Mapper laden. Die Zähllogik muss dann natürlich vor dem AddUpdateMappingset passieren.





Um auf den Zähler später zuzugreifen könntest du im Anschluss einen TextHTMLWriter und extrahierst aus dem Mapper mit dem aktuellen Zählerstand.


${spreadsheet@SpreadsheetMapper.firstRow("value")!}



Auf die Variable kannst du nun mit


${meta.TEMPLATE_OUTPUT_STRING@TextHTMLWriter!}


zugreifen.



Viele Grüße,


Rocco






Hallo Rocco,

vielen Dank für die schnelle Antwort.

Ich habe es ausprobiert und es funktioniert grundsätzlich.


1. Mapper mit

- Hilfsspalte für counter Variable

- Hilfsspalte für key Value des Mappingsets

- Ergebnisspalte mit Summe aus (Wert aus Mappingset + aktueller Counter)


2. Filter um alle Zeilen ohne Ergebnisnummer rauszufiltern (Artikelpositionen sollen nicht die fortlaufende Nummer hochzählen)


3. AddUpdateMappingset um den neuen Wert in das Mappingset zu schreiben. Als Input dienen hier die "Hilfsspalte für key Value des Mappingsets" als keycolumn und die "Ergebnisspalte mit der fortlaufenden Nummer" als valuecolumn


So weit, so gut. Damit können wir arbeiten.

Was ich nicht ganz verstehe ist, warum du oben

${spreadsheet@SpreadsheetMapper.firstRow("value")!}

benutzt. Müsste ich den Wert nicht aus der letzten Zeile extrahieren?


lastRow funktioniert leider nicht. Eine Funktion für das Maximum habe ich auch nicht gefunden.

https://docs.synesty.com/display/SSUD/Spreadsheet+Freemarker-Funktionen


Also müsste ich das Spreadsheet vorher auf eine Zeile zusammenschmelzen, sodass nur die letzte Zeile übrig bleibt? (Dafür würde ich einen weiteren Mapper nach dem Filter einfügen und die Aggregatfunktion nutzen, sodass mir nur die letzte Zeile ausgegeben wird. In Summe sind es dann aber 3-4 Steps nur für diese eine fortlaufende Nummer).


image


Und ist der Umweg über ein Mappingset wirklich notwendig? Ich hatte gehofft, dass es eine Funktion gibt, um direkt die Flowvariablen überschreiben zu können. Gibt es diese Möglichkeit generell? Falls nicht, ist so eine Erweiterung geplant?


Liebe Grüße

Diana


Hallo Diana,


Flow-Variablen können leider nicht aus dem Flow selbst beschrieben werden. Wenn du im Mapper einen Counter hochzählst und den höchsten Wert benötigst, könntest du das mit dem TextHTMLWriter auch so machen:


<#list spreadsheet@SpreadsheetMapper.getRows() as row><#assign counter +=  row.get("value") + ";"></#list>
${max(counter, ";")!}


Die Funktion erstellt eine Liste aller Zähler und gibt den max-Wert aus.


Die .firstRow() hatte ich gewählt um nicht durch das ganze Spreadsheet listen zu müssen. Ich ging davon aus das nur einmal pro Run der Counter hochgezählt wird.



Viele Grüße,


Rocco

Hallo Rocco,

vielen Dank für die ausführliche Erklärungen. Spannend zu sehen, wie viele Wege es gibt.

Mit dem Mappingset hat es sehr gut funktioniert und es bleibt übersichtlich und anpassbar für den Kunden. Wir werden darauf vermutlich sogar aus mehreren Flows heraus zugreifen :)


Vielen Dank für deine Hilfe!


Einen guten Start in die neue Woche!

Diana