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

问题描述 投票:1回答:3

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

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

我刚刚将我的解决方案从CRM 8.2迁移到CRM 9.0一切都在CRM 8.2中运行良好,即使我在CRM 8.2环境中运行相同的页面它运行良好但在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是此代码块下面定义的两个函数

javascript dynamics-crm crm dynamics-crm-2016 on-prem
3个回答
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
投票

您应该考虑切换到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
            }
        );

你可以查看官方文档here

编辑

如果你想在HTML IFRAME中调用Xrm WebApi,你必须在它前面添加window.parent,所以对Xrm WebApi的任何调用都将从window.parent.Xrm.WebApi开始。

如果要访问在HTML IFRAME之外定义的JS函数,则必须在其前面加上parent.frames[0],因此对名为SomeFunction的函数的调用将是parent.frames[0].SomeFunction()


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
© www.soinside.com 2019 - 2024. All rights reserved.