Compartir a través de


Valores dinámicos

Dynamic es un tipo de datos en Power Fx que puede contener cualquier estructura de datos, compleja o sencilla. No se puede usar directamente ni convertir a otro tipo de datos en tiempo de ejecución, ya sea explícita o implícitamente. Solo se puede obtener acceso a los campos de registros de un valor dinámico mediante la notación de puntos y la existencia de campos solo se comprueba en tiempo de ejecución.

Hay dos maneras de crear un valor dinámico :

Nota:

Dynamic se llamaba anteriormente UntypedObject. Solo ha cambiado el nombre, no hay ningún cambio en la semántica. El único lugar donde el nombre habría aparecido en una fórmula es en las versiones experimentales de funciones definidas por el usuario y tipos definidos por el usuario.

Tipos sencillos

El valor de una variable que contiene un valor dinámico no se puede usar directamente. Siempre tiene que escribirlo correctamente mediante el constructor de tipos correspondiente o conviértalo en un tipo específico con funciones AsType y ParseJSON .

En los ejemplos siguientes se convierte el valor de una variable dinámica denominada DynValue.

Text(DynValue)
Value(DynValue)

En la tabla siguiente se enumeran los tipos de datos y las funciones correspondientes para convertir Dynamic a ese tipo de datos.

Tipo de datos Function Descripción
Booleana Boolean() Al convertir Dynamic a Boolean, el valor subyacente tiene que representar un valor booleano o un tipo que se puede convertir automáticamente (como una cadena "true").
Color ColorValue() o RGBA() Los colores se pueden representar en notación de definición de color de hoja de estilos en cascada (CSS) como cadena, o como componentes RGBA individuales. La dinámica se puede convertir directamente desde una cadena de definición de color de hoja de estilos en cascada (CSS) mediante la función ColorValue() o desde números RGBA individuales en color mediante la función RGBA().
Moneda, número Value() Al convertir Dynamic a Number, el valor subyacente tiene que representar un número o un tipo que se puede convertir automáticamente (por ejemplo, una cadena "123.456").
Fecha, Fecha y hora, Hora DateValue(), TimeValue() o DateTimeValue() La fecha, la hora y la fecha y hora se pueden convertir directamente de Dynamic a su tipo respectivo, cuando se representan en formato ISO 8601. Otros formatos deben convertirse primero a texto usando la función Text() y luego pasarse a la función DateValue(), TimeValue() o DateTimeValue() que por defecto utilizará el idioma de la configuración actual del usuario para interpretar la fecha y hora.
GUID GUID() Un valor dinámico se puede convertir directamente en GUID si el objeto subyacente representa un GUID o si representa una cadena.
Hipervínculo, Imagen, Medios Text() Estos tipos de datos son tipos de datos de texto y pueden convertirse en texto y luego usarse en Power Fx.
Elección, dos opciones Switch() o If() Elecciones y dos opciones se presentan como cadenas localizadas en Power Fx. Las elecciones están respaldadas por un número y dos opciones como booleanos. No hay conversión directa de booleano, número o cadena a una elección o dos opciones, pero las funciones Switch() o If() se pueden usar en el valor booleano, de texto o numérico para asignar correctamente el valor de elección o dos opciones.
Grabar n/d No hay ninguna conversión directa de Dynamic a una estructura de registros, pero los campos individuales se pueden recuperar de Dynamic para crear un nuevo registro.
Referencia de registro n/d Las referencias de registro son únicas para los orígenes de datos y no tienen ninguna representación significativa en Dynamic.
Table Table() y ForAll() Un valor Dinámico puede representar una matriz, que se puede convertir en una tabla. Estos objetos pueden ser matrices de registros o matrices de valores que son efectivamente tablas de una sola columna. ForAll() se puede utilizar para crear una tabla con registros totalmente tipificados. Revise los ejemplos posteriores de este artículo para obtener más información.
Text Text() El texto se puede convertir directamente. Si un valor dinámico representa un número, primero debe convertir el valor dinámico en número mediante Value() antes de convertir en texto.

Tipos de registro

