Hoy en día, está más que claro que los Servicios Web han llegado para quedarse, por lo menos, para quedarse lo que se suelen quedar las tecnologías; unos cuantos añitos hasta que algo mejor revolucione el mundillo. Pero el caso es que la utilización de servicios web puede ser de grandísima utilidad en la personalización de Microsoft Dynamics CRM, y no sólo desde código .Net como se tiende a pensar. Hoy intentaremos ver un ejemplillo de cómo esto es posible, y así reforzar la idea de la capacidad que tiene JavaScript junto con opciones ISV para personalizar el CRM como veíamos en el post anterior.
Supongo que la mayoría ya habéis oído hablar de AJAX (Asynchronous JavaScript and XML), una gran herramienta que nos permite utilizar Servicios Web desde JavaScript, y de las enormes posibilidades de interactividad que proporciona a los interfaces web. Y como los clientes de Microsoft Dynamics CRM son en sí interfaces web, aún que utilicemos el cliente Outlook los formularios son webs, AJAX también es aplicable a la personalización del CRM.
Vale, ya sabemos que podemos utilizar AJAX, que por lo tanto podemos llamar a Servicios Web desde código JavaScript personalizado en Microsoft CRM. Pero… ¿Y para qué lo utilizamos? Pues vamos a ver un sencillo ejemplo en el que nos podría ayudar, y así seguro que ya se nos empiezan a ocurrir más.
Si recordáis, en el último post vimos como incluir botones personalizados en las barras de herramientas de Microsoft Dynamics CRM. Bueno, pues imaginad que queremos insertar un botón que nos permita consultar datos bursátiles online de una cuenta directamente desde la ficha. Insertar el botón ya sabemos cómo se puede hacer porque ya lo vimos, pero cómo usamos AJAX para llamar a servicios web no está tan claro.
Para utilizar AJAX no tenemos más que instanciar el objeto ActiveX Microsoft.XMLHTTP, y llamar al servicio web que deseamos utilizando el método GET. En nuestro ejemplo vamos a llamar a un servicio web de WebServicex, un sitio que proporciona servicios web de utilidad y gratuitos, para consultar la cotización de la cuenta. Una vez instanciado, hacemos la llamada al servicio web componiendo la url del servicio y concatenándole el símbolo de cotización que tenemos en el campo tickersymbol de la entidad account.
//Server
var serverUrl = «http://www.webservicex.net»;
// Get stock quote.
symbol = crmForm.all.tickersymbol.DataValue;
// Instantiate at connection to the Web service and call the get method.
var xmlhttp = new ActiveXObject(«Microsoft.XMLHTTP»);
xmlhttp.open(«get», serverUrl + «/stockquote.asmx/GetQuote?symbol=»+escape(symbol), false);
xmlhttp.send();
Una vez realizada la consulta recibiremos una respuesta XML con un montón de información bursátil sobre el símbolo. Ahora tenemos que parsear el XML y quedarnos con lo que nos interesa. Para ello, y aunque hay métodos mejores, tomamos los substring que nos interesan de la respuesta y listo.
//Tags for XML response
var startNameTag = «Name»;
var endNameTag = «/Name»;
var startLastTag =»Last»;
var endLastTag = «/Last»;
var startMarketTag =»MktCap»;
var endMarketTag = «/MktCap»;
// Get Name
var valueStart = 0;
var valueEnd = 0;
valueStart = xmlhttp.responseXML.xml.indexOf(startNameTag, valueEnd) + startNameTag.length+4;
valueEnd = xmlhttp.responseXml.xml.indexOf(endNameTag, valueEnd+1)-4;
name= xmlhttp.responseXML.xml.substring(valueStart, valueEnd);
//Get Last Value
var valueStart = 0;
var valueEnd = 0;
valueStart = xmlhttp.responseXML.xml.indexOf(startLastTag, valueEnd) + startLastTag.length+4;
valueEnd = xmlhttp.responseXml.xml.indexOf(endLastTag, valueEnd+1)-4;
last= xmlhttp.responseXML.xml.substring(valueStart, valueEnd);
// Get Market Capitalization
var valueStart = 0;
var valueEnd = 0;
valueStart = xmlhttp.responseXML.xml.indexOf(startMarketTag, valueEnd) + startMarketTag.length+4;
valueEnd = xmlhttp.responseXml.xml.indexOf(endMarketTag, valueEnd+1)-4;
marketCap= xmlhttp.responseXML.xml.substring(valueStart, valueEnd);
Y mostramos los resultados en cuadro de diálogo para simplificar. Aunque bien podríamos haber insertado los valores en campos del formulario para que quedasen almacenados, por ejemplo, guardar un dato interesante como es la capitalización de mercado de nuestro cliente.
// Show results
alert(«Valor de las acciones de «+ name +»: n»+last+»n Capitalización: «+marketCap);
Bueno como veis no es excesivamente complicado llamar a servicios web desde código de lado cliente en Microsoft Dynamics CRM. Y lo mejor es que esto nos abre multitud de posibilidades, no sólo para llamar a servicios web externos, sino para contactar con nuestras propias aplicaciones o incluso utilizar los propios servicios web de Microsoft CRM. No me diréis que no se os ocurren muchas posibilidades ¿no? En el SDK hay más ejemplos e información así que ya sabéis.
Bueno, espero que este post y el anterior os hayan servido para ver que siempre hay que tener en cuenta las personalizaciones de script de lado cliente antes de lanzarnos a cosas más complejas. A partir de hoy morirán menos moscas a cañonazos.
Saludos,
Marco Amoedo Martínez