2 marzo, 2024

PROGRAMANDO UN BUSCADOR EFICIENTE EN POWER APPS CON POWER AUTOMATE, ESTRATEGIAS PARA EVITAR PROBLEMAS DE DELEGACIÓN

Hola a todos,

Dado que siempre ando liado y con poco tiempo, me aseguro de que lo que comparto en Excel Signum resulta interesante. Y como parece que este tema despierta curiosidad, me animé a contaros cómo lo desarrollé y compartirlo con todos, que por eso somos una comunidad.»

Bien, el objetivo del post es encontrar una alternativa a las búsquedas en Power Apps condicionadas frecuentemente a los límites que nos deja la delegación. Por ejemplo, si estamos buscando sobre una lista de SharePoint de 5.000 o 20.000 registros usando un cuadro combinado, lo máximo que vamos a buscar es hasta los 2.000 registros. El motivo es que la función Search no delega.

Además, el cuadro combinado ofrece la posibilidad de realizar búsquedas por cualquier parte de la palabra (subcadenas), pero con el problema de la delegación se queda restringido a listas de datos muy pequeñas.

Para superar esta limitación he creado la siguiente alternativa:


En nuestro Power Apps vamos a crear una aplicación de lienzo, y luego añadimos una entrada de texto, un botón y una galería para mostrar los datos de la búsqueda.

El siguiente paso es crear un flujo de Power Automate para realizar la búsqueda. Para ello vamos a la pestaña de Power Automate de nuestro editor de Power Apps y pulsamos en Agregar flujo. En este caso, mi flujo se llama FLUJO BUSQUEDA:

Ahora exploraremos paso por paso cómo se crea:

El primer paso es el desencadenante, y en este caso es Power Apps:

En el siguiente paso vamos a crear una variable y la inicializamos:

El título es inputText (o el que queráis), el tipo es Cadena y el Valor, debéis seleccionar en contenido dinámico la opción Preguntar en PowerApps. Automáticamente se creará el valor inicializarvariable_Valor.

El siguiente paso trabajar sobre nuestra lista de SharePoint y para ello vamos a seleccionar la acción: Obtener elementos:

En este caso indicamos la dirección de nuestro sitio de SharePoint y el nombre de la lista sobre la que vamos a buscar. A continuación indicamos en consulta de filtro: substringof(‘ inputText’)}’, Title). Donde InputText es la salida de la acción anterior y Title el campo de SharePoint sobre el que vamos a buscar.

Y además, y esto es importante, pulsamos en los tres puntos de la esquina superior derecha y luego Configuración:

Y habilitamos la opción Paginación e indicamos un número de registros a los que nuestra base de datos no llegará, por ejemplo, 50.000 (esto según vuestros proyectos). Y luego bajad el cursor y pulsar en listo para que se guarde la configuración.

El siguiente paso será añadir otra acción de variable, que es seleccionar de nuestros datos anteriores el campo que necesitamos mostrar. Por ello, seleccionamos value en el apartado Desde y en Mapa, indicamos un nombre para nuestro campo, que será Title y luego lo seleccionamos la lista de SharePoint, que es Materiales.

El siguiente paso es añadir otra acción de variable, Redactar y pasar los datos a formato json:

Donde indicamos en contenido dinámica Salida de la acción anterior.

Y finalmente añadimos la acción Responder a una instancia de PowerApps o a un flujo, donde vamos a seleccionar la salida de la acción Redactar.

Y ya tenemos nuestro flujo terminado. Pero aún no hemos finalizado nuestro trabajo, esto es lo que nuestro flujo nos enviará, por ejemplo si buscamos: MANZANAS

"json('[{\"Title\":\"REBANADOR DE MANZANAS\"},{\"Title\":\"RALLADOR DE MANZANAS PLASTICO\"}]')"

Como veis, el resultado tiene muchos elementos que no nos interesan: corchetes, paréntesis, etc

Para procesar todo esto, lo vamos a hacer en Power Apps y para ello vamos a colocar el siguiente código en nuestro botón buscar:

ClearCollect(ResBusqueda; FLUJOBUSQUEDA.Run(TextInput1.Text));;
Set(jsonText; First(ResBusqueda).text);;
Set(jsonTextClean; 
    Substitute(
        Substitute(
            Substitute(
                Substitute(
                    Substitute(
                        Substitute(
                            Substitute(
                                Substitute(jsonText; 
                                    "["; ""
                                ); 
                                "]"; ""
                            ); 
                            "{"; ""
                        ); 
                        "}"; ""
                    ); 
                    """Title"":"""; ""
                ); 
                """"; ""
            );
            "json('"; ""
        );
        "')"; ""
    )
);;
ClearCollect(FinBusqueda; Split(jsonTextClean; ","));;
If(
    IsBlank(jsonTextClean);
    Notify("No se ha encontrado ningún resultado"; NotificationType.Warning)
)

Primero ejecutamos el flujo y creamos una colección con el resultado de la búsqueda (es decir, de ejecutar el flujo), y la llamaremos ResBusqueda:

ClearCollect(ResBusqueda; FLUJOBUSQUEDA.Run(TextInput1.Text));;

En el siguiente paso seleccionamos el contenido de la colección y lo pasamos a una variable (jsonText):

Set(jsonText; First(ResBusqueda).text);;

En el siguiente paso limpiamos nuestra cadena de resultado y creamos otra colección con el resultado final y con la función split tendremos una línea por cada resultado de la búsqueda:

Set(jsonTextClean; 
    Substitute(
        Substitute(
            Substitute(
                Substitute(
                    Substitute(
                        Substitute(
                            Substitute(
                                Substitute(jsonText; 
                                    "["; ""
                                ); 
                                "]"; ""
                            ); 
                            "{"; ""
                        ); 
                        "}"; ""
                    ); 
                    """Title"":"""; ""
                ); 
                """"; ""
            );
            "json('"; ""
        );
        "')"; ""
    )
);;
ClearCollect(FinBusqueda; Split(jsonTextClean; ","));;

Finalmente he creado una notificación por si no se encuentran datos.

If(
    IsBlank(jsonTextClean);
    Notify("No se ha encontrado ningún resultado"; NotificationType.Warning)
)

Para finalizar, mostraremos el resultado de la búsqueda en la galería, para ello debemos indicar en la propiedad Items la variable con el resultado: FinBusqueda.

Y automáticamente se mostrará el resultado:

Por ejemplo, si buscamos la palabra: platos

Como podéis ver, la búsqueda se produce correctamente y por cualquier parte de la palabra. En este caso la lista tiene 11.000 registros (la paginación de 50.000 llega de sobra, sería mejor usar 20.000).

Y esto es todo! espero que os haya resultado útil para vuestros proyectos.

Saludos!

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies