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