DNM+ Online
dotnetmania 2.0
Impresión desde CRM con WordML y FetchXML
Se trata de una extensión de Microsoft Dynamics CRM que permite convertir la información de cualquier entidad CRM (oferta, factura, etc.) en un documento Word, para imprimir o enviar por correo electrónico. Esta alternativa a Reporting Services se basa en FetchXML y una plantilla WML a la que añadimos etiquetas XML que transformaremos con XSL para obtener el documento final.

En este artículo describimos una manera de aumentar las posibilidades de MS-CRM con una funcionalidad que en muchos casos "se le supone" a la herramienta: la impresión de datos. No me refiero a una impresión "plana" que sirva para uso interno, sino a un formato más presentable: con gráficos, tablas etc. El tipo de documento que presentaríamos a un cliente sin avergonzarnos. Vaya por delante que la herramienta número uno para esta tarea es SQL Reporting Services. Por potencia, flexibilidad y robustez es la mejor manera de volcar a papel cualquier información contenida en nuestro CRM. De todas formas, no está mal saber que existen alternativas como la que presentamos en este artículo. Se trata de aprovechar la coincidencia de Office y CRM en un lenguaje de datos: XML. Vamos por partes: desde la versión 2003, Office integra el lenguaje WordML para expresar documentos Word en un lenguaje XML. Por otro lado, CRM permite a través del lenguaje FetchXML lanzar consultas a la aplicación que devuelven a su vez datos en XML. Seguimos dentro de XML: la tecnología XSL permite hacer transformaciones XML entre un documento origen y uno destino. De modo que si generamos la XSL necesaria, los datos de CRM se pueden convertir en un documento Word de la complejidad que necesitemos. La pregunta que surge ahora es ¿cómo generamos esta transformación XSL? Ahí radicaba el problema de esta aproximación antes de la aparición de la WordML Inference Tool (wml2xslt). Esta herramienta permite generar una XSL a partir de un documento Word cualquiera: a este documento lo llamaremos a partir de aquí la semilla. Este es el punto fuerte de esta aproximación: mientras que con Reporting Services el cliente tiene que dar una idea aproximada de qué aspecto debe tener su informe, con la aproximación WML el cliente puede darnos directamente un documento ejemplo que muestra el aspecto exacto que quiere que tenga su máscara de impresión. El desarrollador sólo tendrá que agregar los campos XML en los lugares adecuados del documento. A partir del documento semilla, la herramienta wml2xslt genera la transformación XSL necesaria. Sólo falta un punto: ¿cómo conseguimos los campos XML a insertar en el documento Word? Una opción es consultar el esquema de CRM en la dirección http://<miservidorcrm>/sdk/list.aspx y construir un ejemplo XML "a mano". Una opción más rápida es fabricar un pequeño programa que vuelque desde CRM esta información, que es lo que veremos en la próxima sección. FetchXML es un lenguaje XML para realizar consultas integrado en la plataforma de CRM. Permite establecer criterios de búsqueda, columnas deseadas, ordenación, etc. A cualquiera que haya hecho una consulta SQL le resultará familiar su funcionalidad -aunque no su sintaxis-. Por otro lado, cualquiera que haya hecho una búsqueda avanzada desde la interfaz de usuario está usando FetchXML sin saberlo. Una búsqueda guardada no es otra cosa que una consulta FetchXML almacenada que se puede lanzar a petición del usuario. Lo que véis en el fuente 1 es un ejemplo de FetchXML que devuelve información de todas las ofertas (quotes) cuyo quoteid sea "xxx" (en
negrita). Su sintaxis es sencilla de manejar y nos permite acceder de manera segura, a través del servicio Web de CRM (crmservice.asmx), a consultas complejas. Y cuando digo segura, me refiero a que tiene en cuenta el nivel de seguridad definido en CRM para el usuario que hace la consulta. Por ejemplo, aunque pida todas las cuentas de CRM, la consulta sólo devolverá aquellas para las que el usuario que la lanza tiene permisos de lectura. Ya sólo nos falta un pequeño programa que lance todo este montaje. En nuestro caso, se trata de una página ASPX que lanza la consulta, recoge los resultados, aplica la transformación y vuelca el resultado al navegador del cliente. Para más comodidad, hemos creado una serie de parámetros que nos permiten escoger la consulta (FML) y la transformación (XSL). El atributo que contiene el identificador del registro lo añade CRM automáticamente con el nombre oid gracias al parámetro PassParams=1. Copiamos la carpeta imprimir con el fichero imprimir.aspx al directorio de la Web de CRM. Solo un detalle: la consulta debe cambiar dependiendo del registro que queramos imprimir, algo que configuraremos en el atributo value del elemento condition dentro de filter. Es decir, accedemos al nodo /fetch/entity/filter/condition/@value y cambiamos su valor por el identificador que nos pase CRM. Otro detalle de imprimir.aspx en el que podemos fijarnos es la realización de la consulta. El SDK de CRM nos permite lanzar consultas al sistema de manera muy sencilla a través del servicio Web crmservice.asmx y el método fetch: Por último, el espacio de nombres Xml.Xsl nos proporciona clases que dan acceso al motor de transformaciones XSL de .NET. Solo tenemos que llamar al método Transform para aplicar una transformación XSL a un documento XML. Una opción cómoda es volcar el resultado de la transformación al stream asociado al objeto Response del formulario Web: La configuración de nuestra aplicación Web solo requiere un parámetro: la dirección del servidor CRM contra el que va a trabajar. Esto se configura como en cualquier aplicación ASP.NET, en el fichero web.config. Hemos añadido una sección appSettings donde añadimos dicho parámetro: Entramos ahora en la configuración de CRM. CRM permite agregar a su interfaz de usuario nuevas secciones, opciones de menú y botones. El fichero isv.config.xml es el que especifica cuáles son estas nuevas opciones y en qué consisten. Inicialmente, agregamos dos botones a la ficha de la entidad que nos interesa. Supongamos que es el objeto oferta (quote) lo que queremos imprimir. Fabricamos un botón para ayudarnos a generar la semilla y otro para imprimir el documento. El primer botón sólo lo usaremos durante la fase de desarrollo, más adelante lo inhabilitaremos (veáse el fuente 6). Con el primer botón ejecutaremos la página imprimir.aspx con el parametro semilla=1. Esto generará un fichero en el directorio imprimir con nombre semillaOferta.xml. Es importante que lancemos este proceso desde un registro de CRM que tenga todos los datos que queramos imprimir; de otra manera no aparecerán en la semilla. Abrimos este fichero con Word 2003: veremos los distintos campos devueltos por CRM como etiquetas XML (ojo: los campos en blanco no aparecerán). Por otro lado, sin cerrar el otro fichero, abrimos en el mismo Word el ejemplo de impresión que nos ha proporcionado el cliente. Seleccionamos todo el fichero y lo copiamos al fichero semilla.xml que aún mantenemos abierto. Ahora queda la parte más tediosa: colocar cada cosa en su sitio trasladando las etiquetas XML a su lugar correspondiente. Ya estamos terminando: nuestro fichero semilla.xml casi está listo para ser utilizado. Sólo tenemos que guardarlo con formato XML a través del menú "Fichero" de Word en la opción "Guardar como..." escogiendo como formato XML (ojo: la casilla "Guardar datos solamente" debe estar inhabilitada). La semilla ya está lista: podemos cerrar todos los documentos de Word. Lo siguiente es lanzar la aplicación wml2xslt que, como su nombre sugiere, convierte un documento WML en una transformación XSL. Su sintaxis es:

