Werte aus Map addieren WENN Wert in Map vorhanden ist

Hallo zusammen,

ich will die Bestände für verschiedene Lager die PlentyGetVariations in VariationStocksPhysical zurückliefert addieren, aber halt nur, wenn das Lager eben auch in der Map ist.


Konkret geht es um die IDs, die Addition soll

${VariationStocksPhysical.at("20")?number + VariationStocksPhysical.at("24")?number}

sein. Ich dachte mir das so:

<#if (isNumber(VariationStocksPhysical.at("20")) && isNumber(VariationStocksPhysical.at("24")))>
  ${VariationStocksPhysical.at("20")?number + VariationStocksPhysical.at("24")?number}
<#elseif (isNumber(VariationStocksPhysical.at("20"))>
  ${VariationStocksPhysical.at("20")}
<#elseif (isNumber(VariationStocksPhysical.at("24"))>
  ${VariationStocksPhysical.at("24")}
<#else>
 0
</#if>

Dann bekomme ich aber ein

Das Wert-Feld enthält Fehler. (Root Causes: ParseException: Syntax error in template "StocksPhysical" in line 4, column 3: You can't use ${...} (an interpolation) here as you are already in FreeMarker-expression-mode. Thus, instead of ${myExpression}, just write myExpression. (${...} is only used where otherwise static text is expected, i.e., outside FreeMarker tags and interpolations, or inside string literals.))

zurück. Ja, okay, dann entferne ich die ${...} innerhalb der if/else-Anweisungen. Dann gibts aber ein

Das Wert-Feld enthält Fehler. (Root Causes: ParseException: Syntax error in template "StocksPhysical" in line 1, column 270: Encountered "<", but was expecting one of: "." ".." <DOT_DOT_LESS> "..*" "?" "??" "!" "[" "(" ")" <TERMINATING_EXCLAM>)

Hä? Ist bestimmt nur irgendwo ein Syntaxfehler, aber ich komm nicht weiter. Könnt ihr helfen?


Grüße Daniel


Hallo Daniel,


du könntest es auch so versuchen:


<#assign sum = 0>
<#list VariationStocksPhysical?keys as key>
  <#if isNumber(VariationStocksPhysical[key])>
    <#assign sum = sum + VariationStocksPhysical[key]>
  </#if>
</#list>
${sum!}


Variable mit 0 initalisieren, alle keys als Liste iterieren und wenn der Wert eine Zahl ist zur 0 addieren. Am Ende die Sume ausgeben.


Siehe https://www.viralpatel.net/iterate-hashmap-in-freemarker-ftl/


Beste Grüße,


Rocco

Falls du noch auf der Suche nach dem Syntax-Fehler bist: In den elseif-Blöcken öffnest du zu Beginn eine Klammer, die nicht geschlossen wird.


Gruß

Gustav

Argh Gustav, das passiert wenn man so spät noch auf Code schaut O.o

Danke, das wars!

Ergänzung dazu:


VariationStocksPhysical.at("20") funktioniert nur direkt auf API-Calls, nicht wenn ich auf einen String aus einem Datastore operiere, dort benötigt es parsemap. Das hatte mir ein bisschen Kopfzerbrechen beim blind kopieren gemacht ;-)

Ich nochmal: der Code den Rocco oben gepostet hat, hat nicht funktioniert (mit einer Map aus einem String/Datastore).


Aber so funktioniert es:

<#assign sum = 0>
  <#list parseMap(VariationStocksPhysical) as key, value>
    <#if isNumber(value)>
      <#assign sum = sum + value?number>
    </#if>
  </#list>
${sum!}

Und wenn man nur bestimmte Lager aufsummieren möchte, kann man deren IDs kommagetrennt in eine Variable LagerIDs schreiben, und mit diesem Code nur die passenden addieren:

<#assign sum = 0>
  <#list parseMap(VariationStocksPhysical) as key, value>
    <#if meta.LagerIDs?split(",")?seq_contains(key)>
      <#if isNumber(value)>
        <#assign sum = sum + value?number>
      </#if>
    </#if>
  </#list>
${sum!}

Grüße Daniel