crm 2013 javascript保存和刷新崩溃

crm 2013 javascript save and refresh crashes

本文关键字:刷新 崩溃 保存 2013 javascript crm      更新时间:2023-09-26

我目前有一个CRM 2013内部部署的开发环境。在我的自定义实体中,运行以下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());
};

我想做的事:

  • 更改选项集值时更改业务流程

切换选项集后我的代码在做什么:

  • 启动自定义工作流以进行实际切换(工作正常,我需要刷新才能向用户实际显示选定的工作流)
  • 不需要某些字段(如果未填充,则阻止刷新)
  • 保存表单(刷新以显示正确的业务流程后,从未保存值,因此从未设置选项集值)
  • 防止出现"您尚未保存"弹出窗口。(很有可能我不再需要这个了)
  • 未保存后,我将表单设置为不脏

为什么我要将大部分步骤推到requests变量中?

  • 我希望在刷新表单之前,这些值一定会出现。很可能我做得不正确或效率不高

工作原理:

  • 一切都在我的CRM 2013内部部署测试环境中如预期的那样工作
  • 保存
  • 刷新
  • 正确的业务流程&阶段

CRM 2013在线问题:

  • 保存和刷新不起作用
  • IE 9、10、11和FireFox完全崩溃。铬很好
  • 关闭"自动保存"没有什么区别

我尝试保存的内容:

  • 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()函数是其中一个答案的示例。超级简单的样本,易于跟踪和逐步通过测试,结果不变。

我也在谷歌上搜索过(我最好的朋友),甚至把我的问题发了疯。另一个网站上的另一个帖子,我相信是在微软网站上,根本没有回应。根据所写的内容,我认为这是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。将其置于超时之外或保存之前会导致打开一条新记录(本质上是"保存+新建")。

如果有更有效的方法,请告诉我费用,我会选择你的答案(如果有效的话)作为正确的答案。

编辑:
下面的代码实际上是一个更好的版本。之前的代码我做了保存和保存&关闭,导致保存发生两次,这打乱了我对不同项目的一些逻辑

setTimeout(function () {
    var id = Xrm.Page.data.entity.getId();
    var entityLogicalName = Xrm.Page.data.entity.getEntityName();
    Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);

在这里,openEntityForm是在关闭并再次打开它之前保存记录,这是我能得到的最接近Save&刷新

以下代码应与"modifiedon"字段的"onchange"事件关联。保存表单后,"modifiedon"字段始终更新。因此,单击"保存"后,将使用以下函数重新加载表单。

function ReloadFormAfterSave(eventArgs) {
var formId = Xrm.Page.ui.getFormType();
alert(formId);
if (formId == "2") { // in my case, I only want the reload to occur when updating
    setTimeout(function () {
        var id = Xrm.Page.data.entity.getId();
        var entityLogicalName = Xrm.Page.data.entity.getEntityName();
        Xrm.Utility.openEntityForm(entityLogicalName, id);
    }, 500);
}
}

请参阅http://dynamicscrmtouch.wordpress.com/2014/07/05/onload-event-not-triggered-after-save-on-crm-2013/关于"modifiedon"的解释。

我忘了提到你需要在表单上添加"modifiedon"作为隐藏字段。

干杯!