Compartir a través de


ForAll Función

Se aplica a: Aplicaciones de lienzo Copilot Studio Desktop fluyen aplicaciones controladas por modelos de power Platform FUNCIONES de Power Platform Dataverse Power Pages

Calcula valores y realiza acciones para todos los registros de una tabla.

Descripción

La ForAll función evalúa una fórmula para todos los registros de una tabla. La fórmula puede calcular un valor o realizar acciones, como modificar datos o trabajar con una conexión. Use la función With para evaluar la fórmula de un solo registro.

Use la función Sequence con la ForAll función para iterar en función de un recuento.

Los campos de registro que se están procesando actualmente estarán disponibles en la formula. Use el operador ThisRecord o simplemente haga referencia a los campos por nombre como lo haría con cualquier otro valor. El operador As también se puede usar para nombrar el registro que se está procesando, lo que puede ayudar a que su fórmula sea más fácil de entender y hacer accesibles los registros anidados. Para obtener más información, vea los ejemplos siguientes y trabajar con el ámbito de registros.

Valor de retorno

Se devuelve el resultado de cada evaluación de fórmula en una tabla, en el mismo orden que la tabla de entrada.

Si el resultado de la fórmula es un valor único, la tabla resultante es una tabla de una sola columna. Si el resultado de la fórmula es un registro, la tabla resultante contendrá registros con las mismas columnas que el registro del resultado.

Si el resultado de la fórmula es un valor en blanco , no hay ningún registro en la tabla de resultados para ese registro de entrada. En este caso, hay menos registros en la tabla de resultados que la tabla de origen.

Realización de acciones

La fórmula puede incluir funciones que realicen acciones, como modificar los registros de un origen de datos con las funciones Patch y Collect. La fórmula también puede llamar a métodos en las conexiones. Se pueden realizar varias acciones por registro mediante el operador ;. No se puede modificar la tabla que es el asunto de la ForAll función.

Al escribir la fórmula, tenga en cuenta que los registros se pueden procesar en cualquier orden y, siempre que sea posible, en paralelo. Se puede procesar el primer registro de la tabla después del último registro.

Tenga cuidado para evitar la ordenación de las dependencias. Por este motivo, no puede usar las funciones UpdateContext, Clear y ClearCollect dentro de una ForAll función porque podrían usarse fácilmente para contener variables que podrían ser susceptibles a este efecto. Puede usar Collect, pero el orden en que se agregan los registros no está definido.

Varias funciones que modifican los orígenes de datos, incluidas las funciones Collect, Remove y Update, devuelven el origen de datos que han cambiado como su valor devuelto. Estos valores devueltos pueden ser grandes y consumir recursos significativos si se devuelven para cada registro de la ForAll tabla. También puede encontrar que estos valores devueltos no son lo que espera porque ForAll puede funcionar en paralelo y puede separar los efectos secundarios de estas funciones de obtener su resultado. Si no se usa el valor devuelto de ForAll , que suele ser el caso de las funciones de modificación de datos, no se creará el valor devuelto y no habrá ningún problema de recurso o orden. Pero si usa el resultado de y ForAll una de las funciones que devuelve un origen de datos, piense cuidadosamente en cómo estructura el resultado y pruébelo primero en conjuntos de datos pequeños.

Alternativas

Muchas funciones de Power Apps pueden procesar más de un valor a la vez mediante una tabla de una sola columna. Por ejemplo, la función Len puede procesar una tabla de valores de texto, devolviendo una tabla de longitudes, de la misma manera, que ForAll podría. Esto puede eliminar la necesidad de usar ForAll en muchos casos, puede ser más eficaz y es más fácil de leer.

Otra consideración es que ForAll no es delegable mientras que otras funciones pueden ser, como Filter.

Delegación

