Operadores e identificadores en Power Apps

Se aplica a: Aplicaciones de lienzo Aplicaciones basadas en modelos

Algunos de estos operadores dependen del idioma del autor. Para obtener más información sobre el soporte de idioma en las aplicaciones de lienzo, consulte Aplicaciones globales.

Símbolo Tipo Ejemplo Descripción
'...' Identificador 'Nombre de cuenta' Los identificadores que contienen caracteres especiales, incluidos espacios, se encierran entre comillas simples
"..." Cadena de texto "Hola, Mundo" Las cadenas de texto están entre comillas dobles
$"..." Interpolación de cadenas $"Estimado {FirstName}," Fórmulas incrustadas dentro de una cadena de texto
. Selector de propiedad Slider1.Value
Color.Red
Acceleration.X
Extrae una propiedad de una tabla, control, señal o enumeración. Para compatibilidad con versiones anteriores, ! también se puede utilizar.
.
[depende del idioma]
Separador decimal 1.23 Separador entre las partes entera y fraccionaria de un número. El carácter depende del idioma.
( ) Paréntesis Filter(T, A < 10)

(1 + 2) * 3
Aplica el orden de prioridad y agrupa las subexpresiones en una expresión mayor
+ Operadores aritméticos 1 + 2 Suma
-   2-1 Resta y signo
*   2 * 3 Multiplicación
/   2 / 3 División (consulte también la función Mod)
^   2 ^ 3 Exponenciación, equivalente a la función Power
%   20% Porcentaje (equivalente a "* 1/100")
= Operadores de comparación Price = 100 Igual a
>   Price > 100 Mayor que
>=   Price >= 100 Mayor o igual que
<   Price < 100 Menor que
<=   Price <= 100 Menor o igual que
<>   Price <> 100 No igual a
& Operador de concatenación de cadenas "hello" & " " & "world" Hace que varias cadenas aparezcan continuas
&& o And Operadores lógicos Price < 100 && Slider1.Value = 20
o Price < 100 And Slider1.Value = 20
Conjunción lógica, equivalente a la función And
|| o Or   Price < 100 || Slider1.Value = 20 o Price < 100 Or Slider1.Value = 20 Disyunción lógica, equivalente a la función Or
! o Not   !(Price < 100) o Not (Price < 100) Negación lógica, equivalente a la función Not
exactin Operadores de pertenencia Gallery1.Selected exactin SavedItems Perteneciente a una colección o una tabla
exactin   "Windows exactin "Para mostrar ventanas en el sistema de operativo Windows..." Prueba de subcadena (distingue mayúsculas de minúsculas)
in   Gallery1.Selected in SavedItems Perteneciente a una colección o una tabla
in   "El" in "El teclado y el monitor..." Prueba de subcadena (no distingue mayúsculas de minúsculas)
@ Operador de desambiguación MyTable[@fieldname] Desambiguación de campo
@   [@MyVariable] Desambiguación global
,
[depende del idioma]
Separador de lista If( X < 10, "Bajo", "Bien" )
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
Separa:
  • argumentos en llamadas a funciones
  • campos de un registro
  • registros en una tabla
Este carácter depende del idioma.
;
[depende del idioma]
Encadenamiento de fórmulas Collect(T, A); Navigate(S1, "") Separar invocaciones de funciones en las propiedades del comportamiento. El operador de encadenamiento depende del idioma.
Como Operador As AllCustomers As Customer Reemplace ThisItem y ThisRecord en galerías y funciones de ámbito de registros. As es útil para proporcionar un nombre mejor y más específico, y es especialmente importante en los escenarios anidados.
Self Operador Self Self.Fill Acceder a las propiedades del control actual
Primario Operador Parent Parent.Fill Acceso a las propiedades de un contenedor de control
ThisItem Operador ThisItem ThisItem.FirstName Acceder a los campos de un control Form o Gallery
ThisRecord Operador ThisRecord ThisRecord.FirstName Ofrece acceso al registro completo y los campos individuales del registro en ForAll, Sum, With y otras funciones de ámbito de registros. Se puede reemplazar con el operador As.

Nota

El operador @ también se puede utilizar para validar el tipo de objeto de registro con un origen de datos. Por ejemplo, Collect(coll,Account@{'Account Number: 1111')

Operadores in y exactin

Use los operadores in y exactin para buscar una cadena en un origen de datos, como una colección o una tabla importada. El operador in identifica coincidencias, independientemente del caso, mientras que exactin identifica coincidencias solo si coinciden las mayúsculas. Mostramos ahora un ejemplo:

  1. Cree o importe una colección denominada Inventory y muéstrela en una galería, como se describe en el primer procedimiento en Mostrar imágenes y texto en una galería.

  2. Establezca la propiedad Items de la galería en esta fórmula:
    Filter(Inventory, "E" in ProductName)

    La galería muestra todos los productos, excepto Callisto, porque el nombre de ese producto es el único que no contiene la letra que ha especificado.

  3. Cambie la propiedad Items de la galería a esta fórmula:
    Filter(Inventory, "E" exactin ProductName)

    La galería muestra solo Europa, porque es la única palabra que contiene la letra que ha especificado con el uso de mayúsculas y minúsculas que ha especificado.

Operadores ThisItem, ThisRecord y As

Algunos controles y funciones aplican fórmulas a registros individuales de una tabla. Para hacer referencia al registro individual de una fórmula, utilice uno de los siguientes:

Operador Se aplica a Descripción
ThisItem Control Gallery
Control Edit form
Control Display form
El nombre predeterminado del registro actual en un control Gallery o Form.
ThisRecord ForAll, Filter, With, Sum y otras funciones del ámbito de registros El nombre predeterminado para el registro actual en ForAll y otras funciones de ámbito de registros.
Comonombre Control Gallery
ForAll, Filter, With, Sum y otras funciones de ámbito de registros
Define un nombre para el registro actual, reemplazando los valores predeterminados ThisItem o ThisRecord. Use As para facilitar la comprensión de las fórmulas y resolver ambigüedades al anidar.

Operador ThisItem

Por ejemplo, en el siguiente control Gallery la propiedad Items se establece en el origen de datos Empleados (como la tabla Empleados incluida con la Muestra de Northwind Traders):

Employees

Empleados mostrados en una galería.

El primer elemento de la galería es una plantilla que se replica para cada empleado. En la plantilla, la fórmula de la imagen utiliza ThisItem para referirse al elemento actual:

ThisItem.Picture

Fórmula para la imagen de un empleado.

Asimismo, la fórmula para el nombre también usa ThisItem:

ThisItem.'First Name' & " " & ThisItem.'Last Name'

Fórmula para el nombre y el apellido de un empleado.

Operador ThisRecord

ThisRecord se utiliza en funciones que tienen un ámbito de registros. Por ejemplo, podemos usar la función Filter con la propiedad Items de la galería para mostrar únicamente los nombres que empiezan por M:

Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )

Filtrar los empleados por nombre mediante ThisRecord.

ThisRecord es opcional y está implícito al utilizar los campos directamente. Por ejemplo, en este caso, podríamos haber escrito:

Filter( Employees, StartsWith( 'First Name', "M" ) )

Aunque es opcional, el uso de ThisRecord puede hacer que las fórmulas sean más fáciles de entender y puede ser necesario en situaciones ambiguas en las que un nombre de campo también puede ser un nombre de relación. ThisRecord es opcional, mientras que ThisItem es siempre obligatorio.

Use ThisRecord para hacer referencia al registro completo con Patch, Collect y otras funciones de ámbito de registros. Por ejemplo, la siguiente fórmula establece como activo el estado de todos los empleados inactivos:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees,
              Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )

Operador As

Utilizar el operador As para asignar nombre a un registro en una galería o función de ámbito de registros, reemplazando los valores predeterminados ThisItem o ThisRecord. Asignar un nombre al registro puede hacer que sus fórmulas sean más fáciles de entender y puede ser necesario en situaciones anidadas para acceder a registros de otros ámbitos.

Por ejemplo, puede modificar la propiedad Items de nuestra galería para usar As con el fin de identificar que estamos trabajando con un empleado:

Employees As Employee

Galería de empleados, con el operador As.

Las fórmulas para la imagen y el nombre se ajustan con el fin de usar este nombre para el registro actual:

Employee.Picture

Imagen de un empleado que usa el nombre de empleado establecido con el operador As.

Employee.'First Name' & " " & Employee.'Last Name'

Nombre y apellido de un empleado que usa el nombre de empleado establecido con el operador As.

As también se puede usar con funciones de ámbito de registro para reemplazar el nombre predeterminado ThisRecord. Podemos aplicar esto a nuestro ejemplo anterior para aclarar el registro con el que estamos trabajando:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees As Employee,
              Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )

Al anidar galerías y funciones de ámbito de registros, ThisItem y ThisRecord siempre hacen referencia al ámbito más interno, dejando los registros de los ámbitos externos como no disponibles. Use As para hacer que todos los ámbitos de registros estén disponibles, dándole un nombre único a cada uno.

Por ejemplo, esta fórmula produce un patrón de tablero de ajedrez como una cadena de texto al anidar dos funciones ForAll:

Concat(
    ForAll( Sequence(8) As Rank,
        Concat(
            ForAll( Sequence(8) As File,
                    If( Mod(Rank.Value + File.Value, 2) = 1, " X ", " . " )
            ),
            Value
        ) & Char(10)
    ),
    Value
)

Al establecer como valor de la propiedad Text de un control Label esta fórmula, se muestra:

Texto con patrón de tablero de ajedrez mostrado en un control de etiqueta.

Analicemos lo que está sucediendo aquí:

  • Comenzamos iterando una tabla sin nombre de 8 registros numerados con la función Sequence. Este bucle es para cada fila del tablero, que comúnmente se conoce como Rank, por lo que le damos este nombre.
  • Para cada fila, iteramos otra tabla sin nombre de 8 columnas y le damos el nombre común File.
  • Si Rank.Value + File.Value es un número impar, el cuadrado obtiene una X; de lo contrario obtiene un punto. Esta parte de la fórmula hace referencia a los dos bucles ForAll, algo que es posible gracias al operador As.
  • Concat se usa dos veces: primero para ensamblar las columnas y después las filas, con un Char(10) que se usa para crear una nueva línea.

Un ejemplo similar es posible con controles Gallery anidados en lugar de funciones ForAll. Comencemos con la galería vertical para Rank. Este control de Gallery tendrá como fórmula Items:

Sequence(8) as Rank

Ilustración de la galería exterior que proporciona la iteración de Rank.

Dentro de esta galería, colocaremos una galería horizontal para el File, que se replicará para cada Rank, con una propiedad Items de:

Sequence(8) as File

Ilustración de la galería interior que proporciona la iteración de File.

Y, por último, dentro de esta galería, agregaremos un control Label que se replicará para cada File y cada Rank. Ajustaremos sus dimensiones para llenar todo el espacio y usaremos la propiedad Fill para proporcionar el color con esta fórmula:

If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )

Control de etiquetas dentro de las dos galerías que proporciona los colores alternos para el tablero de ajedrez.

Operadores Self y Parent

Hay tres formas de referirse a un control y sus propiedades dentro de una fórmula:

Método Descripción
Por nombre de control Se puede hacer referencia a todos los controles por su nombre desde cualquier lugar de la aplicación.

Por ejemplo, Label1.Fill se refiere a la propiedad de relleno del control cuyo nombre es Label1.
Operador Self A menudo es conveniente hacer referencia a otra propiedad del mismo control al escribir una fórmula. En lugar de usar una referencia absoluta por nombre, es más fácil y portátil usar una referencia relativa a uno propio. El operador Self ofrece ese accesosencillo a las propiedades del control actual.

Por ejemplo, Self.Fill se refiere al color de relleno del control actual.
Operador Parent Algunos controles alojan otros controles, como los controles Screen y Gallery. Al control que hospeda los controles se denomina el primario. Como el operador Self, el operador Parent ofrece una referencia relativa fácil al control del contenedor.

Por ejemplo, Parent.Fill se refiere a la propiedad de relleno del control que es el contenedor del control actual.

Self y Parent son operadores y no propiedades de los propios controles. Con respecto a Parent.Parent, Self.Parent o Parent.Self no se admiten.

Nombres identificadores

Los nombres de variables, orígenes de datos, columnas y otros objetos pueden contener cualquier Unicode.

Use comillas simples en torno a un nombre que contenga un espacio u otro carácter especial.
Use dos comillas simples juntas para representar una comilla simple en el nombre. Los nombres que no contienen caracteres especiales no requieren comillas simples.

Estos son algunos ejemplos de nombres de columnas que puede encontrar en una tabla y cómo se representan en una fórmula:

Nombre de columna en una base de datos Referencia de columna en una fórmula
SimpleName SimpleName
NameWith123Numbers NameWith123Numbers
Nombre con espacios 'Name with spaces'
Nombre con comillas "dobles" 'Name with "double" quotes'
Nombre con comillas 'simples' 'Name with ''single'' quotes'
Nombre con un signo @ 'Name with an @ at sign'

Las comillas dobles se utilizan para designar cadenas de texto.

