Sdílet prostřednictvím


Dynamické hodnoty

Dynamická je datový typ v Power Fx, který může obsahovat libovolnou datovou strukturu, složitou nebo jednoduchou. Nelze ho použít přímo a převést na jiný datový typ za běhu, a to buď explicitně, nebo implicitně. Pole záznamů v dynamické hodnotě lze získat přístup pomocí zápisu tečky a existence polí je ověřena pouze za běhu.

Dynamickou hodnotu můžete vytvořit dvěma způsoby:

  • Použití funkce ParseJSON.
  • Použití spojnice, která vrací "dynamický" typ.

Poznámka:

Dynamická byla dříve označována jako UntypedObject. Změnil se pouze název, sémantika se nijak nemění. Jediné místo, kde by se název objevil ve vzorci, je v experimentálních verzích uživatelem definovaných funkcí a uživatelem definovaných typů.

Jednoduché typy

Hodnotu proměnné obsahující dynamickou hodnotu nelze použít přímo. Vždy ho musíte správně zadat pomocí odpovídajícího konstruktoru typu nebo převodem na konkrétní typ pomocí funkcí AsType a ParseJSON .

Následující příklady převedou hodnotu dynamické proměnné s názvem DynValue.

Text(DynValue)
Value(DynValue)

Následující tabulka uvádí datové typy a odpovídající funkce pro převod dynamického na tento datový typ.

Datový typ Function Description
logický Boolean() Při převodu dynamické na logickou hodnotu musí podkladová hodnota představovat logickou hodnotu nebo typ, který lze automaticky převést (například řetězec "true").
Color ColorValue() nebo RGBA() Barvy mohou být reprezentovány v zápisu definice barvy kaskádového stylu (CSS) jako řetězec nebo jako jednotlivé komponenty RGBA. Dynamickou funkci lze převést přímo z řetězce definice barvy šablony stylů CSS (Cascading Style Sheet) pomocí funkce ColorValue() nebo z jednotlivých čísel RGBA na barvu pomocí funkce RGBA().
Měna, číslo Value() Při převodu dynamické hodnoty na číslo musí podkladová hodnota představovat číslo nebo typ, který lze automaticky převést (například řetězec 123,456).
Datum, datum a čas, čas DateValue(), TimeValue() nebo DateTimeValue() Datum, čas a datum a čas lze přímo převést z dynamické na příslušný typ, pokud je znázorněno ve formátu ISO 8601. Jiné formáty musí být nejprve převedeny na text pomocí funkce Text() a poté předány do funkce DateValue(), TimeValue() nebo DateTimeValue(), která ve výchozím nastavení použije jazyk nastavení aktuálního uživatele.
GUID GUID() Dynamická hodnota může být přímo převedena na IDENTIFIKÁTOR GUID, pokud podkladový objekt představuje identifikátor GUID nebo pokud představuje řetězec.
Hypertextový odkaz, obrázek, médium Text() Tyto datové typy jsou textové datové typy a lze je převést na text a poté použít v Power Fx.
Volba, dvě možnosti Switch() nebo If() Choices a two options jsou prezentovány jako lokalizované řetězce v Power Fx. Chocies jsou podloženy číslem a two options jako logické hodnoty. Neexistuje žádný přímý převod z logické hodnoty, čísla nebo řetězce na choice nebo two options, ale funkce Switch() nebo If() lze použít na logickou, textovou nebo číselnou hodnotu ke správnému přiřazení hodnoty choice nebo two option.
Zaznamenat nelze použít Neexistuje žádný přímý převod z dynamické struktury na strukturu záznamů, ale jednotlivá pole lze načíst z dynamického objektu a vytvořit nový záznam.
Reference záznamu nelze použít Odkazy na záznamy jsou jedinečné pro zdroje dat a nemají smysluplnou reprezentaci v dynamic.
Table Table() a ForAll() Dynamická může představovat pole, které lze převést na tabulku. Tyto objekty mohou být pole záznamů nebo pole hodnot, které jsou ve skutečnosti tabulkami s jedním sloupcem. ForAll() lze použít k vytvoření tabulky s plně typovanými záznamy. Další informace naleznete v příkladech níže v tomto článku.
Text Text() Text lze přímo převádět. Pokud dynamická hodnota představuje číslo, musíte před převodem na text nejprve převést dynamickou hodnotu na číslo pomocí value().

