Partager via


Valeurs dynamiques

Dynamic est un type de données dans Power Fx qui peut contenir n’importe quelle structure de données, complexe ou simple. Elle ne peut pas être utilisée directement et la conversion vers un autre type de données lors de l’exécution, explicitement ou implicitement. Les champs d’enregistrements d’une valeur dynamique sont accessibles à l’aide de la notation par points et l’existence de champs est vérifiée uniquement au moment de l’exécution.

Il existe deux façons de créer une valeur dynamique :

  • Utilisation de la fonction ParseJSON.
  • Utilisation d’un connecteur qui retourne un type « dynamique ».

Note

Dynamic était anciennement appelé UntypedObject. Seul le nom a changé, il n’y a aucune modification dans la sémantique. Le seul endroit où le nom serait apparu dans une formule se trouve dans les versions expérimentales des fonctions définies par l’utilisateur et des types définis par l’utilisateur.

Types simples

La valeur d’une variable contenant une valeur dynamique ne peut pas être utilisée directement. Vous devez toujours le taper correctement à l’aide du constructeur de type correspondant ou en le convertissant en un type spécifique avec les fonctions AsType et ParseJSON .

Les exemples suivants convertissent la valeur d’une variable dynamique nommée DynValue.

Text(DynValue)
Value(DynValue)

Le tableau suivant répertorie les types de données et les fonctions correspondantes pour convertir Dynamique en ce type de données.

Type de données Function Description
Entier Boolean() Lors de la conversion dynamique en booléen, la valeur sous-jacente doit représenter une valeur booléenne ou un type qui peut être automatiquement converti (par exemple, une chaîne « true »).
Color ColorValue() ou RGBA() Les couleurs peuvent être représentées dans une notation de définition de couleur de la feuille de style en cascade (CSS) sous forme de chaîne ou de composants RGBA individuels. La fonction Dynamic peut être convertie directement à partir d’une chaîne de définition de couleur feuille de style en cascade (CSS) à l’aide de la fonction ColorValue() ou de nombres RVBA individuels en couleur à l’aide de la fonction RGBA().
Devise, Nombre Value() Lors de la conversion dynamique en nombre, la valeur sous-jacente doit représenter un nombre ou un type qui peut être automatiquement converti (par exemple, une chaîne « 123.456 »).
Date, DateHeure, Heure DateValue(), TimeValue() ou DateTimeValue() La date, l’heure et la datetime peuvent être directement converties de Dynamic en leur type respectif, lorsqu’elles sont représentées au format ISO 8601. Les autres formats doivent être tout d’abord convertis en texte à l’aide de la fonction Text(), puis transmis dans la fonction DateValue(), TimeValue() ou DateTimeValue() qui utilise par défaut la langue des paramètres de l’utilisateur actuel pour interpréter la date et l’heure.
GUID GUID() Une valeur dynamique peut être convertie directement en GUID si l’objet sous-jacent représente un GUID ou s’il représente une chaîne.
Lien hypertexte, image, média Text() Ces types de données sont des types de données texte et peuvent être convertis en texte, puis utilisés dans Power Fx.
Choix, Deux options Switch() ou If() Choix et Deux options sont présentées sous forme de chaînes localisées dans Power Fx. Choix reposent sur un nombre et Deux options sur des valeurs booléennes. Il n’y a pas de conversion directe d’une fonction Boolean, Number ou String en fonction Choice ou Deux options, mais les fonctions Switch() ou If() peuvent être utilisées sur la valeur booléenne, texte ou nombre pour attribuer correctement la valeur choix ou deux options.
Enregistrer n/d Il n’existe aucune conversion directe de Dynamic vers une structure d’enregistrement, mais des champs individuels peuvent être récupérés à partir de La dynamique pour créer un enregistrement.
Référence d’enregistrement n/d Les références d’enregistrement sont uniques aux sources de données et n’ont aucune représentation significative dans Dynamic.
Table Table() et ForAll() Une dynamique peut représenter un tableau, qui peut être converti en table. Ces objets peuvent être des tableaux d’enregistrements ou des tableaux de valeurs qui sont en fait des tables à une seule colonne. ForAll() peut être utilisée pour créer une table avec des enregistrements entièrement typés. Consultez les exemples plus loin dans cet article pour plus d’informations.
Text Text() Le texte peut être directement converti. Si une valeur dynamique représente un nombre, vous devez d’abord convertir la valeur dynamique en nombre à l’aide de Value() avant de la convertir en texte.

