domingo, 23 de febrero de 2014

Vista dinámica en campo LookUp con JavaScript CRM 2011

En Microsoft Dynamics CRM 2011 contamos con varios tipos de campos:
  • Línea de texto única.
  • Conjunto de opciones
  • Dos opciones
  • Imagen
  • Número entero
  • Número de punto flotante
  • Numero decimal
  • Divisa
  • Varias líneas de texto
  • Fecha y hora
  • Búsqueda(Éstos últimos son de nuestro interés en ésta entrada del blog)
Los campos de búsqueda o "LookUp" nos proporcionan el listado de TODOS los registros que contiene una entidad 'B' que éste relacionada con la entidad 'A' en la que hayamos creado el campo Búsqueda. 

Veamos un ejemplo:
Tendremos tres entidades relacionadas, entidad 'A' llamada: Cliente, entidad 'B' llamada: Tienda y entidad 'C' llamada: Zona; ahora bien, nuestro formulario de la entidad 'A' contiene toda la información de nuestro cliente, entre esa información contamos con dos campos LookUp: 'Zona' y 'Tienda', hasta aquí todo suena bien, sin embargo, supongamos que los usuarios de Microsoft Dynamics CRM 2011 capturan la información de 'Zona' y 'Tienda' pero una vez que seleccionan la zona, deben elegir UNA tienda de todas las que se encuentren en la zona seleccionada, pero 'Zona' contiene 50 opciones y 'Tienda' contiene 300 registros. 

Bueno, para lograrlo, podemos hacer uso de las 'Vistas', éstas nos dan la posibilidad de filtrar los registros de una entidad de acuerdo a ciertas condiciones que nosotros podemos definir. Para éste ejemplo: Listar únicamente las 'Tiendas' que pertenezcan a la 'Zona X'.
A partir de ésto parece sencillo deducir que podríamos generar una vista por cada una de nuestras zonas, pero ésto tiene un inconveniente, contamos con 50 Zonas diferentes!, tendríamos que elaborar 50 Vistas diferentes(eso suena tedioso e ineficiente).

Pero contamos con otra alternativa. Aplicar una vista dinámica a un campo Lookup con JS(JavaScript). En el caso específico que planteamos, filtraremos el lookup de 'Tienda' para que se enlisten únicamente las tiendas que pertenezcan a la zona seleccionada en el lookup 'Zona'.

Vayamos a la solución(a partir de ahora todo el código es JS):
Para aplicar una vista dinámica a un campo lookup necesitamos 3 cosas importantes
  • Un criterio de filtrado.
  • Aplicar ese filtro.
  • Mostrar los resultados.
Entonces, para el ejemplo, nuestro "Criterio de filtrado" será el valor de nuestro campo 'Zona', el cual obtendremos con el siguiente código:
var zona = Xrm.Page.getAttribute("new_zona").getValue();

Cabe recordar que al obtener el valor de los campos lookups en Microsoft Dynamics CRM 2011 nos arrojara un objectObject() que manejaremos como un Array. el cual contiene, entre otros atributos, id, name, entityType. Los cuales podremos recuperar con la siguiente notación: 
  1. object().id: contiene el ID único que genera Microsoft Dynamic CRM 2011 para identificar cada registro.
  2. object().name: contiene el valor que se muestra al usuario.
  3. object().entityType: describe la entidad a la que pertenece el registro en cuestión.
Así pues obtendremos:
alert("ID: "+zona.id+" Nombre: "+zona.name+" Entidad: "+zona.entityType);
ID: {25986987-4065-A267-4889-637E6438B4E0} Nombre: Zona A Entidad: new_zona

Ahora, una vez obtenido nuestro criterio de filtrado necesitamos aplicarlo, y como lo dice el título de esta entrada, lo aplicaremos en una "Vista" dinámica con filtro personalizado. Para ello primeramente necesitaremos realizar una "Búsqueda Avanzada" con los criterios de filtrado que necesitamos.

Una vez que estemos seguros de que nuestra "Búsqueda Avanzada" nos arroje los resultados que queremos, descargaremos el FecthXML que se genero con nuestra búsqueda.

Para obtener algo como ésto:

Antes de poder utilizar éste código XML en nuestro JS debemos hacer unas modificaciones.
  • Cambiar las comillas dobles ["] por comillas simples['](MUY IMPORTANTE!)
  • Agregar comilla doble["] al principio y al final de cada linea
  • Agregar un [+] al final de cada línea excepto la última
  • Agregar un [;] al final de la última línea
Quedando algo como ésto:


Llegados a éste punto, tendremos que identificar dos elementos que serán los que nos posibilitaran crear "Vistas" dinámicas para filtrar nuestro campo lookup 'Tienda'. ´Dichos elementos son los atributos uiname y value de la etiqueta condition. El primero contiene el "nombre" que ve el usuario(Zona A) y el segundo contiene el ID({25986987-4065-A267-4889-637E6438B4E0}) para manejo interno que utiliza Microsoft Dynamics CRM 2011, éstos atributos son los que vamos a remplazar con los valores del campo lookup 'Zona', quedando algo como ésto.

Casi hemos terminado, solo falta definir la forma en que nuestros resultados del Fetch se mostraran a nuestros usuarios.

Para finalizar necesitamos 3 características que contienen todas las vistas en Microsoft Dynamics CRM 2011:
var viewId = "{25986987-4065-A267-4889-637E6438B4E0}";
var entityName = "new_tienda";
var viewDisplayName = "Tiendas de la "+zona.name;

El viewId es un identificador único para cada uno de los elementos que conforman el CRM, el formato es siempre el mismo:
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

en nuestro caso es solo un Id de referencia, necesario para que nuestra "Vista" dinámica funcione correctamente, ya que ésta vista nunca se guarda como parte del sistema porque al ser dinámica se crea cada que se llama a la función en el evento OnChange de nuestro campo 'Zona'; el entityType define la entidad (con nombre de sistema) a la que aplicaremos la vista dinámica; viewDisplayName es el nombre que tendrá nuestra "Vista" dinámica.

Para finalizar sólo debemos escribir la siguiente línea para aplicar nuestra "Vista Dinámica" al lookup 'Tienda':
Xrm.Page.getControl("new_tienda").addCustomView(viewId,entityName, viewDisplayName, FetchCML, layoutXML, true);

Si seguimos todos los pasos correctamente obtendremos el siguiente código funcional:

Una vez desarrollado éste código, basta con ejecutarlo cada vez que nuestro lookup 'Zona' cambie de valor (evento OnChange, Al Cambiar) para poder filtrar nuestro lookup 'Tienda', así lograremos que se muestren únicamente los registros que pertenezcan a la Zona seleccionada.

viernes, 21 de febrero de 2014

Informes SSRS CRM 2011 basados en FetchXML

Introducción

Microsoft Dynamics CRM soporta 2 tipos de reportes basados en SSRS (SQL Server Reporting Services)

FilteredViews:

Hasta la versión 4.0 de Dynamics CRM la única forma soportada se basaba en peticiones (Querys) a las vistas filtradas del sistema. (FilteredViews) Cabe mencionar que después de la versión 4.0 de Dynamics CRM se agregó una nueva funcionalidad de seguridad a nivel de base de datos.
Esto significa que para acceder a las vistas filtradas se requiere autenticación basada en credenciales de windows, que este dentro del dominio de la organización, y que tenga permisos de acceso al CRM.
Esta forma de obtención de datos, dependiendo los permisos que el usuario dentro de CRM serán los datos que la vista filtrada retorne.

FetchXML:

Desde la versión 2011 de Dynamics CRM, los CRMs Online y OnPremise comparten una característica de acceso a datos para la realización de reportes:
FetchXML
Recordemos que en Dynamics CRM Online esto sucede debido a que nuestra información se encuentra alojada en la nube de Microsoft. Debido a esto solo tenemos acceso a datos a través de un FetchXML. Caso contrario a un CRM OnPremise donde los datos son alojados en nuestros propios servidores, y podemos acceder a los datos directamente de SQL Server y también usando FetchXML.

¿Por qué usar FetchXML?

Microsoft ha incluido en Dynamics CRM 2011 una variedad de utilidades de extending para que nuestro CRM trabaje exactamente como lo necesitamos, fácilmente.
Una de estas utilidades es el FetchXML.


¿Qué es FetchXML y cómo usarlo para hacer reportes?

FetchXML es propiamente un query basado en el esquema de base de datos de Dynamics CRM, se usa fácilmente modelando el 'Query' de forma gráfica (Si usamos búsquedas avanzadas). Incluso usuarios más avanzados pueden modelar sus propios Querys basados en FetchXML desde código.



Aquí un ejemplo del FetchXML:



Usando FetchXML para generar Reportes en Visual Studio 2008

Pre requisitos:


En este blog, crearemos un ejemplo rápido y básico para demostrar como poder usar FetchXML como origen de datos de nuestro reporte.
Para esto usaré un CRM online (rollout 2013) donde obtendré las cuentas registradas en Dynamics CRM y sus contactos relacionados.


Pasos para generar el reporte:

1.- Obtener FetchXML mediante búsqueda avanzada:

Obtendremos el FetchXML a partir de una vista, para este ejemplo vamos a obtener los Contactos de una cuenta especifica. Simplemente modelamos nuestra búsqueda avanzada, corroboramos que los datos que arroja son los esperados y descargamos el archivo FetchXML.

2.- Nuevo proyecto en Visual Studio

Creamos un nuevo proyecto de Visual Studio de tipo 'Report Server'


Agregamos un reporte:


Agregamos una nueva fuente de datos con estos datos muy IMPORTANTES:
  • URL de conexión a nuestro CRM 
  • Tipo de conexión ( Microsoft Dynamics CRM Fetch)
  • Credenciales de conexión a Dynamics CRM 
Tal como se muestra en el ejemplo:




En este ejemplo usamos un CRM ONLINE, en el caso de OnPremise bastará con introducir los datos con los que acedemos al CRM
Ejemplo: 
  • *dominio*\*usuario*
  • Contraseña
Ahora, ya teniendo nuestra conexión vamos a agregar un nuevo conjunto de datos  (dataSet)


En este paso es importante seleccionar la opción 'Use a dataset embedded in my report' pues aqui es donde usaremos el FetchXML como se muestra en la imagen.


Si nuestra todo en nuestro proceso ha salido bien, ahora podremos ver los datos en nuestro panel, y podemos comenzar a modelar nuestro reporte.
Vale la pena mencionar que podemos agregar tantos dataSets como nos sea necesario. Siguiendo los pasos anteriores.


Ahora solo generamos nuestro reporte:



Y lo ejecutamos:



Ahora los reportes que generemos dependerán de la dificultad o complejidad requerida. Sin embargo esta es una buena herramienta que Microsoft Proporciona para facilitar la generación de reportes de CRM