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.




1:n-Beziehung bei großen Listen

Unbeantwortet Dieser Beitrag hat 21 Antworten

Ohne Rang
150 Beiträge
CptGreenwood erstellt 9 Jan. 2015 14:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich habe vor einiger Zeit ein Ablagesystem aufgebaut, das (grob gesagt) eine 1:n Beziehung abbildet. Es gibt Vorgänge (Liste) und Dokumente (Bibliothek). Dokumente gehören einem Vorgang, ein Vorgang kann viele Dokumente haben. um die Verbindung zu schaffen, Besitzt ein Dokument ein Feld "Vorgang" in dem die Vorgangsnummer steht, zu dem dieses Dokument gehört. Ich denke, dass ist kein ungewöhnliches Szenario.

In der Daten-Ansicht des Vorgangs habe ich einen Webpart unten angehängt, der eine Dokumente-Ansicht anzeigt, die über eine Beziehung so eingestellt ist, dass sie nur Dokumente anzeigt, die zu dem aktuell dargestellten Vorgang gehören (also einen Filter auf das "Vorgang"-Feld im Dokument). Der Anwender kann sich nun einen Vorgang anzeigen und sieht unter dessen Daten eine Liste mit den zugehörigen Dokumenten.

Das hat so lange wunderbar funktioniert, bis die Dokumentenbibliothek die 5000-Elemente-Grenze überschritten hatte und in vielen Dokument-Ansichten der Anwendung nun die "Zu viele"-Fehlermeldung angezeigt wurde. Nach einigem Lesen in den gängigen Quellen habe ich es geschafft, die meisten Dokumentansichten so zu konfigurieren, dass nach einem indizierten Feld gefiltert wurde und damit die Anzeigegrenze wieder unterschritten wurde. Lediglich in der wichtigen 1:n-Darstellung, die ich oben beschrieben habe, will mir das nicht gelingen: In der Liste der zugehörigen Dokumente in der Anzeige eines Vorgangs bekomme ich die Fehlermeldung nicht weg.

Eigentlich dachte ich, durch die eingestellte Beziehung zwischen der Vorgangsnummer des angezeigten Vorgangs und des Vorgang-Feldes der Dokumente wird ein solches Problem nicht auftauchen, denn zu einem Vorgang gehören durchschnittlich nur 5 bis 10 Dokumente. Ich habe in der Dokumentbibliothek auch das Vorgangsfeld indiziert. Keine Wirkung, 5000-Elemente-Fehlermeldung.

Ich habe jetzt in der ZentralAdmin die Grenze auf 10000 hochgesetzt, damit die User weiterarbeiten können, habe aber ein ungutes Gefühl dabei. Was mache ich denn in der 1:n-Anzeige bei der Dokumentliste falsch? Warum wird angezeigt, dass die Grenze überschritten ist, obwohl bei einem angezeigten Vorgang nur 10 zugehörige Dokumente angezeigt werden müssten?

Wäre sehr dankbar für Hilfe...!

Gruß,
Ralf

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Jan. 2015 15:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich nehme an, Du hast die Dokumente bei den Vorgängen über "Verwandte Liste einfügen" dorthin gebracht. Dabei wird der Filter über eine Webpartverbindung realisiert und dabei rennt man dann in das von Dir geschilderte Problem.

Man kann aber die Seite in SharePoint Designer öffnen und das CAML der Dokumentenansicht verändern. Dabei gibst Du dem Webpart einen Parameter (über den Button oben) wie z.B. VorgangsID, der sich die ID aus der URL (Abfragezeichenfolge) holt. Dann erzeugst Du einen Filter, der das Nachschlagefeld der Dokumente auf diesen Parameter filtert.

Jetzt wird Dir das passende CAML erzeugt, das aber noch nicht ganz funktioniert, weil jetzt die ID mit dem angezeigten Text des Nachschlagefeldes verglichen wird. Das kann man aber in der Codeansicht ändern. Du findest dort sowas:

<Where>
<Eq>
<FieldRef Name="MyLookup" />
<Value Type="Lookup">{VorgangsID}</Value>
</Eq>
</Where>

