Freemarker - simple If-Abfrage mit numerischen Werten

Hallo,

ich habe Schwierigkeiten mit if-Abfragen, indem ich meinen Fehler nicht finde und meine, alles richtig zu machen.

Hier mein Code:

<#assign row = target.addRow()>
<#assign currentDateString = .now?string["yyyy-MM-dd"]>
<#assign currentDate = currentDateString?replace("-", "")>

<#list xml["ROOT"]["ARTIKEL"] as artikel>
  <#assign row = target.addRow()>
  ${addColumns(row, artikel)}

  <#list artikel.AKTIONEN.AKTION as aktion>
    <#assign laufzeitVon = aktion.LAUFZEITVON?string>
    <#assign laufzeitBis = aktion.LAUFZEITBIS?string>
    
    <#assign laufzeitVonDate = laufzeitVon?replace("-", "")>
    <#assign laufzeitBisDate = laufzeitBis?replace("-", "")>
    
    <#if currentDate >= laufzeitVonDate && currentDate <= laufzeitBisDate>
      ${row.addCol("Zeit", currentDate)}
      ${row.addCol("Zeit1", laufzeitVonDate)}
      ${row.addCol("Zeit2", laufzeitBisDate)}
    </#if>
  </#list>
</#list>

currentDate hat den Wert 20240729. Heute halt.

aktion hat 3 Datensätze.

laufzeitVonDate mit 20240601
laufzeitBisDate mit 20240630

laufzeitVonDate mit 20240701
laufzeitBisDate mit 20240730

laufzeitVonDate mit 20240801
laufzeitBisDate mit 20240830

Wenn ich mir nun aber die Vorschau anzeigen lasse, erhalte ich für Zeit1 und Zeit2 die August-Werte. Ich müsste normalerweise die vom Juli erhalten. Wo ist mein Fehler?

Ich habe es nun mit replace gelöst, weil ich dachte an date würde die If-Abfrage scheitern.

Beste Grüße
Daniel

Hallo Daniel,

in deinem Beispiel sind die beiden Variablen laufzeitVonDate und laufzeitBisDate im String Format, weshalb größer kleiner vergleiche nicht funktionieren sollte.

Wenn du ermitteln möchtest ob ein Datum vor oder nach einem anderen Datum liegt, verwende am besten die von uns bereitgestellten Date-Funktion. Die findest du unter Anderem im Mapper wenn du beim Wert-Feld auf das + klickst und dann zu Scripten navigierst.

Viele Grüße
Lukas

Hallo Lukas,

das hatte ich auch genutzt und immer nur Fehlermeldung erhalten. An diesem Punkt hatte ich diesen Ansatz:

<#assign currentDate = .now?date["yyyy-MM-dd"]>
<#assign laufzeitVon = aktion.LAUFZEITVON?date["yyyy-MM-dd"]>
<#assign laufzeitBis = aktion.LAUFZEITBIS?date["yyyy-MM-dd"]>

Da aber aktion.LAUFZEITVON und aktion.LAUFZEITBIS schon in YYYY-MM-DD kommen, könnte dort ein fehlerhafter Wert drin stehen?

Alternativ hatte ich mein obigen Code bereits erweitert und aus den ganzen String das .number hinzugefügt. Aber auch hier komme ich immer nur im August heraus.

Mein aktueller Code:

<#assign row = target.addRow()>
<#assign currentDateString = .now?string["yyyy-MM-dd"]>
<#assign currentDate = currentDateString?replace("-", "")>
<#assign currentDateInt = currentDate?number>

<#list xml["ROOT"]["ARTIKEL"] as artikel>
  <#assign row = target.addRow()>
  ${addColumns(row, artikel)}

  <#list artikel.AKTIONEN.AKTION as aktion>
    <#assign laufzeitVon = aktion.LAUFZEITVON?string>
    <#assign laufzeitBis = aktion.LAUFZEITBIS?string>
    
    <#assign laufzeitVonDate = laufzeitVon?replace("-", "")>
    <#assign laufzeitBisDate = laufzeitBis?replace("-", "")>

    <#assign laufzeitVonDateInt = laufzeitVonDate?number>
    <#assign laufzeitBisDateInt = laufzeitBisDate?number>
    
    <#if currentDate >= laufzeitVonDateInt && currentDate <= laufzeitBisDateInt >
      ${row.addCol("Zeit", currentDate?string)}
      ${row.addCol("Zeit1", laufzeitVonDate?string )}
      ${row.addCol("Zeit2", laufzeitBisDate?string )}
    </#if>
  </#list>
</#list>

Meiner Meinung nach muss das funktionieren, oder? Jedoch lande ich weiter im August und die Werte, die alle noch dahinter stecken, die ich raus lasse, auch.

Warum klappt das nicht?

Gerade Debug gemacht.

Es geht in alle 3 Datumsangaben rein. August gewinnt nur als Letztes.
Aber die If-Abfrage ist doch richtig?

<#if currentDate >= laufzeitVonDateInt && currentDate <= laufzeitBisDateInt >

<#if 20240731 >= 20240601 && 20240731 <= 20240630 >
nein

<#if 20240731 >= 20240701 && 20240731 <= 20240730 >
ja

<#if 20240731 >= 20240801 && 20240731 <= 20240830 >
nein

Das Skript macht aber alle zu einem „ja“. Warum?

Doku lesen hilft: if, else, elseif - Apache FreeMarker Manual

When you want to test if x > 0 or x >= 0, writing <#if x > 0> and <#if x >= 0> is WRONG, as the first > will close the #if tag. To work that around, write <#if x gt 0> or <#if gte 0>. Also note that if the comparison occurs inside parentheses, you will have no such problem, like <#if foo.bar(x > 0)> works as expected.

Thema damit erledigt.