Types d’enregistrements

Vous pouvez accéder aux champs d’une variable représentant un enregistrement dynamique à l’aide de la notation par points standard utilisée pour les enregistrements. Cependant, l’existence des champs ne sera pas vérifiée avant l’exécution. En conséquence, Intellisense n’est pas disponible. Si un champ n’existe pas ou a une valeur nulle sous-jacente, y accéder entraîne une valeur Blank().

Chaque champ de l’enregistrement est également de type Dynamique et doit être correctement typé. Le champ peut être un enregistrement dynamique de type simple. S’il s’agit d’un enregistrement, vous pouvez enchaîner la notation par points. Si un champ de la chaîne n’existe pas, Blank() est renvoyé.

Les exemples suivants utilisent des champs d’une variable dynamique nommée DynRecord.

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

Au cas où un nom de champ se compose d’un nom d’identifiant invalide, par exemple lorsque les noms de champ commencent par un nombre ou contiennent des caractères invalides comme un trait d’union, vous pouvez mettre les noms de champ entre guillemets simples :

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

Accès dynamique aux colonnes

Parfois, les noms des colonnes d’un enregistrement sont dynamiques. Utilisez la fonction ColumnNames pour déterminer quelles noms de colonne sont disponibles dans un enregistrement, puis utilisez la fonction Column pour récupérer la valeur d’une colonne nommée.

Par exemple :

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

Tableaux

Une variable dynamique peut contenir un tableau. Même si le tableau peut être un tableau d’enregistrements ou de tableaux de types simples, la conversion du tableau dynamique en table à l’aide de la fonction Table() entraîne toujours une table à colonne unique de Dynamic. Des fonctions telles que ForAll() et Index() ne vous obligent pas à commencer par créer une Table() et par conséquent, n’exige pas que vous utilisiez le champ Value à colonne unique,

Par exemple, pour obtenir le deuxième nombre dans un tableau de valeurs numériques dynamiques contenant des valeurs de nombre ( [1, 2, 3] ), la formule suivante peut être utilisée pour récupérer la deuxième ligne de la table et convertir une colonne en nombre :

Value( Index( UOArray, 2 ) )

Si l’élément Dynamique a été converti en table() en premier, la deuxième ligne de la table à colonne unique du résultat est une Value colonne contenant la colonne Dynamique :

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

Pour un tableau d’enregistrements qui ont une colonne de texte appelée Field, la même logique s’applique. La fonction Dynamic est accessible directement, ou si vous utilisez la fonction Table(), une table à colonne unique est dynamique.

La Field colonne peut être accessible directement à partir de la fonction Dynamic retournée par la fonction Index().

Text( Index( UORecordArray, 2 ).Field )

Lorsque vous utilisez la fonction Table(), récupérez d’abord la colonne à colonne Value unique pour obtenir la colonne Dynamique, puis accédez à la Field colonne :

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

Pour convertir un tableau d’enregistrements en une table typée, vous pouvez utiliser la fonction ForAll() et convertir chaque champ individuel.

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

Si la dynamique est d’abord convertie en table, là encore, la table à colonne unique résultante de Dynamic vous oblige à utiliser la Value colonne pour obtenir les champs.

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

Conversion en enregistrements et tables typés

Important

Au lieu de convertir chaque valeur simple individuellement, les fonctions ParseJSON, IsType et AsType peuvent être utilisées pour convertir un dynamic en objet typé en bloc. Utilisez la fonction Type pour créer un type qui mappe la structure dynamique à une structure typée.

Par exemple, ici, nous interprétons les chaînes JSON comme des valeurs de date et d’heure, sans avoir besoin d’appeler la fonction 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