Mostrando entradas con la etiqueta Plugins. Mostrar todas las entradas
Mostrando entradas con la etiqueta Plugins. Mostrar todas las entradas

lunes, 22 de junio de 2015

Utilizando el Registro de Seguimiento de ensamblados (TRACE)

En el desarrollo de ensamblados en Dynamics CRM en Plugins y Workflow Assemblies, existe una gran funcionalidad que sirve para dejar trazas en nuestra ejecución.

Normalmente, podemos acceder a estas trazas al momento de que nuestros ensamblados lanzan una excepción, y desde la misma interfaz de usuario, se puede descargar un fichero, que incluye en Stacktrace de la ejecución de nuestro código y además nuestras trazas incluidas.

Estas trazas ahora se pueden quedar almacenadas también en Dynamics CRM, de cara a no requerir que los usuarios tengan que descargarse estos ficheros y enviarlos.

Para activar las trazas, podemos activarlas en la Configuración del sistema como muestro a continuación:

image

En esta pantalla podemos seleccionar si queremos que se registre toda ejecución o solamente las Excepciones.

OJO: el activar “TODOS” puede ser una buena opción en un entorno de DES, pero cuidado porque quedará registro de cada ejecución de nuestros Plugins.

Una vez activado, cada plugin o actividad de workflow en donde utilicemos la interfaz “ITracingService” que nos da el contexto de CRM, quedará registrada en CRM aquí:

image

El registro que nos deja va dejando un listado con todas las ejecuciones:

image

Y en el formulario de detalle, podemos ver la información del Context, mas la información de nuestras trazas:

image

Esta nueva funcionalidad esta disponible con el Update 1, es simplemente genial y puede ser utilizada para muchas cosas.

Espero les haya gustado

Abrazo!

@demian_rasko

martes, 17 de marzo de 2015

Error con Plugin Registration Tool (como solucionarlo)

Una de las cosas mas interesantes de ser un MVP, es la posibilidad de contactar con gente muy diversa y sobre todo tener contacto con el equipo de producto dentro de Microsoft de la tecnología que nos apasiona, en mi caso, Dynamics CRM.

Bien, hoy ha sido uno de esos días en los cuales puede decir que he conseguido una (muy pequeña) contribución para todos los que trabajamos con Dynamics CRM de habla hispana.

Como muchos de ustedes ya sabrán, en la SDK hay una herramienta que se llama Plugin Registration Tool, que sirve para el registro y depuración de Plugins en Dynamics CRM (en online y en onpremise).

Desde la versión 6.1.1, estamos notando los que tenemos equipos en español, que al intentar conectar con un CRM, la herramienta se intenta conectar y luego se queda así totalmente en blanco:

image

