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.

No hay comentarios:

Publicar un comentario