Cambiar la vista por defecto de la historia de actividades

Para abrir la segunda era de este blog, me gustaría compartir con vosotros un pequeño código en JavaScript para Microsoft Dynamics CRM 4.0 que permite fijar la vista por defecto del histórico de actividades de “Los últimos 30 días” a “Todas”.

Este es un requisito que me he encontrado bastante a menudo en organizaciones que hacen un uso intensivo del CRM para registrar las interacciones con sus clientes, y en el que las interacciones en forma de actividades ocurren con una frecuencia no demasiado alta.

El caso es que por defecto Microsoft Dynamics CRM 3.0 y 4.0 en la vista de historia filtran por defecto las actividades cerradas en los últimos 30 días. Esto quiere decir que al abrir la vista de historial, por ejemplo en un contacto, puede ser que no se muestre ninguna actividad ya que estas han sido completadas hace más de treinta días.

clip_image002

Este comportamiento es para muchos usuarios es un poco inconveniente, ya que han de acordarse de cambiar el filtro de “Últimos 30 días” a “Todas” para poder ver las últimas actividades realizadas con este cliente.

Probablemente algunos conoceréis un código publicado por mi amigo Michael Höehne que permitía solventar este problema para el caso de CRM 3.0. Por si no os acordáis aquí está un post en su blog explicando cómo cambiar la vista por defecto en CRM 3.0.

Lo malo, es que este código no funciona en Microsoft Dynamics CRM 4.0, es lo que tiene utilizar personalizaciones no soportadas, a veces dejan de funcionar al actualizar la versión J Sin embargo, la buena noticia es que después de pelearme un poco con este código y utilizando Visual Studio para depurar el JavaScript, he dado con la causa del fallo en CRM 4.0 y la solución.

Antes de nada pongamos el código.



   1: /*************************************************************
   2: BEGIN SET THE DEFAULT VIEW OF ACTIVTY HISTORY TO ALL
   3: **************************************************************/
   4: if (crmForm.FormType==2 || crmForm.FormType==3 || crmForm.FormType==4)
   5: { 
   6: var DEFAULT_VIEW = “All”;
   7: /**************************************************************
   8: * Change the default view of a view selection combo box
   9: **************************************************************/
  10: SetDefaultView = function(viewCombo, viewName) { 
  11:  
  12:     /* If the view has already been set, we don’t need to do it again. */
  13:     if (viewCombo.value != viewName) { 
  14:  
  15:         /* Set the new view */
  16:         viewCombo.value = viewName; 
  17:  
  18:         /* Call FireOnChange to run the code in the appropriate HTML control.
  19:          * Without this call, only the selection in the combo box changes,
  20:          * but not the content of the grid */
  21:         viewCombo.FireOnChange();
  22:     }
  23: } 
  24:  
  25: /**************************************************************
  26: * Event handler. Called whenever the ready state of the 
  27: * areaActivityHistoryFrame changes. 
  28: **************************************************************/
  29: areaActivityHistoryFrame_OnReadyStateChange = function() { 
  30:  
  31:     /* Waiting until the frame has finished loading */
  32:     if (this.readyState == “complete”) { 
  33:  
  34:         /* This is the frame we’re interested in */
  35:         var frame = document.frames(“areaActivityHistoryFrame”); 
  36:  
  37:         /* And this is the view combo box */
  38:         var viewCombo = frame.document.getElementById(“actualend”); 
  39:  
  40:         /* The view combo box uses a style sheet that references a HTML
  41:          * control. We have to wait until the htc file is loaded, 
  42:          * otherwise the call to FireOnChange in the SetDefaultView
  43:          * method will fail. */
  44:         if (viewCombo.readyState == “complete”) { 
  45:  
  46:             /* If the control already has finished loading, we can
  47:              * directly set the new view. */
  48:             SetDefaultView(viewCombo, DEFAULT_VIEW);
  49:         } 
  50:  
  51:         else {
  52:             /* Otherwise we have to register another event handler
  53:              * waiting until all of the include files used by the 
  54:              * combo box are loaded as well. */
  55:             viewCombo.onreadystatechange = function() {
  56:                 if (this.readyState == “complete”) {
  57:                     SetDefaultView(this, DEFAULT_VIEW);
  58:                 }
  59:             }
  60:         }
  61:     }
  62: } 
  63:  
  64: /**************************************************************
  65: * loadNavItem. Instead of using the function LoadArea 
  66: * available in the CRM intenal code we have to use this modified 
  67: * function to avoid a problem loading the breadcrumb.
  68: **************************************************************/
  69: loadNavItem = function (navItemName)
  70: {
  71:     var o = document.getElementById(navItemName);
  72:     crmNavBar.down(o);
  73: } 
  74:  
  75: /* Load the history area.*/
  76: loadNavItem(‘navActivityHistory’); 
  77:  
  78: /* Immediately switch back to the main form. The previous line is needed
  79: * to initialize the history frame. This line switches back immediately,
  80: * so you see the main application form while the history frame is loaded
  81: * in the background. 
  82: */
  83: loadNavItem(‘navInfo’); 
  84:  
  85: /* We have to wait until the the history frame was completely loaded, so
  86: /* we register a new event handler, calling the code above. */
  87: document.frames(“areaActivityHistoryFrame”).document.onreadystatechange = areaActivityHistoryFrame_OnReadyStateChange; 
  88:  
  89: }
  90: /*************************************************************
  91: END SET THE DEFAULT VIEW OF ACTIVTY HISTORY TO ALL
  92: **************************************************************/ 