Füge dort beim <FieldRef> ein weiteres Attribut ein: LookupId="True"

Edit: die Webpartverbindung dann bitte entfernen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 9 Jan. 2015 15:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke erstmal für deine Antwort, ich bin ja schon mal froh, dass es eine Lösung gibt, ABER:

Ich habe noch nie mit dem Designer so tief in eine Seite eingegriffen und deine Beschreibung klingt für mich wie Subquantenaggregationsantrieb. Kennst du eine Quelle, wo diese Vorgehensweise schön ausführlich, vielleicht mit einer Prise Screenshot erklärt ist? Oder würdest du dich bereit erklären, das Ganze nochmal für Dummies auszuführen? ;-)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Jan. 2015 15:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tut mir leid, aber eine genauere Erklärung kenne ich auch nicht. Ich dachte aber, ich hätte es ausführlich genug beschrieben :-)

Es ist aber gar nicht so schwer, wie es sich anhört. Schaue es Dir einfach mal an und solange Du nicht speicherst, hast Du ja nichts verändert.

Wenn man eine Seite im Designer öffnet, hat man am unteren Rand die Möglichkeit zwischen Design und Code (oder beidem) umzuschalten. Die Designansicht sieht dabei fast wie im Browser aus. Wenn Du dort das Dokumenten-Webpart markierst, bekommst Du oben im Ribbon auch die passenden Befehle. Wenn im Design etwas markiert ist und man schaltet in die Codeansicht ist dort der entsprechende Code markiert.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 12 Jan. 2015 17:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, viel Feind', viel Ehr'...

Ich habe mich rangewagt, habe die entsprechende Dokumentansicht im Designer geöffnet, habe das Webpart markiert, oben den Button "Parameter" betätigt. Dann ging ein Dialog auf, wo ich einen Parameter mit Namen "VorgangsID" erstellt habe. Als Quelle wählte ich "Abfragezeichenfolge". Rechts wurde dann noch nach "Variable für Abfragezeichenfolge" und "Standardwert" gefragt. Für Variable habe ich auch "VorgangsID" eingetragen, den Standardwert leer gelassen.

Dann bin ich in "Filter" gegangen und habe eine Klausel hinzugefügt, die mein Nachschlagefeld auf "gleich [VorgangsID]" filtert. Schließlich habe ich auch den Quelltext gefunden, den du gepostet hast und LookupId="True" hinzugefügt.

Klappt leider nicht, die Ansicht zeigt dann keine Dokumente mehr an. Glücklicherweise ließ sich die Veränderung problemlos wieder rückgängig machen.

Da ich die Vorgehensweise noch nicht 100%ig durchblicke, kann ich nur eine Vermutung anstellen: Wo sage ich dem System, woher die Dokumentenansicht die Vorgangsnummer des gerade angezeigten Vorgangs herbekommen soll, um danach zu filtern? Das zuständige Feld in der Vorgangsliste heißt schlicht "Vorgang", dort steht die Vorgangsnummer drin, nach der die Dokumente gefiltert werden sollen. Funktioniert das über den CAML-Eintrag LookupId="True"? Muss man diesen Namen evtl verändern?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Jan. 2015 08:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hey, Du hast es fast schon gehabt :-)

[quote user="CptGreenwood"]Als Quelle wählte ich "Abfragezeichenfolge". Rechts wurde dann noch nach "Variable für Abfragezeichenfolge" und "Standardwert" gefragt. Für Variable habe ich auch "VorgangsID" eingetragen, den Standardwert leer gelassen[/quote]

Als Variable mußt Du ID eintragen. In der URL steht irgendwo ID=4711 und genau das ist die ID des Vorgangs, die Du suchst. Standardwert läßt Du leer.

[quote user="CptGreenwood"]Das zuständige Feld in der Vorgangsliste heißt schlicht "Vorgang", dort steht die Vorgangsnummer drin, nach der die Dokumente gefiltert werden sollen. Funktioniert das über den CAML-Eintrag LookupId="True"? Muss man diesen Namen evtl verändern?[/quote]

