Tablas

Nota

Microsoft Power Fx es el nuevo nombre del lenguaje de fórmulas para aplicaciones de lienzo. Estos artículos son un trabajo en progreso a medida que extraemos el idioma de las aplicaciones de lienzo, lo integramos con otros productos Microsoft Power Platform y ponerlo a disposición como código abierto. Empiece con Información general de Microsoft Power Fx para una introducción al idioma.

En Microsoft Power Fx, puede escribir una fórmula con acceso a información de Microsoft Excel, SharePoint, SQL Server y otros diversos orígenes que almacenan datos en tablas y registros. Para trabajar de forma más eficaz con este tipo de datos, revise los conceptos que subyacen a estas estructuras.

  • Un registro contiene una o varias categorías de información sobre una persona, un lugar o una cosa. Por ejemplo, un registro puede contener el nombre, la dirección de correo electrónico y el número de teléfono de un solo cliente. Otras herramientas se refieren a un registro como "fila" o "elemento".
  • Una tabla contiene uno o varios registros que incluyen las mismas categorías de información. Por ejemplo, una tabla puede contener los nombres, las direcciones de correo electrónico y los números de teléfono de 50 clientes.

Puede crear diversas fórmulas que tome el nombre de una tabla como argumento, igual que una fórmula en Excel toma una o varias referencias de celda como argumentos. Algunas fórmulas de Power Fx devuelven una tabla que refleja los otros argumentos que especifique. Por ejemplo, podría crear una fórmula:

  • para actualizar un registro en una tabla mediante la especificación de esa tabla como uno de varios argumentos para la función Patch,
  • para agregar, quitar y cambiar el nombre de las columnas de una tabla mediante la especificación de esa tabla como un argumento para la función AddColumns, DropColumns o RenameColumns. Ninguna de esas funciones modifica la tabla original. En su lugar, la función devuelve otra tabla basada en el resto de los argumentos que se especifiquen.

Elementos de una tabla

Elementos de una tabla.

Registros

Cada registro contiene al menos una categoría de información de una persona, lugar o cosa. En el ejemplo anterior se muestra un registro para cada producto (Chocolate, Pan y Agua) y una columna para cada categoría de información (Precio, Cantidad disponible y Cantidad en pedido).

En una fórmula, puede hacer referencia a un registro por sí mismo, fuera del contexto de una tabla, mediante el uso de llaves. Por ejemplo, este registro { Nombre: "Fresas", Precio: 7,99 } no está asociado a una tabla. Tenga en cuenta que los nombres de los campos, como Nombre y Precio en ese ejemplo, no están dentro de comillas dobles.

Campos

Un campo es un fragmento de información de un registro. Puede visualizar este tipo de campo como un valor de una columna para un registro concreto.

Tal como sucede con un control, para hacer referencia a un campo de un registro se usa el operador. en el registro. Por ejemplo, First(Products).Name devuelve el campo Nombre para el primer registro de la tabla Productos.

Un campo puede contener otro registro o tabla, como muestra el ejemplo de la función GroupBy. Puede anidar tantos niveles de registros y tablas como desee.

Columnas

Una columna es el mismo campo de uno o más registros de una tabla. En el ejemplo anterior, cada producto tiene un campo de precio y ese precio está en la misma columna en todos los productos. La tabla anterior tiene cuatro columnas, que se muestran horizontalmente en la parte superior:

  • Nombre
  • Precio
  • Cantidad disponible
  • Cantidad en pedido

El nombre de la columna refleja los campos de esa columna.

Todos los valores dentro de una columna son del mismo tipo de datos. En el ejemplo anterior, la columna "Cantidad disponible" siempre contiene un número y no puede contener una cadena, como "12 unidades", para un registro. El valor de cualquier campo también puede aparecer en blanco.

Es posible que en otras herramientas haya hecho referencia a las columnas con el término "campos".

Tabla

Una tabla consta de uno o varios registros, cada uno con varios campos que tienen nombres coherentes entre los registros.

Cualquier tabla almacenada en un origen de datos o en una colección tiene un nombre, que se usa para hacer referencia a la tabla y para pasarlo a funciones que consideran las tablas como argumentos. Las tablas también pueden resultar de una función o de una fórmula.

Como en el ejemplo siguiente, puede expresar una tabla en una fórmula mediante la utilización de la función Table con un conjunto de registros, que se expresa entre llaves:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

También puede definir una tabla de una sola columna entre corchetes. Una manera equivalente de escribir lo anterior:

[ "Strawberry", "Vanilla" ]

Fórmulas de tabla

En Excel y Power Fx, las fórmulas se usan para manipular números y cadenas de texto de formas similares:

  • En Excel, escriba un valor, como 42, en la celda A1 y después escriba una fórmula, como A1+2, en otra celda para mostrar el valor de 44.
  • En Power Apps, establezca la propiedad Default de Slider1 en 42, y defina la propiedad Text de una etiqueta en Slider1.Value + 2 para mostrar el valor de 44.

En ambos casos, el valor calculado cambia automáticamente si modifica los valores de los argumentos (por ejemplo, el número de la celda A1 o el valor de Slider1).

Del mismo modo, puede usar fórmulas para acceder a datos de tablas y registros y manipularlos. Puede usar nombres de tablas como argumentos en algunas fórmulas, como Min(Catalog, Price), para mostrar el valor mínimo en la columna Precio de la tabla Catálogo. Otras fórmulas proporcionan tablas completas como valores devueltos, como RenameColumns(Catalog, "Price", "Cost"), que devuelve todos los registros de la tabla Catálogo, pero cambia el nombre de la columna Precio a Coste.

Al igual que con los números, las fórmulas relacionadas con tablas y registros se recalculan automáticamente a medida que el registro o la tabla subyacentes cambian. Si el coste de un producto de la tabla Catálogo está muy por debajo del mínimo anterior, el valor devuelto de la fórmula Min cambiará automáticamente para establecer la coincidencia.

Funciones de tabla y propiedades de control

Considere la función Lower. Si la variable welcome contiene la cadena de texto "Hello, World", la formula Lower (welcome) devuelve "hello, world". Esta función no cambia de ninguna manera el valor en esa variable. Lower es una función pura porque solo procesa entradas y produce salidas. Eso es todo; no tiene efectos secundarios. Todas las funciones en Excel y la mayoría de las funciones en Power Fx son funciones puras, que permiten que el libro o la aplicación se recalculen automáticamente.

Power Fx ofrece un conjunto de funciones que operan en tablas de la misma manera. Estas funciones toman tablas como entrada y filtran, clasifican, transforman, reducen y resumen tablas completas de datos. De hecho, Lower y muchas otras funciones que generalmente toman un solo valor también pueden tomar una tabla de una sola columna como entrada.

Muchas funciones toman una tabla de una sola columna como entrada. Si una tabla completa tiene solo una columna, puede especificarla por su nombre. Si una tabla tiene varias columnas, puede especificar una de esas columnas mediante una sintaxis Table.Column. Por ejemplo, Products.Name devuelve la tabla de una sola columna de solo valores Nombre de la tabla Productos.

Puede cambiar completamente la forma de una tabla como desee mediante el uso de la función AddColumns, RenameColumns, ShowColumns o DropColumns. Una vez más, estas funciones solo cambian su salida, no su origen.

Fórmulas de comportamiento

Otras funciones están especialmente diseñadas para modificar datos y tienen efectos secundarios. Puesto que estas funciones no son puras, debe compilarlas con cuidado, y no pueden participar en el recálculo automático de valores en la aplicación. Puede usar estas funciones únicamente dentro de fórmulas de comportamiento.

Ámbito del informe

Algunas funciones se aplican mediante la evaluación de una fórmula en todos los registros de una tabla de forma individual. El resultado de la fórmula se utiliza de varias maneras:

  • AddColumns: la fórmula proporciona el valor del campo agregado.
  • Average, Max, Min, Sum, StdevP, VarP: la fórmula proporciona el valor que se va a agregar.
  • Filter, Lookup: la fórmula determina si el registro debe incluirse en la salida.
  • Concat: la fórmula determina las cadenas que se deben concatenar.
  • Distinct: la fórmula devuelve un valor, que se usa para identificar registros duplicados.
  • ForAll: la fórmula puede devolver cualquier valor, posiblemente con efectos secundarios.
  • Sort: la fórmula ofrece el valor en función del cual ordenar los registros.
  • With: la fórmula puede devolver cualquier valor, posiblemente con efectos secundarios.

Dentro de estas fórmulas, puede hacer referencia a los campos del registro que se va a procesar. Cada una de estas funciones crea un "ámbito de registro" en el que se evalúa la fórmula, donde los campos del registro están disponibles como identificadores de primer nivel. También puede hacer referencia a propiedades de control y a otros valores desde toda la aplicación.

Por ejemplo, tome una tabla de Productos colocado en una variable global:

Tablas solicitadas.

Set( 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 }
    )
)

Para determinar si se había solicitado más cantidad de alguno de estos productos de la que se encuentra disponible:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

El primer argumento para Filtrar es la tabla de registros en los que operar, y el segundo argumento es una fórmula. Filtrar crea un ámbito de registro para evaluar esta fórmula en la que están disponibles los campos de cada registro; en este caso, Producto, Cantidad en pedido y Cantidad disponible. El resultado de la comparación determina si cada registro debe incluirse en el resultado de la función:

Tablas necesarias.

Según este ejemplo, podemos calcular qué cantidad de cada producto solicitar:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

A continuación, se va a agregar una columna calculada al resultado. AddColumns tiene su propio ámbito de registro que se utiliza para calcular la diferencia entre lo que se ha solicitado y lo que está disponible.

