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

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




SPQuery mit Join

Unbeantwortet Dieser Beitrag hat 25 Antworten

Ohne Rang
194 Beiträge
Florian Lippert erstellt 6 Sept. 2013 13:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Sept. 2013 13:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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

Das einzige, was mir an Deinem Code auffällt

[quote user="Florian Lippert"]<FieldRef Name='Dokument' RefType='ID'/>[/quote]

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

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 6 Sept. 2013 13:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

danke für deine Antwort :)

[quote user="Andi Fandrich"]

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

[/quote]

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

 

[quote user="Andi Fandrich"]

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

[/quote]

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

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Sept. 2013 13:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 6 Sept. 2013 15:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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!

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Sept. 2013 15:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 6 Sept. 2013 15:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Sept. 2013 15:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 9 Sept. 2013 16:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Klappt super :) - Code Bespiel folgt -

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

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Sept. 2013 17:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 9 Sept. 2013 17:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 10 Sept. 2013 08:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 11 Sept. 2013 13:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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:

[quote user="Andi Fandrich"]

.. egal ob Mehrfachauswahl oder nicht. ...

[/quote]

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

Danke & VG

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Sept. 2013 13:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 30 Sept. 2016 10:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

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

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Sept. 2016 11:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Florian Lippert"]Wo ist es am sinnvolsten, hinsichtlich der View, die LookUps zu stetzen?[/quote]

Die Lookups müssen in der Liste sein, für die Du die View haben möchtest. Allerdings setzt man Lookups ja anders ein, nämlich i.d.R. dann, wenn man eine 1:n Verbindung hat. Wie bei einer Bestellung mit Kopf (1) und Positionen (n). Das Lookup kommt dann zu den Positionen, damit jede Position genau einem Kopfelement zugeordnet werden kann.

Ich habe das vor längerem mal zusammengefaßt: https://andifandrich.wordpress.com/2013/02/04/list-joins-und-projected-fields/

Vielleicht hilft Dir das schon weiter. Sonst kann man das auch immer testen, indem man sich eine passende Ansicht aus zwei Listen zusammenklickt. Wenn man die danach in SharePoint Designer öffnet, kann man sich das CAML anschauen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 30 Sept. 2016 14:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

danke für deine Antwort.

Deinen Artikel hab ich als Grundlage genommen - kann aber sein, dass ich da etwas falsch umgesetzt habe. Probiere es nochmal :)

Eine Frage noch:
Wo kann ich denn die Ansicht zusammen klicken? Dachte bisher, das die Joins nur im Designer erstellt werden können :/

Danke und viele Grüße

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Sept. 2016 14:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Gehe in die Listeneinstellungen und dort auf das Nachschlagefeld. Du kannst zusätzliche Felder der nachgeschlagenen Liste auswählen. Wenn Du jetzt eine Ansicht bearbeitest, kannst Du diese zusätzlichen Felder für die Ansicht auswählen. Dahinter steckt dann genau ein Join dieser beiden Listen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 30 Sept. 2016 14:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok.

Hab nun im SharePoint die Liste bzw. das LookUp-Feld bearbeitet und "Title" dazugenommen. Nun habe ich eine weitere Column "refStammdaten:Title". Dieses Feld wird auch in der View angezeigt.

Wenn ich jetzt jedoch die View im Designer öffne, sehe ich keinen Aufbau eines Joins.

Ich würde gerne die Felder in der View jonen ohne weitere Columns in der Liste "anzulegen".

Habe ich an anderer Stelle die interne Definition einzusehen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Sept. 2016 15:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Florian Lippert"]Wenn ich jetzt jedoch die View im Designer öffne, sehe ich keinen Aufbau eines Joins[/quote]

Aber die <Query> mit ihren <FieldRef> usw. siehst Du? Ich hätt geschworen, daß man damit einen Join provozieren kann. Etwas anderes zum Zusammenklicken fällt mir nicht ein.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 30 Sept. 2016 15:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, Query und FieldRef seh ich - nur die Query ist leer ;)

Das ist das was in der View erzeugt wurde:

[quote user="View"]
<XmlDefinition>
            <View Name="{F7ECDA26-2859-4151-833A-FE9F531FE82C}" Type="HTML" DisplayName="Joins" Url="/fre/Lists/Produkt/Joins.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png">
                <Query/>
                <ViewFields>
                    <FieldRef Name="Attachments"/>
                    <FieldRef Name="LinkTitle"/>
                    <FieldRef Name="refProd1"/>
                    <FieldRef Name="refProd2"/>
                    <FieldRef Name="refProd3"/>
                    <FieldRef Name="refStamm1"/>
                    <FieldRef Name="refStamm2"/>
                    <FieldRef Name="refStamm3"/>
                </ViewFields>
                <RowLimit Paged="TRUE">30</RowLimit>
                <Toolbar Type="Standard"/>
            </View>
        </XmlDefinition>
