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.