Client Side Scripting en Microsoft Dynamics CRM

Son muchas las veces que me encuentro con las mismas preguntas sobre personalización de Microsoft Dynamics CRM 3.0 ¿Se puede hacer esto? ¿Con qué método es mejor hacerlo? ¿Se puede hacer esto con JavaScript/Workflows/Callouts?


Bueno, pues vamos a aclarar un poquito que podemos conseguir con cada cosa, hoy voy a intentar mostrar la utilidad del Client Side Scripting con JavaScript y el fichero ISV.config, para que veáis qué se puede conseguir con esto, y cómo nos permite añadir funcionalidad de forma sencilla a nuestro despliegue de Microsoft Dynamics CRM.


“Las moscas y los cañonazos”


Antes de nada, me gustaría mencionar una frase que solía repetir un profesor mío en la carrera y que creo que debería ser unos de los principios de todos los diseños de sistemas informáticos y la ingeniería en general: “No mates moscas a cañonazos”. Detrás de una frase tan simple, hay una gran filosofía de trabajo. Una filosofía que nos dice que hay que ajustar la solución al problema, y tratar de resolver los problemas con soluciones que no solo sean eficaces, sino que sean eficientes y no añadan complejidades innecesarias. ¿Por qué os cuento esto? Pues, porque muchas veces JavaScript es el matamoscas adecuado, aunque la gente tiende a utilizar los cañones de personalizaciones más complejas en .Net. Hay que destacar que JavaScript se ejecutará en el lado cliente sin afectar al servidor, mientras que las extensiones con .Net se ejecutan en el servidor añadiendo más carga de trabajo al mismo.


Personalmente, cuando me enfrento a personalizaciones de CRM intento investigar primero si las posibilidades de las personalizaciones más sencillas (formularios, vistas, workflows, JavaScript, ISV, Iframes…) son capaces de solucionar el problema. Y digo investigar, porque muchas veces es difícil saber a priori sin un método nos puede solucionar nuestras necesidades. Pero lo bueno, es que aunque utilicemos mucho tiempo en esta investigación, este tiempo nunca será un tiempo perdido ya que nos ayudará a saber un poco más sobre las posibilidades de personalización de Microsoft Dynamics CRM.


JavaScript e ISV en funcionamiento


Vamos a pensar un escenario en el que JavaScript será el matamoscas adecuado, y así ver algo más de su utilidad. Imaginad que en nuestra empresa resulta de vital importancia controlar de una manera más menos fiel la duración de las llamadas, por ejemplo, para saber lo que se tarda en atender de media a un cliente en el callcenter o poder conseguir estadísticas sobre nuestros empleados de atención al cliente. Sabemos que existe un campo en la entidad Llamada Telefónica que se utiliza para almacenar la duración, pero este campo se cubre de forma manual introduciendo demasiada desviación del tiempo real de atención. Así que necesitamos un método que permita a nuestros empleados determinar la duración de la llamada de una forma más fiel a la realidad.


¿Qué os parece utilizar unos botones en el formulario de la llamada para tener disponible una especie de contador de duración? Pues es una sencilla personalización que se puede conseguir mediante JavaScript y personalizaciones ISV, que podría servir para nuestro objetivo.


Si nos fijamos en los campos disponibles en la entidad “phonecall” encontraremos dos que serán la base de nuestro desarrollo. Se trata de actualstart y actualend, dos campos tipo DateTime que mostraremos deshabilitados en el formulario y con formato de fecha y hora. El objetivo de incluirlos en el formulario es que nuestro código JavaScript pueda acceder a ellos utilizando el DOM (Document Object Model, más información en el SDK) del CRM, y deshabilitados para que el usuario no pueda modificarlos manualmente. El formulario quedaría más o menos como en la figura del final donde aparecen los campos añadidos y los botones.


Ahora tenemos que usar estos campos para calcular la duración. El primer paso, podría ser incluir un botón en el formulario que almacenase el instante de comienzo de la llamada en el campo actualstart. El segundo paso, sería poner otro botón para parar el contador, este botón almacenaría el instante actual en el campo actualend y obtendría la duración de la llamada mediante la diferencia de actualend y actualstart. Y finalmente podemos poner un tercer botón para resetear el contador.


Vale, ¿Y cómo añadimos los botones y la funcionalidad de los botones? Pues como ya dije con ISV.config y Javascript. Lo primero es pensar que código JavaScript tienen que ejecutar los botones. Como por ejemplo:




  • Botón Start Timer


 


Sólo debemos almacenar la fecha y hora actuales en el campo actualstart


 


crmForm.all.actualstart.DataValue=new Date();


 




  • Botón Stop Timer

 


Tomamos la fecha y hora actuales, la almacenamos en actualend, y calculamos la duración.


 


var inicio = crmForm.all.actualstart.DataValue;


var fin = new Date();


var duration =(fin-inicio)/1000/60; crmForm.all.actualdurationminutes.DataValue=Math.round(duration); crmForm.all.actualend.DataValue=fin;


 




  • Botón Reset Timer

 


Ponemos el valor null en los tres campos


 


crmForm.all.actualstart.DataValue=null;


crmForm.all.actualend.DataValue=null;


crmForm.all.actualdurationminutes.DataValue=null;


