TWidmayer
Elite Observer

ContentSelect mit Parameter und Filterung

Jump to solution

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

0 Kudos
1 Solution

Accepted Solutions
aVogt
Returning Creator

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

View solution in original post

0 Kudos
4 Replies
kohlbrecher
Crownpeak employee

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

0 Kudos
aVogt
Returning Creator

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

0 Kudos
neumann
Crownpeak employee

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

0 Kudos

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

0 Kudos