Cuando se usa con un origen de datos, esta función no se puede delegar. Solo se recuperará la primera parte del origen de datos, y después se aplicará la función. Es posible que el resultado no represente la historia completa. Puede que aparezca una advertencia en el momento de la creación para recordarle esta limitación y sugerirle un cambio a alternativas delegables siempre que sea posible. Para obtener más información, consulte la información general sobre delegación

Sintaxis

ForAll(Tabla, Fórmula)

  • Tabla - Obligatorio. Tabla sobre la que se va a actuar.
  • Fórmula - Obligatoria. La fórmula que se evalúa para todos los registros de la tabla.

Ejemplos

Cálculos

Los ejemplos siguientes usan el origen de datosSquares:

Ejemplo de cuadrados.

Para crear este origen de datos como una colección, establezca la propiedad OnSelect de un control Button en esta fórmula, abra el modo de vista previa y, a continuación, seleccione el botón:

ClearCollect( Squares, [ "1", "4", "9" ] )

Fórmula Descripción Resultado
ForAll( Cuadrados, Sqrt( Valor )

Sqrt(cuadrados)
Para todos los registros de la tabla de entrada calcula la raíz cuadrada de la columna Value. La función Sqrt también se puede usar con una tabla de una sola columna, lo que permite realizar este ejemplo sin usar ForAll. Ejemplo de Sqrt.
ForAll( Cuadrados, Power( Valor, 3 ) ) Para todos los registros de la tabla de entrada eleva la columna Valor a la tercera potencia. La función Power no admite tablas de columna única. Por lo tanto, ForAll debe usarse en este caso. Ejemplo de Power.

Uso de una conexión

Los ejemplos siguientes usan el origen de datosExpressions:

Ejemplo de expresiones.

Para crear este origen de datos como una colección, establezca la propiedad OnSelect de un control Button en esta fórmula, abra el modo de vista previa y, a continuación, seleccione el botón:

ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Este ejemplo usa también una conexión con Microsoft Translator. Para agregar esta conexión a la aplicación, consulte el artículo acerca de cómo administrar conexiones.

Fórmula Descripción Resultado
ForAll(Expresiones, MicrosoftTranslator.Translate(Value, "es")) Para todos los registros de la tabla Expressions, traduce el contenido de la columna Value en español (abreviado "es"). Ejemplo con valor
ForAll(Expresiones, MicrosoftTranslator.Translate(Value, "fr")) Para todos los registros de la tabla Expressions, traduce el contenido de la columna Value en francés (abreviado "fr"). Ejemplo con valor

Copia de una tabla

A veces, es necesario filtrar, dar forma, ordenar y manipular los datos. Power Apps proporciona muchas funciones para hacer esto, como Filter, AddColumns y Sort. Power Apps trata cada tabla como un valor, lo que le permite fluir a través de fórmulas y consumirse fácilmente.

Y, a veces, querrá hacer una copia de este resultado para usarlo posteriormente, o desea mover información de un origen de datos a otro. Power Apps proporciona la función Collect para copiar datos.

Pero antes de hacer esa copia, piense detenidamente si es necesario. Hay muchas situaciones que se pueden solucionar mediante el filtrado y la forma del origen de datos subyacente a petición con una fórmula. Algunas de las desventajas a la hora de realizar una copia son:

  • Dos copias de la misma información significa que una de ellas puede quedar desfasada por no sincronizarse.
  • Realizar una copia puede consumir gran parte de la memoria del equipo, ancho de banda de red y mucho tiempo.
  • Para la mayoría de los orígenes de datos, no se puede delegar la copia, lo que limita la cantidad de datos que se pueden mover.

Los ejemplos siguientes usan el origen de datosProducts:

Ejemplo de origen de datos de productos.

Para crear este origen de datos como una colección, establezca la propiedad OnSelect de un control Button en esta fórmula, abra el modo de vista previa y, a continuación, seleccione el botón:

ClearCollect( Products,
    Table(
        { Product: "Widget",    'Quantity Requested': 6,  'Quantity Available': 3 },
        { Product: "Gadget",    'Quantity Requested': 10, 'Quantity Available': 20 },
        { Product: "Gizmo",     'Quantity Requested': 4,  'Quantity Available': 11 },
        { Product: "Apparatus", 'Quantity Requested': 7,  'Quantity Available': 6 }
    )
)

Nuestro objetivo es trabajar con una tabla derivada que incluya solo los artículos de los que se ha solicitado una cantidad mayor a la disponible y para los cuales hay que realizar un pedido:

Ejemplo de tabla de derivadas.

Se puede realizar esta tarea de dos maneras diferentes, que generan el mismo resultado, y cada una con sus ventajas y desventajas.

Forma de tabla a petición

No haga esa copia. Podemos utilizar la fórmula siguiente en cualquier lugar que sea necesario:

// Table shaping on demand, no need for a copy of the result
ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Se crea un ámbito de registro mediante las funciones Filter y AddColumns que permite realizar las operaciones de comparación y resta, respectivamente, con los campos 'Cantidad en pedido' y 'Cantidad disponible' de cada registro.

En este ejemplo, la función Filter se puede delegar. Esto es importante, ya que puede encontrar todos los productos que cumplen los criterios, incluso si se trata solo de unos pocos registros en una tabla de millones de ellos. En este momento, ShowColumns y AddColumns no se pueden delegar, por lo que el número real de productos que deben solicitarse es limitado. Si sabe que el tamaño de este resultado siempre es relativamente pequeño, este enfoque es correcto.

Y como no hicimos una copia, no hay ninguna copia adicional de la información para administrar o dejar de estar actualizada.

ForAll a petición

Otro enfoque consiste en usar la ForAll función para reemplazar las funciones de forma de tabla:

ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        {
            Product: Product,
            'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
        }
    )
)

Esta fórmula puede ser más sencilla de leer y escribir para algunas personas.

Ninguna parte del objeto ForAll es delegable. Solo se evalúa la primera parte de la tabla Products , lo que podría ser un problema si esta tabla es grande. Dado que la función Filter se pudo delegar en el ejemplo anterior, esta podría funcionar mejor con grandes conjuntos de datos.

Recopilación de resultados

En algunos casos, puede que sea necesario realizar una copia de los datos. Puede que necesite mover información de un origen de datos a otro. En este ejemplo, se realizan los pedidos a través de una tabla denominada NewOrder del sistema del proveedor. En el caso de las interacciones de usuario de alta velocidad, es posible que desee almacenar en caché una copia local de una tabla para que no haya ninguna latencia del servidor.

Se utilizará la misma forma de tabla que en los dos ejemplos anteriores, pero se capturará el resultado en una colección:

ClearCollect( NewOrder,
    ShowColumns(
        AddColumns(
            Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
            "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
        ),
        "Product",
        "Quantity To Order"
    )
)
ClearCollect( NewOrder,
    ForAll( Products,
        If( 'Quantity Requested' > 'Quantity Available',
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

ClearCollect y Collect no se pueden delegar. Como consecuencia, la cantidad de datos que se pueden mover de esta manera es limitada.

Recopilar dentro de ForAll

Por último, podemos realizar la recopilación directamente dentro de ForAll:

Clear( NewOrder );
ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        Collect( NewOrder,
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

De nuevo, la ForAll función no se puede delegar en este momento. Si nuestra tabla Products es grande, ForAll examina solo el primer conjunto de registros y podemos perder algunos productos que necesitan ser ordenados. Pero para las tablas que sabemos son pequeñas, este enfoque es correcto.

Tenga en cuenta que no capturamos el resultado de ForAll. Las llamadas a la función Collect realizadas desde dentro devuelven el origen de datos NewOrder para todos los registros, lo que podría agregar hasta numerosos datos si lo capturamos.

Asignar tabla en un componente

Vea Asignar tablas.