Obtener el nombre del workflow padre con ParentContext

Cuando desplegamos un plugin o un workflow en nuestra instancia de CRM Dynamics estamos activando un flujo de trabajo que se ejecutará ante un determinado evento. En el caso del workflow podemos configurar mediante el menú de edición de Dynamics unas condiciones extra que se deben de dar para que se ejecute el código –como podría ser que determinado campo del registro modificado esté valorizado-.

Podría darse el caso de que este registro del que hablamos sea modificado por el usuario mediante un formulario de CRM, y además también podría ser modificado mediante la ejecución de otro workflow o plugin de, por ejemplo, actualización de datos nocturnos. Y rizando el rizo podemos suponer que un workflow puede llamar a otro, y este a otro, y así repetidas veces, pudiendo encontrar problemas si no controlamos bien el contexto en el que se ejecuta nuestro código.

En la ejecución de un Workflow o plugin siempre podemos obtener el objeto Context que vendrá heredado y que contendrá información sobre la profundidad –accesible mediante la propiedad Depth del objeto- además de otros parámetros de interés.

Cuando la profundidad es igual o mayor a uno implica que la ejecución de nuestro código ha sido invocada desde otro workflow o plugin. Cuando esto ocurre,  podremos acceder al ParentContext que será un objeto del mismo tipo pero que contendrá información del contexto del workflow que precede al nuestro que incluso podría darse el caso de que sea el mismo workflow.

La idea es poder obtener el nombre literal de ese workflow padre para poder poder condicionar la ejecución de nuestro workflow mediante un if.

Nombre literal del workflow en la entidad "Trabajos del sistema"

Nombre literal del workflow en la entidad “Trabajos del sistema”

Como hemos dicho, el ParentContext contiene información del contexto del workflow invocador de nuestro workflow, y entre otros datos contiene el parámetro CorrelationId que sería el id único del registro de tarea del sistema creado por este workflow. Con este id seremos capaces de obtener el nombre de éste workflow y condicionar la ejecución, como se indica en el siguiente ejemplo:

Descargar un Workflow o Plugin de CRM

En este post vamos a ver cómo descargar un Workflow o Plugin registrado en CRM. Sería algo así como el proceso inverso que realiza el Plugin Registration Tool que trae la SDK de CRM. Mediante esta herramienta podemos registrar (o subir) ensamblados DLL a CRM pero no se nos permite descargarlos.

Para hacer la prueba vamos a crear un Workflow muy simple, lo vamos a registrar y a continuación lo vamos a descargar. El Workflow únicamente escribirá un nuevo registro dentro de una entidad de Log denominada new_log.

Además, para tener una pequeña verificación de que el Workflow que nos descargaremos luego sea el mismo que hemos registrado voy a darle una versión de compilado a la DLL con el valor 3.1.4.1.

Versión compilado Visual Studio

Versión compilado Visual Studio

 

Recordad que además para que un Workflow pueda ser registrado debe contener firma. En las propiedades del proyecto, en el apartado Firma (Signing) añadimos una nueva firma.

Añadir firma a un Workfow

Añadir firma a un Workfow

Compilamos y obtenemos la DLL con nuestro Workflow.

DLL del Workflow compilado

DLL del Workflow compilado

Abrimos el Plugin Registration Tool y registramos nuestro Workflow en nuestra organización.

 Workflow registrado en CRM

Workflow registrado en CRM

Hasta aquí sería el trabajo que solemos hacer para cargar un ensamblado en CRM. Ahora vamos a ver cómo descargarlo. Lo primero de todo es entender cómo se guardan en CRM los ensamblados. Un ensamblado se guarda en la base de datos del mismo modo que cualquier otro registro cuando seleccionamos este modo de registro en el Plugin Registration Tool en la opción Location : Database, que es la opción por defecto. En este caso cuando registramos una DLL en CRM se creará un registro que contendrá, entre otros datos, el contenido del ensamblado. La entidad donde se guardan los ensamblados tiene como nombre lógico (logical name) pluginassembly y, como el resto de entidades, cada registro tendrá un ID único. Para conocer el ID debemos ir a CRM y mediante una búsqueda avanzada a la entidad Ensamblados de Complementos encontraremos el nuestro Workflow. El ID lo podemos obtener abriendo la consola del navegador y localizando la linea en el código.

Obtener un ID de un registro mediante búsqueda avanzada

Obtener un ID de un registro mediante búsqueda avanzada

Ahora, teniendo la entidad y el ID único podemos hacer un Retrieve. Los campos que debemos descargar son el nombre (name) y el contenido del ensamblado (content). Este segundo campo contiene el contenido de la DLL codificado en Base 64. Desde C# es sencillo decodificarlo mediante la clase Convert.

Con todo esto ya podemos descargar y guardar en un archivo la DLL, como en el siguiente ejemplo:

Si ejecutamos ese comando y abrimos la carpeta donde está el ejecutable encontraremos la DLL y podremos comprobar la versión.

DLL descargada con su versión

DLL descargada con su versión