Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

In der Rubrik Cookbooks sammeln wir "Rezepte" für häufig auftretende Probleme und Lösungen. Das ganze wird im Frage-Antwort Stil geschrieben wie z.B. "Wie mache ich dies oder jenes?"

 

...

 

Image Removed

Spreadsheet: Wie kann ich Steuerzeichen aus Spalten entfernen

Steuerzeichen sind nicht darstellbare Zeichen eines Zeichensatzes. Häufig müssen für die Übertragung in Form von XML Steuerzeichen entfernt werden.

Sie können zu entfernen von Steuerzeichen die Freemarker replace Funktion nutzen:

Code Block
${value?replace("\\u0000|\\u0001|\\u0002|\\u0003|\\u0004|\\u0005|\\u0006|\\u0007|\\u0008|\\u0009|\\u000B|\\u000C|\\u000E|\\u000F|\\u0010|\\u0011|\\u0012|\\u0013|\\u0014|\\u0015|\\u0016|\\u0017|\\u0018|\\u0019|\\u001A|\\u001B|\\u001C|\\u001D|\\u001E|\\u001F","","ris")}

oder die Suchen & Ersetzen Funktion (Regulärer Ausdruck aktiviert):

Code Block
Suchmuster: \u0000|\u0001|\u0002|\u0003|\u0004|\u0005|\u0006|\u0007|\u0008|\u0009|\u000B|\u000C|\u000E|\u000F|\u0010|\u0011|\u0012|\u0013|\u0014|\u0015|\u0016|\u0017|\u0018|\u0019|\u001A|\u001B|\u001C|\u001D|\u001E|\u001F


Ersetzen durch: 

Image Removed

Flow: Wie erstelle ich eine CSV mit fester zusätzlichen Kopfzeile?

