lunes, 21 de mayo de 2012

Javascript: Como hacer una consulta al CRM

Hola, en este artículo empezaremos a ver ejemplos de como utilizar pequeñas funciones de javascript que suelen ser muy útiles y que suelen ser necesarias en muchos de los proyectos a los que nos solemos enfrentar en nuestro día a día.
Para empezar vamos a crear una funcionalidad relacionada con la realización de consultas de datos al CRM desde un formulario de CRM.
La descripción del método es la siguiente:

Formulario: Cuenta
Evento: OnChange()
Atributo: primarycontactid
Funcionalidad: consulta el télefono movil y el email del contacto seleccionado y los rellena en "Otro teléfono" y "Fax" respectivamente

image
El javascript puede descargarse desde la página de Codeplex de EBDDCRM, en donde también iremos añadiendo mas funciones:
http://elblogdedynamicscrm.codeplex.com/documentation
La función principal es llamada en el "OnChange" del Contacto principal:

image2
Y la función es la siguiente:

function contact_change()
{
   var contactid="";
   var telephone2=""; var fax="";
   
   var lookupItem = new Array(); 
   lookupItem = Xrm.Page.getAttribute("primarycontactid").getValue();
   if (lookupItem!=null) contactid=lookupItem[0].id;

   
   if (contactid!="")
   {
      var obj_contact=RetrieveEntityById("contact",contactid,
"mobilephone,emailaddress1");
      telephone2=obj_contact.mobilephone;
      fax=obj_contact.emailaddress1;
  

 }
   
   Xrm.Page.getAttribute("telephone2").setValue(telephone2);         
   Xrm.Page.getAttribute("fax").setValue(fax); 


}
Esta función llama al método "RetrieveEntityById" que recibe tres parámetros y nos devuelve un objeto de Javascript, con los atributos que le hemos solicitado, para que podamos recoger los valores del mismo por ejemplo simplemente haciendo "obj_contact.mobilephone".


En el código adjunto se encuentra el código completo que se puede hacer copy/paste directamente en el formulario y es totalmente funcional.


El método que realiza la consulta "RetrieveEntityById", es el siguiente:


function RetrieveEntityById(EntityName, EntityId, EntityColumns) {
    var resultXml, errorCount, msg, xmlHttpRequest;
    var arrayEntityColumns = EntityColumns.split(",");
    var xmlEntityColumns = '';
    for (var i = 0; i < arrayEntityColumns.length; i++) {
        xmlEntityColumns += "" + arrayEntityColumns[i] + "";
    }
    var soap = PopulateSoapObject(); // //Prepare the SOAP message.
    var xml = soap.Header
        + ""
        + "" + EntityName + ""
        + "" + EntityId + ""
        + ""
        + "" + xmlEntityColumns + ""
        + ""
        + ""
        + soap.Footer;
    //call function to create Soap Request to ms crm webservice 
    xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); // false = don't make async call 
    xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Retrieve");
    xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
    xmlHttpRequest.send(xml);
    // debugger;
    resultXml = xmlHttpRequest.responseXML;
    return ObjectFromXML(resultXml, arrayEntityColumns, "//RetrieveResult");
}

function PopulateSoapObject() {
    var soap = new Object();
    soap.Header = ""
        + ""
        + Xrm.Page.context.getAuthenticationHeader() + "";
    soap.Footer = "";
    return soap;
}

ObjectFromXML = function (xml, arrFields, prefix, ignoreNulls) {
    var r = {}; // Return object
    r.ok = false;
    if (xml == null) { r.errorMsg = "No XML Returned by platform!"; return r };
    var errorCount = xml.selectNodes('//error').length;
    if (errorCount != 0) {
        r.errorMsg = xml.selectSingleNode('//description').nodeTypedValue;
        return r;
    }
    if (xml == null) {
        r.errorMsg = "Null XML returned.";
        return r;
    }
    /* var recordCount = 0;
    $(xml).find(prefix.substr(2)).each(function () {
    recordCount++;
    });
    if (recordCount == 0) {
    r.errorMsg = "No Records returned.";
    return r;
    } */
    if (prefix != "") { xml = xml.selectSingleNode(prefix) }; // Grab just the first node with the prefix
    // Everything ok, now format as an object
    r.ok = true;
    for (var i = 0; i < arrFields.length; i++) {
        if (!ignoreNulls) { r[arrFields[i]] = "" }
        var node = xml.selectSingleNode("q1:" + arrFields[i]);
        if (node != null) {
            var lookup = false;
            if (arrFields[i].indexOf("id") >= 0) {
                try { // Add try loop as .text fails when atribute not present
                    var name = node.getAttributeNode("name").text;
                    var type = node.getAttributeNode("type").text;
                    if (name != null && type != null) { lookup = true }
                } catch (err) { };
            }
            if (lookup) {
                r[arrFields[i]] = { name: name, id: node.text, entityType: type} // return lookup object 
            } else {
                r[arrFields[i]] = node.text;
            }
        }
    } // for
    return r;
}             // ObjectFromXML






Espero les sea útil este post. un abrazo!

No hay comentarios:

Publicar un comentario