Part-4 – Code Conversion to latest Web API (Dynamics 365)

Opportunity Close Request

Using 2011 endpoint in CRM 2011 to CRM 2016 we can call request to close opportunity like given below

//--***********************************************************************************************//
//-- Opportunity Close Request by Using 2011 End Point
//--***********************************************************************************************//
function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;

    return [year, month, day].join('-');
}

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

function OpportunityCloseRequestBy2011() {
    var closeDate = new Date();
    var description = 'Lorum ipsum';
    var actualRevenue = '2000';
    var oppId = Xrm.Page.data.entity.getId();

    var requestMain2 = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    requestMain2 += "  <s:Body>";
    requestMain2 += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
    requestMain2 += "      <request i:type=\"b:WinOpportunityRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
    requestMain2 += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
    requestMain2 += "          <a:KeyValuePairOfstringanyType>";
    requestMain2 += "            <c:key>OpportunityClose</c:key>";
    requestMain2 += "            <c:value i:type=\"a:Entity\">";
    requestMain2 += "              <a:Attributes>";
    requestMain2 += "                <a:KeyValuePairOfstringanyType>";
    requestMain2 += "                  <c:key>opportunityid</c:key>";
    requestMain2 += "                  <c:value i:type=\"a:EntityReference\">";
    requestMain2 += "                    <a:Id>" + oppId + "</a:Id>";
    requestMain2 += "                    <a:LogicalName>opportunity</a:LogicalName>";
    requestMain2 += "                    <a:Name i:nil=\"true\" />";
    requestMain2 += "                  </c:value>";
    requestMain2 += "                </a:KeyValuePairOfstringanyType>";
    requestMain2 += "                <a:KeyValuePairOfstringanyType>";
    requestMain2 += "                  <c:key>subject</c:key>";
    requestMain2 += "                  <c:value i:type=\"d:string\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">Won the Opportunity!</c:value>";
    requestMain2 += "                </a:KeyValuePairOfstringanyType>";
    requestMain2 += " <a:KeyValuePairOfstringanyType>";
    requestMain2 += " <c:key>actualend</c:key>";
    requestMain2 += " <c:value i:type=\"d:dateTime\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">" + formatDate(closeDate) + "</c:value>";
    requestMain2 += " </a:KeyValuePairOfstringanyType>";
    requestMain2 += " <a:KeyValuePairOfstringanyType>";
    requestMain2 += " <c:key>description</c:key>";
    requestMain2 += " <c:value i:type=\"d:string\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">" + description + "</c:value>";
    requestMain2 += " </a:KeyValuePairOfstringanyType>";
    requestMain2 += " <a:KeyValuePairOfstringanyType>";
    requestMain2 += " <c:key>actualrevenue</c:key>";
    requestMain2 += " <c:value i:type=\"a:Money\">";
    requestMain2 += " <a:Value>" + actualRevenue + "</a:Value>";
    requestMain2 += " </c:value>";
    requestMain2 += " </a:KeyValuePairOfstringanyType>";
    requestMain2 += "              </a:Attributes>";
    requestMain2 += "              <a:EntityState i:nil=\"true\" />";
    requestMain2 += "              <a:FormattedValues />";
    requestMain2 += "              <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
    requestMain2 += "              <a:LogicalName>opportunityclose</a:LogicalName>";
    requestMain2 += "              <a:RelatedEntities />";
    requestMain2 += "            </c:value>";
    requestMain2 += "          </a:KeyValuePairOfstringanyType>";
    requestMain2 += "          <a:KeyValuePairOfstringanyType>";
    requestMain2 += "            <c:key>Status</c:key>";
    requestMain2 += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain2 += "              <a:Value>3</a:Value>";
    requestMain2 += "            </c:value>";
    requestMain2 += "          </a:KeyValuePairOfstringanyType>";
    requestMain2 += "        </a:Parameters>";
    requestMain2 += "        <a:RequestId i:nil=\"true\" />";
    requestMain2 += "        <a:RequestName>WinOpportunity</a:RequestName>";
    requestMain2 += "      </request>";
    requestMain2 += "    </Execute>";
    requestMain2 += "  </s:Body>";
    requestMain2 += "</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(requestMain2);
}

From 2016 we can use latest web API approach like this

