rbitdd
Returning Responder

Scripting-Frage

Jump to solution

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:

  1. Ich hab keine Ahnung, ob meine geplante Vorgehensweise überhaupt geeignet ist.
  2. Ich hab keine Ahnung, wie ich ansetzen soll.
  3. Ich hab überhaupt keine Ahnung vom Scripting, würde diesen Umstand jedoch gerne ändern...
    D.h. mir wäre vermutlich lerntechnisch am meisten damit geholfen, wenn mich jemand "in die richtige Richtung schubsen würde". Ich nehme jedoch auch gerne Lösungsvorschläge entgegen, welche ich nur noch anpassen muss und vielleicht daran dann etwas lerne. Smiley Wink

Freue mich auf hilfreiche Antworten.

Viele Grüße

24 Replies
rbitdd
Returning Responder

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. Smiley Wink

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...

0 Kudos
rbitdd
Returning Responder

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. Smiley Happy

0 Kudos

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.

Peter
0 Kudos
gockel
Crownpeak employee

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

rbitdd
Returning Responder

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. Smiley Wink

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. Smiley Sad

[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]

0 Kudos