Dynamiska värden

Dynamic är en datatyp i Power Fx som kan innehålla alla datastrukturer, komplexa eller enkla. Den kan inte användas direkt och konverteras till en annan datatyp vid körning, antingen explicit eller implicit. Fält med poster i ett dynamiskt värde kan nås med hjälp av punkt notationen och förekomsten av fält verifieras endast vid körning.

Det finns två sätt att skapa ett dynamiskt värde:

Anmärkning

Dynamic kallades tidigare UntypedObject. Endast namnet har ändrats, det finns ingen ändring i semantiken. Den enda plats där namnet skulle ha dykt upp i en formel finns i de experimentella versionerna av användardefinierade funktioner och användardefinierade typer.

Enkla typer

Värdet för en variabel som innehåller ett dynamiskt värde kan inte användas direkt. Du måste alltid skriva den korrekt med hjälp av motsvarande typkonstruktor eller genom att konvertera den till en viss typ med funktionerna AsType och ParseJSON .

I följande exempel konverteras värdet för en dynamisk variabel med namnet DynValue.

Text(DynValue)
Value(DynValue)

I följande tabell visas datatyper och motsvarande funktioner för att konvertera Dynamic till den datatypen.

Datatyp Function Description
Booleskt Booleskt() När du konverterar dynamiskt till booleskt värde måste det underliggande värdet representera ett booleskt värde eller en typ som kan konverteras automatiskt (till exempel en sträng "true").
Color ColorValue() eller RGBA() Färger kan representeras i sammanhängande formatmallar (CSS) färgdefinitions notation som en sträng, eller som enskilda RGBA-komponenter. Dynamisk kan konverteras direkt från en CSS-färgdefinitionssträng (Cascading Style Sheet) med hjälp av funktionen ColorValue() eller från enskilda RGBA-tal till färg med hjälp av funktionen RGBA().
Valuta, tal Värde() När du konverterar Dynamisk till Tal måste det underliggande värdet representera ett tal eller en typ som kan konverteras automatiskt (till exempel strängen "123.456").
Datum, DateTime, Tid DateValue(), TimeValue() eller DateTimeValue() Datum, tid och datetime kan konverteras direkt från Dynamisk till deras respektive typ, när de representeras i ISO 8601-format. Andra format måste först konverteras till text med funktionen Text() och anges sedan i funktionen DateValue(), TimeValue() eller DateTimeValue() som standard använder språket i den aktuella användarens inställningar för att tolka datum och tid.
GUID GUID() Ett dynamiskt värde kan konverteras direkt till GUID om det underliggande objektet representerar ett GUID eller om det representerar en sträng.
HyperLink, bild, Media Text() Dessa datatyper är textdatatyper och kan konverteras till text och sedan användas i Power Fx.
Val, två alternativ Switch() eller If() Alternativ och två alternativ visas som lokaliserade strängar i Power Fx. Val stöds av ett nummer och två alternativ som booleska. Det finns ingen direkt konvertering från boolesk, tal eller sträng till val eller två alternativ, men funktionerna Switch() eller If() kan användas på booleska, text- eller talvärden för att korrekt tilldela värdet val eller två alternativet.
Post saknas Det finns ingen direkt konvertering från Dynamisk till en poststruktur, men enskilda fält kan hämtas från Dynamisk för att skapa en ny post.
Referens för post saknas Postreferenser är unika för datakällor och har ingen meningsfull representation i Dynamic.
Register Table() och ForAll() En dynamisk kan representera en matris som kan konverteras till en tabell. Dessa objekt kan vara matriser med poster eller matriser med värden som i praktiken är tabeller med en kolumn. ForAll() kan användas för att skapa en tabell med helt typifierade poster. Läs exemplen längre ned i den här artikeln om du vill ha mer information.
Text Text() Text kan konverteras direkt. Om ett dynamiskt värde representerar ett tal måste du konvertera dynamiskt till tal först med Hjälp av Value() innan du konverterar till text.

Posttyper

Du kan komma åt fält i en variabel som representerar en dynamisk post med vanlig punkt notation som används för poster. Om det finns fält eller inte kommer inte att verifieras förrän vid körning. Det finns därför inte heller någon intellisense tillgänglig. Om ett fält inte finns eller har ett underliggande null-värde resulterar åtkomsten till det i ett Blank() värde.

Varje fält i posten är också av typen Dynamisk och måste skrivas korrekt. Fältet kan vara en dynamisk post av enkel typ. Om det är en post kan du skapa en punktmarkering. Om något fält i programmet inte finns returneras Blank().

I följande exempel används fält från en dynamisk variabel med namnet DynRecord.

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

Om ett fältnamn består av ett ogiltigt ID-namn, till exempel när fältnamnen börjar med ett tal eller innehåller ogiltiga tecken, t.ex. ett bindestreck, kan du placera fältnamnen i enskilda citattecken:

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

Dynamisk kolumnåtkomst

Ibland är namnen på kolumnerna i en post dynamiska. Använd funktionen ColumnNames för att avgöra vilka kolumnnamn som är tillgängliga i en post och använd sedan funktionen Column för att hämta värdet för en namngiven kolumn.

Till exempel

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

Matriser

En dynamisk variabel kan innehålla en matris. Även om matrisen kan vara antingen en matris med poster eller en matris med enkla typer, resulterar konverteringen av den dynamiska matrisen till en tabell med hjälp av funktionen Table() alltid i en tabell med en kolumn i Dynamic. För funktioner som ForAll() och Index() behöver du inte först skapa en Table() och därför behöver du inte använda fältet Value med en kolumn,

Om du till exempel vill hämta det andra talet i en matris med dynamiskt innehållande talvärden ( [1, 2, 3] ) kan följande formel användas för att hämta den andra raden i tabellen och konvertera kolumnen till ett tal:

Value( Index( UOArray, 2 ) )

Om Dynamic konverterades till en Table() först är den andra raden i resultatet enkolumnstabell en Value kolumn som innehåller dynamisk:

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

För en matris med poster som har en textkolumn med namnet Field gäller samma logik. Dynamisk kan nås direkt, eller om du använder funktionen Table() resulterar det i en tabell med en kolumn med Dynamisk.

Kolumnen Field kan kommas åt direkt från funktionen Dynamic som returneras av funktionen Index().

Text( Index( UORecordArray, 2 ).Field )

När du använder funktionen Table() hämtar du först kolumnen med en kolumn Value för att hämta dynamisk och kommer sedan åt Field kolumnen:

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

Om du vill konvertera en matris med poster till en typad tabell kan du använda funktionen ForAll() och konvertera varje enskilt fält.

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

Om dynamic först konverteras till en tabell kräver den resulterande tabellen med en kolumn i Dynamic att du använder Value kolumnen för att hämta fälten.

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

Konvertera till typade poster och tabeller

Viktigt!

I stället för att konvertera varje enkelt värde individuellt kan funktionerna ParseJSON, IsType och AsType användas för att konvertera ett dynamiskt till ett skrivet objekt i bulk. Använd funktionen Typ för att skapa en typ som mappar den dynamiska strukturen till en typbaserad struktur.

Här tolkar vi till exempel JSON-strängarna som datum/tid-värden, utan att behöva anropa funktionen 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