2009-08-21 5 views
5

Sto utilizzando il servizio Web GetListItems e restituisco solo circa il 50% dei risultati memorizzati. C'è un limite alla quantità di dati che può essere restituita? C'è comunque intorno a questo?Servizio Web Sharepoint GetListItems non restituisce tutte le righe

+1

Puoi condividere il meccanismo (codice, se possibile) che stai utilizzando per recuperare i dati. Inoltre, quanti oggetti stai recuperando e quanti sono nella lista? –

risposta

5

Il metodo recupera solo il numero di righe nella visualizzazione predefinita dell'elenco. Per risolvere questo problema, puoi semplicemente aumentare il conteggio delle righe nella visualizzazione predefinita o, meglio ancora, utilizzare le query CAML. Ecco un articolo su come utilizzare CAML con i servizi web: http://dotnet.org.za/zlatan/archive/2007/08/01/collaborative-application-markup-language-caml-and-webservices-in-sharepoint-2007.aspx

+0

Questo link è rotto. Bummer. –

2

Consultare l'articolo this numero di righe restituite in base alla vista utilizzata, modificare il limite di riga nella vista.

4

Dalla mia esperienza bisogna opzioni: 1. Modificare la vista che si usa quando si chiama il metodo GetListItems al vista corretta che restituisce tutte le righe 2. Controlla e verifica se hai inserito un limite di riga nel metodo getlistitems. Se si desidera restituire tutto nella vista corrente che è possibile utilizzare "0", vedere l'esempio seguente: XmlNode doc = doclist.GetListItems ("Elenco personale", "Vista personale", query, campi di visualizzazione, "0", queryOptions , nullo);

È anche possibile provare a visitare il sito di SharePoint, passare all'elenco da cui si sta eseguendo, quindi selezionare le impostazioni e modificare la vista predefinita/creare la propria vista ed espandere il gruppo Totali. Sotto il gruppo Totali, cerca un identificatore univoco per il tuo elenco (ad esempio ID), quindi nel menu a discesa accanto seleziona COUNT e salva la vista. Una volta ricaricato l'elenco, confrontare il numero totale che verrà visualizzato in questa vista con il numero di elementi restituiti dalla query. Fammi sapere se non sono ancora gli stessi. :)

1

GetListItems() limita i risultati in base al limite di riga della vista che si utilizza come secondo parametro nella chiamata al metodo. Se avete bisogno di tutte le righe da restituire:

  1. andare al tuo sito SharePoint utilizzando il vostro preferito (o meno favorito) Browser Web
  2. Naviga nella tua lista di
  3. Selezionare la vista che corrisponde al GUID si è utilizzo come secondo parametro della chiamata al metodo GetListItems() (vedi esempio di seguito)
  4. Seleziona (dal menu a discesa Visualizza) "Modifica questa visualizzazione"
  5. Scorri fino in fondo ed espandi "Punto di limitazione "
  6. Set un numero elevato (ho usato 9000) come "Numero di elementi da visualizzare" e selezionare "Limita il numero totale di articoli restituiti all'importo specificato."
  7. Fare clic su OK.

    Service.GetListItems (ListGuid, ViewGuid, interrogare, ViewFields, RowLimit, queryOptions, nullo);

Se il RowLimit parametro metodo è meno di limitare la visualizzazione Row si era creato in SharePoint, allora i risultati sono limitate al valore del parametro.

1

Solo per riferimento ad altre persone che arrivano da Google.

Ho bisogno di estrarre i dati da un sistema legacy e capita di avere lo stesso identico problema. La differenza è che non ho avuto il controllo sull'elenco degli sharepoint, quindi non posso modificare la vista predefinita.

var items = listSvc.GetListItems(listname, null, null, null, null, null); 

var pager = items.ChildNodes[1].Attributes["ListItemCollectionPositionNext"] != null ? items.ChildNodes[1].Attributes["ListItemCollectionPositionNext"].Value : string.Empty; 
var pagerXml = new XmlDocument(); 
pagerXml.InnerXml = "<QueryOptions><Paging ListItemCollectionPositionNext=\"\" /></QueryOptions>"; 
var pagerNode = pagerXml.GetElementsByTagName("QueryOptions")[0]; 

while (!string.IsNullOrEmpty(pager)) 
{ 
    pagerNode.ChildNodes[0].Attributes[0].Value = pager; 
    var temp = listSvc.GetListItems(listname, null, null, null, null, pagerNode); 
    foreach (XmlNode c in temp.ChildNodes[1].ChildNodes) 
    { 
     var c2 = items.OwnerDocument.ImportNode(c, true); 
     items.ChildNodes[1].AppendChild(c2); 
    } 

    pager = temp.ChildNodes[1].Attributes["ListItemCollectionPositionNext"] != null ? temp.ChildNodes[1].Attributes["ListItemCollectionPositionNext"].Value : string.Empty; 
} 

Questo è uno utilizzare il codice tempo, quindi lascio al lettore per riordinare in su: D

ma il succo è, se non si può ottenere in una chiamata, è sufficiente farlo in lotti utilizzando le dimensioni della pagina di visualizzazione come dimensione del batch. L'ultimo argomento di GetListItems() accetta un parametro XmlNode e si può passare qualcosa come:

<QueryOptions><Paging ListItemCollectionPositionNext="{paging-option}" /></QueryOptions> 

dove {paging-option} è il valore dell'attributo (stesso nome) di rs:data

1

Set RowLimit a 0

var rowLimit = "0"; 
var result = client.GetListItems("ListName", null, query, viewFields, rowLimit, queryOptions, null); 

Attenzione ai timeout. Se si dispone di molti articoli nell'elenco di SharePoint, è possibile che si verifichino timeout http. I timeout possono essere modificati in IIS e web.config del sito di SharePoint