Uncaught TypeError: Невозможно прочитать свойство 'retrieveMultiple' из неопределенного - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь запустить JavaScript на HTML-странице в CRM 9.0, которая выдает мне следующую ошибку.

Uncaught TypeError: Невозможно прочитать свойство 'retrieveMultiple' из не определен

Я только что перенес свое решение из CRM 8.2 в CRM 9.0, все работало нормально в CRM 8.2, даже когда я запускаю ту же страницу в среде CRM 8.2, оно работает нормально, но в CRM 9.0 оно выдает ошибку выше. Кроме того, когда я запускаю ту же страницу изнутри CRM 9.0, она работает нормально. Только когда я запускаю эту страницу в Интернете с помощью URL, она выдает эту ошибку. Я не понимаю, почему эта ошибка,

Я использую код ниже, где появляется ошибка,

 XrmSvcToolkit.retrieveMultiple({
    entityName: SpecialOperationEntity,  //Update this code later
    odataQuery: Query,
    async: false,
    successCallback: successCallback,
    errorCallback: errorCallback
});

EDIT:

Снимок сделан с консоли. Почему появляется ошибка XrmSvcToolkit, я не уверен. Может кто-нибудь, пожалуйста, руководство? Так же ссылка доступна на HTML странице

enter image description here

РЕДАКТИРОВАТЬ 2:

Для всех тех, кто предлагает мне использовать Web.API

Когда я использую Web Api и закомментирую эту текущую логику, фактический файл js даже не загружается внутри HTML, а файл HTML выдает ошибку, в которой говорится, что он не может найти функции, определенные в файле js (поскольку файл js не загружается в этом случае).

Я использую код ниже,

 Xrm.WebApi.retrieveMultipleRecords(SpecialOperationEntity, "$select=vrp_Output&$filter=vrp_Operation eq '" + Operation + "' and vrp_Input eq '" + JsonInputParameter + "'";).then(
       successCallback
        ,errorCallback
    );

Примечание: successCallback и errorCallback - две функции, определенные под этим блоком кода

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Вы используете 9.0, почему бы просто не перейти на WebAPI. Я очень рекомендую использовать WebAPI для получения Использовать Webapi очень просто, и вам также не понадобится сторонняя библиотека в систему. Взгляните на CRM Rest Builder это действительно просто для создания запросов Webapi.

Пример кода для RetreiveMultipe

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/accounts?$select=accountclassificationcode,accountid&$filter=accountid eq 123456789", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
            for (var i = 0; i < results.value.length; i++) {
                var accountclassificationcode = results.value[i]["accountclassificationcode"];
                var accountclassificationcode_formatted = results.value[i]["accountclassificationcode@OData.Community.Display.V1.FormattedValue"];
                var accountid = results.value[i]["accountid"];
            }
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();
1 голос
/ 02 апреля 2019

Вам следует подумать о переходе на Xrm.WebApi, поскольку XrmSvcToolkit является устаревшим сторонним инструментом. Вот как вы можете получить несколько записей, начиная с Dynamics 365 v9:

        Xrm.WebApi.retrieveMultipleRecords("account", "?$select=name").then(
            function success(result) {
                // perform additional operations on retrieved records
            },
            function (error) {
                // handle error conditions
            }
        );

С официальной документацией можно ознакомиться здесь .

EDIT

Если вы хотите позвонить в Xrm WebApi внутри вашего HTML IFRAME, вам необходимо добавить префикс window.parent, поэтому любой вызов Xrm WebApi будет начинаться с window.parent.Xrm.WebApi.

Если вы хотите получить доступ к JS-функции, которая определена за пределами вашего HTML-КАДРА, вы должны добавить к нему префикс parent.frames[0], поэтому вызов функции SomeFunction будет parent.frames[0].SomeFunction().

0 голосов
/ 03 апреля 2019

Как и другие рекомендуемые ответы, вы должны переключиться на Xrm.Webapi методы для асинхронной обработки или XMLHttpRequest для синхронных / асинхронных вызовов.CRM REST Builder имеет жизненно важное значение.

Я отвечу на ваш вопрос:

Только когда я просматриваю эту страницу в Интернете с помощью URL-адреса, выдается эта ошибка.Я не понимаю, почему возникает эта ошибка,

Возможно, вы добавили ссылку на файл сценария на странице HTML, как показано ниже:

<script type="text/javascript" src="vrp_franix_XrmSvcToolKit.js"></script>

Возможно, это не работает.Также консольные ошибки указывают на CRM context is not available и другие ошибки, такие как Cannot read property Page of undefined, означающие, что этот HTML может использоваться только в контексте CRM и требовалось много сантехники. Прочитайте эту ветку сообщества.

Лучше отключите эту библиотеку и исправьте код, чтобы использовать рекомендуемые продуктом функции.

Обновление :

Если вы хотите использовать Xrm в веб-ресурсе HTML, вы должны ссылаться на контекст из родительского окна CRM.

Если страница HTML встроена в форму:

window.parent.Xrm.WebApi

Если HTML-страница открывается во всплывающем окне:

window.opener.Xrm.WebApi
...