Mostrar nombres y nombres lógicos

Algunos orígenes de datos como SharePoint y Microsoft Dataverse tienen dos nombres diferentes para referirse a la misma tabla o columna de datos:

  • Nombre lógico - Un nombre que se garantiza que es único, no cambia después de crearse, generalmente no permite espacios ni otros caracteres especiales y no está localizado en diferentes idiomas. Como consecuencia, el nombre puede resultar críptico. Estos nombres son utilizados por desarrolladores profesionales. Por ejemplo, cra3a_customfield. Este nombre también se puede denominar como nombre de esquema o solo nombre.

  • Nombre para mostrar: nombre fácil de usar y destinado a ser visto por los usuarios finales. Este nombre puede no ser único, puede cambiar con el tiempo, puede contener espacios y cualquier carácter Unicode, y puede estar localizado en diferentes idiomas. De acuerdo con el ejemplo anterior, el nombre para mostrar puede ser Campo personalizado, con espacio entre las palabras.

Dado que los nombres para mostrar son más fáciles de entender, las aplicaciones de lienzo los sugerirán como opciones y no sugerirán nombres lógicos. Aunque no se sugieren nombres lógicos, aún se pueden usar si se escriben indirectamente.

Por ejemplo, imagine que ha agregado un Campo personalizado a una tabla en Dataverse. El sistema le asignará un nombre lógico que solo puede modificar al crear el campo. El resultado sería similar a:

Tabla de cuentas con campo personalizado agregado, que muestra un nombre de

Al crear una referencia a un campo de Cuentas, se hará la sugerencia de usar 'Campo personalizado' ya que este es el nombre para mostrar. Se deben usar comillas simples porque este nombre tiene un espacio en él:

Barra de fórmulas de Studio que muestra sugerencias para nombres de campo Cuentas con el nombre para mostrar

Después de seleccionar la sugerencia, se muestra 'Campo personalizado' en la barra de fórmulas y se recuperan los datos:

Barra de fórmulas de Studio que muestra el uso del nombre para mostrar

Aunque no se sugiere, también podríamos usar el nombre lógico para este campo. Esto hará que se recuperen los mismos datos. No se requieren comillas simples ya que este nombre no contiene espacios ni caracteres especiales:

Barra de fórmulas de Studio que muestra el uso del nombre lógico cr5e3_customfield para el campo.

En segundo plano, se mantiene una asignación entre los nombres para mostrar vistos en las fórmulas y los nombres lógicos subyacentes. Dado que los nombres lógicos deben usarse para interactuar con el origen de datos, esta asignación se usa para convertir el nombre para mostrar actual al nombre lógico automáticamente y eso es lo que se ve en el tráfico de la red. Esta asignación también se usa para volver a convertir a nombres lógicos, a fin de cambiar a nuevos nombres para mostrar, por ejemplo, si se cambia un nombre o si un creador que habla otro idioma edita la aplicación.

Nota

Los nombres lógicos no se traducen al mover una aplicación entre entornos. Para nombres Dataverse de campos y tablas del sistema, esto no debería ser un problema ya que los nombres lógicos son consistentes en todos los entornos. Pero cualquier campo personalizado, como cra3a_customfield, en este ejemplo anterior, puede tener un prefijo de entorno diferente (cra3a, en este caso). Se prefieren los nombres para mostrar, ya que pueden compararse con los nombres para mostrar en el nuevo entorno.

Anulación de ambigüedades en los nombres

Dado que los nombres para mostrar no son únicos, el mismo nombre puede aparecer más de una vez en la misma tabla. Cuando esto sucede, el nombre lógico se agregará al final del nombre para mostrar entre paréntesis para uno de los nombres en conflicto. Partiendo del ejemplo anterior, si hubiera un segundo campo con el mismo nombre para mostrar de Campo personalizado con un nombre lógico de cra3a_customfieldalt, las sugerencias mostrarían:

Barra de fórmulas de Studio que muestra el uso del nombre lógico cr5e3_customfieldalt para desambiguar las dos versiones de

Las cadenas de desambiguación de nombres se agregan en otras situaciones en las que ocurren conflictos de nombres, como los nombres de la tabla, las opciones y otros artículos Dataverse.

Operador de desambiguación

Algunas funciones crean ámbitos de registro para acceder a los campos de la tabla mientras se procesa cada registro, como Filter, AddColumns y Sum. 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).

Para obtener más información y ejemplos, vea los ámbitos de registro.