Gonzalo Rementeria

06 – Dos Trucazos para mejorar nuestras Canvas Apps

Muy buenas. En este artículo veremos 2 tips super útiles para power apps, aplicado a un caso real.

El caso que me plantearon es el siguiente. Dada la siguiente tabla (antes llamada pocTrimestres). Genera un grilla que contenga todos los trimestres que haya entre la fecha prevista de inicio y la de fin.

Y los 2 trucos que he aplicado son los siguientes:

  • Usar with anidados para ahorrarme declarar variables que en otros ámbitos solo crearían ruido.
  • Usar secuence para ayudar a pasar de un número a un array (en este caso el número de trimestres) que pueda usar
    para llenar una colección.

Sin más os comento como lo hice:

Lo primero de todo, no tengáis en cuenta la estética pues, para este artículo quiero centrar toda la atención en los puntos que os hemencionado. Para lograr esto solo hacen falta 2 componentes.

  • Un dropdown que se puebla con la tabla de trimestres y muestra el código (para este ejemplo el desplegable mostrará 3
    códigos: Codigo_1, Codigo_2 y Codigo_3).
  • Un gallery horizontal que contiene todos los trimestres entre ambas fechas y por cada una muestra el año, el trimestre y un text input.

La galería está llenándose con una colección (colTrimestres) que se llena dinámicamente en el momento de elegir una opción del desplegable (en el onChange). Es aquí donde está toda la lógica del código y donde he aplicado estos 2 tips.

En las siguientes imágenes lo comento. No obstante, al final del artículo está el código por si os es de utilidad. Pero antes voy a explicar cómo se usan estas 2 funciones y para que sirven.

With

Esta función, a veces olvidada, ayuda a trabajar muy parecido a como se hace en Power BI con DAX. Permite crear variables que usaremos más adelante y que solo se usarán en ese ámbito. Es decir, no se podrá interactuar con ellas de ninguna forma ni desde otra pantalla, ni desde la misma, ni de ningún otro lugar fuera del with. Su estructura es la siguiente

With({  

 //declaro variables de esta forma  Variable1: Valor Variable1; Variable2:ValorVariable2

};

//uso las variables que he creado antes y que solo estarán disponibles en esta porción de código 

Ejemplo

With( { radius: 10;  height: 15 };    Pi() * (radius*radius) * height)

// Result: 4712.38898038 (as shown in a label control)

Limitaciones. No puedo usar una variable declarada para declarar otras variables en ese mismo ámbito

Solución. Anido otro With que podrá ayudarse de las variables previamente creadas.

 

Sequence

Esta función permite crear un array de valores en una secuencia. Admite 3 parámetros. El 1º el número de valores de esa secuencia. El 2º el valor inicial de la secuencia y el 3º la distancia entre un valor y otro. 

Ejemplos

Sequence( 4, -100, 5 )  tabla con los siguientes valores (-100;  -95;  -90;   -85)

Sequence( 5, 0, 1 )  tabla con los siguientes valores (0;  1;  2;  3;  4;  5)

 

Una vez visto esto vamos con el código.

 

En cuanto a la colección así queda.

Y así se ve la colección dinámica para cada uno de los 3 registros.

Y en cuanto al código que hay en el onChange del textInput es este:

				
					With(
    {
        registro: LookUp(
            pocTrimestres;
            Código = Cbx_Selector.Selected.Código
        )
    };
    //modelo el registro elegido para tener el año de inicio, trimestre de inicio y el número de trimestres
    With(
        {
            AñoInicio_1: Year(registro.FechaPrevistaInicio);
            TrimestreIncio_1: If(
                Month(registro.FechaPrevistaInicio) <= 3;
                1;
                Month(registro.FechaPrevistaInicio) >= 4 And Month(registro.FechaPrevistaInicio) < 6;
                2;
                Month(registro.FechaPrevistaInicio) >= 7 And Month(registro.FechaPrevistaInicio) < 9;
                3;
                4
            );
            NumTrimestre_1: DateDiff(
                registro.FechaPrevistaInicio;
                registro.FechaPrevistaFin;
                TimeUnit.Quarters
            ) + 1
        };
        //hago una secuencia para poder hacer luego el forall
        With(
            {
                secuencia_2: Sequence(
                    NumTrimestre_1;
                    0
                )
            };
            Clear(colTrimestres);;
            ForAll(
                secuencia_2 As _item;
                //por cada vuelta del bucle caluclo el trimestre y el trimestre acumulado que usare para el año
                With(
                    {
                        trimestre_3: If(
                            Mod(
                                TrimestreIncio_1 + _item.Value;
                                4
                            ) = 0;
                            4;
                            Mod(
                                TrimestreIncio_1 + _item.Value;
                                4
                            )
                        );
                        trimestreAcumulado_3: TrimestreIncio_1 + _item.Value
                    };
                    Collect(
                        colTrimestres;
                        {
                            Año: If(
                                Mod(
                                    trimestreAcumulado_3;
                                    4
                                ) = 0;
                                AñoInicio_1 + RoundDown(
                                    trimestreAcumulado_3 / 4;
                                    0
                                ) - 1;
                                AñoInicio_1 + RoundDown(
                                    trimestreAcumulado_3 / 4;
                                    0
                                )
                            );
                            Trimestre: If(
                                AñoInicio_1 = AñoInicio_1 + RoundDown(
                                    trimestre_3 / 4;
                                    0
                                ) - 1;
                                4;
                                trimestre_3
                            );
                            Valor: 0;
                            FechaDePrevision:Today();
                            Codigo:Self.Selected.Código;
                            //estos son solo para tener vision de los valores pero no son necesarios
                            TrimestreInicio: TrimestreIncio_1;
                            TrimestreAcumulado: trimestreAcumulado_3;
                            Mes: Month(registro.FechaPrevistaInicio);
                            Añoinicio: AñoInicio_1
                        }
                    )
                )
            )
        )
    )
)


				
			

Aqui, mejorada la estética y con alguna funcionalidad más