Megosztás a következőn keresztül:


Típusmentes objektum adattípus

A nem típusos objektum olyan adattípus, Power Fx amely bármilyen összetett vagy egyszerű adatstruktúrát tartalmazhat. Közvetlenül nem használható, és egy adattípusra való kifejezett átalakítást igényel. A nem típusos objektumokban lévő rekordok bejegyzései a pont jelöléssel érhetők el, és a mezők készenlétét csak futásidőben ellenőrzi a rendszer.

A nem típusos objektum adott nem típusos szolgáltatók visszatérési típusa. Jelenleg csak a ParseJSON() függvény ad vissza nem típusos objektumot.

Egyszerű típusok

A nem típusos objektum típusú változók értéke nem használható közvetlenül. Mindig helyesen kell begépelni a megfelelő típusú konstruktor használatával.

Az alábbi példákban egy UOValue nevű nem típusos objektum változó értékét alakítjuk át.

Text(UOValue)
Value(UOValue)

A következő táblázat felsorolja azokat az adattípusokat és kapcsolódó függvényeket, amelyek arra az adattípusra konvertálnak nem típusos objektumot.

Adattípus Function Description
Boolean Logikai () Nem típusos objektum logikai formátumba konvertálásakoraz alapul szolgáló értéknek logikai értéket vagy automatikusan konvertálható típust (például "igaz" karakterláncot) kell képviselnie.
Color ColorValue() vagy RGBA() A színek lépcsőzetes stíluslap (CSS) színdefiníciós jelöléssel adhatók meg sztringként vagy egyéni RBGA-összetevőként. A nem típusos objektum közvetlenül átalakítható lépcsőzetes stíluslap (CSS) színdefiníciós sztringből a ColorValue() függvénnyel, illetve egyedi RBGA-számokból színné az RGBA() függvénnyel.
Pénznem, Szám Érték() Típussal nem rendelkező objektum számmá alakításakoraz alapul szolgáló értéknek egy számot vagy egy automatikusan konvertálható típust kell képviselnie (például egy "123,456" karakterláncot).
Dátum, DateTime, Idő DateValue(), TimeValue() vagy DateTimeValue() A dátum, az idő és a datetime közvetlenül átalakítható nem típusos objektumból az adott típussá, ha ISO 8601 formátum jelöli. Már formátumokat először Text() fügvénnyé kell alakítani, majd át kell adni a DateValue(), a TimeValue() vagy a DateTimeValue() függvénybe, amely alapértelmezés szerint az aktuális felhasználó beállításai között nyelvet használja a dátum és az idő értelmezéséhez.
GUID-azonosító GUID() A nem típusos objektumok közvetlenül GUID azonosítóvá alakíthatók, ha az alapul szolgáló objektum GUID azonosítót vagy karakterláncot képvisel.
Hivatkozás, Kép, Média Szöveg() Ezek az adattípusok szöveges adattípusok, és szöveggé alakíthatók, majd felhasználhatók a Power Fx rendszerben.
Választás, Két érték Switch() vagy If() A választási lehetőségek és a két lehetőség honosított karakterláncként jelenik meg Power Fx. A választási lehetőségeket számos és két lehetőség támogatja logikai értékként. A logikai értékek, a számok és a sztringek nem alakíthatók át közvetlenül választási lehetőséggé vagy két értékké, de a Switch() vagy az If() függvények használhatók a logikai, a szöveges vagy a számértékekhez a választási lehetőség vagy a két érték helyes hozzárendeléséhez.
Rögzítés n.a. Nem típusos objektum nem alakítható át közvetlenül rekordstruktúrává, de az egyes mezők lekérhetők a nem típusos objektumból új rekord létrehozásához.
Rekord hivatkozása n.a. A rekordhivatkozások egyediek az adatforrásokban, és nincs értelemmel bíró jelentésük a nem típusos objektumokban.
Tábla Table() és ForAll() A nem típusos objektumok jelölhetnek olyan tömböt, amely táblává alakítható át. Ezek az objektumok rekordtömbök vagy értéktömbök lehetnek, amelyek hatékonyan használhatók egyetlen oszlopos táblákhoz. A ForAll() segítségével teljesen típusos rekordokat tartalmazó táblát hozhat létre. További információért tekintse át a cikk későbbi részében található példákat.
Szöveges Szöveg() A szöveg közvetlenül átalakítható. Ha egy nem típusos objektum számot jelöl, akkor a szöveggé való átalakítás előtt először számmá kell alakítani a nem típusos objektumot a Value() használatával.

