Trigger workflow with JavaScript:
if (typeof (SDK) == "undefined")
{ SDK = {
__namespace: true }; }
//This will
establish a more unique namespace for functions in this library. This will
reduce the
// potential
for functions to be overwritten due to a duplicate name when the library is
loaded.
SDK.SAMPLES = {
_getServerUrl: function () {
///<summary>
///
Returns the URL for the SOAP endpoint using the context information available
in the form
/// or
HTML Web resource.
///</summary>
var
OrgServicePath = "/XRMServices/2011/Organization.svc/web";
var
serverUrl = "";
if
(typeof GetGlobalContext == "function") {
var
context = GetGlobalContext();
serverUrl = context.getServerUrl();
}
else {
if
(typeof Xrm.Page.context == "object") {
serverUrl =
Xrm.Page.context.getServerUrl();
}
else
{
throw new Error("Unable to access the server URL"); }
}
if
(serverUrl.match(/\/$/)) {
serverUrl =
serverUrl.substring(0, serverUrl.length - 1);
}
return serverUrl + OrgServicePath;
},
ExecuteWorkflowRequest: function () {
var
requestMain = ""
requestMain += "<s:Envelope
xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
requestMain += "
<s:Body>";
requestMain += "
<Execute
xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
requestMain += "
<request i:type=\"b:ExecuteWorkflowRequest\"
xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
requestMain += "
<a:Parameters
xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
requestMain += "
<a:KeyValuePairOfstringanyType>";
requestMain += " <c:key>EntityId</c:key>";
requestMain += "
<c:value i:type=\"d:guid\"
xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">a46fa1c1-e38d-e011-86ba-1cc1dee8ea49</c:value>";
requestMain += "
</a:KeyValuePairOfstringanyType>";
requestMain += "
<a:KeyValuePairOfstringanyType>";
requestMain += "
<c:key>WorkflowId</c:key>";
requestMain += "
<c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">d009c04f-f826-4b3b-90cd-209581cfc2ff</c:value>";
requestMain += "
</a:KeyValuePairOfstringanyType>";
requestMain += "
</a:Parameters>";
requestMain
+= " <a:RequestId
i:nil=\"true\" />";
requestMain += "
<a:RequestName>ExecuteWorkflow</a:RequestName>";
requestMain += "
</request>";
requestMain += "
</Execute>";
requestMain
+= " </s:Body>";
requestMain += "</s:Envelope>";
var req
= new XMLHttpRequest();
req.open("POST", SDK.SAMPLES._getServerUrl(), 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");
var
successCallback = null;
var
errorCallback = null;
req.onreadystatechange = function () {
SDK.SAMPLES.ExecuteWorkflowResponse(req, successCallback, errorCallback); };
req.send(requestMain);
},
ExecuteWorkflowResponse: function (req, successCallback, errorCallback)
{
///<summary>
///
Recieves the assign response
///</summary>
///<param name="req" Type="XMLHttpRequest">
/// The
XMLHttpRequest response
///</param>
///<param name="successCallback"
Type="Function">
/// The
function to perform when an successfult response is returned.
/// For
this message no data is returned so a success callback is not really necessary.
///</param>
///<param name="errorCallback"
Type="Function">
/// The
function to perform when an error is returned.
///
This function accepts a JScript error returned by the _getError function
///</param>
if
(req.readyState == 4) {
if
(req.status == 200) {
if (successCallback
!= null)
{
successCallback(); }
}
else {
errorCallback(SDK.SAMPLES._getError(req.responseXML));
}
}
},
_getError:
function (faultXml) {
///<summary>
/// Parses
the WCF fault returned in the event of an error.
///</summary>
///<param name="faultXml" Type="XML">
/// The
responseXML property of the XMLHttpRequest response.
///</param>
var
errorMessage = "Unknown Error (Unable to parse the fault)";
if (typeof
faultXml == "object") {
try {
var
bodyNode = faultXml.firstChild.firstChild;
//Retrieve the fault node
for
(var i = 0; i < bodyNode.childNodes.length; i++) {
var node = bodyNode.childNodes[i];
//NOTE: This comparison does not handle the case where the XML namespace
changes
if ("s:Fault" ==
node.nodeName) {
for (var j = 0; j < node.childNodes.length; j++) {
var faultStringNode = node.childNodes[j];
if ("faultstring" == faultStringNode.nodeName) {
errorMessage =
faultStringNode.text;
break;
}
}
break;
}
}
}
catch (e) { };
}
return new
Error(errorMessage);
},
__namespace: true
};
No comments:
Post a Comment