在 Dynamics CRM 2016 中使用 javascript 启动工作流

Start workflow with javascript in Dynamics CRM 2016

我需要创建一个 JS 库,它可以 运行 使用新的 WebApi for Dynamics CRM 2016 工作流:

我需要从我的代码开始工作流程。 (工作流应该是“实时的”)而不是异步的。我会将我的函数调用构建到表单上的功能区中。 如果有人能帮助我,我会更加感激,因为我搜索了所有互联网,但找不到解决这个问题的方法,除了从上面 link 我找到这个方法的地方

但是我不知道如何使用这个方法?一旦开始,它必须是“实时的” 我找到了解决方案,例如:

-https://processjs.codeplex.com/

但这对我不起作用,因为它 运行 工作流程是异步的。它必须使用上面提供的 link 中的 Web API。我认为此 Web API 仅适用于 Microsoft Dynamics 2016

我经常这样做:使流程成为 Action,它们是专门为此目的而设计的(单击功能区按钮并调用本质上 的工作流程通过 WebAP;它们也成为插件注册的自定义消息,这在某些情况下很好)。

要进行同步调用,您需要做的就是通过调整 open 语句使 XmlHttpRequest 同步:

// 'xhr' is the XMLHttpRequest 
xhr.open(http_method, request_url, false); <-- third parameter 'false' means sync request

我从不使用库来调用 webapi,所以不幸的是我不能建议任何特定于库的代码,但我假设任何体面的库都允许您使 XHR 请求同步。

(强制警告:同步请求不是最理想的,浏览器确实会抱怨它们,我希望 Chrome 特别是在将来的某个时候开始破坏同步代码)。

现在我们有了操作,真的不需要再从 javascript 开始工作流了。我曾经使用使用 SOAP api 的 javascript 库来这样做,但是 Web api 操作更容易使用。动作的创建方式与工作流相同。要创建操作,请转到创建工作流,而不是从下拉列表 select 操作中选择工作流。你最终会得到这样的表格。 请记住您将 运行 反对的唯一名称和实体。在此示例中,我将使用图中所示的工作流程 运行s 来对照联系人记录。 从 javascript 我现在可以发出 POST 到

https://<your-crm-server>/api/data/v8.0/contacts(<contact-id>)/Microsoft.Dynamics.CRM.wa_GetContactSyncStatus

同样,这是一个针对联系人的操作,运行在 wa_GetContactSyncStatus 操作中,将值更改为您需要的值。另外作为旁注,这是针对 2016 服务器的,以后的任何内容都会有不同的 api 版本供您使用。请查阅您的 crm 实例中的开发人员资源页面,了解您的 url for the web api 是什么。

该操作将 运行 异步进行,只要您的 javascript 请求设置为同步,您的请求也会 return 当操作完成时。

另一方面请注意,如果您的操作调用另一个非同步的工作流,它很可能会 return 在您的异步后台工作流之前调用。

JS 中的 Soap 请求:

function RunWorkflow(in_entitiId,in_workflowId,in_url) { 
    var _return = window.confirm('Do you want to execute workflow ?');
    if (_return) {
        var url = in_url;
        var entityId =in_entitiId ;
        var workflowId = in_workflowId;
        var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
        url = url  + OrgServicePath;
        var request;
        request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                    "<s:Body>" +
                        "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                        "<request i:type=\"b:ExecuteWorkflowRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">" +
                            "<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">" +
                            "<a:KeyValuePairOfstringanyType>" +
                                "<c:key>EntityId</c:key>" +
                                "<c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + entityId + "</c:value>" +
                            "</a:KeyValuePairOfstringanyType>" +
                            "<a:KeyValuePairOfstringanyType>" +
                                "<c:key>WorkflowId</c:key>" +
                                "<c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + workflowId + "</c:value>" +
                            "</a:KeyValuePairOfstringanyType>" +
                            "</a:Parameters>" +
                            "<a:RequestId i:nil=\"true\" />" +
                            "<a:RequestName>ExecuteWorkflow</a:RequestName>" +
                        "</request>" +
                        "</Execute>" +
                    "</s:Body>" +
                    "</s:Envelope>";

        var req = new XMLHttpRequest();
        req.open("POST", url, true)
        // Responses will return XML. It isn't possible to return JSON.
        req.setRequestHeader("Accept", "application/xml, text/xml, */*");
        req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
        req.onerror = displayError;
        req.onreadystatechange = function () { assignResponse(req); };
        req.send(request);
    }
    function displayError(e) {
    alert(this.status);
    }

}

function assignResponse(req) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            alert('successfully executed the workflow');
        }
    }
}

示例:

RunWorkflow(Xrm.Page.data.entity.getId(),"21E95262-5A36-46CA-B5B5-3F5AA539A9AF","https://org.dynamics.com");