jueves, 10 de julio de 2014

DYNAMICS CRM 2011 – DATOS ÚTILES

Microsoft Dynamics CRM es una herramienta software para Gestión de las Relaciones con Clientes (en inglés Customer Relationship Management) desarrollado por Microsoft.

Forma parte de la familia de software empresarial Microsoft Dynamics.

Desarrollar customizaciones de este sistema puede tornarse algo tedioso si no se conoce en detalle el SDK del mismo.

En este post se pretende dar una guía para dar los primeros pasos en la customizacion de este producto.

Como crear un proyecto de Dynamics CRM 2011 en Visual Studio

Existe un template de proyecto para Visual Studio (2010 en adelante) que nos provee de un entorno que nos facilita generar y organizar nuestro código.

Se listan a continuación una serie de pasos para la implementación del mismo:

1. Bajar e Instalar el SDK desde:

http://www.microsoft.com/en-us/download/details.aspx?id=24004

2. Instalar el Developer Toolkit desde:

SDK\Tools\DeveloperToolkit

3. Abrir Visual Studio. Hacer click File à New à Project

4. Seleccionar Dynamics CRM como tipo de proyecto

clip_image003

5. Elegir el nombre del proyecto y hacer click en el botón “OK”

6. Ingresar datos relevantes en la ventana de conexión al Server de Dynamics CRM:

clip_image005

NOTA: Después de completar las credenciales y apretar el botón Log On, se habilitaran las organizaciones a las cual su usuario tiene acceso.

Luego de seleccionar la organización, se habilitaran las soluciones contenidas en su interior. La solución elegida será la contenedora de nuestros archivos al momento de hacer deploy desde el proyecto de Visual Studio

7. Firmar el Proyecto de Plugins:

a. Click derecho sobre el proyecto “Plugins”

b. Click sobre la opción “Propiedades”. Se abrirá la siguiente ventana:

clip_image007

c. Click sobre el tab “Signing”

d. Tildar el check box “Sign the assembly”

e. Seleccionar la opcion “New”

clip_image009

f. Completar los campos asignándole un nombre a la firma, así como también un password

Cómo Manejar los Web Resources desde Visual Studio

El template de desarrollo de Dynamics CRM 2011 para Visual Studio, nos da la posibilidad de agregar los Web Resources existentes en nuestro entorno de Dynamics CRM a nuestro proyecto.

Agregar un Web Resource al Proyecto de Visual Studio

Detallamos aquí los pasos para hacerlo:

1. Abrir el menú “CRM Explorer”

2. Hacer click sobre la Organización

3. Desplegar el menú de Web Resources

clip_image011

4. Click derecho sobre el Web Resource que se quiere agregar al proyecto de VS.

5. Click sobre “Add to packaging project”

clip_image013

Una vez hecho esto, tendremos acceso desde el “Project Explorer” a todos los WR que hayamos agregado al proyecto.

clip_image015

NOTA: Cada vez que hagamos Deploy del proyecto, por defecto también se hará deploy de todos los Web Resources.

Se recomienda cambiar la propiedad “Build Action” del Web Resource a “none” para que esto no suceda.

clip_image017

Implementar Modificaciones en Dynamics CRM

Existen varias formas de implementar los cambios realizados en el código de los Web Resources.

Describiremos aquí dos procedimientos que son válidos y uno que no lo es.

INVALIDO – Copiar el código dentro del “Text Editor” de la UI de Dynamics

En antiguas versiones de Dynamics CRM no existían los Web Resources.

La implementación de código Javascript se hacía embebiendo el código en una sección que la UI de CRM nos otorgaba para tal fin.

Al parecer, muchos desarrolladores siguieron con la misma costumbre de “Copiar y Pegar” el código en Dynamics CRM 2011.

Esto no se debe hacer, ya que a partir del Rollup update 8, este “Editor de Texto” nos trunca el código en 2000 caracteres.

clip_image019

RECOMENDADO – Implementar las Modificaciones Desde el Archivo con el Código Fuente

Este procedimiento es fácil y nos da la seguridad de que estamos implementado exactamente las modificaciones que queremos implementar.