Mucho mas no podemos hacer…así que lo único que nos quedaba era utilizar versiones anteriores que si funcionan (la primera para atrás es la 6.1.0. El problema es que si tenemos diferencia de versiones, no podemos instalar el “Profiler” para depurar los Plugins en remoto.

Hasta ahora esto no ha sido un problema para mí y creí que era algo temporal o de mi PC, pero poco a poco me di cuenta que esto le ocurría a mas gente.

Bien, ahora les voy a decir como se soluciona este problema, y parece ser que es algo solamente relacionado con aquellos como yo que tenemos el PC en idioma Español.

Simplemente se debe renombrar la carpeta dentro del PluginRegistrationTool con el nombre “es-es” como muestro a continuación:

image

Con esto, ya lo tendremos resuelto y a correr!

Espero les haya servido para tanto como para mí… un abrazo!

@demian_rasko

sábado, 7 de septiembre de 2013

Plugins: Transacciones en Pre/Post operations

Después de un tiempo de inactividad en mi blog (aunque no en otras áreas), vuelvo con mcuhas ganas con todo lo nuevo que se viene.
Hoy quiero explicar un poco como funcionan los plugins en los Pre y Post operations.
Al comenzar la ejecución de un plugin en estos pasos, CRM crea una transacción, que provoca que a veces no podamos hacer algunas de las cosas que necesitamos.
En primer lugar al registro que lanza el plugin, se le provoca un bloqueo en la base de datos de SQL Server, que puede provocar que hacer acciones sobre el mismo no se puedan realizar y nos genere unos errores inesperados.
Por otro lado, se inicia una transacción en donde se van guardando los cambios realizados en el registro que lanza el plugin y que además hace un rollback de cualquier otro registro que se cree o modifique.
A continuación pongo un código de ejemplo:
   1: IPluginExecutionContext context =
   2:                 (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
   3:  
   4:             IOrganizationServiceFactory factory =
   5:                 (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
   6:             IOrganizationService service = factory.CreateOrganizationService(context.UserId);
   7:              
   8:  
   9:             ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
  10:  
  11:             tracingService.Trace("Creacion de contacto");
  12:  
  13:             Entity acc = new Entity("account");
  14:             acc.Attributes.Add("accountid",context.PrimaryEntityId);
  15:             acc.Attributes.Add("accountnumber","1232333");
  16:             service.Update(acc);
  17:  
  18:  
  19:             Entity cont = new Entity("contact");
  20:             cont.Attributes.Add("lastname", "Raschkovan");
  21:             cont.Attributes.Add("firstname", "Demian Adolfo");
  22:  
  23:             Guid id=service.Create(cont);
  24:  
  25:             throw new InvalidPluginExecutionException("La cuenta ha sido creada con el id " + id.ToString() + ", pero se quita por estar en transaccion.");

 
Este plugin esta pensado para lanzarse al hacer un “Update” del nombre de la Cuenta. Lo que hace es primero actualizar el numero de cuenta y luego crear un contacto.

En caso de que se produzca un error como el que estoy forzando allí, todo lo que se haya creado o actualizado durante la ejecución del Plugin, es deshecho con un Rollback.

Si lo ejecuto lo que ocurre es lo siguiente:
image

Si comento la última línea, quedan correcto el update de la cuenta y se crea el contacto.

Esto esta muy bien, pero…¿si necesito por ejemplo lanzar una excepción para hacer una validación y además crear un registro en CRM, como lo hago?

Para encontrar una solución, primero hay que entender como guarda CRM esta transacción. Como se ve en el código, yo utilizo el “service” que me da el CRM con el contexto de ejecución del plugin. Todo lo que yo haga con ese contexto, quedará bajo la transacción y por lo tanto desaparecerán con el Rollback.

Entonces, si quiero realizar una operación fuera de la transacción y así evitar un posible Rollback, la solución pasaría por crearnos una nueva llamada a los web services de CRM, por fuera de la conexión que nos da el contexto de CRM. Esto se puede hacer o bien añadiendo una llamada directa a los web services de CRM pasándole las credenciales usuario y password, o a través de algún web service intermedio.

domingo, 28 de abril de 2013

CRM 2011 Testing Data Creation (nuevo: lookups)

codeplex-logo_thumb

Hola, he seguido añadiendo a mi librería de creación masiva de datos de pruebas. Como siempre, todo el código fuente y la solución de CRM completa esta aquí: https://crm2011testingdata.codeplex.com/

En mi última Release, añadí muchos nuevos tipos de campos, pero me dejé el mas “difícil” para el final. Ahora ya lo tiene, en la nueva versión (1.3.0.0) ya funciona con Lookps simplemente se añade el lookup y el nombre de la entidad relacionada y listo. Ejemplo:

28-04-2013 0-15-18

28-04-2013 0-15-50

La funcionalidad incluida incluye que simplemente se busca en los metadatos, el atributo principal utilizado como nombre de la entidad relacionada, y con el texto buscado, le crea la relación.

Para próximas releases incluiré:

  • Posibilidad de buscar por otros campos de la entidad relacionada (códigos, por ejemplo)
  • Creación automática de registros relacionados en caso de no encontrarse.

Saludos,

lunes, 15 de abril de 2013

CRM 2011 Testing Data Creation (nueva release)

Hola a todos, he recibido algo de buen “feedback” de mi desarrollo de creación de testing data, y he decidido mejorar la solución poco a poco, para mejorarla y ofrecer una herramienta mas útil y versátil.

Para los que no la conozcan, es una solución que publiqué en Codeplex y está descrita en este post:

He añadido una nueva “release” (1.2.0.0). Hasta aquí: http://crmtoall.blogspot.com.es/2013/03/crm-2011-testing-data-creation.html

La solución de Codeplex está aquí: https://crm2011testingdata.codeplex.com

image

Hasta hoy, esta solución solo funcionaba con campos de tipo texto, ahora le he añadido el soporte para los siguientes tipos de datos:

  • String
  • Integer
  • Money
  • Boolean
  • Double
  • Picklist
  • Status

Para próximas releases iré añadiendo nuevas funcionalidades como por ejemplo:

  • Soporte para tipos statecode, lookups y partylists
  • Validaciones de todo tipo (entidades, campos, etc.)
  • Posibilidad de añadir datos estáticos (y no dinámicos), o una mezcla de ambos por ejemplo desde un csv.

Estoy abierto a nuevas propuestas…

Un abrazo!

jueves, 27 de septiembre de 2012

Authenticación en plugins y diferencias entre 4.0 y 2011

Hola,  como muchos habrán utilizado alguna vez, al trabajar con Plugins, a veces es difícil saber con que usuario se realizan las acciones que se desarrollen en el mismo.

Primero hay que tener en cuenta en el registro de los Plugins, en donde se puede seleccionar que dicho paso se ejecute con un usuario específico, o por el contrario el “Calling User”, que permitirá que en el contexto se “pase” el id del usuario que ha lanzado el Plugin:

image

Una vez que estamos en el código, debemos conectarnos al CRM para realizar diferentes acciones como por ejemplo una consulta, una actualización, etc.

Para esto se utiliza en 2011 el método IOrganizationServiceFactory.CreateOrganizationService (http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iorganizationservicefactory.createorganizationservice.aspx).

En CRM 4.0 se utilizaba el método IPluginExecutionContext.CreateCrmService (http://msdn.microsoft.com/en-us/library/bb959583.aspx).

Para saber como podemos autenticarnos en los plugins dejo un listado que además muestra las diferencias entre 4.0 y 2011:

Tipo CRM 4.0 CRM 2011
Usuario conectado (Calling User) ICrmService service = context.CreateCrmService(true);
IOrganizationService service = serviceFactory.CreateOrganizationService(Guid.Empty);
Un usuario específico ICrmService service = context.CreateCrmService(context.UserId); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
System User ICrmService service = context.CreateCrmService(false); IOrganizationService service = serviceFactory.CreateOrganizationService(null);

Un saludo,