Es gibt einige Fälle in denen eine oder mehrere Zeilen über eine CSV-Tabelle gesetzt werden müssen. Um dies in Synesty Studio zu realisieren wird der Step "FileAppender" aus dem "Tools AddOn" benötigt (https://apps.synesty.com/registration/Tools?action=showPlan&id=062d6837-b10e-4d3b-864a-cebcd56829b6). Mit diesem Step, können 2 CSV Dateien zusammengefügt werden.

...

Flow: Wie füge ich mehrere Spreadsheets zusammen?

Es kommt vor das in einem Flow zwei oder mehrere verschiedene Spreadsheets unabhängig voneinander bearbeitet und am Ende zusammengeführt werden müssen. Diese Funktion bietet der Step "SpreadsheetAppend". Fügen Sie dazu einfach die beiden Spreadsheets in "spreadsheet1" und "spreadsheet2" ein.
Sollten Sie mehr als zwei Spreadsheets zusammenführen wollen, tragen Sie die gewünschte Anzahl in "numAdditional" ein und drücken Sie speichern. Nun erscheinen neue Inputfelder für die zusätzlichen Spreadsheets.

Note

Achten Sie darauf das alle Spreadsheets die identischen Spalten besitzen, ansonsten schlägt der Step fehl.

Flow: Wie finde ich Datensätze, die gestern importiert wurden, aber heute nicht mehr mit mitkommen?

Ein klassisches Problem bei der Integration von Lieferanten für Bestandsupdates ist, dass Datensätze nicht mehr in der Lieferantendatei enthalten sind, die am Vortag noch enthalten waren. Meist betrifft das ausgelaufene Artikel, die aus dem Sortiment des Lieferanten genommen wurden. Anstatt also den Datensatz mitzuschicken und als "ausgelaufen" zu markieren, kommt dieser Datensatz gar nicht mehr in der Datei mit. 

Die Anforderung ist dann, genau diese Artikel zu identifizieren und im eigenen Sortiment ebenfalls zu entfernen oder auf Bestand=0 zu setzen. 

Bezogen auf die Grafik bedeutet das, dass man die Artikel auf der rechten Seite herausfinden will. 

 

Lösung:

Lösen lässt sich das Problem nur, wenn man sich immer alle Lieferantenartikel in einem Datastore speichert, damit man den Vergleich machen kann, welche Artikel am Vortag noch vorhanden waren und heute aber nicht mehr. 

Ein möglicher Flow sieht dann aus wie im Screenshot:

  • Zuerst importiert man die Daten, die der Lieferant schickt in einen Datastore. 
  • Dabei werden durch den SpreadsheetDatastoreWriter alle importieren Datensätze im Datastore mit der aktuellen flowrunid markiert (jeder Run hat eine eindeutige ID)
  • Danach macht man eine Datastore-Suche nach allen Datensätzen die NICHT (NOT EQUALS) von der aktuellen flowrunid "angefasst" wurden.
  • Diese "nicht angefassten" Datensätze kann man nun wieder mit einem SpreadsheetMapper bearbeiten (z.B. Stock=0) und wieder importieren

Image Removed

Wichtige Einstellung im Step SearchMasterDatastore - NICHT angefasste DatensätzeImage Removed

Image Removed

 

Wie kann man dieses Vorgehen testen?

Dazu erstellt man sich 2 Test-CSV Dateien und importiert diese nacheinander mit dem obigen Flow. 
Die erste Datei enthält z.B. 3 Zeilen. In der zweiten Datei entfernt man einfach eine Zeile.

Erwartetes Ergebnis:

In der 1. Ausführung werden 3 Zeilen importiert. 
In der 2. Ausführung werden nur 2 Zeilen importiert. Der Datensatz der entfernten Zeile befindet sich jedoch noch im Datastore von der 1. Ausführung, jedoch mit der flowrunid des 1. Runs. 
In der 2. Ausführung sollte der Step SearchMasterDatastore - NICHT angefasste Datensätze genau den entfernten Datensatz als Ergebnis liefern (das liegt am Suchfilter flowrunid NOT EQUALS).

 

Info
titleMehrere Lieferanten im Datastore

Der oben beschriebene Prozess setzt voraus, dass der Datastore ausschließlich Artikel eines einzigen Lieferanten beinhaltet.
Sollten Sie mehrere Lieferanten im gleichen Datastore verwalten, dann sollte man pro Lieferant einen extra Folder benutzen. Bei allen relevanten Steps (SpreadsheetDatastoreWriter, SearchMasterDatastore) muss dann darauf achten, dass die Folder-Spalte gesetzt und als Filter genutzt wird. Das ganze müsste dann pro Lieferant gemacht werden.

 

...

Oft will man Daten von z.B. Lieferanten mit seinem eigenen Artikelstamm abgleichen und nur die neuen Artikel erkennen. 

Bezogen auf die Grafik bedeutet das, dass man die Artikel auf der linken Seite herausfinden will. 

...

Man braucht dafür:

  • am besten 2 Flows
  • und einen Datastore

Flow 1 (Vorbereitung)

  • importiert ihren Artikelstamm in einen Datastore
  • wichtig: in identifier2 des Datastore sollten man den Abgleichs-Identifier speichern, den auch der Lieferant schickt z.B. EAN
  • diesen Flow braucht man nur ausführen wenn es neue Artikel in ihrem Artikelstamm gibt, damit der Datastore immer aktuell ist 

Flow 2 (das ist der entscheidende Flow)

  • Flow holt ihre Lieferantendatei und verarbeitet diese
  • dort braucht man einen SpreadsheetMapper Step
  • im SpreadsheetMapper machen sie z.B. in der EAN- oder in einer Hilfsspalte einen Querverweis auf ean zu identifier2 und folder des Datastores, in dem sich ihr Artikelstamm befindet.
  • wenn der Lieferant nun eine EAN schickt, die noch nicht in ihrem Datastore in identifier2 existiert, dann liefert der Querverweis ein "No Record found"

 

Info
titleFolder beachten

Sollten Sie ein "No Record found" erhalten, obwohl der identifier2 im Datastore existiert, dann prüfen Sie, ob sie auch den Folder korrekt gesetzt haben und dass die Datensätze in einem Folder im Datastore liegen, der nicht "default" ist. Das Feld Folder im Querverweis kann nur dann leer gelassen werden, wenn der Folder "default" ist. Ansonsten müssen sie hier auch den entsprechenden Folder angeben, in dem der Datensatz zu finden ist. Sie können hier einen festen Wert eintragen oder über Freemarker eine Spalte der Quelldatei definieren z.B. ${Marke!} -> (analog wie ${EAN!} im identifier).

 

Neue Produkte erkennen

Nun schaltet man hinter den SpreadsheetMapper einen SpreadsheetFilter Step mit folgender Filter-Bedingung: 

Code Block
ean! == "No Record found"

 

D.h. der Filter lässt nur Zeilen durch, in denen in der Querverweis-Spalte "No Record found" steht.
Das sind dann neue Produkte.

...

Info

Wenn man die Filter-Bedingung umkehrt (ean! != "No Record found") dann bekommt man die existierenden Artikel.

ean! == "No Record found" --> das sind neue Artikel, die es im Datastore noch nicht gibt.

ean! != "No Record found" --> das sind existierende Artikel, zu denen es im Datastore schon einen Eintrag gibt.

 

...

Flow: Wie erzeuge ich einen Dateinamen mit dem aktuellen Datum?

Um z.B. eine CSV Datei mit dem aktuellen Datum im Dateinamen zu erzeugen gibt es 2 Möglichkeiten:

Variante 1 - SpreadsheetCSVWriter Step (seit 12/2014)

Der SpreadsheetCSVWriter Step hat beim Input "filename" ein + Zeichen. Darüber können Sie den Dateinamen dynamisch zusammensetzen. 

Image Removed

Für die aktuelle Uhrzeit wählen Sie die Variable current_timestamp. Diese Variante solte in den meisten Fällen ausreichend sein. 

Variante 2 - TextHTMLWriter

Weiterhin kann man den TextHTMLWriter Step benutzten. Damit erzeugt man den Dateinamen und verwendet diesen dann in darauffolgenden Steps. 

Im TextHTMLWriter hat man die Möglichkeit auf Laufzeitvariablen ${current_timestamp} zuzugreifen.

Info
titleDatumsformatierung

Da es sich dabei um eine Variable vom Typ DATETIME handelt, hat man nach dem Einfügung auch gleich die Möglichkeit das Datum zu formatieren. 
Die Formatangabe yyyyMMddHHmmss erzeugt z.B. den Dateinamen meindateiname_20140806172214.csv .

 

Image Removed

Image Removed

Image Removed

Image Removed

Im nächsten Step z.B. SpreadsheetCSVWriter kann man dann diesen dynamisch erzeugten Dateinamen im Input Feld filename verwenden:

Image Removed

Spreadsheet: Wie subtrahiere einen Tag von einem Datum und gebe es formatiert wieder aus? (oder: Wie kann man mit einem Datum rechnen?)

Wenn man einen Dateinamen erzeugen möchte, der das Datum von gestern beinhaltet (bezogen auf das aktuelle Datum), dann helfen folgende Freemarker Ausdrücke weiter:

Code Block
# formatiertes Datum von heute (z.B. 05.09.2014 11:56)
${(.now?long)?number_to_datetime?string("dd.MM.yyyy HH:mm")}
 
# formatiertes Datum von gestern (z.B. 04.09.2014 11:56)
${((.now?long) - (24*60*60*1000))?number_to_datetime?string("dd.MM.yyyy HH:mm")}

oder Beispiel-Mapping anzeigen

Flow: Wie stoppe ich einen Flow wenn eine bestimmte Bedingung zutrifft?

Um einen Flow zu stoppen gibt es den Step StopFlowIf. Hier kann man die Ausführung eines Flows abbrechen, wenn ein bestimmte Bedingung zutrifft. 

Hier ein  Beispiel: 

Flow stoppen, wenn Spreadsheet leer

Szenario: Der Flow soll gestoppt werden, wenn ein Spreadsheet aus einer Datastore-Suche (SearchDatastore) leer ist (bzw. nur die Kopfzeile / Header enthält).

Image Removed

Die Konfiguration des StopFlowIf Steps sähe dann wie folgt aus:

Image Removed

Die Bedingung (Condition) bedeutet:
WENN das Spreadsheet aus dem SearchDatastore-Step nicht existiert oder 0 Zeilen hat,
DANN (action) stoppe den Flow mit Status ERROR. 

Hinweis: Nutzen Sie den Image Removed Button. Dort erhalten Sie in der Regel schon Vorschläge für Bedingungen wie z.B. Image Removed
Diese Bedingungen können Sie dann an ihre Anforderungen anpassen. Die Verwendung des Buttons stellt auch sicher, dass die korrekten Variablennamen verwendet werden, da die sich je nach Position des referenzierten Steps unterscheiden. 

 

Spreadsheet: Wie erzeuge ich zu Artikelvarianten-Zeilen eine künstliche Parent-Artikel-Zeile?

Immer wieder gibt es den Fall, wo man Produktdaten als CSV-Datei geschickt bekommt, aber darin sind nur die Artikel-Varianten pro Zeile enthalten aber keine Zeile für einen Hauptartikel (oder Eltern-Artikel / Parent). 
Oft benötigt man aber genau solche einen Parent-Artikel. Das Beispiel kann man auch auf Auftragskopf- und Auftragspositionen übertragen. (man bekommt nur die Positionen, aber es fehlt eine Zeile für den Auftragskopf).

Lösung: Man kann sich diesen Parent-Artikel künstlich erzeugen. Das Stichwort heißt Gruppieren (siehe Spreadsheets#Gruppieren/Aggregatfunktionen)

Vorgehensweise:

  • sie benötigen einen Flow 
  • der Mapper gruppiert die Eingangsdaten nach einer Spalte, die allen Artikeln gemeinsam ist (z.B. die gemeinsame Artikelnummer oder Auftragsnummer)
    • dadurch werden alle Zeilen, die diese gemeinsame Nummer haben zu einer Zeile zusammengefasst. Das sind die Parent-Zeilen, die wir künstlich erzeugen wollen
  • dann fügen Sie mit Hilfe des SpreadsheetAppend Steps das Ergebnis der gruppierenden SpreadsheetMapper und den Eingangsdaten zusammen.

Ergebnis: Sie erhalten ein neues Spreadsheet welches zuerst die neuen künstlich erzeugen Parent-Zeilen und anschließend die Varianten-Zeilen aus der Ausgangsdatei. 

Image Removed

 

 

Wie prüfe ich, ob ein Wert einer Spalte eine Zahl ist oder nicht?

Mit der Template-Funktion isNumber kann man prüfen, ob ein Wert eine Zahl ist oder nicht. 

Image Removed

 

Image Removed

 

 

Code Block
<#if isNumber(value)>value ist eine Zahl<#else>value ist KEINE Zahl</#if>

 

 

Flows: Wie kann ich voneinander abhängige Flows immer nach einander ausführen lassen?

Wenn die Reihnenfolge von Flows wichtig ist und der nächste Flow immer erst ausgeführt werden soll, wenn der vorherige fertig ist, dann können Sie dafür den FlowTrigger Step verwenden. Mit diesem Step können Sie einen anderen Flow anstarten. 

In den meisten Fällen sollte dies der letzte Step im Flow sein, der den nächsten Flow anstartet. 
Um nun so eine Flow-Kette zu bauen, braucht nur der erste Flow gestartet zu werden (z.B. per Zeitplanung oder URL-Trigger). 

 
Info
title

...

Wenn Sie Vorschläge für ein Cookbook-Thema haben, dann nutzen Sie dafür bitte das Kommentarfeld am Ende der Seite.

 

Table of Contents
maxLevel2
absoluteUrltrue

Best-Practises und Tips zur Fehlervermeidung

Es gibt einige generelle Dinge, die man stets beherzigen kann, und damit automatisch viele potentielle Fehler bei der Arbeit mit Datenfeeds und Schnittstellen vermeiden kann. Natürlich gibt es immer Ausnahmen, aber folgende Tips spiegeln unsere Erfahrungen in unzähligen Integrationsprojekten wieder.

  • Geben Sie Steps und Flows gute sprechende Namen. Wir empfehlen den ursprünglichen Stepnamen vorangestellt zu lassen und hinten noch einen Zusatz anzuhängen, der die Intention des Steps beschreibt (z.B. SpreadsheetCSVWriter - Schreibe Preisliste)
  • Lesen Sie die Seite Typische Fehlermeldungen
    • Lesen Sie Fehlermeldung im Eventlog bis zum Ende. Meist steht der interessante Teil am Ende der Fehlermeldung. Halten Sie Ausschau nach Wörtern oder Nummern, die Ihnen bekannt vorkommen. Wenn z.B. eine Artikel-Nummer in der Fehlermeldung vorkommt, dann dann stimmt vermutlich mit dem Artikel etwas nicht. Steht in der Fehlermeldung ein HTTP-Fehlercode (z.B. 404) oder Wörter wie Connection oder Remote, dann hat es in der Regel immer irgendwas mit dem externen System zu tun, mit dem sie reden.
  • Verwenden Sie niemals Sonderzeichen, Leerzeichen oder deutsche Umlaute in ID-Spalten (Identifier, EAN, Artikelnummer etc.)
  • Vermeiden sie Copy/Paste von Daten aus Word oder Excel. Durch Copy/Paste in Textfelder im Browser kommen häufig unsichtbare Steuerzeichen in Textfelder, die bei Schnittstellen zu Fehlern führen können (Stichwort: invalid UTF-8 Character)
  • Verwenden Sie immer einen Punkt als Dezimaltrenner (statt Komma). Das ist bei vielen Schnittstellen der Standard und so auch in Synesty Studio
  • Nutzen Sie als Datei-Encoding immer UTF-8. Damit sind Sie immer auf der sicheren Seite, wenn es um die Darstellung von Umlauten geht
  • Verwenden Sie Texteditoren statt Excel! Öffnen oder bearbeiten Sie CSV-Dateien nicht mit Tabellenkalkukationsprogrammen wie Excel, sondern verwenden Sie einen Texteditor wie z.B. Notepad++ (Windows) oder TextWranger (MacOSX). Oft werden durch das zusätzliche Speichern in Tabellenkalkulationsprogramme Spalten "zerstört".
    • Klassiker: EANs werden in Exponentialdarstellung ausgegeben 9,0821E+11 statt 908210002054. Damit wird die EAN zerstört und der Datenfeed damit unbrauchbar
    • Wenn es sich nicht vermeiden lässt, dann prüfen Sie nach dem Speichern die resultierende CSV-Datei mit einem Texteditor, denn: "Nur ein Texteditor sagt die Wahrheit"
  • Kontrolldateien erstellen: Speichern Sie wichtige Zwischenergebnisse und Filter-Ergebnisse immer noch mal zusätzlich als CSV-Datei mit Timestamp (z.B. mein-gefilterter-feed_201507271151.csv) weg. Gerade wenn Sie große Datenmengen verarbeiten oder Flows sehr lange dauern kann eine physische Kontrolldatei sehr viel Wert sein. Legen Sie sich Kontrolldateien z.B. zusätzlich auf Ihrem FTP-Server ab. Das ist vor allem dann wichtig, wenn eine andere Partei behauptet, dass Daten nicht übertragen wurden. Damit haben Sie auch nach Wochen immer noch einen physischen Nachweis, welche Daten wann übertragen wurden.

 

 

Spreadsheet: Wie kann ich die Summe /  Durchschnitt / kleinsten / größten Wert einer z.B. pro EAN berechnen?

Das Stichwort und die Funktion lautet "Gruppieren" und Funktionen wie Summe oder Durchschnitt im Zusammenhang mit Gruppierung nennen sich Aggregatfunktionen.

Diese finden Sie im SpreadsheetMapper unter "Einstellungen / Gruppieren nach Spaltenname:". Wählen Sie eine Spalte nach der Sie Gruppieren wollen und drücken Sie auf "Einstellungen Anwenden". In der Spalte wo die Berechnung stattfinden sollen finden Sie nun unter "Funktionen" ein neuen Menüpunkt "Aggregierfunktionen", hier finden Sie vorgefertigte Funktionen, welche auf die gruppierten Werte angewandt werden können, u.a. auch "Summe aller Werte" und "Durchschnittswert".

Mehr zur Gruppierfunktion

Image Removed

Image Removed

Note
Achten Sie darauf, dass mathematische Aggregatfunktionen nur angewandt werden können wenn "Kommazahlen" durch einen Punkt getrennt sein müssen, z.B. 10.95. (Wie Sie dies bewerkstelligen, erfahren Sie im nächsten Punkt)

Spreadsheet: Wie kann ich die Werte zweier Spalten addieren, mit Komma als Dezimaltrenner?

Sie können mehrere Spaltenwerte mit Freemarker addieren, subtrahieren, multiplizieren usw. Um Freemarker Syntax zu verwenden, nutzen Sie bitte das "Wert" Feld in einer beliebigen Spalte. Klicken Sie auf das Image Removed um aus allen vorhandenen Spalten ein oder mehrere Spalten dem "Wert" Feld hinzuzufügen. Fügen Sie nun einen beliebigen Rechenoperator zwischen die beiden Ausdrücke (z.B. ein +). Das Resultat sieht in etwa so aus:

Code Block
themeConfluence
${SPALTENNAME_A?number + SPALTENNAME_B?number}
Info
titleDezimaltrenner
Wichtig ist, Rechenoperationen funktionieren nur mit einem Punkt als Dezimaltrenner (z.B. 19.99). Falls dies bei Ihnen schon der Fall ist, lesen Sie weiter.
Info
titleFallstrick

Es ist wichtig, dass bei Rechenoperationen die Formel innerhalb der geschweiften Klammern steht. Ansonsten würden einfach nur beide Werte ausgegeben werden.

Richtig: ${SPALTENNAME_A?number + SPALTENNAME_B?number}
Falsch: ${SPALTENNAME_A?number} + ${SPALTENNAME_B?number}

 

 

Komma durch Punkt ersetzen

Dies erreichen Sie mit der Freemarker Funktion ?replace(). Zwischen die Klammern kommt zum einen das Zeichen welches ersetzt werden soll (in diesem Fall ",") gefolgt von einem Komma und danach den Wert der dafür eingesetzt werden soll (in diesem Fall ein Punkt "."). In diesem Fall würde sich folgendes Resultat ergeben:

Code Block
themeConfluence
${SPALTENNAME_A?replace(",",".")?number + SPALTENNAME_B?replace(",",".")?number}

Zeichenkette in eine Zahl umwandeln

Freemarker behandelt jeden Spaltenwert als eine Zeichenkette. Um eine Rechenoperation durchzuführen bedarf es jedoch selbstverständlich Zahlen. Um die Zeichenkette in eine Zahl umzuwandeln wird die Freemarker Funktion ?number benötigt. Diese Funktion hängen sie einfach am Ende ihrer Variablen an und schon erkennt Freemarker die Werte als Zahlen.

Das finale Resultat für eine Addition von zwei Spalten sieht demnach wie folgt aus (falls keine Kommas ersetzt werden mussten,können die replace(...)" Anweisungen ignoriert werden):

Code Block
themeConfluence
${SPALTENNAME_A?replace(",",".")?number} + ${SPALTENNAME_B?replace(",",".")?number}

 

Spreadsheet: Ich habe in einer Spalte kommagetrennte Werte, wie kann ich nur den n-ten Wert ausgeben?

Bsp.: Wert1,Wert2,Wert3

Wenn Sie innerhalb einer Spalte Daten auftrennen wollen, können Sie dies über die in Freemarker integrierte Funktion ?split() erreichen. Innerhalb der Klammern wird das Trennzeichen, nach dem die Zeichenkette aufgeteilt werden soll, in Anführungszeichen eingetragen. In diesem Fall lautet die Funktion also split(",") - da wir die Werte zwischen den Kommas betrachten wollen.
Die Split-Funktion sucht nun nach Kommazeichen und speichert jeden Wert, welcher zwischen Kommas steht in eine Liste, der erste Wert erhält die Position 0, der zweite die Position 1 usw. Um nun einen bestimmten Wert von dieser Liste auszugeben wird die Position in eckigen Klammern [] angegeben. Wenn also z.B. der erste Wert ausgegeben werden soll, schreibt man [0], soll der zweite Wert ausgegeben werden [1] usw.
Um in unserem Beispiel an "Wert2" zu kommen, schreibt man in das Wert-Feld folgende Anweisung:

Code Block
themeConfluence
${SPALTENNAME?split(",")[1]}

Ausgabe: Wert2 

Das Trennzeichen (hier Komma) und die Position (hier 1) können natürlich beliebig geändert werden.

 

Info
titleErstes und letztes Element

Um auf das erste oder das letzte Element der gesplitteten Liste zuzugreifen sind die beiden Helfer-Funktionen ?first und ?last sehr hilfreich.

 

 

Spreadsheet: Wie finde ich heraus, ob ein bestimmtes Wort in Spaltenzeile vorkommt?

Um Daten nach einem Wort zu durchsuchen kann die Freemarker Funktion ?contains() verwendet werden. Dabei wird zwischen die Klammern, eingeschlossen von Anführungszeichen, der Ausdruck eingetragen, nach welchem gesucht werden soll. Der Rückgabewert der Funktion ist ein Boolean ("true" oder "false"). Für ein Beispiel soll in einer Spalte nach dem Wert "XYZ" gesucht werden, wird dieser Wert gefunden, soll eine Erfolgsmeldung "XYZ gefunden!" eingetragen werden. Wird der Ausdruck nicht gefunden, soll das Feld leer bleiben.

Ausgehend von diesem Beispiel ist in das "Wert" Feld einer Spalte folgende Anweisung einzutragen:

Code Block
themeConfluence
<#if SPALTENNAME?contains("XYZ")>XYZ gefunden!<#else>XYZ nicht gefunden</#if>

 

Spreadsheet: Wie verkette ich Werte verschiedener Spalten?

Beispiel:
Spalte1 = tolles
Spalte2 = Wetter   
Spalte3 = Es ist heute tolles Wetter.

 

Dazu schreiben sie in das Wert-Feld folgendes:

Code Block
Es ist heute ${Spalte1} ${Spalte2}.

Spalte1 und Spalte2 sind in diesem Fall Spalten aus dem Quell Spreadsheet.

Verkettung von bereits bearbeiteten Spalten

Manchmal hat man z.B. bereits Spalten bearbeitet und möchte mit diesen weiterarbeiten. Dies ist hier detailierter beschrieben.

Beispiel:

...

D.h. in Spalte4 wollen wir etwas mit der zuvor bearbeiteten Spalte3 machen.

Code Block
Bearbeitung ${result['Spalte3']!}

Image Removed

Image Removed

 

 

Spreadsheet: Wie multipliziere ich den Wert einer Spalte mit einer Flow-Variable?

In einem Flow kann man Variablen mit einem festen Wert anlegen. Variablen sind sinnvoll, wenn man den Wert an verschiedenen Stellen verwenden will, z.B. zum Rechnen. 
Auch im SpreadsheetMapper kann man auf Variablen zugreifen. 

Anwendungsbeispiel: 
Man kann z.B. eine Flow-Variable Aufpreis=1.5 anlegen, um damit in einer Spalte den Artikelpreis mit dem Aufpreis zu multiplizieren. 

Vorteil: 
Der Aufpreis kann zentral an einer Stelle als Flow-Variable gepflegt werden, ohne den SpreadsheetMapper anzupassen. 

Beispiel:

Flow-Variable anlegenImage Removed

Im SpreadsheetMapper Wert hinzufügenImage Removed

Image Removed

Im Wert Feld damit rechnenImage Removed

Spreadsheet: Wie wandele ich einen Timestamp in ein Datum um

Häufig stehen Datumswerte nur als Linux-Timestamp in Sekunden oder Millisekunden zur Verfügung. Sie können Timestamps in Sekunden über die Datumsfunktion in ein Datumsformat ihrer Wahl umwandeln.

Image Removed

  Beispiele: 

QuellwertQuellformatZielformatZielwertErklärung
1222340540sdd.MM.yyyy25.09.2008Umwandlung von Timestamp in Sekunden in Datum "Tag.Monat.Jahr"

Für die Umwandlung von Timestamps in Millisekunden können Sie die Freemarker Funktion "number_to_datetime" verwenden.

Beispiel: 

Code Block
${TimestamInMs?number?number_to_datetime?string("dd.MM.yyyy HH:mm")}

Image Removed

 

Spreadsheet: Wie formatiere ich das aktuelle Datum (date) als Timestamp und anderen Formaten?

Im Spreadsheet kann man über Freemarker-Spezialausdruck ${.now} auf das aktuelle Datum zugreifen:

Image Removed

Die Beispielausgabe erfolgt, weil im Hintergrund die Standardausgabe eines Date Objektes ausgegeben wird.

Will man nun diese Date-Objekt umformatieren, dann helfen folgende Beispiele weiter:

CodeBeispielwertBeschreibung
${.now}
Jun 30, 2014 1:40:46 PM
 
${.now?string("yyyy.MM.dd")}2014.06.30 
${.now?string("yyyy.MM.dd HH:mm:ss")}2014.06.30 13:45:50 
${.now?long}1404128791781Timestamp in Millisekunden
${.now?long / 1000}1404129730Unix Timestamp in Sekunden

Weitere Beispiele

...

titleDate vs. Strings

...

"1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")?string("dd.MM.yyyy")

...

 

Spreadsheet: Wie finde ich den kleinsten Wert aus n Spalten?

Stellen Sie sich vor, sie haben ein Spreadsheet und möchten das Minimum der Spalten A, B, C, D finden und in der Spalte Minimum ausgeben. 

ABCDMinimum
731153

Das Problem kann mit einer Liste und den Funktionen sort und first gelöst werden. 

 

 ABCDMinimum
Werte73115${[result["A"]?number, result["B"]?number,result["C"]?number,result["D"]?number]?sort?first}
Ergebnis731153

Der Trick ist folgender:

...

Cookbooks sind umgezogen

08.01.2016: Sie finden die Cookbooks ab sofort unter dieser Adresse.