2016-06-17 3 views
0

Schnelle Frage für Sie hier. Also versuche ich eine REST-Berechnung durchzuführen, wie viele Listenelemente es gibt, aber die Liste gibt immer nur bis zu 1.000 Einträge gleichzeitig zurück. Ich denke, ich habe eine Arbeit, aber wie würde ich die zwei Ergebnisse hinzufügen?SharePoint 2010 REST Große Liste zählt

 $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages", function (data) { 
     $("#ALLCount1").text(data.d.results.length); 
    }) 

    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages&$skiptoken=1016", function (data) { 
     $("#ALLCount2").text(data.d.results.length); 
    }) 

Antwort

2

Gesamt Artikel Graf

Wenn Sie die Gesamtanzahl der Elemente in der Liste suchen sich (in Bezug auf die Anzahl der Elemente in einer gefilterten Ansicht entgegengesetzt) ​​Sie können direkt die $count Unterkunft Liste zuzugreifen.

"/_vti_bin/ListData.svc/MPIC/$count" 

Dies wird die Elementanzahl zurück.

Paging (falls erforderlich)

Paging zu simulieren REST verwenden Sie Folgendes ausführen können:

  1. Verwenden Sie den $skip=n Parameter überspringen die ersten n Einträge nach dem $orderby Parameter
  2. Verwenden Sie den Parameter , um die oberen n Einträge entsprechend der $orderby undzurückzugebenParameter.

Umgang mit asynchronen Rückrufen in Ihrem Code

Das größte Problem ist, dass Sie zwei asynchrone Funktion Rückrufe haben, dass Sie die Summe der resultierenden Produkte erhalten verwenden. Da diese Funktionsaufrufe nicht im selben Umfang ausgeführt werden, können Sie nicht gleichzeitig auf ihre Werte zugreifen.

Eine Problemumgehung besteht darin, mithilfe der Funktionskette die Logik in die Rückruffunktion (en) zu verschieben.

Beispiel $ überspringen mit und oben $

Hier ist ein Beispiel die $skip und $top Parameter mit Ihrem bereitgestellten Code verwenden, eine rekursive Callback-Funktion die Gesamtzahl der Ergebnisse zu erhalten, bevor Sie den Text Ihrer ALLCount1 Aktualisierung Element.

$.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$top=1000&$inlinecount=allpages", function (data) { 
    var count = data.d.results.length; 
    updateTotal(count); 
}); 

function updateTotal(total){ 
    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$skip="+total+"&$top=1000&$inlinecount=allpages", function (data) { 
     var count = data.d.results.length; 
     if(count > 0){ 
      updateTotal(total+count); 
     } 
     else{ 
      $("#ALLCount1").text(total); 
     } 
    }); 
} 

Beispiel $ skiptoken und $ oben mit

Wenn Sie $skiptoken statt $skip (wie bei der Abfrage eine Liste von 5000+ Artikel) zu verwenden sind eingeschränkt, können Sie es auf jeden Fall noch verwenden , aber du wirst ein bisschen mehr zu tun haben.

Während $skip nur die Anzahl der zu überspringenden Elemente haben möchte, möchte $skiptoken die ID des letzten zu überspringenden Elements.

Der Code wäre größtenteils derselbe wie oben, aber Sie müssen in die Datenergebnisse eintauchen und den ID-Wert des letzten Elements herauspicken. Ich überlasse das als Übung für den Leser.

updateTotal(0,0); 
function updateTotal(skip,total){ 
    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$orderby=Id&$skiptoken="+skip+"&$top=1000&$inlinecount=allpages", function (data) { 
     var count = data.d.results.length; 
     if(count > 0){ 
      var lastItemId; 
      // TODO: get last item id from results here 
      updateTotal(lastItemId,total+count); 
     } 
     else{ 
      $("#ALLCount1").text(total); 
     } 
    }); 
} 
0

Um die Summe, die Sie so etwas wie dies versuchen könnte:

var sum = 0; 

$.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages", function (data) { 
    sum = data.d.results.length; 
    $("#ALLCount1").text(sum); 
    $.getJSON("/_vti_bin/ListData.svc/MPIC?$select=Id&$inlinecount=allpages&$skiptoken=1016", function (data) { 
     sum += data.d.results.length; 
     $("#ALLCount2").text(sum); 
    }) 
}) 

Obwohl dies einige Probleme hat:

  1. Zum einen, warum Sie 1016 das Überspringen sind? Willst du nicht 1001?
  2. Sie haben hier nur zwei Anrufe. Wie planen Sie den Rekord 2001?

Was Sie wahrscheinlich tun möchten, ist Paging. Das heißt, Anfragen weiterleiten, bis keine Datensätze mehr zurückgegeben werden.

+0

Also wenn ich auf die erste Zählung schaue. Es hat eine nächste, die bei 1016 beginnt. Ich denke, weil die ersten 16 Dokumente so gelöscht wurden. Wie funktioniert das Paging? Ich habe einige Kommentare gefunden, in denen es erwähnt wurde, aber nichts bestimmtes zur Ausführung. –

+0

Sie möchten es immer noch auf 1000 beschränken, außer Sie wissen, wie viele die ganze Zeit gelöscht werden. Es ist besser, es auf 1000 zu beschränken, 984 zurückzugeben und eine genaue Anzahl zu erhalten. – Matt

+0

[dieses Beispiel] (http://stackoverflow.com/questions/6951191/do-while-javascript-issue) sollte Ihnen den Einstieg erleichtern. Es enthält einen Beispielcode, der geändert werden muss. Sie können jedoch eine andere Frage stellen, wenn Sie Probleme damit haben. – Matt