Llamar a un Power Automate en Dynamics 365 y esperar a que finalice.

En algunas ocasiones requerimos desarrollar procesos que se ejecuten en tiempo real, es decir, que el usuario ejecute el proceso y espere a que finalice para continuar. Pues bien, eso en Dynamics 365 lo podemos realizar con workflows real-time. Pero por todos son conocidas ya las ventajas que tiene Power Automate respecto a los workflows, sin embargo, Power Automate no tiene esta posibilidad, se ejecuta siempre en background.

Reemplazar flujos de trabajo Microsoft Dataverse clásicos con Power Automate - Power Automate | Microsoft Docs


¿Cómo podemos entonces hacer que el usuario espere a que finalice?


Como Power Automate se ejecuta en background, lo único que podemos hacer es programar en el cliente una función que genere la espera hasta que reciba respuesta del Power Automate y en función de la respuesta de este, mostrar un mensaje.


Veamoslo de forma práctica, para ello crearemos un botón en la barra de comandos de Dynamics 365 o de nuestra model-driven app que ejecutará una función.


1. Crear script:

En primer lugar, generaremos una función que contenga la llamada al Power Automate, la condición de espera y la acción a realizar tras la ejecución en función de la respuesta dada por el Power Automate.


showProgressIndicator (referencia API de cliente) en aplicaciones basadas en modelo - Power Apps | Microsoft Docs


async function CallPowerAutomate(primaryControl) {

    //Obtenemos el contexto de ejecución.
    var formContext = primaryControl;
    var recordId = formContext.data.entity.getId().replace('{', '').replace('}', '');
    
    //Obtenermos el ID del registro para enviar al Power Automate.
    var data = {
        "recordId": recordId
    };
    
    //Generamos la variables del cuadro de dialogo que se abrirá en caso correcto.
    var alertStrings = { text: "El proceso finalizó correctamente", title: "CORRECTO", confirmButtonLabel: "Ok" };
    var alertOptions = { height: 200, width: 450 };
    //Generamos la variables del cuadro de dialogo que se abrirá en caso de error.
    var alertStringsERROR = { text:"Ocurrió un error, intentelo de nuevo. Si el problema persiste contacte con el administrador", title:"ERROR", confirmButtonLabel:"Aceptar"};
    var alertOptionsERROR = { height: 200, width: 450  };
    Xrm.Utility.showProgressIndicator("Please wait...");
    //Haremos la llamada a nuestro Power Automate.
    try {
        await fetch("PowerAutomateURL",
        {
            "method":"POST",
            "headers": {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(data)
        })
        console.log("Flow call finished Ok");
        Xrm.Utility.closeProgressIndicator();
        Xrm.Navigation.openAlertDialog(alertStrings, alertOptions);
    
    } catch (error) {
    
    Xrm.Utility.closeProgressIndicator();
    console.log(`
    Flow Call finished with error. Status code: ${error}
    `)
    Xrm.Navigation.openAlertDialog(alertStringsERROR, alertOptionsERROR);
    }
    }

Una vez programado, deberemos agregarlo como un recurso web a nuestra solución.


2. Crear nuestro Power Automate.

El Power Automate tendrá como desencadenador "Cuando se recibe una llamada HTTP" y en el esquema del JSON agregaremos el parámetro recordId


El HTTP post url, será la cadena que deberemos agregar en PowerAutomateURL dentro de nuestro script.


Por último, agregaremos una respuesta cuando el flujo se ha ejecutado correctamente con la acción de respuesta.

En caso de que queramos indicar un mensaje de error aunque el flujo se ejecute correctamente de forma natural, deberemos agregar una respuesta con un código de error (diferente a 200 según nuestro script) y agregar un terminador para indicar que el flujo falló.



3. Agregar un botón personalizado en la barra de comandos de nuestro formulario.

Para poder desencadenar este Power Automate, vamos a crear un botón personalizado en la barra de comandos del formulario de nuestra aplicación. Este botón será el encargado de llamar al script que hemos programado y este a su vez ejecutar el Power Automate con las condiciones que le hemos agregado.


Para ello podemos usar Ribbon Workbench o la característica de edición de la barra de comandos que tenemos actualmente disponible. Vamos a optar en esta ocasión por usar esta nueva característica.


Para ello editaremos nuestra aplicación y dentro de ella seleccionaremos editar barra de comandos.



Seleccionaremos el formulario principal, es decir el formulario del registro.



Después seguiremos los siguientes paso:

  1. Agregar un nuevo comando.

  2. Cambiar la etiqueta.

  3. Agregar un icono.

  4. Seleccionar la acción "Ejecutar JavaScript".

  5. Seleccionar la librería (El recurso web previamente creado).

  6. Agregaremos la función que debemos llamar.

  7. Le enviaremos el Primary Control cómo parámetro.


Una vez agregado nuestro nuevo botón simplemente deberemos probarlo. En este ejemplo sencillo, simplemente hemos establecido que se haga una actualización del campo Name.


En caso de que le flujo de error, tal y como hemos programado en nuestro script, saltará una ventana informando al usuario.