2

我试图让主发票表单中的“获取产品”功能区操作逻辑在表单处于更新模式时自动执行。

发票是通过以商机开始的业务流程创建的。

这是发票 onLoad 事件的加载事件的代码:

onFormLoad = function () {

    //if we are in update mode...
    if (Xrm.Page.ui.getFormType() == 2) {

        //if no products are present in the list...
        if (loadInvoiceProducts().length == 0) {
            Mscrm.CommandBarActions.getProducts();
        }
    }
};

loadInvoiceProducts = function () {
    //just a jQuery ajax call to the oData service... this works.
    var products = oDataQuery("InvoiceDetailSet?$filter=InvoiceId/Id eq guid'" + Xrm.Page.data.entity.getId() + "'");
    return products.results;
};

如果我手动创建一个新订单(然后表单处于表单模式 == 1,创建)并且当我填写必填字段并保存时,该表单会以更新模式重新加载,然后出现“获取产品”弹出窗口.

问题是何时通过业务流程创建发票。发票表单以创建模式打开(通过业务流程,所有必填字段都已填写),当我按 Ctrl-S 时,触发上面的代码,表单处于更新模式,但随后发生另一次刷新,然后上面的代码没有运行。

我必须按 F5 才能再次触发它。

有没有人尝试过这样的事情?

谢谢。

4

1 回答 1

1

最新版本的 CRM 具有异步表单加载和刷新,这很可能是您遇到的问题。如您所述,当创建并保存新记录时,会再次触发 onload。更新和保存现有记录时,不会再次触发 onload。要了解更多关于正在发生的事情,请添加一个取消保存的 onsave 处理程序,如下所示:

// Put this function into your script
function cancelSave(econtext) {
    var eventArgs = econtext.getEventArgs();
    console.log("saveMode", eventArgs.getSaveMode()); // could help you figure out why form is saving
    eventArgs.preventDefault();
}

// And then put this line into your onload method
Xrm.Page.data.entity.addOnSave(cancelSave);

如果在添加处理程序后您的问题消失了,那么问题是您现有的记录正在被保存,正如我提到的那样,它不会再次触发 onload。您将需要调查表单保存的原因:

  • 您是否有其他可能触发保存的代码?
  • 如果控制台输出cancelSave显示 70(“AutoSave”),则它是自动保存的(您可以在系统范围内或在您的表单上专门禁用 [在 sdk 中搜索preventAutoSave])
  • 如果控制台输出cancelSave显示 2(“保存并关闭”),则表单上的某些内容可能会导致导航发生(启用自动保存时,导航离开带有未保存数据的表单会触发模式 2 的保存)

如果您确定这是一个正在干扰的保存事件,但由于某种原因无法确定保存的来源,那么您还可以采取找出哪些表单字段是脏的方法。如果没有脏字段,则保存事件不会执行任何操作,因此,如果您可以找出并解决脏字段,那将解决该问题。查看哪些字段是脏的,一种简单的方法是在实体上启用审计,然后查看审计日志以查看哪些字段在保存时发生了更改。

于 2016-05-13T22:02:20.497 回答