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 +).

http://xrmservicetoolkit.codeplex.com/

Другие вопросы по тегам