Tiene como ventajas que es claro, rápido y transparente.

Tiene como desventaja que es un poco tedioso para implementaciones masivas (muchos Web Resources al mismo tiempo).

Detallamos cómo hacerlo:

1. Abrir el CRM Explorer.

2. Hacer doble Click sobre el Web Resource a Actualizar.

(Esto abrirá la ventana del Web Resource dentro de nuestro entorno de VS)

clip_image021

3. Abrir desde el Project Explorer el archivo con el código fuente.

4. Click derecho sobre la solapa del archivo.

5. Click sobre la opción “Copy full path”

clip_image023

6. Click sobre el botón “Browse…” en la ventana del Web Resource (CRM UI)

7. Pegar el path copiado.

8. Click sobre el botón “Save”

9. Click sobre el botón “Publish”

VÁLIDO – Deploy del Proyecto

Al hacer Deploy del proyecto (Ver Sección 5), todos los web resources cuya propiedad “Build Action” sea “CRM WebResource” serán implementados en nuestro entorno de Dynamics CRM.

Para que los cambios cobren efecto, se deberá hacer un “Publish” desde la UI de Dynamics CRM.

Este procedimiento tiene como ventaja la posibilidad de hacer Deploy de muchos web resources al mismo tiempo.

Como desventaja lidiamos con que, al hacer deploy,,si no especificamos lo contario, estamos implementando tanto web resources, como plugins, como implementaciones Silverlight y todo lo que tengamos en nuestro proyecto.

En general, tomar todos los recaudos para que únicamente se implemente el código que queremos se torna tedioso.

Además, suele tardar más tiempo que el procedimiento anteriormente descripto.

Cómo Crear Plugins en Dynamics CRM 2011 usando Visual Studio

1. Abrir el menú “CRM Explorer”

2. Hacer click sobre la Organización

3. Desplegar el menú de entidades

clip_image025

4. Click derecho sobre la entidad para la cual se quiere generar un plugin

5. Click sobre la opción “Create Plugin”

clip_image027

Se abrirá una ventana en la cual se deberá configurar el plugin a crear.

Dicha ventana la describiremos a continuación:

clip_image029

a. Message: Es el “Mensaje” o “Step” en el cual se va a atachar el plugin. Es decir, que evento va a disparar la ejecución del plugin. Los de uso más extendido son:

i. Update: Los plugins registrados en este Step se dispararan cuando un registro haya sido actualizado

ii. Create: Los plugins registrados en este Step se dispararan cuando un registro haya sido creado.

iii. Assign: Los plugins registrados en este Step se dispararan cuando un registro haya sido asignado a un usuario distinto al que lo está actualmente.

iv. Delete: Los plugins registrados en este Step se dispararan cuando un registro haya sido borrado.

v. Retrieve: Los plugins registrados en este Step se dispararan cuando Dynamics hace la solicitud de un registro a la base de datos.

b. Run in Context: Al hacer click en este menú, se despliega una lista de todos los usuarios contenidos en la organización de crm y además una opcion, que viene seleccionada por defecto, llamada “Calling User”.

Este campo determina si el plugin deberá ejecutarse sin importar que usuario dispare el evento (Calling User) o solo si es disparado por un usuario en particular.

c. Pipeline Stage: En Dynamics, además de elegir en que evento vamos a atachar un plugin, debemos explicitar también un “Pipeline Stage”.

Cada evento, en CRM, está compuesto en realidad de dos eventos:

i. Pre-Operation: Se dispara antes de que los cambios en el registro hayan impactado en la base de datos.

ii. Post-Operation: Se dispara después de que los cambios hayan impactado en la base de datos.

d. Pre Image Alias: Si completamos este campo, entonces, se generara automáticamente en el plugin, un objeto del tipo Entidad conteniendo el valor de los atributos que hayamos seleccionado como parámetros ANTES de haberse producidos los cambios que dispararon el plugin..

e. Post Image Alias: Si completamos este campo, entonces, se generara automáticamente en el plugin, un objeto del tipo Entidad conteniendo el valor de los atributos que hayamos seleccionado como parámetros DESPUES de haberse producidos los cambios que dispararon el plugin.

