Tipe data objek yang tidak diketik
Objek yang tidak diketik adalah tipe Power Fx data yang dapat menampung struktur data apa pun, kompleks atau sederhana. Objek tidak berjenis tidak dapat digunakan secara langsung dan memerlukan konversi eksplisit ke suatu jenis data. Bidang dalam catatan dalam objek tidak berjenis dapat diakses menggunakan notasi titik dan keberadaan bidang hanya diverifikasi saat runtime.
Objek yang tidak diketik adalah jenis pengembalian dari penyedia tertentu yang tidak diketik. Saat ini, hanya fungsi ParseJSON() yang menampilkan objek tidak berjenis.
Jenis Sederhana
Nilai variabel jenis objek tidak berjenis tidak dapat digunakan secara langsung. Anda harus selalu menulisnya dengan benar menggunakan konstruktor jenis yang sesuai.
Contoh berikut mengonversi nilai variabel objek tidak berjenis bernama UOValue
.
Text(UOValue)
Value(UOValue)
Tabel berikut mencantumkan jenis data dan fungsi terkait untuk mengonversi objek tidak berjenis ke jenis data tersebut.
Jenis Data | Function | Description |
---|---|---|
Boolean | Boolean() | Saat mengonversi objek yang tidak diketik ke boolean, nilai yang mendasarinya harus mewakili boolean atau jenis yang dapat dikonversi secara otomatis (seperti string "true"). |
Warna | ColorValue() atau RGBA() | Warna dapat direpresentasikan dalam notasi definisi warna Cascading Style Sheet (CSS) sebagai string, atau sebagai komponen RGBA individual. Objek tidak berjenis dapat langsung dikonversi dari string definisi warna Cascading Style Sheet (CSS) menggunakan fungsi ColorValue(), atau dari angka RGBA individual menjadi warna menggunakan fungsi RGBA(). |
Mata uang, Angka | Nilai() | Saat mengonversi objek yang tidak diketik ke angka , nilai yang mendasarinya harus mewakili angka atau jenis yang dapat dikonversi secara otomatis (seperti string "123.456"). |
Tanggal, TanggalWaktu, Waktu | DateValue(), TimeValue() atau DateTimeValue() | Tanggal, waktu, dan tanggalwaktu dapat langsung dikonversi dari objek tidak berjenis ke jenisnya masing-masing, jika direpresentasikan dalam format ISO 8601. Format lain harus terlebih dahulu dikonversi menjadi teks menggunakan fungsi Text() lalu diteruskan ke fungsi DateValue(), TimeValue() or DateTimeValue() yang secara default akan menggunakan bahasa pengaturan pengguna saat ini untuk menginterpretasikan tanggal dan waktu. |
GUID | PANDUAN () | Objek yang tidak diketik dapat langsung dikonversi ke GUID jika objek yang mendasarinya mewakili GUID, atau jika mewakili string. |
HyperLink, Gambar, Media | Teks() | Jenis data ini adalah jenis data teks dan dapat dikonversi ke teks lalu digunakan di Power Fx. |
Pilihan, Dua Opsi | Switch() atau if() | Pilihan dan dua opsi disajikan sebagai string yang Power Fxdilokalkan. Pilihan didukung oleh angka dan dua opsi sebagai boolean. Tidak ada konversi langsung dari boolean, angka, atau string ke pilihan atau dua opsi, tetapi fungsi Switch() atau If() dapat digunakan di nilai boolean, teks, atau angka untuk menetapkan dengan benar nilai pilihan atau dua opsi. |
Rekaman | t/a | Tidak ada konversi langsung dari objek tidak berjenis ke struktur catatan, tetapi setiap bidang dapat diambil dari objek tidak berjenis untuk membuat catatan baru. |
Referensi Catatan | t/a | Referensi catatan bersifat unik untuk sumber data dan tidak memiliki representasi yang berarti di objek tidak berjenis. |
Table | Table() dan ForAll() | Objek tidak berjenis dapat merepresentasikan sebuah array, yang dapat dikonversikan menjadi sebuah tabel. Objek ini dapat berupa array catatan, atau array nilai yang secara efektif merupakan tabel kolom tunggal. ForAll() dapat digunakan untuk membuat tabel dengan rekaman yang diketik sepenuhnya. Tinjau contoh lebih lanjut di artikel ini untuk informasi selengkapnya. |
SMS | Teks() | Teks dapat dikonversi secara langsung. Jika objek tidak berjenis merepresentasikan angka, Anda harus mengonversi objek tidak berjenis ke angka terlebih dahulu menggunakan Value() sebelum mengonversinya menjadi teks. |
Jenis Data
Anda dapat mengakses bidang pada variabel yang merepresentasikan catatan objek tidak berjenis menggunakan notasi titik biasa yang digunakan untuk catatan. Namun, keberadaan kolom tersebut tidak akan diverifikasi hingga runtime. Sehingga, intellisense juga tidak tersedia. Jika bidang tidak ada atau memiliki nilai dasar null, nilai Blank() akan dihasilkan saat mengaksesnya.
Setiap bidang pada catatan juga berjenis objek tidak berjenis dan harus ditulis dengan benar. Bidang dapat berupa catatan tidak berjenis dari jenis sederhana. Jika itu adalah catatan, Anda dapat merangkai notasi titik. Jika ada bidang dalam rantai yang tidak ada, Blank() ditampilkan.
Contoh berikut menggunakan bidang dari variabel objek tidak berjenis bernama UORecord
.
Text(UORecord.StringField)
Value(UORecord.Field.ChildField)
Jika nama bidang terdiri dari nama pengidentifikasi yang tidak valid, misalnya saat nama bidang dimulai dengan angka atau berisi karakter yang tidak valid seperti tanda hubung, Anda dapat memasukkan nama bidang dalam tanda kutip tunggal:
untyped.'01'
untyped.'my-field'
Akses kolom dinamis
Terkadang nama kolom dalam rekaman akan dinamis. Gunakan fungsi ColumnNames untuk menentukan nama kolom mana yang tersedia dalam rekaman, lalu gunakan fungsi Kolom untuk mengambil nilai kolom bernama.
Misalnya,
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
Array
Variabel objek tidak berjenis dapat berisi sebuah array. Meskipun array tersebut dapat berupa array catatan atau array jenis sederhana, mengonversi array objek tidak berjenis menjadi tabel menggunakan fungsi Table() akan selalu menghasilkan tabel kolom tunggal objek tidak berjenis. Fungsi seperti ForAll() dan Index() tidak mengharuskan Anda untuk terlebih dahulu membuat Table(), sehingga tidak mengharuskan Anda untuk menggunakan bidang Value
kolom tunggal,
Misalnya, untuk mendapatkan angka kedua dalam array objek tidak berjenis yang berisikan nilai angka ( [1, 2, 3]
), rumus berikut dapat digunakan untuk mengambil baris kedua dalam tabel dan mengonversi kolom menjadi angka:
Value( Index( UOArray, 2 ) )
Jika objek tidak berjenis dikonversi menjadi Table() terlebih dahulu, baris kedua dalam tabel kolom tunggal yang dihasilkan adalah kolom Value
yang berisi objek tidak berjenis:
Value( Index( Table( UOArray ), 2 ).Value )
Untuk array catatan yang memiliki kolom teks bernama Field
, logika yang sama berlaku.
Objek tidak berjenis dapat diakses secara langsung, atau jika menggunakan fungsi Table() akan menghasilkan tabel kolom tunggal objek tidak berjenis.
Kolom Field
dapat diakses secara langsung dari objek tidak berjenis yang ditampilkan oleh fungsi Index().
Text( Index( UORecordArray, 2 ).Field )
Saat menggunakan fungsi Table(), ambil kolom Value
terlebih dahulu untuk mendapatkan objek tidak berjenis, lalu akses kolom Field
:
Text( Index( Table( UORecordArray ), 2 ).Value.Field )
Untuk mengonversi array catatan ke tabel berjenis, Anda dapat menggunakan fungsi ForAll() dan mengkonversi setiap bidang individu.
ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )
Jika objek tidak berjenis terlebih dahulu dikonversi menjadi tabel, sekali lagi, tabel kolom tunggal objek tidak berjenis yang dihasilkan akan mengharuskan Anda untuk menggunakan kolom Value
untuk mendapatkan bidang.
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
Mengonversi ke rekaman dan tabel yang diketik
Alih-alih mengonversi setiap nilai sederhana satu per satu, fungsi ParseJSON,IsType, dan AsType dapat digunakan untuk mengonversi objek yang tidak diketik menjadi objek yang diketik secara massal. Gunakan fungsi Type untuk membuat jenis yang akan memetakan struktur yang tidak diketik ke struktur yang diketik.
Misalnya, di sini kita menafsirkan string JSON sebagai nilai waktu tanggal, tanpa perlu memanggil fungsi 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