wml2xslt semillaOferta.xml -o oferta.xsl

Con este último punto acabamos de generar la transformación XSL que necesita nuestra página imprimir.aspx con el siguiente formato (esto es lo que configuramos previamente en el fichero de configuración isv.config.xml):

imprimir.aspx?fml=oferta&xsl=oferta

Para probar la impresión, vamos al registro de CRM que hemos creado para las pruebas, abrimos su formulario y pulsamos el botón "Imprimir". Aparecerá un diálogo de confirmación para guardar o abrir el documento, que tendrá como título el nombre de la XSL pero con extensión .doc. Por último, si todo ha ido bien, ya podemos quitar de CRM el botón de "Generar semilla". Lo más cómodo sería comentar la línea, lo que en sintaxis XML tiene el siguiente aspecto: Conclusiones En este artículo hemos visto una forma alternativa de imprimir desde CRM a través de la tecnología XML y gracias a la inclusión del lenguaje de consulta FetchXML en la aplicación. En un principio puede parecer largo, pero con la práctica veréis cómo se puede convertir en una herramienta de productividad muy ventajosa. Recordad que el trabajo de decir "dónde va cada cosa", de elegir gráficos, diseñar tablas, etc., lo está realizando el cliente, que además estará más satisfecho por ver que el resultado es exactamente como él lo quiere, y que los cambios que haya que realizar se aplican rápidamente: solo hay que enviarle la semilla y pedirle que cambie lo que quiera para luego repetir el paso de generación con wml2xslt. Toda la estructura que hemos montado puede permanecer intacta, cambiando como mucho el fichero .fml para incluir o excluir atributos.

blog comments powered by Disqus
autor
referencias