我试图在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页面中提供了引用
编辑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是此代码块下面定义的两个函数
您正在使用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();
您应该考虑切换到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()
。
与推荐的其他答案一样,您必须切换到用于异步处理的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