Rekordtípusok

A nem típusos objektum rekordot jelölő változók mezői a rekordhoz használt szokásos pont-jelölés segítségével érhetők el. A mezők készenlétét azonban a futásidő előtt nem ellenőrzi a rendszer. Emiatt az IntelliSense szolgáltatás sem használható. Ha egy mező nem létezik, vagy mögöttes null értéke van, akkor az elérése Blank() értéket eredményez.

A rekord minden mezője nem típusos objektum típusú is, és megfelelően kell beírni. A mező lehet egyszerű típusú nem típusos rekord. Ha rekord, akkor a pont-jelölés összefűzhető. Ha az összefűzésben nem létezik valamelyik mező, akkor a rendszer Blank() értéket ad vissza.

Az alábbi példákban egy UORecord nevű nem típusos objektumból származó mezőket használunk.

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

Abban az esetben, ha a mezőnév érvénytelen azonosítónevet tartalmaz, például amikor a mezőnevek számmal kezdődnek vagy érvénytelen karaktereket (például kötőjelet) tartalmaznak, a mezőnevek egyszeres idézőjelbe kell tenni:

untyped.'01'
untyped.'my-field'

Dinamikus oszlopelérés

Néha egy rekord oszlopainak neve dinamikus lesz. A ColumnNames függvénnyel meghatározhatja, hogy mely oszlopnevek érhetők el egy rekordban, majd a Column függvénnyel olvassa be egy elnevezett oszlop értékét.

Például

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

Tömbök

A nem típusos objektum változók tartalmazhatnak tömböt. Annak ellenére, hogy a tömb rekordok vagy egyszerű típusok tömbje is lehet, a nem típusos objektum tömb Table() függvény segítségével való átalakítása mindig nem típusos objektumok egy oszlopos tábláját eredményezi. Az olyan függvényeknél, mint a ForAll() és az Index(), nem kell először Table() függvényt létrehozni, így nem kell az egyoszlopos Value mezőt használnia.

Egy számértékeket ( [1, 2, 3] ) tartalmazó nem típusos objektum tömbjében lévő második szám beolvasásához például az alábbi képlet használható a táblázat második sorának beolvasására és az oszlop számmá való átalakítására:

Value( Index( UOArray, 2 ) )

Ha a nem típusos objektumot először Table() értékre alakította át, akkor az eredményként kapott egyoszlopos tábla második sora egy olyan Value oszlop, amely amely a nem típusos objektumot tartalmazza:

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

Ugyanez a logika érvényes az olyan rekordtömbökre, amelyek Field nevű szöveges oszlopot tartalmaznak. A nem típusos objektum elérhető közvetlenül, vagy a Table() függvény használata esetén egy nem típusos objektum egyoszlopos tábláját adja eredményként.

A Field oszlop elérhető közvetlenül az Index() függvény által visszaadott nem típusos objektumból.

Text( Index( UORecordArray, 2 ).Field )

A Table() függvény használata esetén először kérje le az egyoszlopos Value oszlopot a nem típusos objektum beolvasásához, majd érje el a Field oszlopot:

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

Ha rekordtömböt típusos táblává alakít át, használhatja a ForAll() függvényt, és minden egyes mezőt átalakíthat.

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

Ha a nem típusos objektumot először átalakítja táblává, akkor a nem típusos objektum eredményként kapott egyoszlopos táblájához használni kell a Value oszlopot a mezők beolvasásához.

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

Konvertálás gépelt rekordokká és táblákká

Az egyes egyszerű értékek külön-külön történő konvertálása helyett a ParseJSON, IsType és AsType függvényekkel tömegesen konvertálhat egy nem típusos objektumot beírt objektummá. A Type függvénnyel olyan típust hozhat létre, amely a nem típusos struktúrát típusos struktúrára képezi le.

Itt például dátum-idő értékekként értelmezzük a JSON-sztringeket anélkül, hogy meg kellene hívnunk a DateTimeValue függvényt:

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