简体   繁体   中英

CRM 2011 - Enable workflow onload of lead entity using javascript?

I've checked through the forum and cant seem to get what i need to work.

On the lead entity, when a user creates a new lead a Workflow runs just before to change some lead fields.

I found out this is only possible through javascript and onload in the entity settings.

I've created the Workflow and a JavaScript file and set it to run onload. The Javascript i have used is:

function callworkfow(workflowId, entityId) {
var 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>B3D77337-D5FD-E211-BB05-005056AF0003</c:key>
  <c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization/">EntityIdValue</c:value>
      </a:KeyValuePairOfstringanyType>
      <a:KeyValuePairOfstringanyType>
        <c:key>2EF8C158-182B-444A-A9DF-FF2DC5E44514</c:key>
        <c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization /">WorkflowIdValue</c:value>
      </a:KeyValuePairOfstringanyType>
    </a:Parameters>
    <a:RequestId i:nil="true" />
    <a:RequestName>ExecuteWorkflow</a:RequestName>
  </request>
    </Execute>
  </s:Body>
</s:Envelope>

var xhr = new XMLHttpRequest();
xhr.open('POST', '/XRMServices/2011/Organization.svc/web', true);

xhr.setRequestHeader('Accept', 'application/xml, text/xml, */*');
xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute');

xhr.onreadystatechange = function () { alert(xhr.status); };
xhr.send(request);
}

However this fails to load.

If anyone could help me i would be very grateful. Just need the JavaScript to simply load a Workflow. Oh and with cross platform compatibility.


function SetLookupValue(fieldName, id, name, entityType) {
    if (fieldName != null) {
        var lookupValue = new Array();
        lookupValue[0] = new Object();
        lookupValue[0].id = id;
        lookupValue[0].name = name;
        lookupValue[0].entityType = entityType;
        Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
    }
}

var ExistingCase = curentUserId = Xrm.Page.context.getUserId();
if (ExistingCase.getValue() != null) {
    var ExistingCaseGUID = ExistingCase.getValue()[0].id;
    var ExistingCaseName = ExistingCase.getValue()[0].name;
    SetLookupValue("new_accountmanager", ExistingCaseGUID, ExistingCaseName, "incident");
}

please check following code, it worked fine for me last time i used it:

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.Workflow = {
           _getServerUrl: function () {
               ///<summary>
               /// Returns the URL for the SOAP endpoint using the context information available in the form
               /// or HTML Web resource.
               ///</summary>
               var ServicePath = "/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 + ServicePath;
               }, 
           ExecuteRequest: 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/\">267d4790-e41a-e311-b6a7-3c4a92db481b</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/\">a6832cc5-1d82-48f5-a940-e41269726204</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.Workflow._getServerUrl(), false)
               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.send(requestMain);
               //work with the response here
               var strResponse = req.responseXML.xml;
               alert(strResponse.toString());
           },
 __namespace: true
};

UPDATE:--------------

My previous answer was direct to question. Now providing new answer due to question comments. As it's said in comments workflows can be run only over existing records, but as you said you want to change some field on creation form: record is not saved yet. To do that you must use Xrm object as it is shown below:

function OnLoadingForm() {
    var FormType = Xrm.Page.ui.getFormType();
    if (FormType != null) {
        switch (FormType) {
            case 1:
                //  It's a "create" form
                var test = "Mr.";                    
                Xrm.Page.getAttribute("salutation").setValue(test);
                break;
            case 2:
                //  It's a "update" form                              
                break;
            case 3:
                // It's a "readonly" form
                break;
            case 4:
                // It's a "disabled" form
                break;
            case 6:
                // It's a  "bulkedit" form
                break;
            default:
                break;
        }
    }
}

This code works on classic CRM forms (Information forms in customizations). New release may change this. "salutation" is name of field from customizations. Notice that this field change is only on form and will be saved to CRM DB after user clicks Save button.

UPDATE 2:----------- Due to new circumstances new code snippet:

function OnLoadingForm() {
    // Get the current FormType
    var FormType = Xrm.Page.ui.getFormType();      
    if (FormType != null) {
        switch (FormType) {
            case 1:
                //  It's a "create" form                

                var curentUserId = Xrm.Page.context.getUserId();
                var serverUrl;
                if (Xrm.Page.context.getClientUrl !== undefined) {
                    serverUrl = Xrm.Page.context.getClientUrl();
                } else {
                    serverUrl = Xrm.Page.context.getServerUrl();
                }
                var ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc"; 
                var userRequest = new XMLHttpRequest(); 
                userRequest.open("GET", ODataPath + "/SystemUserSet(guid'" + Xrm.Page.context.getUserId() + "')", false); 
                userRequest.setRequestHeader("Accept", "application/json"); 
                userRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
                userRequest.send();
                if (userRequest.status === 200) {
                    var retrievedUser = JSON.parse(userRequest.responseText).d; 
                    var userFullName = retrievedUser.FullName;        
                    SetLookupValue("new_accountmanager", curentUserId, userFullName, "systemuser");
                }
                else {
                    return "error";
                }
                break;
            case 2:
                //  It's a "update" form               
                break;
            case 3:
                // It's a "readonly" form
                break;
            case 4:
                // It's a "disabled" form
                break;
            case 6:
                // It's a  "bulkedit" form
                break;
            default:
                break;
        }
    }
}

function SetLookupValue(fieldName, id, name, entityType) {
    if (fieldName != null) {
        var lookupValue = new Array();
        lookupValue[0] = new Object();
        lookupValue[0].id = id;
        lookupValue[0].name = name;
        lookupValue[0].entityType = entityType;
        Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM