Tip de date obiect netipizat
Obiectul netipizat este un tip de date în Power Fx care poate conține orice structură de date, complexă sau simplă. Nu poate fi utilizat direct și necesită o conversie explicită într-un tip de date. Câmpurile din înregistrările dintr-un obiect netipizat pot fi accesate folosind notația cu puncte, iar existența câmpurilor este verificată numai în timpul execuției.
Obiectul netipizat este tipul de returnare al anumitor furnizori netipați. În prezent, numai funcția ParseJSON() returnează obiect netipizat.
Tipuri simple
Valoarea unei variabile de tip obiect netipizat nu poate fi utilizată direct. Întotdeauna trebuie să-l tastați corect folosind constructorul de tip corespunzător.
Următoarele exemple convertesc valoarea unui obiect netipizat variabilă numită UOValue
.
Text(UOValue)
Value(UOValue)
Următorul tabel listează tipurile de date și funcțiile corespunzătoare pentru a converti obiectul netipizat în acel tip de date.
Tip de date | Funcţie | Descriere |
---|---|---|
Boolean | boolean() | Când convertiți obiect netipizat în boolean, valoarea de bază trebuie să reprezinte un boolean sau un tip care poate fi automat convertit (cum ar fi un șir „adevărat”). |
Culoare | ColorValue() sau RGBA() | Culorile pot fi reprezentate în Foaia de stil în cascadă (CSS) sub forma unui șir de caractere sau ca componente RGBA individuale. Obiectul netipizat poate fi convertit direct dintr-o foaie de stil în cascadă (CSS) șir de definire a culorii folosind funcția ColorValue() sau din numerele RGBA individuale în culoare folosind funcția RGBA(). |
Monedă, număr | Valoare() | Când convertiți obiect netipizat în număr, valoarea de bază trebuie să reprezinte un număr sau un tip care poate fi automat convertite (cum ar fi un șir „123.456”). |
Dată, DateTime, Oră | DateValue(), TimeValue() sau DateTimeValue() | Data, ora și datetime pot fi convertite direct din obiect netipizat în tipul respectiv, atunci când sunt reprezentate în format ISO 8601. Alte formate trebuie mai întâi convertite în text utilizând funcția Text() și apoi trecute în funcția DateValue(), TimeValue() sau DateTimeValue( ), care va folosi în mod implicit limba setărilor utilizatorului curent pentru a interpreta data și ora. |
GUID | GUID() | Un obiect netipizat poate fi convertit direct în GUID dacă obiectul de bază reprezintă un GUID sau dacă reprezintă un șir. |
Hyperlink, Imagine, Media | Text() | Aceste tipuri de date sunt tipuri de date text și pot fi convertite în text și apoi utilizate în Power Fx. |
Alegere, Două opțiuni | Comutați() sau dacă() | Opțiunile și două opțiuni sunt prezentate ca șiruri de caractere localizate în Power Fx. Opțiunile sunt susținute de un număr și două opțiuni ca boolean. Nu există nicio conversie directă de la boolean, număr sau șir la o alegere sau două opțiuni, dar funcțiile Switch() sau If() pot fi utilizate pe valoarea booleană, text sau valoare numerică pentru a atribui corect valoarea alegere sau două opțiuni. |
Înregistrare | nu se aplică | Nu există nicio conversie directă de la obiect netipizat la o structură de înregistrare, dar câmpurile individuale pot fi preluate de la obiect netipizat pentru a crea o înregistrare nouă. |
Referință înregistrare | nu se aplică | Referințele înregistrărilor sunt unice pentru sursele de date și nu au nicio reprezentare semnificativă în obiectele netipizate. |
Tabel | Table() și ForAll() | Un obiect netipizat poate reprezenta un vector care poate fi convertit într-un tabel. Aceste obiecte pot fi vectori de înregistrări sau vectori de valori care sunt efectiv tabele cu o singură coloană. ForAll() poate fi folosit pentru a crea un tabel cu înregistrări complet tastate. Consultați exemplele de mai jos din acest articol pentru mai multe informații. |
Text | Text() | Textul poate fi convertit direct. Dacă un obiect netipizat reprezintă un număr, trebuie să convertiți mai întâi obiectul netipizat în număr, folosind Value() înainte de a-l converti în text. |
Tipuri de înregistrări
Puteți accesa câmpuri dintr-o variabilă care reprezintă o înregistrare de obiect netipizat folosind notația cu puncte obișnuită folosită pentru înregistrări. Cu toate acestea, existența câmpurilor nu va fi verificată până în momentul execuției. Ca urmare, nu există niciun intellisense disponibil. Dacă un câmp nu există sau are o valoare subiacentă nulă, accesare lui va rezulta într-o valoare Blank().
Fiecare câmp din înregistrare este, de asemenea, de tip obiect netipizat, și trebuie să fie introdus corespunzător. Câmpul poate fi o înregistrare netipizată de tip simplu. În cazul în care este o înregistrare, puteți înlănțui notația cu puncte. Dacă nu există niciun câmp din lanț, se returnează Blank().
Următoarele exemple folosesc câmpuri dintr-o variabilă obiect netipizat numită UORecord
.
Text(UORecord.StringField)
Value(UORecord.Field.ChildField)
În cazul în care un nume de câmp constă dintr-un nume de identificare nevalid, de exemplu atunci când numele câmpului începe cu un număr sau conține caractere nevalide, cum ar fi o cratimă, puteți pune numele câmpurilor între ghilimele simple:
untyped.'01'
untyped.'my-field'
Acces dinamic la coloană
Uneori, numele coloanelor dintr-o înregistrare vor fi dinamice. Folosiți funcția ColumnNames pentru a determina ce nume de coloane sunt disponibile într-o înregistrare, apoi utilizați Column funcție pentru a prelua valoarea unei coloane numite.
De exemplu,
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
Vectori
O variabilă obiect netipizat poate conține un vector. Chiar dacă vectorul poate fi fie un vector de înregistrări, fie un vector de tipuri simple, conversia vectorului obiect netipizat într-un tabel folosind funcția Table() va avea întotdeauna ca rezultat un tabel cu o singură coloană de obiecte netipizate. Funcții precum ForAll() și Index() nu necesită să creați mai întâi un Table() și prin urmare nu necesită să folosiți un câmp cu o singură coloană Value
,
De exemplu, pentru a obține al doilea număr dintr-un vector de obiect netipizat conținând valori numerice ( [1, 2, 3]
), se poate folosi următoarea formulă pentru a prelua al doilea rând din tabel și pentru a converti coloana într-un număr:
Value( Index( UOArray, 2 ) )
Dacă obiectul netipizat a fost convertit mai întâi într-un Table(), al doilea rând din tabelul cu o coloană rezultat este o Value
coloană care conține obiectul netipizat:
Value( Index( Table( UOArray ), 2 ).Value )
Pentru un vector de înregistrări care au o coloană de text numită Field
, se aplică aceeași logică.
Obiectul netipizat poate fi accesat direct sau, dacă utilizați funcția Table() va rezulta un tabel cu o coloană a obiectului netipizat.
Field
Coloana poate fi accesată direct din obiectul netipizat rezultat din funcția Index().
Text( Index( UORecordArray, 2 ).Field )
Când utilizați funcția Table(), mai întâi recuperați coloana cu o singură coloană Value
pentru a obține obiectul netipizat, apoi accesați coloana Field
:
Text( Index( Table( UORecordArray ), 2 ).Value.Field )
Pentru a converti un vector de înregistrări într-un tabel tipizat, puteți utiliza funcția ForAll() și puteți converti fiecare câmp individual.
ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )
Dacă obiectul netipizat este convertit mai întâi într-un tabel, din nou, tabelul rezultat cu o singură coloană al obiectului tipizat va solicita să utilizați coloana Value
pentru a obține câmpurile.
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
Conversia în înregistrări și tabele tastate
În loc să convertească fiecare valoare simplă individual, ParseJSON, IsType și AsType Funcțiile pot fi folosite pentru a converti un obiect netipizat într-un obiect tastat în vrac. Utilizați funcția Type pentru a crea un tip care va mapa structura netipată la o structură tipizată.
De exemplu, aici interpretăm șirurile JSON ca valori date și oră, fără a fi nevoie să apelăm funcția DateTimeValue funcția:
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