Agregar columnas.

Por último, se puede reducir la tabla de resultados a solo las columnas deseadas:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Solo para ordenar.

Tenga en cuenta que en la fórmula anterior, se han usado comillas dobles (") en algunos casos y comillas simples (') en otros. Las comillas simples son necesarias cuando se hace referencia al valor de un objeto, como un campo o una tabla, donde el nombre del objeto contiene un espacio. Las comillas dobles se usan cuando no se hace referencia al valor de un objeto, sino que se habla de él, sobre todo en situaciones en que el objeto todavía no existe, como en el caso de AddColumns.

Anulación de ambigüedades

Los nombres de campo agregados con el ámbito de registro anulan los mismos nombres de los restantes lugares de la aplicación. Cuando esto sucede, para acceder a los valores desde fuera del ámbito de registro hay que utilizar el operador @ de anulación de ambigüedades:

  • Para acceder a valores de ámbitos de registro anidados, use el operador @ con el nombre de la tabla en la que opera mediante este modelo:
    Table[@FieldName]
  • Para acceder a valores globales, como orígenes de datos, colecciones y variables de contexto, use el modelo [@ObjectName] (sin designación de tabla).

Si la tabla en la que se opera es una expresión, como Filter(Table, ... ), no se puede usar el operador de desambiguación. Solo el ámbito de registro más interno puede acceder a los campos de esta expresión de tabla, pero sin usar el operador de anulación de ambigüedades.

Por ejemplo, imagine que tiene una colección X:

Valor de X.

Puede crear esta colección con ClearCollect( X, [1, 2] ).

Y otra colección Y:

Valor de Y.

Puede crear esta colección con ClearCollect( Y, ["A", "B"] ).

Además, defina una variable de contexto denominada Value con esta fórmula: UpdateContext( {Value: "!"} )

Se va a agrupar todo. En este contexto, la fórmula siguiente:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

genera esta tabla:

Valor de XY.

¿Qué sucede aquí? La función ForAll más externa define un ámbito de registro para X, que permite acceder al campo Valor de cada registro a medida que se procesa. Puede acceder a él con tan solo usar la palabra Value o X[@Value].

La función ForAll más interna define otro ámbito de registro para Y. Puesto que esta tabla también tiene un campo Valor definido, el uso de Value aquí hace referencia al campo de registro de Y y ya no es el de X. Aquí, para tener acceso al campo Valor de X, debemos usar la versión más larga con el operador de anulación de ambigüedades.

Puesto que Y es el ámbito de registro más interno, el acceso a los campos de esta tabla no precisa de la anulación de desambigüedades, lo que permite usar esta fórmula con el mismo resultado:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

Todos los ámbitos de registro ForAll invalidan el ámbito global. La variable de contexto Value definida no está disponible por su nombre sin el operador de anulación de ambigüedades. Para obtener acceso a este valor, use [@Value].

Ungroup reduce el resultado porque las funciones ForAll anidadas dan como resultado una tabla de resultados anidados.

Tablas de una sola columna

Para operar en una sola columna de una tabla, use la función ShowColumns como en este ejemplo:

ShowColumns( Products, "Product" )

Esta fórmula genera esta tabla de una sola columna:

Columna única.

Para una alternativa más corta, especifique Table.Column, que extrae la tabla de una sola columna de Columna solamente de Tabla. Por ejemplo, esta fórmula produce exactamente el mismo resultado que el uso de ShowColumns.

Products.Product

Registro en línea

Exprese registros con el uso de llaves que contienen valores de campo con nombre. Por ejemplo, puede expresar el primer registro en la tabla al inicio de este tema mediante la utilización de la fórmula:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

También puede insertar fórmulas dentro de otras, como se muestra en este ejemplo:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Puede anidar registros mediante llaves de anidación, como se muestra en este ejemplo:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Encierre cada nombre de columna que contiene un carácter especial, como un espacio o dos puntos, entre comillas simples. Para usar una comilla simple dentro de un nombre de columna, duplíquela.

Tenga en cuenta que el valor de la columna Precio no incluye ningún símbolo de moneda, como un signo de dólar. Dicho formato se aplicará cuando se muestre el valor.

Tablas en línea

Puede crear una tabla mediante la utilización de la función Table y un conjunto de registros. Puede expresar la tabla al inicio de este tema mediante la utilización de la fórmula:

Table( 
	{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
	{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
	{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

También puede anidar tablas:

Table( 
	{ Name: "Chocolate", 
	  'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
	                             { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
	}
)

Tablas de valores en línea

Puede crear tablas de una sola columna mediante la definición de valores entre corchetes. La tabla resultante tiene una sola columna, denominada Valor.

Por ejemplo, [ 1, 2, 3, 4 ] es equivalente a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) y devuelve esta tabla:

Tabla alineada.