Neues Thema starten
Beantwortet

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



Beste Antwort

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


Antwort

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


1 Person gefällt dies

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


1 Person gefällt dies

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


1 Person gefällt dies

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 ;-) 

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

Danke, das wars!

Anmelden um einen Kommentar zu veröffentlichen