f. Class: Nombre de la clase.

g. Deployment: Desde este atributo se determina en que cliente de Dynamics CRM – ya sea Server Only, Outlook only o ambos - se hará deploy del plugin en cuestión.

6. Hacer click en el botón “OK”.

Se generara una clase dentro del proyecto “Plugins”.

Esta clase hereda de Plugin, que a su vez implementa la interfaz IPlugin, definida en el SDK de Dynamics.

Consideraciones y consejos para el desarrollo de Plugins en Dynamics CRM

Como instanciar el registro siendo modificado

En Dynamics, podemos instanciar un objeto que contenga la modelización del registro cuya modificación disparo el plugin.

Para instanciar un objeto del tipo Entity / EntityReference se deberán utilizar las siguiente líneas de código:

1.

clip_image030

Para los siguientes Steps: Create, Update, Delete.

2. Para el step Assign:

a.

clip_image031

Registro en cuestion:

b. Registro que fue asignado como responsable del registro en cuestión:

clip_image032

Como hacer Deploy de los plugins en Dynamics CRM desde Visual Studio

clip_image034

1. Cerciorarse de que el archivo “RegisterFile.crmregister” no se encuentra bloqueado ni tomado por otro usuario.

2. En el Solution Explorer, hacer click derecho sobre el proyecto “CrmPackage”

3. Hacer click en la opción “Deploy”

Una vez hecho esto, nos aparecerá un icono, en la barra inferior del VS, indicando el estado del proceso. Una vez finalizado, se leerá la leyenda “Deploy Succeeded”.

Exportar / Importar Plugins desde CRM

Una vez instalados los plugins desde VS, se puede acceder a ellos desde CRM.

Visual Studio implementa los plugins en CRM creando:

clip_image001 Un archivo <<NombreDelProyexto>>.dll por cada proyecto del que se hace deploy.

clip_image001[1] Un archivo <<NombreDeLaClaseDelPlugin>> por cada plugin que hayamos registrado en el RegisterFIle.crmregister

Para importar / exportar los plugins se los debe agregar a una solución de Dynamics CRM y proceder mediante el circuito nativo para importar / exportar soluciones.

Dynamics CRM 2011 y Javascript

Al desarrollar customizaciones para Dynamics CRM 2011 nos encontraremos con que muchas de ellas se deben desarrollar utilizando javascript.

Para ello contamos con distintas librerías que nos ayudan a realizar dichas customizaciones.

Describiremos a continuación una de las más útiles.

XRMServiceToolkit.js

Link de descarga: http://xrmservicetoolkit.codeplex.com/releases

Esta librería nos da una fácil implementación de cosas como:

clip_image001[2] Métodos comunes: Cambios en el formulario de CRM (deshabilitar y / ocultar campos, obtener valores de campos, etc).

clip_image001[3] Métodos Rest Endpoint: Crear, consultar, actualizar campos, etc.

clip_image001[4] Métodos Soap: Crear, consultar, actualizar campos, etc.

clip_image001[5] Métodos complementarios: Configurar OptionSets dependientes uno de otros, Agregar Tooltip a campos, Agregar vistas filtradas a Lookups, etc.


Crear un Registro
clip_image035

Hacer Retrieve de un Registro
clip_image036
Actualizar un Registro
clip_image037
Eliminar un Registro
clip_image038

Asociar dos Registros
clip_image039
Desasociar dos Registros
clip_image040
RetrieveMultiple
clip_image041

Ejecutar una consulta FETCHXML
clip_image042

Ejecutar una consulta por atributo
clip_image043

Xrm.Page Object Model

Microsoft Dynamics CRM introduce un nuevo modelo de objeto para interactuar con su entorno: “Xrm.Page”.

Este modelo de objeto permite, entre estas cosas:

clip_image001[6] Mostrar / Ocultar elementos de la UI.

clip_image001[7] Soportar controles múltiples por atributo.

clip_image001[8] Soportar formularios múltiples por entidad.