//--***********************************************************************************************//
//-- Opportunity Close Request by Using Web API
//--***********************************************************************************************//
function OpportunityCloseRequestByWebAPI() {
    var closeDate = new Date();
    var description = 'Lorum ipsum';
    var actualRevenue = '2000';
    var opportunityId = Xrm.Page.data.entity.getId();

    var isSuccessful = false;
    opportunityId = opportunityId.replace(/\{|\}/gi, '');
    var opportunityclose = {
        "opportunityid@odata.bind": "/opportunities(" + opportunityId + ")",//replace with id of opportunity
        "actualrevenue": actualRevenue,
        "actualend": formatDate(closeDate),
        "description": description
    };

    var parameters = {
        "OpportunityClose": opportunityclose,
        "Status": -1
    };

    var context;
    if (typeof GetGlobalContext === "function") {
        context = GetGlobalContext();
    } else {
        context = Xrm.Page.context;
    }

    var req = new XMLHttpRequest();
    req.open("POST", context.getClientUrl() + "/api/data/v8.2/WinOpportunity", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 204 || this.status === 200) {
                //Success - No Return Data - Do Something
                isSuccessful = true;
                return isSuccessful;
            } else {
                var errorText = this.responseText;
                //Error and errorText variable contains an error - do something with it
            }
        }
    };
    req.send(JSON.stringify(parameters));
    return isSuccessful;
}

Part-3 – Code Conversion to latest Web API (Dynamics 365)

Rout Item to Queue/User

Using 2011 endpoint in CRM 2011 to CRM 2016 we can route an entity record (i.e. opportunity) to a queue or user like given below

//--***********************************************************************************************//
//-- Rout Opportunity to Queue/User by Using 2011 End Point
//--***********************************************************************************************//

function getQueueItemIdFromRecord(objectId) {
    var queueItemId = null;
    //Get the customer type
    var clientURL = Xrm.Page.context.getClientUrl();
    var oDataUri = clientURL + "/xrmservices/2011/OrganizationData.svc/QueueItemSet?$select=QueueItemId&$filter=ObjectId/Id eq guid'" + objectId + "'";

    var jSonArray = new Array();
    jQuery.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataUri,
        async: false,
        beforeSend: function (XMLHttpRequest) {
            //Specifying this header ensures that the results will be returned as JSON.
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            isActiveProspect = false;
            //if return results
            if (typeof data !== "undefined" && data.d != null && typeof data.d !== "undefined") {
                if (data.d.results.length >= 1) {
                    if (data.d.results[0].QueueItemId) {
                        // alert((data.d.results[0].QueueItemId));
                        queueItemId = data.d.results[0].QueueItemId;
                    }
                }
            }
            return queueItemId;
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            alert("Error Occurred : " + errorThrown); //Error

        }
    });
    return queueItemId;
}

function RouteItem() {    
    var targetEntityName;
    var targetEntityId;
    var selection = 'User';

    var recordId = recordIds.toString().split(',');
    if (selection == "Queue") {
        targetEntityName = "queue";
        targetEntityId = '94805a7b-11dc-4e26-a0e6-f02d25ad3a25';
    }
    else if (selection == "User") {
        targetEntityName = "systemuser";
        targetEntityId = 'd029cd6e-9f95-4c69-b7a5-c7aa942013ab';
    }

    var opportunityId = '3e4c5587-8bc0-4246-aa00-cf9f50265e4e';
    var queueItemId = getQueueItemIdFromRecord(opportunityId);

        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:RouteToRequest\" 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>QueueItemId</c:key>";
        requestMain += "            <c:value i:type=\"ser:guid\" xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + queueItemId + "</c:value>";
        requestMain += "          </a:KeyValuePairOfstringanyType>";
        requestMain += "          <a:KeyValuePairOfstringanyType>";
        requestMain += "            <c:key>Target</c:key>";
        requestMain += "            <c:value i:type=\"a:EntityReference\">";
        requestMain += "              <a:Id>" + targetEntityId + "</a:Id>";
        requestMain += "              <a:LogicalName>" + targetEntityName + "</a:LogicalName>";
        requestMain += "              <a:Name i:nil=\"true\" />";
        requestMain += "            </c:value>";
        requestMain += "          </a:KeyValuePairOfstringanyType>";
        requestMain += "        </a:Parameters>";
        requestMain += "        <a:RequestId i:nil=\"true\" />";
        requestMain += "        <a:RequestName>RouteTo</a:RequestName>";
        requestMain += "      </request>";
        requestMain += "    </Execute>";
        requestMain += "  </s:Body>";
        requestMain += "</s:Envelope>";

        var orgServicePath = "/XRMServices/2011/Organization.svc/web";
        var clientURL = Xrm.Page.context.getClientUrl();
        clientURL = clientURL + orgServicePath;

        var req = new XMLHttpRequest();
        req.open("POST", clientURL, false)
        // 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.onreadystatechange = function () { Response(req, successCallback, errorCallback); };
        req.send(requestMain);
}

Using Web API in CRM 2016/Dynamics 365 we can route an entity record (i.e. opportunity) to a queue or user like given below

//--***********************************************************************************************//
//-- Rout Opportunity to Queue/User by Using Web API
//--***********************************************************************************************//

