Run Action in Microsoft Dynamics CRM 2016 using Ja

2019-09-05 18:03发布

I've created an Action under Process for a custom entity new_enrollment. I've created no I/O argument for that action. Now, by using following code snippet I want to run that custom action so that when action is executed a plugin get fired and create a phone call.

But it seems that action is not get executed. Any suggestion or help so that I can get action executed.

function emailOrderDetails(){

    var entityId = Xrm.Page.data.entity.getId();
    var entityName = "new_enrollment";
    var requestName = "new_sendemail";
    RunAction(entityId, entityName, requestName);
    window.location.reload(true);
}

function RunAction(entityId, entityName, requestName) {
    try{

    // Creating the request XML for calling the Action
     var requestXML = ""
    requestXML += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    requestXML += "  <s:Body>";
    requestXML += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
    requestXML += "      <request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
    requestXML += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
    requestXML += "          <a:KeyValuePairOfstringanyType>";
    requestXML += "            <b:key>Target</b:key>";
    requestXML += "            <b:value i:type=\"a:EntityReference\">";
    requestXML += "              <a:Id>" + entityId + "</a:Id>";
    requestXML += "              <a:LogicalName>" + entityName + "</a:LogicalName>";
    requestXML += "              <a:Name i:nil=\"true\" />";
    requestXML += "            </b:value>";
    requestXML += "          </a:KeyValuePairOfstringanyType>";
    requestXML += "        </a:Parameters>";
    requestXML += "        <a:RequestId i:nil=\"true\" />";
    requestXML += "        <a:RequestName>" + requestName + "</a:RequestName>";
    requestXML += "      </request>";
    requestXML += "    </Execute>";
    requestXML += "  </s:Body>";
    requestXML += "</s:Envelope>";
    var req = new XMLHttpRequest();
    req.open("POST", GetClientUrl(), 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(requestXML); 
    //Get the Response from the CRM Execute method
    //var response = req.responseXML.xml;
    }
    catch(e){
        alert(e.Message);
    }
}

function GetClientUrl() {
    if (typeof Xrm.Page.context == "object") {
        clientUrl = Xrm.Page.context.getClientUrl();
    }
    var ServicePath = "/XRMServices/2011/Organization.svc/web";
    return clientUrl + ServicePath;
}

1条回答
小情绪 Triste *
2楼-- · 2019-09-05 18:18

you are using 2016 which supports WebAPI and its very easy using WebAPI. Below is the working example of calling custom action using JS. I have 2 output variables, one get set by custom action and the other one "ptext" by plugin which i have registered on this Action. Hope it will solve your problem.

function CallCAction(context) {       
 var Credit_Limit = Xrm.Page.getAttribute("creditlimit").getValue();
    var Credit_hold = Xrm.Page.getAttribute("creditonhold").getValue();
    if(Credit_hold !=null && Credit_Limit!=null){
        var actionName = "new_Preferred_Check";
        var inputParam = {
            "Credit_Limit": Credit_Limit,
            "Credit_hold": Credit_hold
        };
        Xrm.Page.ui.setFormNotification("Processing...","INFO","processingFId");
        var actionResponse = callPreferredCust(actionName, inputParam);

        if (actionResponse != null) {
            Xrm.Page.getAttribute("new_preferredcust").setValue(actionResponse.Preferred_Cust);
            alert(actionResponse.ptext);
            Xrm.Page.ui.clearFormNotification("processingFId");
        }        
    }    
}
function callPreferredCust(actionName, inputParam) {
    var result = null;
    var req = new XMLHttpRequest();
    var uri = Xrm.Page.context.getClientUrl() + "/api/data/v8.2/";
    try {
        req.open("POST",encodeURI(uri+actionName),false);
        req.setRequestHeader("Accept", "application/json");
        req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        req.setRequestHeader("OData-MaxVersion", "4.0");
        req.setRequestHeader("OData-Version", "4.0");
        req.onreadystatechange = function () {
            if(this.readyState==4){
                req.onreadystatechange = null;
                if(this.status==200){
                    result = JSON.parse(this.response);
                }else{
                    var err = JSON.parse(this.response).error;
                    alert(err.message);
                }
            }
        };
        req.send(JSON.stringify(inputParam));
        return result;

    }catch(err){
        alert(err.message);
    }
}
查看更多
登录 后发表回答