我试图在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页面中可用
编辑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是在此代码块下面定义的两个函数
答案 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