function getQueueItemIdFromRecord(objectId) {
    var queueId = null;
    objectId = objectId.replace(/\{|\}/gi, '');
    var req = new XMLHttpRequest();
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/queueitems?$select=queueitemid&$filter=_objectid_value eq " + objectId, false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                if (this.response == null || this.response == undefined) {
                    if (this.responseText != undefined) {
                        var result = JSON.parse(this.responseText);
                        if (result != null && result.value[0] != undefined && result.value[0] != null) {
                            queueId = result.value[0]['queueitemid'];
                            return queueId;
                        }
                    }
                }
                else {
                    var results = JSON.parse(this.response);
                    for (var i = 0; i < results.value.length; i++) {
                        queueId = results.value[i]["queueitemid"];
                        break;
                    }
                    return queueId;
                }
            } else {
                //Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send();
    return queueId;
}

function RouteItem() {
    var parameters = {};
    var target = {};

    var targetEntityName;
    var targetEntityId;
    var selection = 'User';

    var recordId = recordIds.toString().split(',');
    if (selection == "Queue") {
        targetEntityName = "queue";
        targetEntityId = '94805a7b-11dc-4e26-a0e6-f02d25ad3a25';
        target.queueid = targetEntityId;
    }
    else if (selection == "User") {
        targetEntityName = "systemuser";
        targetEntityId = 'd029cd6e-9f95-4c69-b7a5-c7aa942013ab';
        target.systemuserid = targetEntityId;
    }

    target["@odata.type"] = "Microsoft.Dynamics.CRM." + targetEntityName;
    parameters.Target = target;

    var opportunityId = '3e4c5587-8bc0-4246-aa00-cf9f50265e4e';
    var queueItemId = getQueueItemIdFromRecord(opportunityId);
    var queueitem = {};
    queueitem.queueitemid = queueItemId.replace(/[{}]/g, "");
    queueitem["@odata.type"] = "Microsoft.Dynamics.CRM.queueitem";
    parameters.QueueItem = queueitem;

    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/RouteTo", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.send(JSON.stringify(parameters));

    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 204 || this.status === 1223) {
                //Success - No Return Data - Do Something
                $('#loading').hide();
                window.opener.refreshPageAfterRouteClose();
                window.close();
            } else {
                //Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
}

Part-2 – Code Conversion to latest Web API (Dynamics 365)

Pick Item from Queue

Using 2011 endpoint in CRM 2011 to CRM 2016 we can pick item from queue as given below

//--***********************************************************************************************//
//-- Pick Queue From Record by Using 2011 End Point
//--***********************************************************************************************//

//--Let's suppose objectId is opportunityid for our opportunity record
function getQueueItemIdFromRecord(objectId) {

    //Get the customer type
    var clientURL = Xrm.Page.context.getClientUrl();
    //var recordId = customerId.replace("{", "").replace("}", "");
    var oDataUri = clientURL + "/xrmservices/2011/OrganizationData.svc/QueueItemSet?$select=QueueItemId&$filter=ObjectId/Id eq guid'" + objectId + "'";

    var jSonArray = new Array();
    jQuery.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataUri,
        async: false,
        beforeSend: function (XMLHttpRequest) {
            //Specifying this header ensures that the results will be returned as JSON.
            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            isActiveProspect = false;
            //if return results
            if (typeof data !== "undefined" && data.d != null && typeof data.d !== "undefined") {
                if (data.d.results.length == 1) {
                    if (data.d.results[0].QueueItemId) {
                        // alert((data.d.results[0].QueueItemId));
                        queueId = data.d.results[0].QueueItemId;
                    }
                }
            }
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            alert("Error Occurred : " + errorThrown); //Error

        }
    });
}

function pickItemFromQueue()
{
    var opportunityId = '3e4c5587-8bc0-4246-aa00-cf9f50265e4e';
    var queueItemId = getQueueItemIdFromRecord(opportunityId);
    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:PickFromQueueRequest\" 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>QueueItemId</c:key>";
    requestMain += "            <c:value i:type=\"ser:guid\" xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + queueItemId + "</c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>WorkerId</c:key>";
    requestMain += "            <c:value i:type=\"ser:guid\" xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + Xrm.Page.context.getUserId() + "</c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>RemoveQueueItem</c:key>";
    requestMain += "            <c:value i:type=\"d:boolean\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">false</c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "        </a:Parameters>";
    requestMain += "        <a:RequestId i:nil=\"true\" />";
    requestMain += "        <a:RequestName>PickFromQueue</a:RequestName>";
    requestMain += "      </request>";
    requestMain += "    </Execute>";
    requestMain += "  </s:Body>";
    requestMain += "</s:Envelope>";

    var orgServicePath = "/XRMServices/2011/Organization.svc/web";
    var clientURL = Xrm.Page.context.getClientUrl();
    var serviceURL = clientURL + orgServicePath;

    var req = new XMLHttpRequest();
    req.open("POST", serviceURL, false)
    // 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.onreadystatechange = function () { Response(req, successCallback, errorCallback); };
    req.send(requestMain);
}

