MarcusDau
Occasional Collector

contentSelect - QUERY über Date-Feld

Ich möchte mittels eines contentSelect eine Abfrage bauen, die mir aus einer Datenquelle entsprechende Daten ausliest. Dort habe ich ein Feld was als DATE formatiert ist.

Als Parameter möchte ich nun aber nur CMS_INPUT_NUMBER übergeben und zwar das Jahr, aus dem ich die Daten haben möchte.

Aber wie genau mache ich nun die Abfrage?

<CMS_FUNCTION name="contentSelect" resultname="win">
        <CMS_PARAM name="schema" value="wasistneu"/>
        <CMS_VALUE_PARAM  name="von" value="st_jahr" />
        <QUERY entityType="eintrag">
            <AND>
                <FILTERPARAM parameter="von" datatype="java.lang.String" />
                <LIKE attribute="datum" datatype="java.util.Date" parameter="von" />
            </AND> 
        </QUERY>
    </CMS_FUNCTION>

Der <LIKE>-Teil ist natürlich so nicht lauffähig. Hat jemand eine Idee, wie ich das lösen kann?

Grüße

Marcus Dau

10 Replies
aVogt
Returning Creator

Ich hatte so ein ähnliches Problem am einfachsten war es die Millisekunden anzugeben:

<GTE attribute="Datum" datatype="java.util.Date" value="1262300400000" /> (das müsste der 1.1.2010 sein - einziger Nachteil, mann muss jedes jahr die zahl anpassen)

Auf Datum mit "LIKE" zu testen hab ich noch nie gemacht ... (immer nur größer, kleiner)

Du kannst die sicher auch als Parameter übergeben (in einem <CMS_VALUE> ... kann man da so eiiges berechnen

0 Kudos
hoebbel
Crownpeak employee

ich würde es einfach so machen:

<CMS_FUNCTION name="contentSelect" resultname="win">
    <CMS_PARAM name="schema" value="wasistneu"/>
    <CMS_VALUE_PARAM  name='von' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr).set("hour",0).set("minute",0).set("second",0).getTime()' /> 
    <CMS_VALUE_PARAM  name='bis' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr+1).set("hour",0).set("minute",0).set("second",0).getTime()' />
    <QUERY entityType="eintrag">
        <FILTERPARAM parameter="bis" datatype="java.util.Date" value="0"/>
        <FILTERPARAM parameter="von" datatype="java.util.Date" value="0"/>
        <AND>
            <GTE attribute="datum" parameter="von" />
            <LTE attribute="datum" parameter="bis" />
        </AND>
    </QUERY>
</CMS_FUNCTION>

Dann wird ein Datum übergeben und das Ganze bleibt lesbar [gut lesbar schreibe ich mal lieber nicht Smiley Wink ]

Alternativ kann man sich das Datumsobjekt auch komplett zusammenbauen, aber da man dazu class(...) benötigt, manipuliere ich lieber ein Datumsobjekt, welches im Kontext steht.

Tipp: Wenn man die News des letzten Jahres haben will, könnte man #startdate.add("year",-1) benutzen [ebenso wie die der letzten Woche, des letzten Monats...]

Hinweis: natürlich will man zwar die News des letzten Jahres haben, aber nicht exakt ein Jahr zurück, sondern vom Ersten des entsprechenden Monats - dann wird es wieder so "hübsch" wie oben Smiley Wink

Nachricht geändert durch Holger Höbbel:  class-Tags der Rechtschreibkontrolle wieder entfernt, Ticks wieder korrigiert

Nachricht erneut geändert durch Holger Höbbel: korrekte Lösung hier eingefügt

MarcusDau
Occasional Collector

Da kommt er mit den doppelten Anführungszeichen nicht zurecht:

 value="#startdate.set("day_of_month"

unexpected toke 'EOF (at line 4, column 60)
0 Kudos

Hab ich im Originalposting schon korrigiert.

Durch die Rechtschriebkontrolle hatte er da zusätzliche Ausgaben erzeugt, durch die ich die falschen Ticks übersehen hatte Smiley Sad

Beides ist aber bereits korrigiert.

0 Kudos
hoebbel
Crownpeak employee

Außerdem habe ich aus dem LIKE [das in dem Zusammenhang nicht funktionieren kann] ein GTE und ein LTE gemacht Smiley Wink

0 Kudos
MarcusDau
Occasional Collector

Nutze ich das so wie angegeben, dann kommt als Fehler der Vorschau:

27.07.2010 15:10:00.530 ERROR ($CMS_FOR( win_eintrag, fr_win )$ at 16, 1): eintrag.datum: wrong type, expected class java.util.Date, provided class java.lang.String
    inside of: Template 'standard' (id=8402488)
    inside of: $CMS_TRIM(level:3)$ - at 60, 1
    inside of: $CMS_IF(  ! pt_zusammenfassung.isEmpty )$ - at 149, 37
    inside of: $CMS_VALUE(fragment_neu.toString.substring(0, fragment_neu.toString.lastIndexOf(" ", 220)))$ - at 149, 347
    inside of: $CMS_VALUE(fragment.toString.replaceAll("<[^>]*>", " ").replaceAll("'", "").replaceAll("\n", " ").trim())$ - at 149, 231
    inside of: $CMS_VALUE(#global.page.body("inhalt"))$ - at 149, 155
    inside of: Template 'Was ist neu - Auflistung' (id=16313693)
    inside of: $CMS_FOR( win_eintrag, fr_win )$ - at 16, 1

Ändere ich dann im FILTERPARAM den datatype auf java.util.Date, dann kommt diese Fehlermeldung:

27.07.2010 15:08:14.540 ERROR ($CMS_FOR( win_eintrag, fr_win )$ at 16, 1): cannot set select parameter 'bis - null
    inside of: Template 'standard' (id=8402488)
    inside of: $CMS_TRIM(level:3)$ - at 60, 1
    inside of: $CMS_IF(  ! pt_zusammenfassung.isEmpty )$ - at 149, 37
    inside of: $CMS_VALUE(fragment_neu.toString.substring(0, fragment_neu.toString.lastIndexOf(" ", 220)))$ - at 149, 347
    inside of: $CMS_VALUE(fragment.toString.replaceAll("<[^>]*>", " ").replaceAll("'", "").replaceAll("\n", " ").trim())$ - at 149, 231
    inside of: $CMS_VALUE(#global.page.body("inhalt"))$ - at 149, 155
    inside of: Template 'Was ist neu - Auflistung' (id=16313693)
    inside of: $CMS_FOR( win_eintrag, fr_win )$ - at 16, 1

0 Kudos

Ups - sorry. Das kommt davon, wenn man neben den Tickets "mal eben schnell" eine Templatelösung schreibt Smiley Sad

Das hier sollte besser klappen:

<CMS_FUNCTION name="contentSelect" resultname="win">                                                                                                           
    <CMS_PARAM name="schema" value="wasistneu"/>                                                                                                              
    <CMS_VALUE_PARAM  name='von' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr).set("hour",0).set("minute",0).set("second",0)' /> 
    <CMS_VALUE_PARAM  name='bis' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr+1).set("hour",0).set("minute",0).set("second",0)' />
    <QUERY entityType="eintrag">                                                                                                                              
        <FILTERPARAM parameter="von" datatype="java.util.Date" />                                                                                         
        <FILTERPARAM parameter="bis" datatype="java.util.Date" />                                                                                         
        <AND>                                                                                                                                             
            <GTE attribute="datum" parameter="von" />                                                                                                       
            <LTE attribute="datum" parameter="bis" />                                                                                                       
        </AND>                                                                                                                                            
    </QUERY>                                                                                                                                                  
</CMS_FUNCTION>                                                                                                                                              

Ist aber auch "eben kurz" geschrieben und nicht getestet. Ich hoffe nur, ich habe nicht noch etwas übersehen Smiley Wink

Nachricht geändert durch Holger Höbbel:
Das war jetzt der letzte Formatierungsversuch für den Quelltext

0 Kudos
MarcusDau
Occasional Collector

Immer noch:

27.07.2010 15:20:25.663 ERROR ($CMS_FOR( win_eintrag, fr_win )$ at 16, 1): cannot set select parameter 'bis - null
    inside of: Template 'standard' (id=8402488)
    inside of: $CMS_TRIM(level:3)$ - at 60, 1
    inside of: $CMS_IF(  ! pt_zusammenfassung.isEmpty )$ - at 149, 37
    inside of: $CMS_VALUE(fragment_neu.toString.substring(0, fragment_neu.toString.lastIndexOf(" ", 220)))$ - at 149, 347
    inside of: $CMS_VALUE(fragment.toString.replaceAll("<[^>]*>", " ").replaceAll("'", "").replaceAll("\n", " ").trim())$ - at 149, 231
    inside of: $CMS_VALUE(#global.page.body("inhalt"))$ - at 149, 155
    inside of: Template 'Was ist neu - Auflistung' (id=16313693)
    inside of: $CMS_FOR( win_eintrag, fr_win )$ - at 16, 1

<CMS_FUNCTION name="contentSelect" resultname="fr_win">
        <CMS_PARAM name="schema" value="wasistneu"/>
        <CMS_VALUE_PARAM  name='von' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr).set("hour",0).set("minute",0).set("second",0)' />
        <CMS_VALUE_PARAM  name='bis' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr+1).set("hour",0).set("minute",0).set("second",0)' />
        <QUERY entityType="eintrag">
            <AND>
                <FILTERPARAM parameter="von" datatype="java.util.Date" />
                <FILTERPARAM parameter="bis" datatype="java.util.Date" />
                <GTE attribute="datum" parameter="von" />
                <LT attribute="datum" parameter="bis" />
            </AND> 
        </QUERY>
    </CMS_FUNCTION>

0 Kudos

OK, diesmal getestet:

<CMS_FUNCTION name="contentSelect" resultname="win">                                                                                                          
    <CMS_PARAM name="schema" value="Essensplan"/>                                                                                                              
    <CMS_VALUE_PARAM  name='von' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr).set("hour",0).set("minute",0).set("second",0).getTime()' /> 
    <CMS_VALUE_PARAM  name='bis' value='#startdate.set("day_of_month",1).set("month",0).set("year",st_jahr+1).set("hour",0).set("minute",0).set("second",0).getTime()' />
    <QUERY entityType="kantinenplan">                                                                                                                              
    <FILTERPARAM parameter="bis" datatype="java.util.Date" value="0"/>
    <FILTERPARAM parameter="von" datatype="java.util.Date" value="0"/>                                                                                      
        <AND>                                                                                                                                             
            <GTE attribute="Datum" parameter="von" />                                                                                                       
            <LTE attribute="Datum" parameter="bis" />                                                                                                       
        </AND>                                                                                                                                            
    </QUERY>                                                                                                                                                  
</CMS_FUNCTION>

Was natürlich fehlte, war das getTime() um aus dem Datum Millisekunden zu machen.

Ich korrigiere gleich das Originalposting, damit dort die Lösung zu finden ist.

Vorsichtshalber lasse ich den Quelltext hier so stehen, wie er bei mir im testfall funktioniert hat [also mit falschen Schema- und Tabellennamen]