SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

SPQuery mit Join

bewertet von 0 Usern
Nicht beantwortet Dieser Beitrag hat 0 Geprüfte Antworten | 25 Antworten | 2 Followers

Top-75-Beitragsschreiber
194 Beiträge
Florian Lippert erstellt in 6 Sep 2013 13:12

Hallo zusammen,

ich versuche momentan per Code zwei Listen miteinander zu verknüpfen, aber bekomme dabei immer und immer wieder einen Fehler und komme nicht weiter.

 

Zu erst eine kurze Beschreibung der Situation:

Liste #1 ist eine Favoriten Liste - diese besteht lediglich aus einem Lookup (Name des Feldes 'Dokument') auf Liste #2 (ID und Title in Liste #1 sind für mich unrelevant) und so eingestellt, das der Benutzer nur die selbst erstellten Einträge sehen darf.

Liste #2 ist eine Auflistung von Dokumenten (keine Dokumentenbibliothek!) und enthält neben ID und Title weitere Parameter.

Die Aufgabenstellung setzt vorraus, dass diese Listen nicht geändert werden!

Nun soll beim Laden der Seite oder einem Klick auf einen Button eine Favoritenliste angezeigt werden - sprich geschaut werden welche Dokumente sich der Benutzer als Favorit gemerkt hat und zu diesen jeweils die Parameter laden. Das Ganze wird in einem DataGrid abgebildet und erhält eine DataTable als Source.

So viel zu der Situatuion..

 

Mein Code sieht bisher wie folgt aus:

....

(das Web wird passend übergeben)

SPList favoritenListe = thisWeb.Lists["Favoriten"];

SPQuery selectUserEntry = new SPQuery();
selectUserEntry.Query = "<Where><Eq><FieldRef Name='Author' LookupId='TRUE' /><Value Type='Integer'>" + SPContext.Current.Web.CurrentUser.ID + "</Value></Eq></Where>"; //nicht unbedingt nötig da filter auf liste liegt

selectUserEntry.Joins = @"<Join Type='LEFT' ListAlias='Dokumente'>
                                        <Eq>
                                            <FieldRef Name='Dokument' RefType='ID'/>
                                            <FieldRef List='Dokumente' Name='ID'/>
                                        </Eq>
                                    </Join>";

selectUserEntry.ProjectedFields = "<Field Name='Value1' Type='Lookup' List='Dokumente' ShowField='Value1'/><Field Name='Value2' Type='Lookup' List='Dokumente' ShowField='Value2'/><Field Name='Value3' Type='Lookup' List='Dokumente' ShowField='Value3'/>";

selectUserEntry.ViewFields = "<FieldRef Name='Dokument'/><FieldRef Name='Value1'/><FieldRef Name='Value2'/><FieldRef Name='Value3'/>";

SPListItemCollection selectedItems = favoritenListe.GetItems(selectUserEntry);

....

 

Wenn ich nun die Items per GetItem Abrufe erhalte ich die Fehlermeldung:

"Der Wert liegt außerhalb des erwarteten Bereichs."

Ich habe schon x Seiten mir zu den Joins angeschaut (unteranderem http://blogs.evocom.de/af/archive/2013/02/04/list-joins-und-projected-fields.aspx) etc. finde aber keine Lösung bzw. was meinen Code von den Beispielen unterscheidet...

Ich hoffe ihr könnt mir helfen.

Danke & viele Grüße

Florian

Alle Antworten

Top-10-Beitragsschreiber
18.988 Beiträge

Der von Dir verlinkte Beitrag stammt von mir und funktioniert definitiv.

Das einzige, was mir an Deinem Code auffällt

Florian Lippert:
<FieldRef Name='Dokument' RefType='ID'/>

ist das großgeschriebene ID. Versuche es mal mit Id. SharePoint ist da manchmal empfindlich...

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Hi Andi,

danke für deine Antwort :)

Andi Fandrich:

Der von Dir verlinkte Beitrag stammt von mir und funktioniert definitiv.

Ja ich weiß, dass er von dir ist ;) und glaube dir auch, dass der funktioniert ^^

 

Andi Fandrich:

das großgeschriebene ID. Versuche es mal mit Id. SharePoint ist da manchmal empfindlich...

Hab es geändert - selbes Ergebnis.

 

Ich habe auch noch was anderes versucht:

Die Zeile in der ich die ProjectedFields setze habe ich auskommentiert (ich kann auf die Felder dann nicht mehr zugreifen - aber das konnte ich bisher eh nicht)

und siehe da, wenigstens die SPListItemCollection kann ich nun mit einem for durchlaufen...

 

