web
You’re offline. This is a read only version of the page.
close
Skip to main content

Notifications

Announcements

No record found.

Community site session details

Community site session details

Session Id :

JavaScript OData Pagination with synchronous calls

Guido Preite Profile Picture Guido Preite 54,086 Moderator
One limit of the OData endpoint is that the response can only include up to 50 records, so if your result set has more records it's necessary to reiterate the request using the url inside the __next property contained inside the returned object.

The following code shows how to fetch the request using synchronous calls, because sometimes you need (or want) to block the user :)

function getODataRecords(ODataUrl) {

// we return an object with a similar structure as the OData endpoint
var allRecords = new Object();
allRecords.results = new Array();

// we loop until we have an url to query
var queryUrl = ODataUrl;
while(queryUrl != null) {

// we build the request
var ODataRequest = new XMLHttpRequest();
ODataRequest.open("GET", queryUrl, false); // false = synchronous request
ODataRequest.setRequestHeader("Accept", "application/json");
ODataRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8");
ODataRequest.send();

if (ODataRequest.status === 200) {
var parsedResults = JSON.parse(ODataRequest.responseText).d;
if (parsedResults != null && parsedResults.results != null) {

// we add the results to our object
for (var i = 0; i
allRecords.results.push(parsedResults.results[i]);
}

// check if there are more records and set the new url, otherwise we set to null the url
if (parsedResults.__next != null) {
queryUrl = parsedResults.__next;
} else {
queryUrl = null;
}
}
} else {
// if the request has errors we stop and return a null result
queryUrl = null;
allRecords = null;
}
}

return allRecords;
}

// sample function to return all the accounts
function GetAllAccounts() {
var serverUrl;
if (Xrm.Page.context.getClientUrl !== undefined) {
serverUrl = Xrm.Page.context.getClientUrl();
} else {
serverUrl = Xrm.Page.context.getServerUrl();
}
var ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc";
var accountQueryUrl = ODataPath + "/AcccountSet?$select=AccountNumber,Name";

// call our new method
var retrievedAccounts = getODataRecords(accountQueryUrl);

// alert each result
if (retrievedAccounts != null) {
for (var i = 0; i
alert(retrievedAccounts.results[i].Name + " - " + retrievedAccounts.results[i].AccountNumber);
}
}
}

This was originally posted here.

Comments

*This post is locked for comments