Du brauchst in jedem Fall den internen Namen des Feldes. Den findest Du, wenn Du z.B. in den Listeneinstellungen auf das Feld klickst. In der Adresse steht dann Field=InternerName. Kann aber gut sein, daß bei Dir der interne und der sichtbare Name identisch sind. Im CAML sieht das dann so aus:

<FieldRef Name="Vorgang" LookupId="True" />

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 13 Jan. 2015 10:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Na dann werde ich es mit diesen erweiterten Infos nachher nochmal probieren. Andere Frage zwischendurch: Ist es für diese Lösung zwingend notwendig, dass das "Vorgang"-Feld in der Dokumentenbibliothek indiziert ist? Das habe ich nämlich als erste Maßnahme getan, um das Problem mit der 5000er-Granze in den Griff zu bekommen. Leider musste ich den Anwendern damit wehtun, denn vorher war es möglich, ein Dokument mehreren Vorgängen zuzuordnen. Da eine Indizierung von Mehrfachauswahlfeldern nicht funktioniert, musste ich daraus eine Einfachauswahl machen. Jetzt sind aber die Anwender ein wenig am Motzen. Kann ich die Indizierung wieder rückgängig machen und das Feld wieder zu einer Mehrfachauswahl machen oder klappt das dann mit deiner Lösung nicht mehr?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Jan. 2015 12:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Für die Lösung an sich ist der Index nicht notwendig, aber zum Umgehen der 5.000er Grenze schon. D.h. man kann eine Ansicht zwar auf fast jede Spalte filtern (und das funktioniert auch), aber wenn man die Eintragsgrenze umgehen muß, helfen nur Filter auf indizierte Spalten.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 13 Jan. 2015 12:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hat sich das Verhalten rund um die 5000er-Grenze und die Möglichkeiten der Admins, damit umzugehen bei SharePoint 2013 geändert?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Jan. 2015 13:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, außer daß sich manche Default-Grenzwerte erhöht haben. Ich weiß aber nicht mehr genau welche.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 19 Jan. 2015 14:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

ich bin eben dazu gekommen, deine Lösung nochmal zu versuchen mit den Anmerkungen, die du noch hinzugefügt hast.
Es hat wieder nicht geklappt, aber diesmal mit anderem Ergebnis. Beim ersten Versuch war die Dokumentenanzeige noch leer, diesmal erscheint wieder die Fehlermeldung mit der 5000 Elemente Grenze, die überschritten ist.

Nachdem ich einen Vorgang angeklickt habe wird folgende URL aufgerufen: http://site.domaene.de/websites/Anwendung/Lists/Vorgnge/DispForm.aspx?ID=2877&Source=http%3A%2F%2FAnwendung%2EDom%2EDomaene%2Ede%2Fwebsites%2FAnwendung%2FLists%2FVorgnge%2FAlle%2520Vorgnge1%2Easpx&ContentTypeId=0x0100DF7E98BBA04100439C0372A4F0B0EA74

Darin sehe ich keinen Parameter, der übergeben wird oder ist das die ContentTypeID? Eher nicht...
Habe ich beim Erzeugen des Parameters etwas falsch gemacht? Muss der IIS durchgestartet werden, bevor so etwas greift?

Die Zeilen im CAML sehen so aus:

 

 

 

 

 

 

 

 

 

 

 

 

 

<Query>
  <OrderBy>
   
<FieldRef Name="Created" Ascending="FALSE"/>
   
<FieldRef Name="DocIcon"/>
 
</OrderBy>
 
<Where>
   
<Eq>
     
<FieldRef Name="Vorgang" LookupId="True"/>
     
<Value Type="Lookup">{VorgangsID}</Value>
   
</Eq>
 
</Where>
</Query>

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Jan. 2015 14:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Irgendwas schein am parameter faul zu sein. CAML sieht gut aus, und nein man muß nichts sonst machen. Und der URL-Parameter heißt wirklich ID. Siehst Du, wenn Du Dir Deine Adresse genau anschaust:

...DispForm.aspx?ID=2877&Source=...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 19 Jan. 2015 14:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ach ja da... Vor lauter URL-Text überlesen. Muss ich die Webpart-Verbindung raus nehmen, bevor es funktioniert? Vielleicht mal eine ganz frische Dokumentansicht erstellen, die so konfiguriert ist?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Jan. 2015 14:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, die Verbindung muß weg. Und am Besten versucht Du es tatsählich mal mit einer ganz neuen Ansicht.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 19 Jan. 2015 16:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Habe es jetzt nochmal mit einer ganz frischen Ansicht versucht, sie nach deiner Methode konfiguriert (langsam bekomme ich Übung :-) ), einen Webpart mit dieser Ansicht dem Formular des Vorgangs hinzugefügt und bekomme bei Aufruf eine Exception im Webpart angezeigt.

Ich habe mich durch die Logdatei gewühlt und folgendes gefunden:

Type mismatch with field Vorgang and value {VorgangsID}

In deiner Beschreibung steht als Value Type immer "Lookup" drin. In dem Code, den der Designer erzeugt (bevor ich daran etwas ändere) steht aber "Text". Muss ich "Text" anstatt "Lookup" verwenden? Das ist aber bestimmt auch problematisch, denn der Parameter {VorgangsID} ist zwar Text (denke ich) aber mein Feld "Vorgang" in der Dok.Bibl. ist nun mal ein LookUp-Feld...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2015 07:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="CptGreenwood"]In dem Code, den der Designer erzeugt (bevor ich daran etwas ändere) steht aber "Text". [/quote]

Das ist so, weil der automatisch erzeugte Code auf den angezeigten Text im Lookup filtert. Du möchtest aber auf die dahinterliegende ID filtern und das geht mit LookupId="True" beim <FieldRef> und Type="Lookup" oder Type="Integer" beim <Value>

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 20 Jan. 2015 08:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK. Ich versuche es dann nochmal mit Integer.

Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 20 Jan. 2015 09:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bin mit meinem neuen Versuch durch. Sowohl mit Feldtyp "Lookup", als auch mit "Integer" wird im betreffenden Webpart ein Fehler angezeigt und ein Nachsehen im Log ergibt "Type mismatch with field Vorgang and value {VorgangsID}" gefolgt von einem Schwanz an SQL-Fehlermeldungen.

Um intensiver darüber grübeln zu können, wo es hängt, noch eine Frage zum Verfahren selbst: Wenn ich es richtig verstanden habe, wird die ID des Vorgangs über den Parameter an die Dokumentenansicht übergeben und dort darauf gefiltert. Was sich mir nicht erschließt: Der Parameter transportiert die ID aber nicht das Feld "Vorgangsnummer" der Vorgangsliste, die den eigentlichen Schlüssel darstellt. Diese sieht z.B. so aus "E00101/18". Wenn ein Dokument aus der Dok.Bibl. zu diesem Vorgang gehört, hat es im Lookup-Feld "Vorgang" genau diesen Schlüssel stehen. Was hat denn die ID mit dieser Beziehung zu tun, bzw. wie hilft die ID?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2015 10:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jedes Element in SharePoint (in Listen und Bibliotheken) hat immer eine numerische ID, die von SharePoint automatisch hochgezählt wird. Das ist der eindeutige Schlüssel, der intern immer zum Identifizieren eines Datensatzes verwendet wird. Du kannst das Feld ID einfach mal in eine Listenansicht aufnehmen, dann siehst Du daß das erste Element eins hat, das nächste zwei usw.

Nachschlagefelder speichern intern immer diese ID, auch wenn an der Oberfläche vielleicht etwas ganz anderes angezeigt wird.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 20 Jan. 2015 10:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also müsste es ja theoretisch funktionieren, der Weg ist also nicht falsch. Hast du eine Idee, wo und wie ich nach dem Problem forschen kann? Ich möchte ungern aufgeben und sagen: "Dann halt nicht, setze ich die Einträgegrenze eben auf 10000 hoch".

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Jan. 2015 10:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tut mir leid, aber ich habe jetzt keine Idee mehr. Der von mir beschriebene Weg funktioniert aber definitiv. Ich habe das schon sehr oft genau so umgesetzt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
CptGreenwood Als Antwort am 20 Jan. 2015 10:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, trotzdem danke.