CRM JS事件的字段值由工作流程更改

时间:2016-01-21 18:50:11

标签: dynamics-crm-2011 dynamics-crm dynamics-crm-2013 microsoft-dynamics

我在CRM 2015中的表单上有表单和按钮。通过单击表单上的按钮,用户可以触发按需工作流程。完成工作流后,它会更新表单上其中一个字段的值。但是,此服务器数据更改未反映在用户UI上。

注册JS回调的最佳方法是什么?如果工作流程执行成功,它将刷新表单?

阅读本文:https://msdn.microsoft.com/en-us/library/gg334701.aspx看起来我不能使用OnChange()事件,因为我以编程方式更改数据。

2 个答案:

答案 0 :(得分:1)

首先,我建议使用Sync Workflow。执行工作流后,只需执行以下代码:

Xrm.Page.data.refresh(false);

答案 1 :(得分:0)

我曾经有过这样的要求。我必须反映异步工作流更改的Form上的更改,由于某种原因,我必须保持工作流异步。

以下是我为此类要求所做的解决方法。

在实体上添加新字段

FieldName: "isworkflowexecutedsuccessfully"
FieldType: "TwoOption"
Default Value: "false"

然后在您编写工作流代码的代码中,写下:

function someFunctionOfYours() {
RunWorkflow(); //
WaitForWorkflowToCompleteProcessingAndThenReload();
}

function isWorklowExecutionCompleted(TimerId, updateIsWorkflowExecutedSuccessfully) {
var entityName = Xrm.Page.data.entity.getEntityName();
var entityGuid = Xrm.Page.data.entity.getId();

var retrievedOpportunity = XrmServiceToolkit.Soap.Retrieve(entityName, entityGuid, new Array("isworkflowexecutedsuccessfully")); //synchronous call
if (retrievedOpportunity.attributes["isworkflowexecutedsuccessfully"].value = true) {
    clearInterval(TimerId);
    setTimeout(function () {
        setIsworkFlowExecutedSuccessfullyToFalse(updateIsWorkflowExecutedSuccessfully);
    }, 3000);
}
}

function WaitForWorkflowToCompleteProcessingAndThenReload() {
var TimerId = setTimeout(function () {
    isWorklowExecutionCompleted(TimerId);
}, 5000);
}

function setIsworkFlowExecutedSuccessfullyToFalse(updateIsWorkflowExecutedSuccessfully) {
var entityName = Xrm.Page.data.entity.getEntityName();
var entityGuid = Xrm.Page.data.entity.getId();

var updateOpportunity = new XrmServiceToolkit.Soap.BusinessEntity(entityName, entityGuid);
updateOpportunity.attributes["isworkflowexecutedsuccessfully"] = false;
if (updateIsWorkflowExecutedSuccessfully == false || updateIsWorkflowExecutedSuccessfully == null) {
    XrmServiceToolkit.Soap.Update(updateOpportunity);
}
Xrm.Utility.openEntityForm(entityName, entityGuid) //refresh form
}