MSCRM асинхронный Javascript SDK.REST.retrieveMultipleRecords возвращает только 50 записей, нужно все записи одновременно
У меня есть некоторые проблемы в асинхронном вызове функции "SDK.REST.retrieveMultipleRecords". Ниже приведен код с моей проблемой
function Main_Method(_AnimalList)
{
new SearchInAnimalRecords(_AnimalList);
}
function SearchInAnimalRecords(_AnimalList)
{
$('#divProgressDetail').append('<br>Start searching Animal Records...');
for (var i = 0; i < _AnimalList.length; i++)
if (_AnimalList[i].SchemaName != "Lion")
this.Process(AnimalSchemaName);
}
SearchInAnimalRecords.prototype.Process = function (AnimalSchemaName)
{
$('#divProgressDetail').append('<br>Retriving ' + AnimalSchemaName + ' Animal Records...');
///SDK.REST.retrieveMultipleRecords : Sends an asynchronous request to retrieve records.
SDK.REST.retrieveMultipleRecords
(
AnimalSchemaName, /// The Schema Name of the Entity type record to retrieve.
"$select=" + AnimalSchemaName + "Id", /// A String representing the OData System Query Options to control the data returned
function (AnimalRecords) // "AnimalRecords" only contain 50 records
Эта функция, которая будет проходить и вызываться для каждой возвращаемой страницы записей. На каждой странице 50 записей. Если вы ожидаете, что будет возвращено более одной страницы записей, эта функция должна перебрать результаты и поместить записи в массив вне функции. Используйте обработчик события OnComplete, чтобы узнать, когда все записи были обработаны.
{
var length = AnimalRecords.length;
for (var i = 0; i < length; i++)
{
var guid = AnimalRecords[i][AnimalSchemaName + 'Id'];
var IsGuidMatch = IsKeyGuidMatchWith(guid);
if (IsGuidMatch)
{
$('#divProgressDetail').append('<br>Key animal found in ' + AnimalSchemaName + ' Records.');
$('#divProgressDetail').append('<br>Searching stop.');
break;
}
}
},
function () /// The function that will be passed through and be called by a failed response.
{
$('#divProgressDetail').append('<br>Error while Retriving ' + AnimalSchemaName + ' Records.');
},
function () /// OnComplete EventHandler The function that will be called when all the requested records have been returned. No parameters are passed to this function.
{
$('#divProgressDetail').append('<br>Completed searching in ' + AnimalSchemaName + ' Records.');
}
);
}
в функции Process они представляют собой одну анонимную функцию, которая принимает один параметр с именем "AnimalRecords". Так что проблема в том, что AnimalRecords содержит только 50 записей, мне нужны здесь все записи одновременно.
2 ответа
Я полагаю, что вы используете Dynamics CRM 2011. Файлы справки, предоставленные в SDK ранее, вернули только первые 50, но они были изменены в последней версии SDK. Если у вас есть доступ к последнему SDK для CRM 2011, вспомогательный файл в нем для вызова jQuery "RetrieveMultiple" уже обрабатывает ограничение в 50 записей самостоятельно; Это означает, что реализация уже существует, чтобы получить все записи, а не только первые 50.
Попробуйте загрузить последнюю версию SDK и используйте этот код. Вы должны получить желаемые результаты.
Я думаю, что это ограничение на количество возвращаемых записей. Каждый раз, когда вы получаете записи, возвращаются только первые 50 записей в вашем запросе. Если существует более 50 записей, в конце результирующего набора будет присутствовать узел " > в XML или свойство JSON__next. Вы можете использовать значение URL в этом узле или свойстве, чтобы перейти к следующему набору записей. URL содержит параметр $skiptoken, который предоставляет информацию о границе подкачки
Ссылка: http://msdn.microsoft.com/en-us/library/gg334767.aspx
Если вы хотите получить доступ ко всем записям, попробуйте использовать xrmservicetoolkit
XrmServiceToolkit.Soap.QueryAll: метод для возврата всех записей (> 5k +).