Hat sich was in den Trim-Funktionen und/oder beim Script-Feld geändert? Ergebnis plötzlich nicht mehr wie erwartet

Hi zusammen,
ich ermittle einen String aus Semikolon-getrennten CategoryIDs in dieser Art:

<#if (isSale == "1")>
  <#if (isSale20 == '1')>
    818;819
  <#elseif (isSale50 == '1')>
    817;819
  <#elseif (isSale80 == '1')>
    817;818
  <#else>
    817;818;819
  </#if>
  ;197
<#elseif (isNew == "1")>
  196;817;818;819
<#else>
  196;817;818;819;197
</#if>

Auf dem ganzen läuft dann die Text-Funktion „Trimmen und Zeilenumbrüche entfernen“.
Da kommt dann ein String raus, z.B. 196;817;818;819;197

Im selben Feld des Mappers habe ich dann unten bei Skript dieses hinterlegt:

<#assign remove_cats><#list value?split(";") as cat><#if AllCategoryIDs?split(";")?seq_contains(cat)>${cat};</#if></#list></#assign>${remove_cats?remove_ending(";")}

Das prüft welche der Kategorien bereits in AllCategoryIDs vorhanden sind, und gibt nur deren IDs wieder.

Das klappt nun plötzlich nicht mehr, der Ergebnis ist leer. Im Beispiel ist AllCategoryIDs = 129;149;196;500;1255;1438;1439;1656;3049;3409, es sollte also die 196 ausgegeben werden.

Wenn ich im ersten Script alle Zeilenumbrüche und Leerzeichen am Zeilenanfang entferne, klappt es plötzlich wieder. Aber es ging doch die ganze Zeit auch anders?

Wenn ich mein Script entferne, aber die Text-Funktion belasse, sehe ich im Ergebis auch keine führenden Leerzeichen. Wie gewünscht.

Was ist da los?

Im konkreten Fall entferne ich jetzt mal die Zeilenumbrüche. Aber wenn da was zerbrochen ist, gibts potentiell dutzende Stellen in vielen Flows, die ich prüfen müsste.

Danke Daniel

PS: Post auf die Schnelle hingeschmiert, muss jetzt AFK. Ich prüfe nachher noch mal im Detail. Aber Zeilenumbrüche im Wert-Feld manuell entfernen, scheint das Problem gelöst zu haben :+1:

Hallo,

um Sicher zu gehen, würde vor dem Vergleich der beiden Listen, jeden einzelnen Wert einmal trimmen.
Das lässt sich sehr leicht per „map“ Funktion erledigen. Im Moment bewirkt dein Trimmen nur, dass du das Ende deiner generierten Liste trimmst, nicht aber die Elemente.

Auch der Vergleich lässt sich sehr leicht per Filter Funktion erledigen.

Ich hab hier einmal ein Beispiel für dich:

<#assign valueArray = value?split(";")?map(x -> x?trim)> 
${AllCategoryIDs?split(";")?filter(x -> valueArray?seq_contains(x?trim))?join(";")}

Wenn du aber mit deiner Variante weiter arbeiten möchtest würde wahrscheinlich auch folgendes funktionieren:

<#assign remove_cats><#list value?split(";") as cat><#if AllCategoryIDs?split(";")?seq_contains(cat?trim)>${cat?trim};</#if></#list></#assign>${remove_cats?remove_ending(";")}

Viele Grüße
Stefan

1 Like

Von unserer Seite gab es keine Änderungen…

Das klingt nach einem Reihenfolge-Problem. Funktionen werden von oben nach unten abgearbeitet. Daran hat sich nichts geändert. Wir haben es auch noch mal im alten Mapper getestet.

Text-Funktionen kommen ganz am Ende.
Script davor.
D.h. das Trimmen passiert erst nach der Skript-Funktion.

Mutmaßung: Vielleicht hast du „früher“ oder in anderen Fällen mit Ergebnisspalten (${result['...']}) gearbeitet.

Lösungsansätze:

Seine Variante mit ?filter und ?join(";") macht das gleiche (?join spart das "removeEnding). Mehr solcher Freemarker-Tricks auch hier im Vortrag (Edit: Link korrigiert. War der falsche Link)

Danke, Stefan. Ich hatte es mit trim() direkt nach dem split() versucht, und das hatte leider nicht geklappt.

Ich schau mir deine Beispiele morgen mal an, sehr hilfreich auf jeden Fall, danke!

Ja, davon geh ich auch aus. Ich muss das Ergebnis aus Wert trimmen, bevor das Skript ran geht.

Wenn ich ehrlich bin, bin ich auch gar nicht sicher, ob ich wirklich getestet hatte ob alles tut, oder nur gesehn hab „oh, Code ohne Umbrüche, den mach ich hübsch und dann die Textfunktion drauf“ :man_facepalming:

Vermutlich hat das ja auch geklappt, für alle Kategorie-IDs, die nicht ganz am Anfang standen im Wert :astonished: Nur der erste Wert hatte Spaces davor, Rest hat funktioniert wie gewünscht.

Oder den Wert nen Mapper vorher befüllt, Script danach dann erst.
Irgendwas hatte ich auf jeden Fall übersehen hier.

Und/oder das. In den funktionierenden Versionen hab ich result[...] genutzt, aber hier dann vergessen, das ebenfalls zu tun. Könnte auch sein.

Ich merk schon: mein Fix war zu Quick gewesen damals, Schuld liegt bei mir :nerd_face:
Ich geh das morgen geregelt durch, überall wo ich das verwende.

Danke für eure Hilfe,
Grüße Daniel