Search the FirstSpirit Knowledge Base
Hallo zusammen,
folgendes:
Ich habe eine Tabelle mit 2 Spalten (name, sid)
In einem Array habe ich Strings, die den Werten der Spalte "name" der Tabelle entsprechen.
Über einen ContentSelect möchte ich nun, die Werte bei einer Übereinstimmung auslesen.
Also:
Hier speichere ich den String-Wert des Arrays beim durchlaufen der Schleife in einer Variablen "fv_role"
diese will ich dem ContentSelect übergeben, damit mir der entsprechende Datensatz ausgeliefert wird
$CMS_FOR(for_role, fv_roles)$
$CMS_SET(fv_role, for_role.toString())$
$CMS_VALUE(cs_ad_mapping)$
$CMS_END_FOR$
Mein ContentSelect
<CMS_FUNCTION name="contentSelect" resultname="cs_ad_mapping">
<CMS_PARAM name="schema" value="Projekt_WebWorld" />
<CMS_VALUE_PARAM name="prm_role" value="fv_role" />
<QUERY entityType="AD_mapping">
<FILTERPARAM parameter="prm_role" datatype="java.lang.String" />
<EQ attribute="name" parameter="prm_role" />
</QUERY>
</CMS_FUNCTION>
die übergebene Variable fv_role wird im Parameter "prm_role" gespeichert welche dann an die Filterung bzw. den EQ-Ausdruck übergeben wird.
Jedoch funktioniert das irgendwie nicht und ich komm an der Stelle nicht weiter bzw. stehe auf dem Schlauch.
Meiner Meinung nach müsste es doch so funktionieren 😕
PS: Datensatz mit dem Namen in der Spalte ist vorhanden, so dass es eben matchen müsste.
Fehlen noch Infos?
viele Grüße
Tobi
Hallo Tobi,
ich habe es anders verstanden.
Ausgehend von
... will ich dem ContentSelect übergeben, damit mir der entsprechende Datensatz ausgeliefert wird ...
müsstest Du auch wirklich das ContentSelect für jeden Wert aufrufen Ein
$CMS_VALUE(cs_ad_mapping)$
reicht da m.E. nicht.
Wir haben so etwas wie folgt umgesetzt:
Aufruf in der Seitenvorlage:
Für jeden Eintrag von dem der Datensatz ermittelt werden soll, wird ein Script aufgerufen (bei uns wird die jeweilige Tabelle, eine ID des zu ermittelnden Datensatzes und der Resultname des Contentselect übergeben)
$CMS_RENDER(script:"SCRIPTNAME", TABELLE:"VORDRUCKE",RESULTNAME:"cs_VD",DSID: VDID)$
Das Script sieht wie folgt aus
//!BeanShell
// Stand: 25.09.2013
out = new StringBuilder();
out.append("<CMS_HEADER>");
out.append(" <CMS_FUNCTION name=\"contentSelect\" resultname=\"").append(RESULTNAME).append("\" context=\"PAGE\">");
out.append(" <CMS_VALUE_PARAM name=\"value_bez\" value=\"").append(DSID).append("\" />");
out.append(" <CMS_PARAM name=\"schema\" value=\"SFO\" />");
out.append(" <QUERY entityType=\"").append(TABELLE).append("\">");
out.append(" <FILTERPARAM parameter=\"value_bez\" datatype=\"java.lang.String\" />");
out.append(" <EQ attribute=\"FS_ID\" parameter=\"value_bez\"/>");
out.append(" </QUERY>");
out.append(" </CMS_FUNCTION>");
out.append("</CMS_HEADER>");
result.setValue(out.toString());
Alternativ kannst Du dir auch erst alle Datesätze holen und z.B. in einer Map speichern (mit Name, Datensatz - geht nat. nur, wenn der Name eindeutig ist). Dann kannst Du über dein Array iterieren und in der Map nachsehen, ob der Name darin enthalten ist.
Welcher Weg performanter ist hängt sicher davon ab, von wie viel Werten Du den Datensatz haben möchtest und wie viele Datensätze vorhanden sind.
Aber vielleicht habe ich dein Anliegen auch falsch verstanden
Grüße Andreas
Hi Tobi,
wenn mich nicht alle täuscht, dann passt bei dir die Reihenfolge nicht. Der ContentSelect wird bereits vor dem Durchlauf deiner Schleife ausgeführt. Du kannst dann auf das Ergebnis zugreifen, dieses aber nicht mehr beeinflussen.
Wie genau sieht denn dein Anwendungsfall aus?
Grüße
Jan
Hallo Tobi,
ich habe es anders verstanden.
Ausgehend von
... will ich dem ContentSelect übergeben, damit mir der entsprechende Datensatz ausgeliefert wird ...
müsstest Du auch wirklich das ContentSelect für jeden Wert aufrufen Ein
$CMS_VALUE(cs_ad_mapping)$
reicht da m.E. nicht.
Wir haben so etwas wie folgt umgesetzt:
Aufruf in der Seitenvorlage:
Für jeden Eintrag von dem der Datensatz ermittelt werden soll, wird ein Script aufgerufen (bei uns wird die jeweilige Tabelle, eine ID des zu ermittelnden Datensatzes und der Resultname des Contentselect übergeben)
$CMS_RENDER(script:"SCRIPTNAME", TABELLE:"VORDRUCKE",RESULTNAME:"cs_VD",DSID: VDID)$
Das Script sieht wie folgt aus
//!BeanShell
// Stand: 25.09.2013
out = new StringBuilder();
out.append("<CMS_HEADER>");
out.append(" <CMS_FUNCTION name=\"contentSelect\" resultname=\"").append(RESULTNAME).append("\" context=\"PAGE\">");
out.append(" <CMS_VALUE_PARAM name=\"value_bez\" value=\"").append(DSID).append("\" />");
out.append(" <CMS_PARAM name=\"schema\" value=\"SFO\" />");
out.append(" <QUERY entityType=\"").append(TABELLE).append("\">");
out.append(" <FILTERPARAM parameter=\"value_bez\" datatype=\"java.lang.String\" />");
out.append(" <EQ attribute=\"FS_ID\" parameter=\"value_bez\"/>");
out.append(" </QUERY>");
out.append(" </CMS_FUNCTION>");
out.append("</CMS_HEADER>");
result.setValue(out.toString());
Alternativ kannst Du dir auch erst alle Datesätze holen und z.B. in einer Map speichern (mit Name, Datensatz - geht nat. nur, wenn der Name eindeutig ist). Dann kannst Du über dein Array iterieren und in der Map nachsehen, ob der Name darin enthalten ist.
Welcher Weg performanter ist hängt sicher davon ab, von wie viel Werten Du den Datensatz haben möchtest und wie viele Datensätze vorhanden sind.
Aber vielleicht habe ich dein Anliegen auch falsch verstanden
Grüße Andreas
Hallo Tobi,
benötigst Du noch weitere Hilfe oder hat Dir die Antwort von Andreas bereits geholfen?
In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere
Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung
gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.
Viele Grüße
Emre
Hallo Andreas,
ja mittlerweile hatte ähnlich wie dein Alternativ-Vorschlag gelöst!
Das mit dem Script sieht aber auch spannend aus.
Das Problem bei meiner Vorgehensweise war glaub ich,
dass sofern man einmal eine Variable per Parameter dem ContentSelect übergeben hat,
diese nicht überschrieben wird, bzw. überschrieben an den ContentSelect weitergegeben wird.
Scheint als würde der ContentSelect mit dem anfangs übergebenem Parameter bestehen bleiben
viele Grüße
Tobi