clip_image001[9] Manipular ítems de navegación entre formularios.

Es importante destacar que este objeto únicamente incluye en sus colecciones a los atributos que fueron materializados como un campo en el formulario. Por lo tanto, si un atributo existe, pero no está incluido como un campo en el formulario, el Xrm.Page Object Model no lo incluirá en sus colecciones.

Jerarquía

Como se muestra en el siguiente diagrama, Xrm.Page provee un namespace para tres objetos descriptos en la siguiente tabla:

Objeto

Descripción

context

Provee métodos para hacer un retrieve de información específica de una organización, un usuario, o parámetros que fueron pasados al formulario a través de una QueryString.

data

Provee acceso a la información de la entidad.

ui

Contiene métodos para hacer un retrieve de información de la UI. Además, brinda acceso a distintos sub componentes del formulario

clip_image045

Métodos Útiles

Acción

Sintaxis

Notas

Obtener el valor de un campo.

Xrm.Page.getAttribute("<<NombreDelCampo>>").getValue()

Obtener el texto de la opción seleccionada en un OptionSet

Xrm.Page.getAttribute("<<NombreDelCampo>>").getSelectedOption().text

Setear el Valor de un campo

Xrm.Page.getAttribute("<<NombreDelCampo>>").setValue(<<Nuevo Valor>>)

Establecer el modo de submit de un campo

Xrm.Page.getAttribute(("<<NombreDelCampo>>").setSubmitMode(("<<SubmitLevet>>")

Submit Levels:

•always

•never

•dirty

Establecer el nivel de requerimiento del campo

Xrm.Page.getAttribute(("<<NombreDelCampo>>"). setRequiredLevel("<<NivelDeRequerimiento>>")

Nivel de Requerimiento:

•none

•required

•recommended

Deshabilitar / Habilitar un control

Xrm.Page.getControl("<<NombreDelCampo>>").setDisabled(true);

•true à Deshabilitado

•false àHabilitado

Obtener Id del usuario logueado

Xrm.Page.context.getUserId()

Obtener Url del Server

Xrm.Page.context.getServerUrl()

Obtener Id del registro en el cual se está ejecutando el script

Xrm.Page.data.entity.getId()

Cambiar de formulario

Xrm.Page.ui.formSelector.items.get("<<NumeroDeFormulario>>").navigate()

Identificar si el formulario es de creación, actualización, etc.

Xrm.Page.ui.getFormType()

•Si devuelve 1 à El contexto del formulario es de creación.

Si Devuelve 2 àEl contexto del formulario es de actualización.

Interrumpir el evento “Save” del formulario

(Habiendo pasado el contexto del evento como parámetro “event”)

event.getEventArgs().preventDefault();

ClientGlobalContext.js.aspx

Esta librería es nativa de Dynamics CRM 2011 y nos brinda un acceso a la información del contexto en el cual se esté ejecutando un web resource.

La función ClientGlobalContext devuelve el mismo objeto encontrado en Xrm.Page.context.

Cuando se esté programando un web resource javascript para un formulario, se deberá usar el objeto Xrm.Page.context.

Cuando se necesite información del contexto fuera del formulario (por ejemplo, en un web resource .html embebido en el formulario), se deberá incluir una referencia a ClientGlobalContext.js.aspx.

….Enjoy coding!

Referencias

1. http://msdn.microsoft.com/en-us/library/hh372957.aspx, Developer Toolkit for Microsoft Dynamics CRM.

2. http://xrmservicetoolkit.codeplex.com , XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library.

3. http://msdn.microsoft.com/en-us/library/gg328541.aspx , GetGlobalContext Function.

4. http://msdn.microsoft.com/en-us/library/gg328474.aspx, Xrm.Page Objetc Model.

5. http://blogs.msdn.com/b/arpita/archive/2012/02/19/microsoft-dynamics-crm-2011-force-submit-on-a-disabled-field-or-read-only-field.aspx

6. http://es.wikipedia.org/wiki/Microsoft_Dynamics_CRM, ¿Qué es Microsoft Dynamics CRM?

¡Gracias por tu contribución Santiago Díaz!