NOTA: AL principio del código se define una variable llamada DEFAULT_VIEW con el valor “All”. No estoy seguro, pero podría ser necesario cambiar este valor al nombre concreto de la opción de la lista en la vista del Historial. Por ejemplo “Todas”, o similar en español. Ahora mismo sólo tengo a mano CRM 4.0 en inglés así que no lo puedo comprobar. Si alguien lo prueba por favor que deje un comentario.

La explicación

Como podéis comprobar el código es básicamente el mismo que el que en su día creo Michael Höehne, ya que no me voy a parar a explicar en detalle el funcionamiento. El único cambio por mi parte para hacerlo funcionar en CRM 4.0 ha sido incluir una nueva función loadNavItem(name) y utilizar esta función en lugar de llamar a la función interna de CRM LoadArea() ya que provocaba un error.

La principal causa del fallo del código diseñado para 3.0, es el “breadcrumb” (nunca he sabido como traducir esto al español). Vamos ese texto que nos dice “History”, o el área en la que nos encontremos, en azul debajo de “Contact: Marco Amoedo”. El caso es que la función LoadArea utilizada en el código original falla al llamarla nosotros directamente no es capaz de tomar el nombre del área a mostrar y falla al actualizar el texto de cabecera.

Después de rebuscar un poco por el código JavaScript que incluye Microsoft Dynamics CRM 4.0, me encontré con un objeto la mar de interesante. Se llama crmNavBar, y como comentaré en futuros posts, nos va a proporcionar muchas funciones para manejar la barra de navegación que aparece a la izquierda de la mayoría de los formularios en Microsoft CRM.

En este caso, como se ve en el código, para crear la nueva función para cargar áreas simplemente uso un método del objeto crmNavBar llamado down, al que pasándole el objeto del menú lateral que queremos mostrar se encarga de hacer todo el trabajo tal cual si el usuario hiciese click en ella.

La única pega, es que el usuario puede percibir un parpadeo como resultado de provocar la carga del área del histórico de actividades si la respuesta del servidor no es lo suficientemente rápida L

Espero, que esta pequeña pieza de código os sea de utilidad.

Un saludo,

Marco

NOTA: El código mostrado en este post es una personalización no soportada. Esto quiere decir que no es posible obtener soporte técnico de Microsoft sobre esta personalización, y que además puede dejar de funcionar sin previo aviso al realizar una actualización.


UPDATE: Justo cuando publicaba este post me dí cuenta de que Michael Höehne acababa de publicar una nueva versión de este código para CRM 4.0. Le he hechado un vistazo, y sigue una aproximación mejor que la explicada en este post. Os recomiendo que utlicéis el código publicado allí en vez de este ya que es más sencillo y evitaréis el parpadeo al cargar el formulario http://www.stunnware.com/crm2/topic.aspx?id=js33


De todas formas continuaré hablando del objecto crmNavBar, que como veréis nos habrirá algunas posibilidades muy interesantes.

2 comentarios en “Cambiar la vista por defecto de la historia de actividades”

  1. Marco!!! Otra vez de vuelta!!! Que alegrón!!!
    A ver cuando mandas un mailito a tus ex-compis mamón, que no sabemos de tus andanzas!!!
    Un abrazo enorme titán!!!

  2. Es una de las cosas que tengo pendientes, si es que soy un desastre. Espero verte en el MVP Open Day como muy tarde.

    A ver si os animais a hacer una visita por Londres y os invito a unas pintas 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *