Doku-Navigation
Keine Treffer. Schauen Sie auch in die FAQ.
Logik: WHEN, Makros, Formatierung
Template-Editor Teil 3, Bedingte Sichtbarkeit, Berechnungen und Label-Parameter
Voraussetzungen
- Guides „Ihr erstes Template“ und „Objekte & Befehle“ durchgearbeitet
- Mehrere Daten-Tabs angelegt (mindestens ein Standard- und ein Angebotsfall)
Ein Template, das immer gleich aussieht, ist ein Preisschild. Ein Template, das auf die Daten reagiert, ist ein System. In diesem Guide bringen Sie Ihrem Template bei, Angebote zu erkennen, Grundpreise zu berechnen und leere Batterien zu melden.
Die häufigste Fehlerquelle vorweg
Die Original-Dokumentation sagt es unmissverständlich: IF-Bedingungen und WHEN-Angaben sind die größte Fehlerquelle im Template-Editor.
Der Klassiker: Ihr Template greift auf {EAN} zu, aber in den Nutzdaten fehlt <EAN="…">. Das Objekt verschwindet, ohne Fehlermeldung.
Zwei Hilfsmittel:
- Bei Verarbeitungsfehlern wird die fehlerhafte Zeile rot markiert, die Statusleiste zeigt eine Meldung.
- Die Editor-Option „Alle Objekte” zeigt auch die Objekte an, die aktuell durch eine WHEN-Bedingung ausgeschlossen sind. Wenn ein Objekt „weg” ist: hier zuerst nachsehen.
Drei Klammertypen, drei Bedeutungen
Bevor Sie eine einzige Bedingung schreiben, verinnerlichen Sie diese Tabelle. Sie ist die Ursache der meisten Missverständnisse.
| Klammer | Bedeutung | Beispiel |
|---|---|---|
<spitz> | Definieren, Befehle, Parameter, Testdaten | <PRICE="12,99"> · <CMD="TEXT"> |
{geschweift} | Datenfeld verwenden | {PRICE} |
(rund) | Variable abfragen (nur in WHEN) | (FILIALE) |
[eckig] | Makrofeld / WHEN-Befehl | [ISEMPTY~PREIS] · [CALC~…] |
Sonderfall, der oft übersehen wird: In WHEN-Bedingungen wird der Tag-Name ohne geschweifte Klammern angegeben.
Richtig: <WHEN="[ISEMPTY~ITEMNO]">
Falsch: <WHEN="[ISEMPTY~{ITEMNO}]">
WHEN, bedingte Sichtbarkeit
Für jedes Kommando kann eine WHEN-Bedingung angegeben werden. Nur bei erfüllter Bedingung wird die Zeile ausgeführt.
<CMD="TEXT"><WHEN="[ISNOTEMPTY~PREIS]"><Y="0"><X="0"><WIDTH="50"><HEIGHT="25"><TEXT="{PREIS}"><COLOR="BLACK"><FONT="Calibri"><FONTSIZE="22">
Dieses Textobjekt erscheint nur, wenn das Datenfeld PREIS gefüllt ist.
Das Format
[Befehl~Parameter1~Parameter2]
Die Parameteranzahl ist je Befehl unterschiedlich. In den Parametern können Makros und Datenfelder verwendet werden.
Bedingungen kombinieren
| Parameter | Wirkung |
|---|---|
WHEN, WHENAND | Alle Bedingungen müssen erfüllt sein (UND) |
WHENOR | Mindestens eine Bedingung muss erfüllt sein (ODER) |
Mehrere Bedingungen werden einfach hintereinander aufgeführt:
<WHEN="[ISEMPTY~PREIS][ISTAG~SONDERPREIS]">
→ Objekt erscheint nur, wenn PREIS leer und SONDERPREIS vorhanden ist.
Die Daten-Tabs aus Guide 2 zahlen sich hier aus. Legen Sie je einen Tab für den Normalfall und den Angebotsfall an, und schalten Sie beim Entwickeln zwischen ihnen um. Sie sehen sofort, ob Ihre Bedingung greift, ohne die Datenbank anzufassen.
Quelle: ESLEasy_TemplateEditor V2.7, WHEN, S. 66–67.
Die WHEN-Befehle im Überblick
Existenz und Inhalt prüfen
| Befehl | Prüft |
|---|---|
ISTAG | Ist das Datenfeld in den verbundenen Daten vorhanden? Tag-Name ohne {} |
ISNOTTAG | Ist das Datenfeld nicht vorhanden? |
ISEMPTY | Ist das Datenfeld leer? Feld ohne {} |
ISNOTEMPTY | Ist das Datenfeld nicht leer? |
ISVALUEEMPTY | Ist Parameter 1 (als Wert) leer? |
ISNOTVALUEEMPTY | Ist Parameter 1 nicht leer? |
ISTAG vs. ISEMPTY, der Unterschied zählt.
ISTAG fragt: Gibt es das Feld überhaupt?
ISEMPTY fragt: Gibt es das Feld, und ist es leer?
Ein Feld, das gar nicht existiert, ist etwas anderes als ein Feld mit leerem Inhalt.
Vergleiche, auf den Datentyp achten
Für jeden Vergleich gibt es drei Varianten: String, Int und Float. Das ist kein Zufall, "9" ist als String größer als "10", als Integer aber kleiner.
| String | Integer | Float |
|---|---|---|
ISEQUAL | ISINTEQUAL | ISFLOATEQUAL |
ISNOTEQUAL | ISNOTINTEQUAL | ISNOTFLOATEQUAL |
| — | ISLESSTHAN | ISFLOATLESSTHAN |
| — | ISLESSEQUAL | ISFLOATLESSEQUAL |
| — | ISGREATERTHAN | ISFLOATGREATERTHAN |
| — | ISGREATEREQUAL | ISFLOATGREATEREQUAL |
Preise immer mit den FLOAT-Varianten vergleichen. Ein Int-Vergleich auf 19,99 führt zu unerwarteten Ergebnissen.
Textprüfungen
| Befehl | Prüft |
|---|---|
STARTSWITH / NOTSTARTSWITH | Beginnt P1 (nicht) mit P2? |
ENDSWITH / NOTENDSWITH | Endet P1 (nicht) mit P2? |
CONTAINS / CONTAINSNOT | Kommt P2 in P1 (nicht) vor? |
ISLENGTHGREATERTHAN / ISLENGTHGREATEREQUAL | String-Länge von P1 > bzw. ≥ Int(P2) |
ISLENGTHLESSTHAN / ISLENGTHLESSEQUAL | String-Länge von P1 < bzw. ≤ Int(P2) |
ISLENGTHGREATERTHAN ist der Layout-Retter: Blenden Sie ein zweizeiliges Textobjekt nur ein, wenn die Artikelbezeichnung eine bestimmte Länge überschreitet, und das einzeilige sonst.
Listen
| Befehl | Prüft | Beispiel |
|---|---|---|
ISINLIST | Ist P1 in der Liste der weiteren Parameter enthalten? | [ISINLIST~Andreas~Peter~Andreas~Marc] → wahr |
ISNOTINLIST | Ist P1 nicht enthalten? | [ISNOTINLIST~Eric~Peter~Andreas~Marc] → wahr |
CONTAINSINLIST | Ist einer der Parameter in P1 enthalten? | [CONTAINSINLIST~Andreas~Pe~An~Ma] → wahr („An” steckt in „Andreas”) |
CONTAINSNOTINLIST | Ist keiner der Parameter in P1 enthalten? | [CONTAINSNOTINLIST~Andreas~Pe~Ab~Ma] → wahr |
ISINLIST ersetzt lange ODER-Ketten. Statt fünf ISEQUAL-Bedingungen mit WHENOR schreiben Sie eine Liste, etwa für Warengruppen, die dasselbe Symbol bekommen sollen.
Datumsvergleiche
Beide Parameter müssen gültige Datumsangaben sein. Makros sind hier nutzbar, das macht diese Befehle mächtig.
| Befehl | Beispiel |
|---|---|
ISDATEEQUAL | <WHEN="[ISDATEEQUAL~%%TODAY%%~{HOLIDAY}]"> |
ISDATENOTEQUAL | <WHEN="[ISDATENOTEQUAL~%%TODAY%%~{HOLIDAY}]"> |
ISDATEGREATERTHAN | <WHEN="[ISDATEGREATERTHAN~%%TODAY%%~2023-01-01]"> |
ISDATELESSTHAN | <WHEN="[ISDATELESSTHAN~%%TODAY%%~2023-12-31]"> |
ISDATEGREATEREQUAL | <WHEN="[ISDATEGREATEREQUAL~%%TODAY%%~2023-01-01]"> |
ISDATELESSEQUAL | <WHEN="[ISDATELESSEQUAL~%%TODAY%%~2023-12-31]"> |
Der Anwendungsfall: Ein Aktionsstörer, der sich selbst abschaltet. Kombinieren Sie ISDATEGREATEREQUAL und ISDATELESSEQUAL mit den Aktionszeitraum-Feldern aus Ihrem ERP, das Label zeigt den Störer nur innerhalb des Zeitraums, ganz ohne manuellen Eingriff.
Dateien
| Befehl | Prüft |
|---|---|
ISFILE | Ist die in P1 angegebene Datei vorhanden? |
ISNOTFILE | Ist die Datei nicht vorhanden? |
Praktisch für Artikelbilder: ISFILE prüft, ob ein Produktbild existiert, und blendet sonst einen Platzhalter ein.
Quelle: V2.7, „Liste der WHEN-Befehle”, S. 67–71.
IF / ELSE / ENDIF, ganze Bereiche schalten
WHEN schaltet eine Zeile. IF schaltet ganze Bereiche.
IF wird immer in Verbindung mit WHEN benutzt. Es gibt einen ELSE-Bereich für den Alternativfall; abgeschlossen wird mit ENDIF. Verschachtelte IF-Bedingungen sind möglich.
<CMD="IF"><WHEN="[ISTAG~NAME]">
<CMD="TEXT">…
<CMD="TEXT">…
<CMD="ELSE">
<CMD="TEXT">…
<CMD="TEXT">…
<CMD="ENDIF">
Wann WHEN, wann IF? Ein einzelnes Objekt ein- oder ausblenden → WHEN. Zwei komplette Layout-Varianten (z. B. Normalpreis-Block vs. Angebots-Block) → IF/ELSE.
Quelle: V2.7, IF, S. 71–72.
Variablen
Variablen legen Werte im Template fest, die in WHEN-Bedingungen abgefragt werden können.
<CMD="SETVARIABLE"><NAME="FILIALE"><VALUE="0815">
<CMD="CLEARVARIABLE"><NAME="FILIALE">
<CMD="CLEARALLVARIABLE">
Abgefragt wird mit runden Klammern:
<CMD="TEXT"><WHEN="[ISEQUAL~(FILIALE)~0815]"><X="334"><WIDTH="153"><HEIGHT="62"><TEXT="FILIALE stimmt mit 0815 überein"><COLOR="BLACK"><FONT="Calibri"><FONTSIZE="22"><Y="519">
Runde Klammern nur bei Variablen. Datenfelder in WHEN-Bedingungen werden ohne Klammern angegeben ([ISEMPTY~PREIS]), Variablen mit runden ([ISEQUAL~(FILIALE)~0815]). Diese Inkonsistenz ist eine klassische Fehlerquelle.
Quelle: V2.7, Variablen, S. 61.
Makros
Makros werden in der Befehlszeile durch den entsprechenden Wert ersetzt. Für die Ausgabe gilt standardmäßig die Formatierung des Betriebssystems, eine eigene Formatierung überschreibt diese:
<DATEFORMAT="dd.MM.yyyy"> → 31.12.2020
<TIMEFORMAT="HH:mm:ss"> → 12:09:23
Datum
| Makro | Wert |
|---|---|
%%TODAY%% | Aktuelles Datum |
%%TODAYMINUSONE%% … %%TODAYMINUSFIVE%% | Aktuelles Datum − 1 … − 5 Tage |
%%TODAYPLUSONE%% … %%TODAYPLUSFIVE%% | Aktuelles Datum + 1 … + 5 Tage |
%%TOMORROW%% | Morgen |
%%FIRSTDAYOFTHEWEEK%% | Erster Tag der aktuellen Woche |
%%WEEK%% | Kalenderwoche des aktuellen Datums |
%%DAY%% / %%MONTH%% | Aktueller Tag (dd) / Monat (MM) |
%%SHORTYEAR%% / %%LONGYEAR%% / %%YEAR%% | Jahr als yy / yyyy / yyyy |
Wochentage
| Makro | Wert |
|---|---|
%%WEEKDAY%% | Aktueller Wochentag als Text |
%%WEEKDAYPLUSONE%% … %%WEEKDAYPLUSSIX%% | Wochentag + 1 … + 6 als Text |
Wochentage erscheinen in der eingestellten Landessprache des PC, nicht in der Sprache des Templates. Bei Filialen im Ausland unbedingt prüfen.
Uhrzeit und System
| Makro | Wert |
|---|---|
%%TIME%% | Aktuelle Uhrzeit (HH:mm:ss) |
%%HOUR%% / %%MINUTE%% / %%SECOND%% | Stunde / Minute / Sekunde |
%%IPADRESS%% | Aktuelle IP-Adresse |
%%IPADRESSES%% | Alle IP-Adressen, mit Komma getrennt |
%%HOSTNAME%% | Hostname des PC |
%%APPPATH%% | Programmpfad der Applikation |
%%VERSION%% / %%TOOLSVERSION%% | Programm-/DLL-Version (interne Verwendung) |
Doku-Eigenheit: Die Original-Dokumentation listet %%YESTERDAY ohne schließende %%, vermutlich ein Fehler im PDF. Verlassen Sie sich nicht darauf; falls Sie „gestern” brauchen, testen Sie beide Schreibweisen.
Quelle: V2.7, Makros, S. 62–63.
Makrofelder, rechnen und umformen
In bestimmten Feldern sind zusätzliche Makro-Auswertungen möglich, die mit eckigen Klammern angegeben werden.
Wo Makrofelder funktionieren:
| Befehl | Felder mit Makro-Auswertung |
|---|---|
TEXT | FILE, TEXT |
IMAGE | FILE |
BARCODE | TEXT |
QRCODE | TEXT |
PRICE | TEXT, IMAGE |
BARGRAPH | PERCENT |
NFC | PAYLOAD |
DATAVALUE
[DATAVALUE~Datenfeld] greift auf ein Datenfeld zu, die alternative Schreibweise zu {Datenfeld}.
Innerhalb von Makrofeldern wird diese Schreibweise benötigt. Sie können {PRICE} nicht in ein [SPLITREPEAT~…] verschachteln, dort muss [DATAVALUE~PRICE] stehen.
CALC, Berechnungen im Template
Neu in Version 2.6. [CALC~Rechenformel~Formatierung] berechnet Werte aus festen Zahlen oder Datenfeldern. Komplexe Ausdrücke mit Klammerebenen sind möglich.
<TEXT="Grundpreis [CALC~{PRICE}/{QUANTITY}~0.00]€ / {UNIT}">
Ausgabe z. B.: Grundpreis 59.60 € / kg
[CALC~…~0.00|0|.] → 59.60
Im zweiten Beispiel: zwei Nachkommastellen, das Dezimaltrennzeichen wird durch einen Punkt ersetzt (falls es z. B. ein Komma ist).
Der Grundpreis muss nicht mehr aus dem ERP kommen. Wenn Preis und Menge in den Daten stehen, rechnet das Template ihn selbst aus, eine Datenfeld-Anforderung weniger an die Warenwirtschaft.
SPLITREPEAT
[SPLITREPEAT~Text~Trennzeichen~Teilstring~Ersatzzeichen] trennt einen Text am Trennzeichen und baut ihn neu formatiert zusammen. __SPLITVALUE__ greift dabei auf den originalen Teiltext zu; freier Text wird für jeden Teil wiederholt.
<TEXT="[SPLITREPEAT~[DATAVALUE~LIST]~,~__SPLITVALUE__~-]">
Datenfeld: <LIST="Jan,Feb,Mar,Apr">
Ergebnis: Jan-Feb-Mar-Apr
<TEXT="[SPLITREPEAT~1,2,1~,~X~---]">
Ausgabe: X---X---X
REGEX
[REGEX~Text~Pattern~] wertet einen regulären Ausdruck aus; das Ergebnis wird als Text eingesetzt.
<TEXT="[REGEX~Eins Zwei Drei~\b[A-Z]~]">
Ausgabe: EZD
Quelle: V2.7, Makrofelder S. 63–64; DATAVALUE S. 64; SPLITREPEAT S. 64; REGEX S. 65; CALC S. 65 (neu in V2.6).
Formatierung von Datenfeldern
Rohdaten aus dem ERP sind selten anzeigefertig. Preise kommen ohne Dezimaltrennzeichen, Zahlen ohne Nachkommastellen. Dafür gibt es eine eigene Formatierungssyntax.
Format: {@@Datenfeld|Formatangabe|Teilungsfaktor}
Zahlenformate
| Angabe | Bedeutung | Beispiel |
|---|---|---|
0 | Stelle wird immer ausgegeben, fehlende Stellen mit 0 aufgefüllt | <INHALT="1"> + {@@INHALT|0.0} → 1,0 |
<INHALT="1.6789"> + {@@INHALT|0.00} → 1,68 | ||
# | Stelle wird nur ausgegeben, wenn vorhanden | <INHALT="1"> + {@@INHALT|0.#} → 1 |
<INHALT="1.5"> + {@@INHALT|0.#} → 1,5 |
Der Teilungsfaktor
Der dritte Parameter löst ein sehr konkretes Problem: Preise, die im ERP ohne Dezimaltrennzeichen gespeichert sind.
<INHALT="16789"> + {@@INHALT|0.00|100} → 167,89
Der Wert wird durch 100 geteilt und dann formatiert. Kein Datenexport muss angepasst werden.
Textformate
| Angabe | Bedeutung | Beispiel |
|---|---|---|
L + Anzahl | Gibt von links die angegebene Anzahl Zeichen aus | <INHALT="1.12345"> + {@@INHALT|L4} → 1.12 |
R + Anzahl | Gibt von rechts die angegebene Anzahl Zeichen aus | <INHALT="1.12345"> + {@@INHALT|R4} → 2345 |
S + Start,Anzahl | Substring: Startposition (beginnend bei 0) und Zeichenanzahl |
CEILING und FLOOR stehen ebenfalls zur Verfügung, sie kamen mit Version 2.3 (05.05.2023) hinzu. Details in der Original-Doku, S. 72–74.
Quelle: V2.7, „Formatierung von Datenfeldern”, S. 72–74.
PAGE, mehrere Ansichten pro Label
ESL-Labels können mehrere Ansichten speichern. Angezeigt wird immer die aktuell aktive. Für jede Ansicht definieren Sie einen eigenen Quellcodebereich.
<CMD="PAGE"><PAGENO="1">
<CMD="TEXT">…
<CMD="TEXT">…
<CMD="PAGE"><PAGENO="2">
<CMD="TEXT">…
<CMD="ELLIPSE">…
Ab der PAGE-Zeile werden alle folgenden Zeilen dieser Page zugewiesen. Ohne PAGE-Befehl landet alles auf der ersten Page.
Zwei Einschränkungen:
- Der grafische Editor zeigt immer nur die eingestellte Page.
- Die Funktion „Aktuelle Ansicht an ein Label senden” berücksichtigt keine Pages, es wird nur die aktuelle Ansicht übertragen.
Das Umschalten der Ansicht auf den Labels erfolgt über Befehle des ESL-Easy-Servers, nicht über das Template.
Quelle: V2.7, PAGE, S. 65–66.
Label-Parameter: __HS_*
Zum Abschluss die Funktion, die Logik, Daten und Hardware verbindet.
Labels liefern selbst Daten. Herstellerabhängig sind das Batteriestand, Funkqualität, Seriennummer, Größe, Auflösung und weitere Parameter. Auf die Daten des aktuell verlinkten Labels greifen Sie im Template wie auf normale Datenfelder zu.
ESL-Label-Parameter beginnen immer mit __HS_, zum Beispiel liefert __HS_BATTERY bei Ontime-Labels den Batteriestand in Prozent.
Eine Liste der verfügbaren Parameter können Sie im Editor per Button abrufen: Label-ID eingeben, die Parameter werden in die Datenliste eingefügt.
Der Anwendungsfall: „Low battery”-Symbol
Kombinieren Sie __HS_BATTERY mit einer WHEN-Bedingung, und das Label meldet seine eigene schwache Batterie:
<CMD="IMAGE"><WHEN="[ISINTLESSTHAN~{__HS_BATTERY}~5]"><FILE="lowbattery.png">…
Das Symbol erscheint nur, wenn der Batteriestand unter 5 % liegt. Kein Monitoring-Tool, kein Report, das Label sagt es selbst.
Die Bedeutung der Werte ist herstellerabhängig. __HS_BATTERY liefert bei Ontime Prozent, verlassen Sie sich nicht darauf, dass ein anderer Hersteller dieselbe Skala verwendet. Rufen Sie die Parameterliste für Ihr konkretes Label ab.
Quelle: V2.7, „ESL-Label-Daten”, S. 21–22.
Weitere Datenquellen im Template
Diese Themen gehören zur Datenverknüpfung und ergänzen die Logik-Funktionen:
| Thema | Kurzbeschreibung | Doku |
|---|---|---|
| Location-Tags | Pro Location hinterlegte Datenfelder, die sich wie Stammdaten verhalten. Dieselbe DataID liefert in Location 1 und Location 2 unterschiedliche Werte. Pflege über Doppelklick auf „DataObject”. | S. 18–20 |
| Dynamische Tag-Namen | Tag-Namen lassen sich zusammenbauen: +Tag-Name+ greift auf den Inhalt eines Tags im Namen zu. Beispiel: <WHEN="[ISNOTEMPTY~ENERGY_CLASS_2017_+LANGUAGE+]"> prüft bei LANGUAGE="DE" den Tag ENERGY_CLASS_2017_DE. Der Schlüssel zu mehrsprachigen Templates. | S. 20 |
| SET, Unterdatensätze (neu in V2.7) | Set-Artikel über <_SETx_DATAID="">. Alle Felder der SET-DataIDs stehen mit dem Präfix _SETx_ bereit ({_SET1_DESCRIPTION}). Ist die Nummerierung lückenhaft (ERP liefert 1, 3, 5), greift <_SET#x_Datenfeld> in sortierter Reihenfolge zu. | S. 17 |
| PARAM | Label-individuelle Parameter, die der Anwender bei der Verknüpfung setzt (siehe Guide 3). | S. 54–55 |
Zum Weiterlesen
- Vorheriger Guide: Objekte & Befehle
- Reihenstart: Ihr erstes Template in 15 Minuten
- Vollständige Referenz: Original-PDF ESLEasy_TemplateEditor 2.7_DE, S. 61–74
Quelldokument: Template Editor · v2.7