【问题标题】:crm 2013 javascript save and refresh crashescrm 2013 javascript保存和刷新崩溃
【发布时间】:2014-04-24 15:39:26
【问题描述】:

我目前有一个 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());
};

我正在尝试做的事情:

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

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

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

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

  • 我希望在刷新表单之前肯定会出现这些值。很可能我做错了或效率不高。

什么有效:

  • 在我的 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 但 SKIPS 里面的所有内容。我认为这总是意味着它总是运行......

当我尝试时:

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() 函数是其中一个答案的示例。超级简单的样本,易于跟踪和逐步完成以进行测试,结果没有任何变化。

我也用 Google 搜索过(我最好的朋友),甚至还对我的问题进行了搜索。我相信在 Microsoft 站点上的另一个站点上的另一个帖子根本没有任何回应。根据所写的内容,我认为它与 StackOverflow 帖子的人是同一个人。

非常感谢您对问题的任何见解,无论是我的代码还是其他问题。

tl;dr Save and Refresh JavaScript 不适用于 CRM 2013 Online

【问题讨论】:

    标签: javascript refresh dynamics-crm-2013 business-process


    【解决方案1】:

    我最终做的是在 Xrm.Page.data.save 之前设置了一个 setTimeout。似乎在字段更改之后和我的 JavaScript 之前直接发生了一些事情。这可能是业务规则(但我最初禁用了它们,所以有可能不是它)。

    无论哪种方式,我为解决我的问题所做的就是在短暂的超时内附上保存功能,然后使用 Xrm.Utility.openEntityForm 来“刷新”整个页面,因为我宁愿不使用不受支持的

    Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
    

    下面是我使用的sn-p代码:

    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 在关闭并再次打开之前保存记录,这是我能达到的最接近保存和刷新的方法。

    【讨论】:

      【解决方案2】:

      以下代码应与“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”作为隐藏字段。

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-09
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多