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
19.014 Beiträge

Florian Lippert:
Wo ist es am sinnvolsten, hinsichtlich der View, die LookUps zu stetzen?

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
Top-75-Beitragsschreiber
194 Beiträge

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

Top-10-Beitragsschreiber
19.014 Beiträge

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
Top-75-Beitragsschreiber
194 Beiträge

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?

Top-10-Beitragsschreiber
19.014 Beiträge

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

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
Top-75-Beitragsschreiber
194 Beiträge

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

Das ist das was in der View erzeugt wurde:

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>

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

Top-10-Beitragsschreiber
929 Beiträge

Schau mal hier 

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

Also ebenfalls innerhalb vom View Node,

Top-75-Beitragsschreiber
194 Beiträge

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

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

 

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:

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

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

Danke euch :)

Top-10-Beitragsschreiber
19.014 Beiträge

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

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

Es klappt! Wow. Danke!

So läuft es:

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

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?

Top-10-Beitragsschreiber
19.014 Beiträge

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
Seite 2 von 2 (26 Elemente) < Zurück 1 2 | RSS