Search the FirstSpirit Knowledge Base
Hallo Community,
für gewöhnlich schreibe ich nur "normale" Templates, sehe aber für die bestehende Anforderung keine Möglichkeit die Aufgabe ohne Scripting zu lösen...
Aufgabe ist wie folgt:
_____________________________________________________________________________________________________
Aus einem bestimmten Bestand an Bildern sollen Keyvisuals wöchtenlich ausgetauscht werden. Diese Keyvisuals müssen alle einmal verwendet werden, bevor sich eines wiederholen darf. Eine bestimmte Reihenfolge ist irrelevant.
Ich dachte dabei die Bilder in eine Datenquelle zu legen und mit Flags zu arbeiten.
D.h. ich mache ein ContentSelect auf die Datenquelle, nehme mir das erste Element aus der Liste, markiere dieses als "current" und lese bei der Verwendung des KV das Bild mit dem Flag "current" aus.
Beim nächsten Durchlauf wird bei dem Bild mit dem Flag "current" das Flag "current" entfernt und ein Flag "used" gesetzt und ein neues Bild ausgewählt und entsprechend markiert.
Ein Kollege meinte, ich solle mir vom Redakteur die Reihenfolge definieren lassen und damit arbeiten. Dies hätte den Vorteil, dass ich die DQ nicht manipulieren muss, in meinen Augen jedoch den Nachteil, das ich mir den "aktuellen Status" irgendwie merken muss... Da mir kein "einfacher Weg" einfällt, wie ich mir das merken kann, fällt die Option für mich ganz aus...
Mir fällt gerade ein, ich muss sicherlich noch darauf achten, dass die geänderten Datensätze freigegeben werden...
_____________________________________________________________________________________________________
So, jetzt mein Anliegen:
Freue mich auf hilfreiche Antworten.
Viele Grüße
Wäre hier nicht ein NotEqual("flag_current", true) einfacher? Dann würde auch das Or entfallen.
Okay, ein Argument, über das es nachzudenken gilt.
Wenn Sie den Code noch haben können Sie dann bitte mal nach dem "select_new_current.setConstraint(or);" ein select_new_current.getXML() als Logausgabe ausgeben und posten?
Hier die Ausgabe:
ERROR 20.06.2012 22:12:06.421 (de.espirit.firstspirit.client.AbstractGuiHost): Fehler bei der Skriptausführung in Zeile 69.
FSVersion=4.2.453.46978#2467;JDK=1.6.0_31 32bit Sun Microsystems Inc.;OS=Windows 7 6.1 x86;Date=20.06.2012 22:12:06
de.espirit.firstspirit.access.script.ExecutionException: Method Invocation select_new_current.getXML at line 69
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:120)
at de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable.execute(ApplicationTabRegistry.java:150)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:88)
at de.espirit.firstspirit.client.action.StartScriptAction.actionPerformed(StartScriptAction.java:97)
at de.espirit.firstspirit.client.keymap.KeyEventDispatcher.processAction(KeyEventDispatcher.java:282)
at de.espirit.firstspirit.client.keymap.KeyEventDispatcher.inInitState(KeyEventDispatcher.java:223)
at de.espirit.firstspirit.client.keymap.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:176)
at de.espirit.firstspirit.client.AWTDispatchingEventQueue._dispatchEvent(AWTDispatchingEventQueue.java:118)
at de.espirit.firstspirit.client.AWTDispatchingEventQueue.dispatchEvent(AWTDispatchingEventQueue.java:108)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at de.espirit.or.impl.query.XMLConstraintSerializer._visit(XMLConstraintSerializer.java:192)
at de.espirit.or.impl.query.XMLConstraintSerializer.visit(XMLConstraintSerializer.java:56)
at de.espirit.or.query.Equal.accept(Equal.java:28)
at de.espirit.or.impl.query.XMLConstraintSerializer._visit(XMLConstraintSerializer.java:164)
at de.espirit.or.impl.query.XMLConstraintSerializer.visit(XMLConstraintSerializer.java:46)
at de.espirit.or.query.And.accept(And.java:27)
at de.espirit.or.impl.query.XMLConstraintSerializer._visit(XMLConstraintSerializer.java:164)
at de.espirit.or.impl.query.XMLConstraintSerializer.visit(XMLConstraintSerializer.java:51)
at de.espirit.or.query.Or.accept(Or.java:17)
at de.espirit.or.impl.query.SelectSerializer.write(SelectSerializer.java:66)
at de.espirit.or.impl.SelectImpl.getXML(SelectImpl.java:229)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at bsh.Reflect.invokeMethod(Unknown Source)
at bsh.Reflect.invokeObjectMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHArguments.getArguments(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHBlock.evalBlock(Unknown Source)
at bsh.BSHBlock.eval(Unknown Source)
at bsh.BshMethod.invokeImpl(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.BshMethod.invoke(Unknown Source)
at bsh.This.invokeMethod(Unknown Source)
at bsh.This.invokeMethod(Unknown Source)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
... 14 more
In der Release-Session sind ja die freigegeben Daten, diese sind read-only. Wenn Sie also änderungen durchführen wollen muss hier wieder die current-Session benutzt werden. Das bei Verwendung der release-Session alte Datensätze auftauchen, lag daran, dass Sie nur im current Stand gelöscht wurden. Gelöscht werden muss - wie auch im JavaClient - immer in beiden.
Die Datensätze waren in beiden Ständen gelöscht...
Hallo,
das funktioniert im ersten Test super.
Ich werde gleich mal mein "finales" Skript dahingehend ändern und dort noch ein paar Tests machen.
Vielen Dank für den echt coolen Tip.
Die NPE bei "getXML()"
kommt, weil ein "Equal" mit "null" eingehangen wurde, das ist nicht valide (für Leer-Tests muss "IsNull" oder "IsNotNull" verwendet werden). Wahrscheinlich funktioniert auch deswegen die Abfrage nicht...
[EDIT]
Noch ein Tipp: Über "session.xml2Select(String)" ist es eventuell einfacher, sich eine Abfrage zu erstellen. Das XML kann man sich dann (wie in einem anderem Posting vorgeschlagen) über den Wizard im Java-Client erstellen. Dann muss man über die API nur noch die aktuellen Parameter-Werte setzen.
Natürlich können sie bei dieser Lösung dann auch Parameter im Wizard vergeben, die dann später im Skript gesetzt werden.
import de.espirit.firstspirit.access.store.templatestore.Query;
TemplateStoreRoot templateStore = ....
query = templateStore.getStoreElement("mySpecialQueryUID", Query.UID_TYPE);
select = query.getSelectStatement();
select.setParameter("newsStartingAt", myDate);
EntityList entityList = session.executeQuery(select);
Diana Dohr schrieb:
Wäre hier nicht ein NotEqual("flag_current", true) einfacher? Dann würde auch das Or entfallen.
Okay, ein Argument, über das es nachzudenken gilt.
Habe darüber nachgedacht und es eigentlich für gut befunden.
In Kombination mit dem Vorschlag die Abfragen in externen Querys zu definieren, habe dies auch versucht.
Mein Query sieht entsprechend wie folgt aus:
<QUERY entityType="test_db">
<NEQ attribute="flag_used" datatype="java.lang.Boolean" value="true"/>
</QUERY>
Leider führt dies nicht dazu, dass die Elemente mit "NULL" im Feld "flag_used" ebenfalls ausgewählt werden. Lediglich die Einträge mit "false" werden an dieser Stelle ausgewählt.
[EDIT]
Eine Anpassung der Prüfung auf "false" und "not null" hat leider auch nicht geholfen.
<QUERY entityType="test_db">
<OR>
<EQ attribute="flag_used" datatype="java.lang.Boolean" value="false"/>
<NOTNULL attribute="flag_used"/>
</OR>
</QUERY>
BTW: Bzgl. des "not Null" finde ich die Darstellung im Wizzard etwas gewöhnungsbedürftig... :smileyconfused:
[/EDIT]