Compartilhar via


Valores dinâmicos

Dinâmico é um tipo de dados no Power Fx que pode conter qualquer estrutura de dados, complexa ou simples. Ele não pode ser usado diretamente e conversão em outro tipo de dados em runtime, explicitamente ou implicitamente. Campos de registros em um valor dinâmico podem ser acessados usando a notação de ponto e a existência de campos só é verificada em runtime.

Há duas maneiras de criar um valor dinâmico :

Observação

A dinâmica anteriormente era chamada de UntypedObject. Somente o nome foi alterado, não há nenhuma alteração na semântica. O único lugar onde o nome teria sido exibido em uma fórmula está nas versões experimentais de funções definidas pelo usuário e tipos definidos pelo usuário.

Tipos Simples

O valor de uma variável que contém um valor dinâmico não pode ser usado diretamente. Você sempre precisa digitá-lo corretamente usando o construtor de tipo correspondente ou convertendo-o em um tipo específico com funções AsType e ParseJSON .

Os exemplos a seguir convertem o valor de uma variável dinâmica chamada DynValue.

Text(DynValue)
Value(DynValue)

A tabela a seguir lista os tipos de dados e as funções correspondentes para converter o Dynamic nesse tipo de dados.

Tipo de Dados Função Description
booleano Boolean() Ao converter Dynamic em Boolean, o valor subjacente precisa representar um booliano ou um tipo que possa ser convertido automaticamente (como uma cadeia de caracteres "true").
Color ColorValue() ou RGBA() As cores podem ser representadas em notação de definição de cor de Folhas de Estilo em Cascata (CSS) como uma cadeia de caracteres ou como componentes RGBA individuais. O Dynamic pode ser convertido diretamente de uma cadeia de caracteres de definição de cores CSS (Folha de Estilos em Cascata) usando a função ColorValue() ou de números RGBA individuais em cores usando a função RGBA( ).
Moeda, Número Value() Ao converter Dinâmico em Número, o valor subjacente deve representar um número ou um tipo que possa ser convertido automaticamente (como uma cadeia de caracteres "123,456").
Data, DateTime, Hora DateValue(), TimeValue() ou DateTimeValue() Data, hora e datetime podem ser convertidos diretamente de Dynamic para seu respectivo tipo, quando representados no formato ISO 8601. Outros formatos devem primeiro ser convertidos em texto usando a função Text() e, em seguida, passados para a função DateValue(), TimeValue() ou DateTimeValue() que, por padrão, usará o idioma das configurações do usuário atual para interpretar a data e hora.
GUID GUID() Um valor dinâmico poderá ser convertido diretamente em GUID se o objeto subjacente representar um GUID ou se ele representar uma cadeia de caracteres.
Hiperlink, Imagem, Mídia Text() Estes tipos de dados são tipos de dados de texto e podem ser convertidos em texto e usados no Power Fx.
Escolha, Opção Dois Switch() ou If() Opções e duas opções são apresentadas como cadeias de caracteres localizadas no Power Fx. Opções têm o suporte de um número e duas opções como boolianos. Não há conversão direta de booliano, número ou cadeia de caracteres em opção ou duas opções, mas as funções Switch() ou If() podem ser usadas no valor booliano, de texto ou número para atribuir corretamente o valor de opção ou duas opções.
Registro n/d Não há conversão direta de Dynamic para uma estrutura de registro, mas campos individuais podem ser recuperados do Dynamic para criar um novo registro.
Referência de Registro n/d As referências de registro são exclusivas das fontes de dados e não têm representação significativa no Dynamic.
Table Table() e ForAll() Um Dynamic pode representar uma matriz, que pode ser convertida em uma tabela. Esses objetos podem ser matrizes de registros ou matrizes de valores que são efetivamente tabelas de coluna única. ForAll() pode ser usada para criar uma tabela com registros totalmente classificados. Revise os exemplos mais abaixo neste artigo para obter mais informações.
Texto Text() O texto pode ser convertido diretamente. Se um valor dinâmico representar um número, você precisará converter o Dinâmico em número primeiro usando Value() antes de converter em texto.

Tipos de Registro

Você pode acessar campos em uma variável que representa um registro dinâmico usando a notação de ponto regular usada para registros. No entanto, a existência dos campos não será verificada até o runtime. Como resultado, também não haverá intellisense disponível. Se um campo não existir ou tiver um valor nulo subjacente, acessá-lo resultará em um valor Blank().

Cada campo no registro também é do tipo Dinâmico e precisa ser digitado corretamente. O campo pode ser um registro dinâmico de tipo simples. Caso seja um registro, você pode encadear a notação de ponto. Se algum campo na cadeia não existir, Blank() será retornado.

Os exemplos a seguir usam campos de uma variável dinâmica chamada DynRecord.

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

Caso um nome de campo consista em um nome de identificador inválido, por exemplo, quando os nomes dos campos começam com um número ou contêm caracteres inválidos, como um hífen, você pode colocar os nomes dos campos entre aspas simples:

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

Acesso dinâmico à coluna

Às vezes, os nomes das colunas em um registro serão dinâmicos. Use a função ColumnNames para determinar quais nomes de coluna estão disponíveis em um registro e, em seguida, use a função Column para recuperar o valor de uma coluna nomeada.

Por exemplo,

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

Matrizes

Uma variável dinâmica pode conter uma matriz. Embora a matriz possa ser uma matriz de registros ou uma matriz de tipos simples, converter a matriz dinâmica em uma tabela usando a função Table() sempre resultará em uma tabela de coluna única do Dynamic. Funções como ForAll() e Index() não exigem que você crie primeiro uma função Table() e, como resultado, você não precisa usar o campo de coluna única Value,

Por exemplo, para obter o segundo número em uma matriz de valores numéricos dinâmicos[1, 2, 3] ( ), a fórmula a seguir pode ser usada para recuperar a segunda linha na tabela e converter a coluna em um número:

Value( Index( UOArray, 2 ) )

Se a Dinâmica tiver sido convertida em uma Tabela() primeiro, a segunda linha na tabela de coluna única de resultado será uma Value coluna que contém a Dinâmica:

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

Para uma matriz de registros que possuem uma coluna de texto chamada Field, a mesma lógica se aplica. O Dynamic pode ser acessado diretamente ou se o uso da função Table() resultará em uma tabela de coluna única do Dynamic.

A Field coluna pode ser acessada diretamente da função Dynamic retornada pela função Index( ).

Text( Index( UORecordArray, 2 ).Field )

Ao usar a função Table(), primeiro recupere a coluna de coluna Value única para obter o Dinâmico e, em seguida, acesse a Field coluna:

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

Para converter uma matriz de registros em uma tabela digitada, você pode usar a função ForAll() e converta cada campo individual.

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

Se o Dynamic for convertido pela primeira vez em uma tabela, novamente, a tabela de coluna única resultante do Dynamic exigirá que você use a Value coluna para obter os campos.

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

Conversão em tabelas e registros tipados

Importante

Em vez de converter cada valor simples individualmente, as funções ParseJSON, IsType e AsType podem ser usadas para converter um Dynamic em um objeto digitado em massa. Use a função Type para criar um tipo que mapeará a estrutura dinâmica para uma estrutura tipada.

Por exemplo, aqui estamos interpretando as cadeias de caracteres JSON como valores de data e hora, sem a necessidade de chamar a função 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