未捕获的TypeError:无法读取未定义的属性'retrieveMultiple'

时间:2019-04-02 13:34:03

标签: javascript dynamics-crm crm dynamics-crm-2016 on-prem

我试图在CRM 9.0的HTML页面上运行JavaScript,这给了我以下错误。

  

未捕获的TypeError:无法读取的属性'retrieveMultiple'   未定义

我刚刚将我的解决方案从CRM 8.2迁移到CRM 9.0,即使在CRM 8.2环境中运行相同的页面运行也很好,但是在CRM 9.0中运行同一页面却一切正常,但是在CRM 9.0中却出现了上述错误。 另外,当我从CRM 9.0内部运行同一页面时,它工作正常。仅当我使用URL在Web上运行此页面时,才会出现此错误。 我不明白为什么会出现此错误,

我正在使用下面的代码,其中出现错误,

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

编辑:

拍摄的图像来自控制台。我不确定为什么会出现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 个答案:

答案 0 :(得分:2)

您使用的是9.0,为什么不直接迁移到WebAPI。 我强烈建议您使用WebAPI来执行retrieveMultiple 使用Webapi真的很容易,而且您也不需要任何外部第三方libaray进入系统。 来看看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 :(得分:1)

由于XrmSvcToolkit是一个过时的第三方工具,因此您应该考虑切换到Xrm.WebApi。自Dynamics 365 v9起,您可以通过这种方式检索多条记录:

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

您可以查看官方文档here

编辑

如果要在HTML IFRAME中内部调用Xrm WebApi,则必须在其前加上window.parent,因此对Xrm WebApi的任何调用都应以window.parent.Xrm.WebApi开始

如果您要访问在HTML IFRAME的外部中定义的JS函数,则必须在其前面加上parent.frames[0],因此对名为SomeFunction的函数的调用应为{{1 }}。

答案 2 :(得分:0)

与建议的其他答案一样,您必须切换到Xrm.Webapi方法进行异步处理,或者切换到XMLHttpRequest进行同步/异步调用。 CRM REST Builder非常重要。

我会回答你的问题:

  

仅当我使用URL在Web上运行此页面时,才会出现此错误。我不明白为什么会出现此错误,

您可能已经在HTML页面中添加了脚本文件引用,如下所示:

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

这可能已损坏。此外,控制台错误提示CRM context is not available,而其他错误,例如Cannot read property Page of undefined,则意味着此HTML只能在CRM上下文中使用,并且需要大量的工作。 Read this community thread.

更好地停用此库并修正代码以使用产品推荐的功能。

更新

如果要在HTML Web资源中使用 Xrm ,则必须从父CRM窗口引用上下文。

如果HTML页面以以下形式嵌入:

window.parent.Xrm.WebApi

如果在弹出窗口中打开HTML页面:

window.opener.Xrm.WebApi