Mir gehn nun langsam echt die Idee aus :(

VG

 

Ergänzung:

Die verknüpfte Liste enthält wirklich die ausgewählten Felder und die Werte die ich angebe sind die StaticNames...

Top-10-Beitragsschreiber
18.988 Beiträge

Ich habe da ehrlich gesagt auch keine Idee. Hast Du es mal in der von mir beschriebenen Weise in einer Listenansicht getestet? Das kann man sehr einfach per SharePoint Designer machen und dann jede kleine Änderung einfach speichern und im Browser anschauen.

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Hi Andi,

hab es jetzt mal wie du beschieben und empfohlen hast im Designer getestet.

Und nach dem ich gesehn habe, dass "Value1" selbst ein LookUp ist habe ich das "ProjectedField" auf ein Textfeld umgesetzt - tada es klappt.

Allerdings brauch ich eig den Titel von dem Value1 das aus Liste #3 kommt. Kannst du mir da einmal nen Tipp geben wie das klappt?

Schonmal an dieser Stelle 1000dank!

Top-10-Beitragsschreiber
18.988 Beiträge

Mit SharePoint Designer kann man das einfach schneller testen ;-)

Du brauchst einfach noch einen weiteren Join, um Liste #3 auch noch einzubinden. Das Vorgehen ist dabei völlig identisch, wie beim ersten Join.

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Ich frag mich ehrlich gesagt wie das dann aussieht.

Weil beim ersten Join ist ja klar, das ich in Liste #1 nr #2 joine (die wird ja auch in dem FieldRef als List genannt)

Aber wie sag ich ihm denn, dass er in lise#2 die #3 joinen soll... dann muss ich da doch noch irgendwie sagen welches feld in welcher liste steht oder nicht?

danke:)

Top-10-Beitragsschreiber
18.988 Beiträge

Ja genau. Du gibst einfach beim Join im ersten FieldRef auch ein List-Attribut an. Das funktioniert wirklich ;-)

Man kann damit auch dieselbe Liste mehrfach "joinen" (mit unterschiedlichen ListAlias), was z.B. nützlich sein kann, wenn man Adressen nachschlägt und sowohl eine Liefer- als auch eine Rechnungsadresse hat.

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Klappt super :) - Code Bespiel folgt -

Aber kann ich damit auch Zellen ausgeben in denen meherere User ausgewählt sind? Klappt bisher irgendwie nich so -.-

Top-10-Beitragsschreiber
18.988 Beiträge

Wenn ich mich richtig erinnere, geht dieses Verfahren mit Personenfeldern gar nicht - egal ob Mehrfachauswahl oder nicht. Das liegt daran, daß das intern auch Nachschlagefelder sind.

Du kannst aber mal testen, ob man damit die UserList joinen kann, auf die nachgeschlagen wird (ich hab's noch nicht getestet) :-)

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Scheinbar kommt man da auch so nicht dran... schade...

Hast du evtl sonst ne idee wie ich sonst an die Informationen in meiner View komme?

Top-10-Beitragsschreiber
18.988 Beiträge

Nein, tut mir leid. Man müßte entweder diese Felder kopieren (Workflow oder EeventReceiver) oder ein Webpart programmieren.

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Hi Andi,

ich muss es also leider anders machen mit den Usern - dann schau ich mal ob ich eien Lösung finde.

 

Nochmal kurz zu einer anderen Aussage:

Andi Fandrich:

.. egal ob Mehrfachauswahl oder nicht. ...

Jetzt unabhängig davon, dass das ein UserFeld ist. Kann ich MultiLookUps auch joinen?

Danke & VG

 

Top-10-Beitragsschreiber
18.988 Beiträge

Nein, Lookups und Personenfelder (die ja auch nur Lookups sind) kann man nicht joinen.

Viele Grüße
Andi
af @ evocom de
Blog
Top-75-Beitragsschreiber
194 Beiträge

Servus,

nach langer lange Zeit stolpere ich leider mal wieder über dieses Thema...

Folgende Situation:

Es existieren 8 Listen. Eine davon ist die Produktliste, alle anderen haben zusätzliche Informationen (Stammdaten1, Stammdaten2, Produktionsdaten etc.).

In der Produktliste soll nun eine View entstehen, die die anderen Informationen dazu Joinen.

Im ersten Versuche bekomme ich immer die Meldung/den Fehler, dass der Wert außerhalb des erwarteten Bereichs liegt. Die Felder sind aber auf jedenfall vorhanden (sowohl internal als auch displayname sind identisch). Die Listen sind bisher leer, aber schon beim speichern der View im Designer erhalte ich genannte Meldung.

Fragen:

  • Wo ist es am sinnvolsten, hinsichtlich der View, die LookUps zu stetzen? Alles Referenzen in die Produktliste oder jede andere Liste eine Referenz auf die Produktliste? Oder ist das egal? Vom Dateninhalt her gibt es dort (fast) keinen Vorteil.
  • Wo in der View kommt der Breich "<ProjectedFields>" hin? Welches wäre das ParentNode?
  • Könnte mir jemand ein kurzes Beispiel bzgl des Joins in genanntem Context geben?

Viele Dank für die Unterstützung und allen ein schönes langes Wochenende ;)

Seite 1 von 2 (26 Elemente) 1 2 Weiter > | RSS