<DataFields>
</DataFields>
[/quote]

<Join> müsste ja nun direkt unterhalb von <View ..>, aber wohin müssten hier die ProjectedFields?

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 4 Okt. 2016 08:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Schau mal hier 

https://msdn.microsoft.com/de-de/library/office/ee535502.aspx

Also ebenfalls innerhalb vom View Node,

Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 5 Okt. 2016 10:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Hinweise, leider bekomme ich nach wie vor die Meldung beim Speichern & im Log

[quote] SOAP exception: System.ArgumentException: Value does not fall within the expected range.     at Microsoft.SharePoint.Library.SPRequestInternalClass.GetListItemDataWithCallback2(......... [/quote]

 

Aktuell habe ich es mit folgendem getestet

Liste "Produkt" [Title (Single line of text), refStamm1 (Lookup auf Liste "Stammdaten1")]

Liste "Stammdaten" [Title (Single line of text), Info1 (Single line of text)]

 

In der Liste Produkt habe ich eine View angelegt:

[quote] <View Name="{F7ECDA26-2859-4151-833A-FE9F531FE82C}" Type="HTML" DisplayName="Joins" Url="/fre/Lists/Produkt/Joins.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png">
                <Query>
                    <OrderBy>
                        <FieldRef Name="ID"/>
                    </OrderBy>
                </Query>
                <ViewFields>
                    <FieldRef Name="LinkTitle"/>
                    <FieldRef Name="refStamm1"/>
                </ViewFields>
                <Joins>
                    <Join Type="LEFT" ListAlias="Stammdaten">
                        <Eq>
                            <FieldRef Name="refStamm1" RefType="Id"/>
                            <FieldRef List="Stammdaten1" Name="ID"/>
                        </Eq>
                    </Join>
                </Joins>
                <ProjectedFields>
                    <Field Name="StammdatenTitel" Type="Lookup" List="Stammdaten1" ShowField="Info1"/>
                </ProjectedFields>
                <RowLimit Paged="TRUE">30</RowLimit>
                <Toolbar Type="Standard"/>
            </View>[/quote]

Habt ihr Ideen was da falsch ist bzw. ob noch irgendwelche Vorausstezungen fehlen etc? Mir gehen langsam die Ideen aus :/

Danke euch :)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 5 Okt. 2016 10:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dein beim Join angegebener ListAlias paßt nicht zum List-Attribut beim Field unter ProjectedFields.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
194 Beiträge
Florian Lippert Als Antwort am 5 Okt. 2016 13:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es klappt! Wow. Danke!

So läuft es:

[quote]

<View Name="{F7ECDA26-2859-4151-833A-FE9F531FE82C}" Type="HTML" DisplayName="Joins" Url="/fre/Lists/Produkt/Joins.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png">
                <Query>
                    <OrderBy>
                        <FieldRef Name="ID"/>
                    </OrderBy>
                </Query>
                <ViewFields>
                    <FieldRef Name="LinkTitle"/>
                    <FieldRef Name="refStamm1"/>
                    <FieldRef Name="StammdatenTitel"/>
                </ViewFields>
                <Joins>
                    <Join Type="LEFT" ListAlias="Stammdaten">
                        <Eq>
                            <FieldRef Name="refStamm1" RefType="Id"/>
                            <FieldRef List="Stammdaten" Name="ID"/>
                        </Eq>
                    </Join>
                </Joins>
                <ProjectedFields>
                    <Field Name="StammdatenTitel" Type="Lookup" List="Stammdaten" ShowField="Info1"/>
                </ProjectedFields>
                <RowLimit Paged="TRUE">30</RowLimit>
                <Toolbar Type="Standard"/>
            </View>

[/quote]

Ich hab mal gekennzeichnet wo bei mir der Denkfehler war. Dachte, dass bei dem Join die Quellliste angegeben werden muss :/ aber so wies aussieht, wird das Alias verlangt

 

Zwei Fragen hab ich jedoch noch:

1. ist es richtig, dass die gejointen felder nicht sortiert/gefiltert werden können?

2. Wie würde ich nun eine weitere Liste joinen? gegens alias?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 5 Okt. 2016 14:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

1. Weiß ich gerade gar nicht. Aber wenn es bei Dir nicht geht, dann ist das wohl so.

2. Genau wie die erste auch. Einfach ein weiteres<Join> einbauen und dabei einen anderen Alias verwenden.

Viele Grüße
Andi
af @ evocom de
Blog