top of page

CÓMO AVANZAR TUS BUSINESS PROCESS FLOWS DE FORMA AUTOMATIZADA (PARTE IV)

Existen varias formas de avanzar tus Business Process Flows (BPF) de forma automatizada: del lado del servidor o del lado del cliente. En la primera parte de post pudimos ver como avanzarlo del lado del cliente con JavaScript, en la segunda parte del post vimos como avanzarlo con Power Automate, en la tercera como hacerlo por plugin y ahora veremos como hacerlo a través de PowerFx.



Avanzar el BPF a través de PowerFX.


PowerFx es un lenguaje propio de Power Apps que simula la programación en Excel. Es un lenguaje principalmente para Canvas Apps y Custom Pages pero tímidamente ya lo encontramos en las Power Apps del tipo Model-Driven.


Para el ejemplo, hemos creado una Canvas app simple con un BPF que simula el que tenemos dentro de la Model-Driven app. En nuestra primera pantalla tenemos una vista de todos los registros con BPF.

En el inicio de la aplicación (OnStart) aplicaremos el siguiente código:


ClearCollect(
    col_bpfStages;
        Sort(
            Filter(
                'Process Stages';
                Process.'Unique Name' = "new_fasesdemo"
            );
            'Process Stage Name'
    )
);;

Con este código pretendemos recoger todos los stages y GUIDs de nuestro proceso y meterlo en una colección ordenado por el nombre del stage.


En la siguiente pantalla tendremos el BPF con el formulario correspondiente al registro:

Nuestro BPF es un componente de Krishna Vandanapu que podéis encontrar aquí: Business Process Flow in Canvas Apps - YouTube Por ello, en los varGallItems vamos a meter el código de la siguiente forma:

Table(
    {
        StatusTitle: Last(FirstN(col_bpfStages;1)).stagename;
        StatusFlag: _stage1        
    };
    {
        StatusTitle: Last(FirstN(col_bpfStages;2)).stagename;
        StatusFlag: _stage2
    };
    {
        StatusTitle: Last(FirstN(col_bpfStages;3)).stagename;
        StatusFlag: _stage3
    };
    {
        StatusTitle: Last(FirstN(col_bpfStages;4)).stagename;
        StatusFlag: _stage4
    }
)

Luego en el OnVisible de esa pantalla meteremos el siguiente código para obtener la instancia del BPF para el registro y para mover el BPF en función del stage en el que está en Dataverse.

Set(
    _activeStage;
    Switch(
        DataCardValue4.Selected.Value;
        Stage.'Stage 1';
        UpdateContext(
            {
                _stage1: 2;
                _stage2: 1;
                _stage3: 1;
                _stage4: 1
            }
        );
        Stage.'Stage 2';
        UpdateContext(
            {
                _stage1: 2;
                _stage2: 2;
                _stage3: 1;
                _stage4: 1
            }
        );
        Stage.'Stage 3';
        UpdateContext(
            {
                _stage1: 2;
                _stage2: 2;
                _stage3: 2;
                _stage4: 1
            }
        );
        Stage.'Stage 4';
        UpdateContext(
            {
                _stage1: 2;
                _stage2: 2;
                _stage3: 2;
                _stage4: 2
            }
        )
    )
);;
Set(
    _processIntance;
    LookUp(
        FasesDemo;
        Mar_Expediente.Expediente = TemplateGalleryList1.Selected.Expediente
    )
)

Luego en nuestro campo stage, en el OnChange cambiaremos nuestra variable _activeStage

Set(
    _activeStage;
    Switch(
        DataCardValue4.Selected.Value;
        Stage.'Stage 1';
        UpdateContext(
            {
            _stage1: 2;
            _stage2:1;
            _stage3:1;
            _stage4:1
            }
        );
        Stage.'Stage 2';
        UpdateContext(
            {
            _stage1: 2;
            _stage2:2;
            _stage3:1;
            _stage4:1
            }
        );
        Stage.'Stage 3';
        UpdateContext(
            {
            _stage1: 2;
            _stage2:2;
            _stage3:2;
            _stage4:1
            }
        );
        Stage.'Stage 4';
        UpdateContext(
            {
            _stage1: 2;
            _stage2:2;
            _stage3:2;
            _stage4:2
            }
        )
    )
)

En el botón de envío mandaremos el formulario con un SubmitForm(Form1) pero en el OnSuccess del formulario actualizaremos el stage de nuestro BPF.

 Set(
    _currentStage;
    LookUp(
        col_bpfStages;
        stagename = Text(DataCardValue4.Selected.Value);
        ThisRecord
    )
);;
Patch(
    FasesDemo;
    _processIntance;
    {
        'Active Stage': _currentStage;
        'Traversed Path': Concatenate(
            _processIntance.'Traversed Path';
            ",";
            _currentStage.'Process Stage'
        )
    }
);;
Navigate(
    Screen4;
    ScreenTransition.Cover
)

El resultado es el siguiente:


Tras estos 4 post solo queda decidir cuando se requiere hacer con un tipo de desarrollo o con otro. Con JavaScript y con PowerFx vamos a requerir que sea el usuario quien intervenga a través de la pantalla para avanzar el proceso, pero con Plugin o Power Automate el proceso se avanzará cuando los cambios ocurran directamente en Dataverse, es decir, para datos que puedan venir desde fuera por un integración o una migración.

También podríamos usar una combinación de Power Automate y desarrollo creando una Custom API para que el Power Automate sea más corto y facilitar la vida a nuestros Citizen Developers.

bottom of page