Typy záznamů

K polím v proměnné představující dynamický záznam můžete přistupovat pomocí běžného zápisu tečky používaného pro záznamy. Existence polí však bude ověřena až za běhu. V důsledku toho není k dispozici ani IntelliSense. Pokud pole neexistuje nebo má podkladovou hodnotu null, přístup k ní bude mít za následek hodnotu Blank().

Každé pole záznamu je také typu Dynamické a musí být správně napsané. Pole může být dynamický záznam jednoduchého typu. V případě, že se jedná o záznam, můžete zřetězit tečkovou notaci. Pokud některé pole v řetězci neexistuje, vrátí se Blank().

Následující příklady používají pole z dynamické proměnné s názvem DynRecord.

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

V případě, že název pole obsahuje neplatný název identifikátoru, například když názvy polí začínají číslem nebo obsahují neplatné znaky, jako je spojovník, můžete názvy polí uvést do jednoduchých uvozovek:

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

Dynamický přístup ke sloupcům

Někdy budou názvy sloupců v záznamu dynamické. Pomocí funkce ColumnNames určete, které názvy sloupců jsou v záznamu k dispozici, a potom pomocí funkce Column načtěte hodnotu pojmenovaného sloupce.

Příklad:

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

Pole

Dynamická proměnná může obsahovat pole. I když pole může být matice záznamů nebo matice jednoduchých typů, převod dynamické matice na tabulku pomocí funkce Table() vždy způsobí tabulku s jedním sloupcem dynamic. Funkce jako ForAll() a Index() nevyžadují, abyste nejprve vytvořili Table() a v důsledku toho nevyžadují použití jednosloupcového pole Value.

Pokud chcete například získat druhé číslo v matici dynamických číselných hodnot ( [1, 2, 3] ), můžete použít následující vzorec k načtení druhého řádku v tabulce a převodu sloupce na číslo:

Value( Index( UOArray, 2 ) )

Pokud se dynamická funkce nejprve převede na tabulku (Table(), druhý řádek ve výsledné tabulce s jedním sloupcem Value je sloupec obsahující dynamickou hodnotu:

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

Pro pole záznamů, které mají textový sloupec nazvaný Field, platí stejná logika. K dynamickému přístupu je možné přistupovat přímo nebo pokud použijete funkci Table(), bude výsledkem tabulka s jedním sloupcem funkce Dynamic.

Ke Field sloupci může přistupovat přímo funkce Dynamic vrácená funkcí Index().

Text( Index( UORecordArray, 2 ).Field )

Při použití funkce Table() nejprve načtěte sloupec s jedním sloupcem Value , abyste získali dynamickou hodnotu, a pak se ke sloupci Field dostali:

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

Chcete-li převést pole záznamů na typovanou tabulku, můžete použít funkci ForAll() a převést každé jednotlivé pole.

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

Pokud se dynamická funkce nejprve převede na tabulku, bude výsledná tabulka s jedním sloupcem dynamického zobrazení vyžadovat, abyste k získání polí použili Value sloupec.

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

Převod na typové záznamy a tabulky

Důležité

Místo individuálního převodu jednotlivých jednoduchých hodnot lze funkce ParseJSON, IsType a AsType použít k hromadnému převodu Dynamic na typovaný objekt. Pomocí funkce Typ vytvořte typ, který mapuje dynamickou strukturu na typovou strukturu.

Tady například interpretujeme řetězce JSON jako hodnoty data a času, aniž bychom museli volat funkci 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