domingo, 22 de septiembre de 2013

Autosave en Dynamics CRM 2013

En el nuevo Dynamics CRM 2013, la funcionalidad de Autosave, hasta ahora solo disponible para CRM 2011 Online, se despliegue para todos los formularios de CRM. Esta funcionalidad por lo tanto se convierte en una funcionalidad general de Dynamics CRM. Esto es una funcionalidad que aporta mucho a los usuarios, ya que hace mucho mas ágil el funcionamiento, permitiendo que el guardado de datos sea algo automático.
A pesar de esto, en muchos entornos, es posible que esto puede provocar funcionamientos no esperados, por esto primero intentaré explicar como funciona, para luego ver alternativas posibles.
El autosave funciona de la siguiente manera:
Al abrir un formulario de CRM aparece en la parte inferior derecha un disco:
image
Al modificar cualquiera de los campos del formulario cambia a lo siguiente:
image
Cada 30 segundos a partir del primer cambio, los datos modificados (los “Dirty”) se envían al servidor y se guardan:
image
Cuando esto ocurre hay que tener en cuenta lo siguiente:
1) Todos los plugins relacionados se disparan (síncronos y asíncronos)
2) Todos los workflows relacionados se disparan (síncronos y asíncronos)
3) El formulario hace un “refresh” de los datos, sin hacer un “postback” de toda la página.
4) Los eventos del Save del formularios son ejecutados
5) Al hacer un Autosave, los eventos del “load” del formulario no se disparan (solo se disparan al cargar el formulario por primera vez). De hecho estos eventos tampoco se disparan si se hace un Save manual. Es decir, para que el Load se vuelva a ejecutar, hay que cargar de nuevo el formulario (hacer un postback).
6) No existe botón de guardar de forma manual en el menú superior, pero dándole al disco se puede grabar manualmente.
Ok, así es como funciona el Autosave. Lo bueno es que podemos deshabilitar esta funcionalidad de forma global para todo el CRM en la configuración de la organización:
image
Una vez deshabilitado el autosave, en el formulario aparece un nuevo botón de Guardar (como en CRM 2011):
image
Ok, hasta aquí todo bien. Pero el problema surgirá cuando un cliente nos pida deshabilitar el Autosave, pero solo para determinadas entidades. Para esto no hay nada previsto a nivel de configuración, sino que se debe controlar a través de código en Javascript.
Para esto, primero creamos un WebResource de tipo Javascript con el siguiente método (el número 70, nos dice que es un Autosave):
   1: function preventAutoSave(econtext) {
   2:     var eventArgs = econtext.getEventArgs();
   3:     if (eventArgs.getSaveMode() == 70 || eventArgs.getSaveMode() == 2) {
   4:         eventArgs.preventDefault();
   5:     }
   6: }
   7:  


image

Luego añadimos la llamada en el OnSave del formulario a dicho método:

image


image


Una vez publicados los cambios, el Autosave deja de funcionar para el formulario en que hemos añadido este código.

Para el usuario final es como si no existiese el Autosave, es totalmente transparente. Si el usuario intenta cerrar la ventana, aparece la típica advertencia de que los cambios no están guardados:

image

Y si intentas navegar a otra página ocurre lo mismo:

image

Si el usuario quiere guardar los cambios deberá hacer click en donde se muestra a continuación de forma manual:

image
Espero les sea de ayuda este pequeño resumen, y a tenerlo en cuenta para nuevas implementaciones con Dynamics CRM 2013!

No hay comentarios:

Publicar un comentario