Puede acceder a los campos de una variable que representa un registro dinámico mediante la notación de puntos normal que se usa para los registros. Sin embargo, la existencia de los campos no se verificará hasta el runtime. Como resultado, tampoco hay intellisense disponible. Si un campo no existe o tiene un valor NULL subyacente, acceder a él dará por resultado un valor Blank().

Cada campo del registro también es de tipo Dinámico y debe escribirse correctamente. El campo puede ser un registro dinámico de tipo simple. En caso de que sea un registro, puede encadenar la notación de puntos. Si algún campo de la cadena no existe, se devuelve Blank().

En los ejemplos siguientes se usan campos de una variable dinámica denominada DynRecord.

Text(DynRecord.StringField)
Value(DynRecord.Field.ChildField)

En caso de que un nombre de campo consista en un nombre de identificador no válido, por ejemplo cuando los nombres de campo comienzan con un número o contienen caracteres no válidos como un guion, puede poner los nombres de campo entre comillas simples:

dynamic.'01'
dynamic.'my-field'

Acceso dinámico a columnas

A veces, los nombres de las columnas de un registro serán dinámicos. Use la función ColumnNames para determinar qué nombres de columna están disponibles en un registro y, a continuación, use la función Column para recuperar el valor de una columna con nombre.

Por ejemplo:

LettersUsed = ParseJSON( "{ ""d"": 2, ""p"": 3 }" );

Concat( ColumnNames( LettersUsed ) As Names, Names.Value, ", " )
// returns "d, p"

Sum( ForAll( ColumnNames( LettersUsed ) As Names, Column( LettersUsed, Names.Value ) ), Value )
// returns 5

Matrices

Una variable dinámica puede contener una matriz. Aunque la matriz podría ser una matriz de registros o una matriz de tipos simples, la conversión de la matriz dinámica en una tabla mediante la función Table() siempre dará como resultado una tabla de una sola columna de Dynamic. Funciones como ForAll() e Index() no necesitan que primero cree una función Table() y como resultado no requieren que use el campo Value de columna única.

Por ejemplo, para obtener el segundo número de una matriz de valores dinámicos que contienen números ( [1, 2, 3] ), se puede usar la fórmula siguiente para recuperar la segunda fila de la tabla y convertir la columna en un número:

Value( Index( UOArray, 2 ) )

Si dynamic se convirtió en table() primero, la segunda fila de la tabla de una sola columna resultante es una Value columna que contiene dynamic:

Value( Index( Table( UOArray ), 2 ).Value )

Para una matriz de registros que tienen una columna de texto llamada Field, se aplica la misma lógica. Se puede acceder directamente a Dynamic , o si se usa la función Table() se producirá una tabla de una sola columna de Dynamic.

La Field columna puede tener acceso directamente desde la función Index() devuelta por Dynamic.

Text( Index( UORecordArray, 2 ).Field )

Al usar la función Table(), recupere primero la columna de una sola columna Value para obtener dynamic y, a continuación, acceda a la Field columna:

Text( Index( Table( UORecordArray ), 2 ).Value.Field )

Para convertir una matriz de registros en una tabla con tipo, puede utilizar la función ForAll() y convertir cada campo individual.

ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )

Si dynamic se convierte primero en una tabla, de nuevo, la tabla de una sola columna resultante de Dynamic requerirá que use la Value columna para obtener los campos.

ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )

Conversión a tablas y registros con tipo

Importante

En lugar de convertir cada valor simple individualmente, las funciones ParseJSON, IsType y AsType se pueden usar para convertir un objeto Dinámico en un objeto con tipo de forma masiva. Use la función Type para crear un tipo que asignará la estructura dinámica a una estructura con tipo.

Por ejemplo, aquí estamos interpretando las cadenas JSON como valores de fecha y hora, sin necesidad de llamar a la función DateTimeValue:

Eclipse = ParseJSON( "{ ""Start"": ""2026-08-12T18:26:00.000Z"", ""End"": ""2026-08-12T18:33:00.000Z"" }",
                     Type( { Start: DateTime, End: DateTime } ) );

DateDiff( Eclipse.Start, Eclipse.End, TimeUnit.Minutes )
// 7