Una vez que hemos pensado el código, tenemos que añadir los botones a la barra de herramientas de la entidad llamada de teléfono para que lo ejecuten. Esto lo conseguimos añadiendo nuevos elementos Button dentro del elemento ToolBar de la entidad phonecall (llamada de teléfono), cada uno con el código correspondiente en la propiedad JavaScript. A continuación tenéis el xml que he añadido al fichero ISV.config.xml para obtener el resultado de la imagen,


     <Entity name=phonecall>


<!– The Timer Tool Bar –>


<ToolBar ValidForCreate=1 ValidForUpdate=1>


<ToolBarSpacer />


<Button Title=Start ToolTip=Start Timer Icon=/_imgs/ico_18_history.gif


JavaScript=crmForm.all.actualstart.DataValue=new Date();


AvailableOffline=true/>


<Button Title=Stop ToolTip=Stop Timer Icon=/_imgs/ico_16_142.gif


JavaScript=var inicio = crmForm.all.actualstart.DataValue;


var fin = new Date(); var duration =(fin-inicio)/1000/60;


crmForm.all.actualdurationminutes.DataValue=Math.round(duration);


crmForm.all.actualend.DataValue=fin;


AvailableOffline=true/>


<Button Title=Reset ToolTip=Reset Timer Icon=/_imgs/ico_16_5005.gif


JavaScript=crmForm.all.actualstart.DataValue=null;


crmForm.all.actualend.DataValue=null;


AvailableOffline=true/>


<ToolBarSpacer />            


</ToolBar>


</Entity>


 


 


 


Como veis el xml tiene algunas propiedades más como la imagen del botón, si está disponible offline, etiqueta y demás. Todas ellas vienen explicadas en el SDK del CRM, os recomiendo que os bajéis la nueva versión 3.0.5 del SDK y le echéis un vistazo.


Ahora sólo tenéis que modificar el fichero web.config para activar las personalizaciones ISV. Buscad la opción que os muestro a continuación y poned el valor dependiendo de en qué cliente queráis verlo.


<add key=ISVIntegration value=All|Outlook|OutlookLaptopClient|OutlookWorkstation|Web/>


Espero que este pequeño ejemplo os ayude a ver más claramente las posibilidades de la personalización de Microsoft Dynamics CRM con scripts del lado cliente. De todas formas, intentaré hacer algún ejemplo más y mostrar más capacidades del JavaScript, como por ejemplo llamadas a servicios web con AJAX.


Hasta la próxima, espero vuestros comentarios.


Marco Amoedo Martínez


Mis agradecimientos a Félix Durán por su aportación a este post en el grupo de noticias.


 

7 comentarios en “Client Side Scripting en Microsoft Dynamics CRM”

  1. Estimado senor tengo un problema con una aplicacion integrada en forma de button en la ficha de cuentas de crm 3.0.
    Se trata de una aplicacion aspx la cual al momento de pulsar un boton asp REPLICA LA MISMA VENTANA, lo cual resulta inaceptable.
    Esta aspx llama a una aplicacion corriendo en el equipo cliente y le entrega ciertos datos de la cuenta.
    Como puedo hacer para mantener la funcionalidad sin que se me despliegue la ventana??

    Agradeceria muchisimo su ayuda.!!!!!

    Salud.

  2. Hola,

    A ver si entiendo tu problema, quieres añadir un botón a la ficha de cuentas y que este botón llame a una aplicación aspx, pasándole información de la cuenta, pero sin abrir ninguna ventana.

    Si es algo así lo que necesitas, podrías utilizar JScript y AJAX para hacer la llamada a la aplicación aspx sin abrirla en una ventana.

    Por favor, dame más información de que es exactamente lo que quieres hacer y veremos como solucionarlo. Utiliza el foro para MS CRM de geeks.ms(http://geeks.ms/forums/42/ShowForum.aspx) que así será más fácil.

    Un saludo

  3. Saludos,

    Tengo un problema, ojala me puedas ayudar, estoy tratando de usar el calendario que despliega el CRM para seleccionar fechas al lado de un texto. Por lo que he visto son javascript, pero no tengo claro como usarlo, has tratado de usarlo en una aplicación externa hecha en .NET ????

  4. Hola que tal.

    Estoy trabajando con CRM 3.0 y he realizado en la web varias validaciones con JavaScript que funcionan muy bien, pero cuando ingreso al CRM desde el cliente outlook aun siendo un entorno web no ejecutan las validaciones realizadas en javascript.

    Se debe habilitar algo adicional para que se ejecuten estas validaciones.

    He colocado en el config que ejecute todos los ISV … All

    Saludos.
    Atte.
    EnriqueK

  5. Quería añadir el ejemplo de citado en este post al CRM que tengo montado en mi servidor, pero el fichero de configuración que tengo no es el ISV.config.xml si no ISV.config.xsd, y cuando lo abro la estructura es distinta a como lo está en el código xml del ejemplo. Alguien me puede echar un cable?

  6. Hago esto pero obtengo resultados me da un error de javascript por lo que lo ejecuto en modo debugger y puedo observar que crmform.all no contiene todos los elementos del formulario cualquier ayuda gracias

Deja un comentario

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