Search the FirstSpirit Knowledge Base
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
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
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 ]
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
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
Da kommt er mit den doppelten Anführungszeichen nicht zurecht:
value="#startdate.set("day_of_month"
unexpected toke 'EOF (at line 4, column 60)
Hab ich im Originalposting schon korrigiert.
Durch die Rechtschriebkontrolle hatte er da zusätzliche Ausgaben erzeugt, durch die ich die falschen Ticks übersehen hatte
Beides ist aber bereits korrigiert.
Außerdem habe ich aus dem LIKE [das in dem Zusammenhang nicht funktionieren kann] ein GTE und ein LTE gemacht
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
Ups - sorry. Das kommt davon, wenn man neben den Tickets "mal eben schnell" eine Templatelösung schreibt
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
Nachricht geändert durch Holger Höbbel:
Das war jetzt der letzte Formatierungsversuch für den Quelltext
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>
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]