在 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");
我需要创建一个 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 操作中选择工作流。你最终会得到这样的表格。
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");