mareike
Returning Observer

In einem Datenbankeintrag ein Feld aus einem verlinkten anderen Datenbankeintrag verwenden

Jump to solution

Wir haben momentan in unserem CMS 2 verschiedene Datenquellen: Pressemitteilungen und Auszeichnungen.
Eine Auszeichnung geht auch immer mit einer Pressemitteilung einher, weshalb es in der Datenquelle Auszeichnungen ein Feld gibt in der die zugehörige Pressemeldung ausgewählt werden kann:

<FS_DATASET name="tabletmpl_link_url" allowEmpty="no" allowNew="no" hFill="yes" mode="sheet" useLanguages="no">

    <LANGINFOS>

      <LANGINFO lang="*" label="Press release"/>

      <LANGINFO lang="DE" label="Pressemeldung" description="Wählen Sie eine Pressemeldung aus"/>

    </LANGINFOS>

    <SOURCES>

      <CONTENT name="presse_mitteilungen_1"/>

    </SOURCES>

  </FS_DATASET>

Die Auszeichnungen sollen nun über eine Datenbank-Abfrage geordnet nach dem Datum, dass sich in der Pressemitteilungen-Datenquelle befindet ausgegeben werden. Am Besten wäre es hier natürlich wenn man in der DB-Abfrage direkt in die verlinkte Pressemitteilungen-Datenquelle "hineinspringen" und nach dem Datum ordnen könnte. Diese Query liefert aber ein undefined:

<CMS_HEADER>

<CMS_FUNCTION name="contentSelect" resultname="all_award_entries">

<CMS_PARAM name="schema" value="public_web" />

  <QUERY entityType="award_entries">

  <AND>

  <NOTNULL attribute="linked_pressemitteilung_DE" />

  </AND>

<ORDERCRITERIA attribute="linked_pressemitteilung_DE.dataset.entity.datum" descending="1"/>

</QUERY>

</CMS_FUNCTION>

</CMS_HEADER>

In der Doku haben wir auch keine Möglichkeit eines Joins gefunden.

Nun haben wir uns überlegt, direkt in den Auszeichnungen eine zusätzliche Spalte mit dem entsprechenden Datum einzufügen, aber wie kann hier automatisch das Datum der verlinkten Pressemeldung eingefügt werden? In der Doku haben wir nicht die Möglichkeit gefunden einen Default Wert für die Spalte einzugeben, welcher sich auf andere Eingabefelder (in diesem Fall das verlinkte FS_DATESET) bezieht.

Ist eines von beidem möglich? Wie könnten wir sonst 2 Datenquellen zusammenbringen? Vielen Dank!

1 Solution

Accepted Solutions
hoebbel
Crownpeak employee

Hallo Mareike,

das Problem hier ist, dass die in der contentSelect Funktion definierte Anfrage direkt an die Datenbank gestellt wird. Die Datenbank hat aber keinen Zugriff auf die Eingabekomponente, so dass "linked_ressemitteilung_DE.dataset" nicht aufgelöst werden kann.

Die einfachste Lösung wäre es, wenn die FS_DATASET Eingabekomponente auf eine zu-1 Fremdschlüsselbeziehung zu den Pressemitteilungen gemappt würde.

Dazu muss im Schema zwischen den beiden Tabellen eine Fremdschlüsselbeziehung zwischen den beiden Tabellen angelegt werden. Die Eingabekomponente kann dann auf diese Fremdschlüsselbeziehung gemappt werden.

In der contentSelect Funktion kann dann über die Fremdschlüsselbeziehung das entsprechende Feld für die Sortierung definiert werden.

Nachteil: Aufgrund des geposteten Codes gehe ich davon aus, dass die FS_DATASET Eingabekomponente auf eine FirstSpirit Editor Spalte gemappt wurde. Bisher gepflegte Daten würden verloren gehen, wenn der Speicherort entsprechend geändert wird.

Befinden sich die beiden Datenbanktabellen in verschiedenen Schemata oder ist der Nachteil zu schwerwiegend, wird es etwas komplizierter.

Möglicherweise funktioniert es mit einem CMS_VALUE_PARAM:

<CMS_HEADER>

<CMS_FUNCTION name="contentSelect" resultname="all_award_entries">

<CMS_PARAM name="schema" value="public_web" />

<CMS_VALUE_PARAM name="sortCriteria" value="linked_ressemitteilung_DE.dataset.entity.datum"/>

  <QUERY entityType="award_entries">

  <AND>

  <NOTNULL attribute="linked_ressemitteilung_DE" />

  </AND>

<ORDERCRITERIA attribute="sortCriteria" descending="1"/>

</QUERY>

</CMS_FUNCTION>

</CMS_HEADER>

Ich fürchte aber, dass das nicht klappt. Lösung wäre es dann, die Daten erst einmal in eine Liste oder Map zu übernehmen und diese dann entsprechend sortiert auszugeben.

Also etwas in der Art:

$CMS_SET(set_awardmap,{:})$