From 2016 onwards we can use latest web API approach like this

//--***********************************************************************************************//
//-- Pick Queue From Record by Using Web API
//--***********************************************************************************************//
function getQueueItemIdFromRecord(objectId) {
    var queueItemId = null;
    objectId = objectId.replace(/\{|\}/gi, '');
    var req = new XMLHttpRequest();
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/queueitems?$select=queueitemid&$filter=_objectid_value eq " + objectId, false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                if (this.response == null || this.response == undefined) {
                    if (this.responseText != undefined) {
                        var result = JSON.parse(this.responseText);
                        if (result != null && result.value[0] != undefined && result.value[0] != null) {
                            queueItemId = result.value[0]['queueitemid'];
                            return queueItemId;
                        }
                    }
                }
                else {
                    var results = JSON.parse(this.response);
                    for (var i = 0; i < results.value.length; i++) {
                        queueItemId = results.value[i]["queueitemid"];
                        break;
                    }
                    return queueItemId;
                }
            } else {
                //Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send();
    return queueItemId;
}

// https://easycrmblog.wordpress.com/2016/05/20/custom-pick-button-on-queueitem/ 
function pickItemFromQueue() {
    var opportunityId = '3e4c5587-8bc0-4246-aa00-cf9f50265e4e';
    var queueItemId = getQueueItemIdFromRecord(opportunityId);
    var userId = Xrm.Page.context.getUserId().replace(/\{|\}/gi, '');

    var parameters = {};
    var systemuser = {};
    systemuser.systemuserid = userId;
    systemuser["@odata.type"] = "Microsoft.Dynamics.CRM.systemuser";
    parameters.SystemUser = systemuser;
    parameters.RemoveQueueItem = false;

    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/queueitems(" + queueItemId + ")/Microsoft.Dynamics.CRM.PickFromQueue", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.send(JSON.stringify(parameters));

    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            debugger;
            req.onreadystatechange = null;
            if (this.status === 204) {
                //Success - No Return Data - Do Something

            } else {
                //Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };    
}

References:

https://easycrmblog.wordpress.com/2016/05/20/custom-pick-button-on-queueitem/

Part-1 – Code Conversion to latest Web API (Dynamics 365)

Retrieve Multiple Records

Using 2011 endpoint in CRM 2011 to CRM 2016 we get multiple records based on certain condition like this

function retrieveMultipleRecords()
{
    var clientURL = Xrm.Page.context.getClientUrl();
    oDataSelect = "/dot_productlevelSet?$select=dot_name&amp;$filter=statecode/Value eq 0";
    var ODataURL = clientURL + "/XRMServices/2011/OrganizationData.svc" + ODataQuery;
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataSelect,
        beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Accept", "application/json"); },
        success: function (data, textStatus, XmlHttpRequest) {
            var result = data.d;
        },
        error: function (xmlHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus + "; ErrorThrown: " + errorThrown + "; Message: " + xmlHttpRequest.responseText);
        }
    });
}

From 2016 we can use latest web API approach like this

function retrieveMultipleRecordsByWebAPI()
{
    var req = new XMLHttpRequest();
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/dot_productlevels?$select=dot_name&amp;$filter=statecode eq 0", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                var results = JSON.parse(this.response);
                for (var i = 0; i &lt; results.value.length; i++) {
                    var dot_name = results.value[i]["dot_name"];
                }
            } else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send();
}

Retrieve Single Record by ID

Using 2011 endpoint in CRM 2011 to CRM 2016 we get multiple records based on certain condition like this

function retrieveSingleRecordBy2011(roleId) {
    var clientURL = Xrm.Page.context.getClientUrl();
    oDataSelect = "/RoleSet?$select=dot_name$filter=RoleId eq guid'" + roleId + "'";
    var ODataURL = clientURL + "/XRMServices/2011/OrganizationData.svc" + ODataQuery;
    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: oDataSelect,
        beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Accept", "application/json"); },
        success: function (data, textStatus, XmlHttpRequest) {
            var result = data.d;
        },
        error: function (xmlHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus + "; ErrorThrown: " + errorThrown + "; Message: " + xmlHttpRequest.responseText);
        }
    });
}

From 2016 we can use latest web API approach like this

function retrieveSingleRecordBy2011(roleId) {
roleId = roleId.replace(/\{|\}/gi, '');
    var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/roles(“+roleId +”)?$select=name", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function () {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var result = JSON.parse(this.response);
            var name = result["name"];
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();
}