Gonzalo Rementeria

18 – Revolución en el lenguaje Power Fx. Declarando funciones

Lo mejor del Código tradicional llega al Low Code de la mano de las Canvas App y su lenguaje, powerFX.

Y es que, tras mucho tiempo, por fin se pueden declarar funciones en PowerFX.

Puede parecer que esto no es tan importante, todo lo contrario. Lo es. Puesto que supone que, en un futuro no muy lejano, es más que probable, que empiecen a crearse librerías de Funciones (Por ejemplo funciones matemáticas, funciones para tratar textos, etc.) Y si bien ahora ya hay funciones agrupadas por esas mismas tipologías, ahora se abre la puerta a que cualquiera pueda contribuir a esto. Lo cual va a acelerar aún más el desarrollo.

Por desgracia esta funcionalidad aún está como algo experimental, pero ese es el primer paso para que pase a estar en preview y finalmente en producción.

Pero vayamos a lo importante ¿Cómo se hace?

Como digo, está aún como una característica experimental, con todo lo que eso conlleva. Para activarla debemos ir a los ajustes de una de nuestras canvas app y activar este check. Es posible que al hacerlo nos pida también activar un check relacionado con el motor de búsqueda. En este mismo apartado, escribimos “motor” en el buscador y veremos la opción, marcamos ambas y listo, ya podemos declarar funciones propias.

Para ver como funciona he declarado estas 2 funciones, una primera muy sencilla y otra algo más compleja. Las funciones se declaran en el apartado de fórmulas. Por lo que lo primero es ir allí.

Función sencilla

Una vez en el apartado de formulas declaramos nuestra función siguiendo la siguiente estructura:

nombreFuncion(parametro1:tipoDato;parámetro2:tipoDato):TipoDatoSalida= Formula

Veamos este sencillo ejemplo. Una función que recibe 2 números  y devuelve el resultado de multiplicarlos.

 El nombre de la función  –> Multiplicar

Parámetros  –> Numero1( de tipo number)  y Numero2 (de tipo number)

Salida  –> (tipo number)

Fórmula  –> Numero1 * Numero2

Como vemos tenemos libertad total para declarar funciones. Para usarla solo tenemos que colocarla en donde queramos que se ejecute, indicarle los parámetros de entrada y ver los resultados. Tal que así.

Y ¿Hasta qué punto se pueden complicar las funciones? De momento solo es algo experimental, pero a priori parece que el límite es tan solo nuestra imaginación.  A continuación, muestro una función para calcular el IVA de un producto.

Esta función recibe dos parámetros un producto (text) y su precio(number), filtra un origen de datos (en este caso una colección) para obtener su tipo de IVA y después con ese dato filtra una segunda colección para obtener el tanto porciento al que corresponde ese tipo de IVA. Luego multiplica el precio del producto por ese tanto porciento entre 100. De tal manera que devuelve cuanto dinero corresponde al IVA para ese producto.

Y así se vería en uso.

En este caso he puesto los productos y valores en el código, pero nada impide que salgan de un dropdown, de un textInput o de cualquier otro componente.

 

Adjunto el código

 

				
					/*APARTADO DE FORMULAS*/
Multiplicar(
    //input que espera la funcion
    Numero1:Number; Numero2:Number
//output
):Number = Numero1 * Numero2;;

CalcularIVA(
    //input que espera la funcion
    _Producto:Text;_Valor:Number
//output
):Number=
With(
    {
        TipoIva:LookUp(ProductosIVA;Producto=_Producto;Tipo)
    };
    With(
        {
        ValorIva:LookUp(TiposIVA;Tipo=TipoIva;Valor)
        };
    _Valor *(ValorIva/100)
    )
);;


/*DENTRO DE UNA ETIQUETA*/
$"El resultado de multiplicar {TextInput1.Text} por {TextInput2.Text} es {Multiplicar(TextInput1.Text;TextInput2.Text)}"
$"para el producto 'Gel' que vale '3,86€' corresponden al IVA: {CalcularIVA("Gel";3,86)}€"&
$"para el producto 'Pan' que vale '0,5€' corresponden al IVA: {CalcularIVA("Pan";0,5)}€"&
$"para el producto 'filetes de pollo' que vale '10€' corresponden al IVA: {CalcularIVA("filetes de pollo";10)}€"&
$"para el producto 'leche' que vale '2€' corresponden al IVA: {CalcularIVA("leche";2)}€"


/*EN EL ONSTART DE LA APLICACIÓN*/
//productos
ClearCollect(
    ProductosIVA;
    {
        Tipo: "General";
        Producto: "Legía"
    };
    {
        Tipo: "General";
        Producto: "Gel"
    };
    {
        Tipo: "General";
        Producto: "Desodorante"
    };
    {
        Tipo: "Reducido";
        Producto: "filetes de merluza"
    };
    {
        Tipo: "Reducido";
        Producto: "filetes de pollo"
    };
    {
        Tipo: "SuperReducido";
        Producto: "espaguetis"
    };
    {
        Tipo: "SuperReducido";
        Producto: "macarrones"
    };
    {
        Tipo: "Exentos";
        Producto: "Leche"
    };
    {
        Tipo: "Exentos";
        Producto: "Pan"
    }
);;

//tipos de iva
ClearCollect(
    TiposIVA;
    {
        Tipo: "General";
        Valor: "21"
    };
    {
        Tipo: "Reducido";
        Valor: "10"
    };
    {
        Tipo: "SuperReducido";
        Valor: "4"
    };
        {
        Tipo: "Exentos";
        Valor: "0"
    }
)