jueves, 10 de septiembre de 2009

Web services de CRM desde Javascript

Muchas veces necesitamos desde el propio formulario del CRM acceder al servidor a través del Javascript.
Como todos sabemos, es posible acceder a los web services desde el javascript de los formularios. Lo interesante es que además de ser posible, es una funcionalidad totalmente soportada por CRM, así que vamos a utilizarla!
La documentación en la SDK esta aquí: Accessing Microsoft Dynamics CRM Web Services
Ahora intentaré poner algunas funciones en Javascript que pueden ser de gran utilidad para dar mas "Vida" a nuestras implantaciones de CRM.

La siguiente función nos devuelve en un "Alert()" el Guid del Usuario, de la Unidad de negocio y de la organización:

function GetCurrentUserInfo()
{
var SERVER_URL = "http://localhost";
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", SERVER_URL + "/mscrmservices/2007/crmservice.asmx", false);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute");

var soapBody = ""+
""+
""+
"
";

var soapXml = " "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'>";

soapXml += GenerateAuthenticationHeader();
soapXml += soapBody;
soapXml += "
";

xmlhttp.send(soapXml);
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(xmlhttp.responseXML.xml);

var userid = xmlDoc.getElementsByTagName("UserId")[0].childNodes[0].nodeValue;
var buid = xmlDoc.getElementsByTagName("BusinessUnitId")[0].childNodes[0].nodeValue;
var orgid = xmlDoc.getElementsByTagName("OrganizationId")[0].childNodes[0].nodeValue;

alert("UserId: " + userid + "\r\nBusinessUnitId: " + buid + "\r\nOrganizationId: " + orgid);

}

La siguiente función dispara un Workflow desde Javascript:

ExecuteWorkflow = function(entityId, workflowId)
{
var xml = "" +
"" +
"" +
GenerateAuthenticationHeader() +
" " +
" " +
" " +
" " + entityId + "" +
" " + workflowId + "" +
"
" +
"
" +
"
" +
"
" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Execute");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);
var resultXml = xmlHttpRequest.responseXML;
return(resultXml.xml);
}

/* la llamada a la función*/
var theWorkflowId = "3FD2DD58-4708-43D7-A21B-F0F90A0AA9F2"; //Id del workflow
ExecuteWorkflow(crmForm.ObjectId, theWorkflowId);

La siguiente función recoge un valor de un atributo de una entidad pasándole su Guid:

alert(GetAttributeValueFromID("systemuser", "09DF2AB7-E16D-DD11-88F3-0003FF884968", "internalemailaddress", "systemuserid"));

function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, sID)
{
var xml = "" +
"" +
"" +
GenerateAuthenticationHeader() +
" " +
" " +
" " +
" "+sEntityName+"" +
" " +
" " +
" "+sAttributeName+"" +
"
" +
"
" +
" false" +
" " +
" 1" +
" 1" +
"
" +
" " +
" And" +
" " +
" " +
" "+sID+"" +
" Equal" +
" " +
" "+sGUID+"" +
"
" +
"
" +
"
" +
"
" +
"
" +
"
" +
"
" +
"
" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");

xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);

// obtiene la respuesta y busca el valor del atributo
var result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName);
if (result == null)
return "";
else
return result.text;
}

Estas funciones de javascript las he recogido desde el Blog de Jim Wang's, que creo que es uno de los que mejores ejemplos de código de javascript tiene publicados en su blog.

Un abrazo y espera les sirvan,

No hay comentarios:

Publicar un comentario