我目前有一个 CRM 2013 On-Premise 的开发环境。 在我的自定义实体中,运行以下 JavaScript 代码:
function UpdateBPF() {
var requests = [];
requests.push(Xrm.Page.getAttribute('description').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('categoryid').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('priority').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('initialtype').setValue(1));
requests.push(Xrm.Page.data.save());
requests.push(event.returnValue = false);
$.when.apply(undefined, requests).always(function () {
Xrm.Page.data.setFormDirty(false);
RefreshForm();
});
};
function RefreshForm() {
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId());
};
我正在尝试做的事情:
- 更改选项集值时更改业务流程
切换选项集后我的代码在做什么:
- 启动自定义工作流以进行实际切换(工作正常,我需要刷新才能向用户实际显示所选工作流)
- 不需要某些字段(如果未填写则防止刷新)
- 保存表单(刷新以显示正确的业务流程后,从未保存值,因此从未设置选项设置值)
- 防止出现“您尚未保存”弹出窗口。 (很有可能我不再需要这个)
- 我在不保存后将表单设置为不脏
为什么我要将大部分步骤推送到请求变量中?
- 我希望这些值在刷新表单之前肯定会出现。很可能我做错了或效率不高。
什么有效:
- 一切都在我的 CRM 2013 内部部署测试环境中按预期运行。
- 保存
- 刷新
- 正确的业务流程和阶段
CRM 2013 Online 问题:
- 保存和刷新不起作用
- IE 9、10、11 和 FireFox 完全崩溃。 Chrome 没问题。
- 关闭自动保存没有任何影响
我为保存所做的尝试:
Xrm.Page.data.save()
Xrm.Page.data.entity.save()
我为刷新所做的尝试:
Xrm.Page.data.refresh()
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
Xrm.Utility.openEntityForm("service_ticket", Xrm.Page.data.entity.getId(), null)
var url = Xrm.Page.context.getClientUrl(); window.open(url + "/main.aspx?etn=ticket&pagetype=entityrecord&id="+ Xrm.Page.data.entity.getId() + "&newWindow=false", "_blank", null, false);
当我调试时,通过顶部发布的代码逐步执行,它会获取 then.when、.apply 和.always,但会跳过其中的所有内容。我认为这总是意味着它总是运行......
当我尝试时:
Xrm.Page.data.save().then(
function () {
alert('Save worked, refresh');
Xrm.Page.data.refresh();
},
function () {
alert('Save failed!');
}
);
单步执行代码并点击保存。但是在点击之后,它跳过了里面的所有内容,然后 IE(我一直在测试它,因为 Chrome 似乎可以工作......),完全崩溃了。错误并不完全弹出,它更像是一个警告,说“IE 已停止工作”。
我在 StackOverflow 中看到了 1 个类似的问题,但没有被接受的答案或根本不适合我的答案。前两段之前的 Xrm.Page.data.save() 函数是其中一个答案的示例。 super 简单的示例,易于遵循和逐步完成以进行测试,而不会改变结果。
我还用 Google 搜索过(我最好的 friend ),甚至还用 Binging 解决了我的问题。另一个网站上的另一篇帖子,我相信是在微软网站上,根本没有回应。根据所写的内容,我假设与 StackOverflow 帖子的人是同一个人。
非常感谢对问题的任何见解,无论是我的代码还是其他东西。
tl;dr 保存和刷新 JavaScript 不适用于 CRM 2013 Online
最佳答案
我最后做的是在 Xrm.Page.data.save 之前有一个 setTimeout。似乎在字段更改之后和我的 JavaScript 之前直接发生了一些事情。这可能是业务规则(但我最初让它们停用,所以有可能不是它)。
无论哪种方式,我为解决我的问题所做的是在短时间内包含保存功能,然后使用 Xrm.Utility.openEntityForm 来“刷新”整个页面,因为我不想使用不受支持的
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
下面是我使用的代码片段:
setTimeout(function () {
Xrm.Page.data.save().then(
function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
},
function () {
alert('Save failed! Please refresh the form.');
});
}, 500);
保存新创建的记录后,我得到了记录的 ID。超出超时时间或保存之前会导致打开新记录(本质上是保存 + 新建)。
如果有更有效的方法来解决这个问题,请随时告诉我,我会选择您的答案(如果可行)作为正确答案。
编辑:
下面的代码实际上是一个更好的版本。之前的代码我做过Save和Save&Close,导致Save发生了两次,搞乱了我在不同项目下的一些逻辑
setTimeout(function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);
在这里,openEntityForm 是在关闭并再次打开之前保存记录,这是我能得到的最接近保存和刷新的记录。
关于javascript - crm 2013 javascript 保存和刷新崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23273585/