Tuesday, October 11, 2011

CRM 4.0 - Call Microsoft dynamics CRM Service through Javascript to retrieve records (crm 4.0/2011)



//utility
function MischiefMayhemSOAP(xmlSoapBody, soapActionHeader) {
    var xmlReq = "<?xml version='1.0' encoding='utf-8'?>"
    + "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"
    + "  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"
    + "  xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"
    + GenerateAuthenticationHeader()
    + "  <soap:Body>"
    + xmlSoapBody
    + "  </soap:Body>"
    + "</soap:Envelope>";
    var httpObj = new ActiveXObject("Msxml2.XMLHTTP");
    httpObj.open('POST', '/mscrmservices/2007/crmservice.asmx', false);
    httpObj.setRequestHeader('SOAPAction', soapActionHeader);
    httpObj.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
    httpObj.setRequestHeader('Content-Length', xmlReq.length);
    httpObj.send(xmlReq);
    var resultXml = httpObj.responseXML;
    var errorCount = resultXml.selectNodes('//error').length;
    if (errorCount != 0) {
        var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
        alert("The following error was encountered: " + msg);
        return null;
    } else {
        return resultXml;
    }
}
// retrieve by entityId
function RetrieveRecord(entityName, entityId, attrArray) {
    var xmlSoapBody = ""
    + "    <Retrieve xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"
    + "      <entityName>" + entityName + "</entityName>"
    + "      <id>" + entityId + "</id>"
    + "      <columnSet xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:ColumnSet'>"
    + "        <q1:Attributes>";
    for (index in attrArray) {
        xmlSoapBody += "          <q1:Attribute>" + attrArray[index] + "</q1:Attribute>";
    }
    xmlSoapBody += ""
    + "        </q1:Attributes>"
    + "      </columnSet>"
    + "    </Retrieve>";
    var resultXml = MischiefMayhemSOAP(xmlSoapBody, 'http://schemas.microsoft.com/crm/2007/WebServices/Retrieve');
    if (resultXml != null) {
        var resultArray = new Array();
        for (index in attrArray) {
            if (resultXml.selectSingleNode("//q1:" + attrArray[index]) != null) {
                resultArray[index] = resultXml.selectSingleNode("//q1:" + attrArray[index]).nodeTypedValue;
            } else {
                resultArray[index] = null;
            }
        }
        return resultArray;
    } else {
        return null;
    }
}
//retrieve by xml criteria
function RetrieveMultiple(entityName, attrArray, distinct, criteriaXml) {
    var xmlSoapBody = ""
    + "    <RetrieveMultiple xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"
    + "      <query xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:QueryExpression'>"
    + "        <q1:EntityName>" + entityName + "</q1:EntityName>"
    + "        <q1:ColumnSet xsi:type='q1:ColumnSet'>"
    + "          <q1:Attributes>";
    for (index in attrArray) {
        xmlSoapBody += "            <q1:Attribute>" + attrArray[index] + "</q1:Attribute>";
    }
    xmlSoapBody += ""
    + "          </q1:Attributes>"
    + "        </q1:ColumnSet>"
    + "        <q1:Distinct>" + distinct + "</q1:Distinct>"
    + criteriaXml
    + "      </query>"
    + "    </RetrieveMultiple>";
    var resultXml = MischiefMayhemSOAP(xmlSoapBody, 'http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple');
    if (resultXml != null) {
        var resultArray = new Array();
        var entityNodes = resultXml.selectNodes("//RetrieveMultipleResult/BusinessEntities/BusinessEntity");
        if (entityNodes.length > 0) {
            for (var index = 0; index < entityNodes.length; index++) {
                var entityNode = entityNodes[index];
                resultArray[index] = new Array();
                // on the 2 selectsinglenode lines with ./ (you could drop the ./ altogether if you wanted)
                for (attrIndex in attrArray) {
                    if (entityNode.selectSingleNode("q1:" + attrArray[attrIndex]) != null) {
                        resultArray[index][attrIndex] = entityNode.selectSingleNode("q1:" + attrArray[attrIndex]).nodeTypedValue;
                    } else {
                        resultArray[index][attrIndex] = null;
                    }
                }
            }
            return resultArray;
        } else {
            return null;
        }
    } else {
        return null;
    }
}

No comments:

Post a Comment