$CMS_FOR(for_award,all_award_entries)$

$CMS_SET(set_awardmap[<Datum>.format("yyyyMMddHHmm")+<IDdesDatensatzes>],for_award)$

$CMS_END_FOR$

$CMS_FOR(for_award,set_awardmap.keySet)$

$CMS_VALUE(for_award)$$--Das ist das Entity--$

$CMS_END_FOR$

<Datum> ist hierbei das Datum, nachdem sortiert werden soll. Die <IDdesDatensatzes> dient nur dazu sicherzustellen, dass nicht zwei Einträge in der Map denselben Key bekommen (und sich dann überschreiben würden). Die Map wird bei der Ausgabe automatisch sortiert, man spart sich also das manuelle sortieren.

Das Ganze ist nur theoretisch runtergeschrieben. Ich habe bestimmt irgendwo einen Tipp- bzw. Denkfehler drin, hoffe aber, dass es als Lösungsansatz trotzdem funktioniert, falls die [bessere] Lösung mit der Fremdschlüsselbeziehung nicht in Frage kommt.

Viele Grüße

Holger

View solution in original post

2 Replies
hoebbel
Crownpeak employee

Hallo Mareike,

das Problem hier ist, dass die in der contentSelect Funktion definierte Anfrage direkt an die Datenbank gestellt wird. Die Datenbank hat aber keinen Zugriff auf die Eingabekomponente, so dass "linked_ressemitteilung_DE.dataset" nicht aufgelöst werden kann.

Die einfachste Lösung wäre es, wenn die FS_DATASET Eingabekomponente auf eine zu-1 Fremdschlüsselbeziehung zu den Pressemitteilungen gemappt würde.

Dazu muss im Schema zwischen den beiden Tabellen eine Fremdschlüsselbeziehung zwischen den beiden Tabellen angelegt werden. Die Eingabekomponente kann dann auf diese Fremdschlüsselbeziehung gemappt werden.

In der contentSelect Funktion kann dann über die Fremdschlüsselbeziehung das entsprechende Feld für die Sortierung definiert werden.

Nachteil: Aufgrund des geposteten Codes gehe ich davon aus, dass die FS_DATASET Eingabekomponente auf eine FirstSpirit Editor Spalte gemappt wurde. Bisher gepflegte Daten würden verloren gehen, wenn der Speicherort entsprechend geändert wird.

Befinden sich die beiden Datenbanktabellen in verschiedenen Schemata oder ist der Nachteil zu schwerwiegend, wird es etwas komplizierter.

Möglicherweise funktioniert es mit einem CMS_VALUE_PARAM:

<CMS_HEADER>

<CMS_FUNCTION name="contentSelect" resultname="all_award_entries">

<CMS_PARAM name="schema" value="public_web" />

<CMS_VALUE_PARAM name="sortCriteria" value="linked_ressemitteilung_DE.dataset.entity.datum"/>

  <QUERY entityType="award_entries">

  <AND>

  <NOTNULL attribute="linked_ressemitteilung_DE" />

  </AND>

<ORDERCRITERIA attribute="sortCriteria" descending="1"/>

</QUERY>

</CMS_FUNCTION>

</CMS_HEADER>

Ich fürchte aber, dass das nicht klappt. Lösung wäre es dann, die Daten erst einmal in eine Liste oder Map zu übernehmen und diese dann entsprechend sortiert auszugeben.

Also etwas in der Art:

$CMS_SET(set_awardmap,{:})$

$CMS_FOR(for_award,all_award_entries)$

$CMS_SET(set_awardmap[<Datum>.format("yyyyMMddHHmm")+<IDdesDatensatzes>],for_award)$

$CMS_END_FOR$

$CMS_FOR(for_award,set_awardmap.keySet)$

$CMS_VALUE(for_award)$$--Das ist das Entity--$

$CMS_END_FOR$

<Datum> ist hierbei das Datum, nachdem sortiert werden soll. Die <IDdesDatensatzes> dient nur dazu sicherzustellen, dass nicht zwei Einträge in der Map denselben Key bekommen (und sich dann überschreiben würden). Die Map wird bei der Ausgabe automatisch sortiert, man spart sich also das manuelle sortieren.

Das Ganze ist nur theoretisch runtergeschrieben. Ich habe bestimmt irgendwo einen Tipp- bzw. Denkfehler drin, hoffe aber, dass es als Lösungsansatz trotzdem funktioniert, falls die [bessere] Lösung mit der Fremdschlüsselbeziehung nicht in Frage kommt.

Viele Grüße

Holger

mareike
Returning Observer

Hallo Holger, vielen Dank für deine schnelle und ausführliche Antwort. Wir haben deine Lösung mit der Map bereits ausprobiert und es scheint wie gewünscht zu funktionieren. Vielen Dank auch für die zusätzlichen Einblicke in die weiteren Möglichkeiten. Das mit der Fremdschlüsselbeziehung ist auch sehr interessant. Viele Grüße Mareike