Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Dynamic — это тип данных в Power Fx, который может содержать любую структуру данных, сложную или простую. Его нельзя использовать напрямую и преобразовать в другой тип данных во время выполнения либо явно, либо неявно. Доступ к полям записей в динамическом значении можно получить с помощью нотации точек, а наличие полей проверяется только во время выполнения.
Существует два способа создания динамического значения:
- Использование функции ParseJSON.
- Использование соединителя, возвращающего динамический тип.
Замечание
Dynamic ранее был назван UntypedObject. Только имя изменилось, изменения в семантике не изменяются. Единственное место, где имя появилось бы в формуле, находится в экспериментальных версиях определяемых пользователем функций и определяемых пользователем типов.
Простые типы
Значение переменной, содержащей динамическое значение, нельзя использовать напрямую. Необходимо всегда правильно вводить его с помощью соответствующего конструктора типов или преобразовывать его в конкретный тип с функциями AsType и ParseJSON .
В следующих примерах преобразуется значение динамической переменной с именем DynValue.
Text(DynValue)
Value(DynValue)
В следующей таблице перечислены типы данных и соответствующие функции для преобразования Dynamic в этот тип данных.
| Тип данных | Function | Description |
|---|---|---|
| Логический | Логический() | При преобразовании Dynamic в логическое значение должно представлять логическое значение или тип, который можно автоматически преобразовать (например, строку true). |
| Color | ColorValue() или RGBA() | Цвета могут быть представлены в нотации определения цвета каскадной таблицы стилей (CSS) в виде строки или отдельных компонентов RGBA. Dynamic можно преобразовать непосредственно из строки определения цвета каскадной таблицы стилей (CSS) с помощью функции ColorValue() или из отдельных чисел RGBA в цвет с помощью функции RGBA(). |
| Номер валюты | Значение() | При преобразовании динамического в число базовое значение должно представлять число или тип, который можно автоматически преобразовать (например, строку "123.456"). |
| Дата, время и дата, время | DateValue(), TimeValue() или DateTimeValue() | Дата, время и время можно напрямую преобразовать из Dynamic в соответствующий тип, если он представлен в формате ISO 8601. Другие форматы должны сначала быть преобразованы в текст с помощью функции Текст(), а затем перенесены в функцию DateValue(), TimeValue() или DateTimeValue(), которая по умолчанию будет использовать язык настроек текущего пользователя для интерпретации даты и времени. |
| GUID | GUID() | Динамическое значение можно преобразовать непосредственно в GUID, если базовый объект представляет GUID или представляет строку. |
| Гиперссылка, изображение, мультимедиа | Текст() | Эти типы данных являются текстовыми типами данных и могут быть преобразованы в текст, а затем использованы в Power Fx. |
| Выбор, два варианта | Переключить или если() | Варианты выбора и два варианта представлены в виде локализованных строк в Power Fx. Варианты выбора поддерживаются номером и двумя вариантами в качестве логических значений. Нет прямого преобразования логического значения, числа или строки в выбор или два варианта, но функции Переключить() или Если() могут использоваться для логического, текстового или числового значений, чтобы правильно назначать значение выбор или два варианта. |
| Запись | н/д | Прямое преобразование из Dynamic в структуру записей отсутствует, но отдельные поля можно извлечь из Dynamic , чтобы создать новую запись. |
| Ссылка на запись | н/д | Ссылки на записи уникальны для источников данных и не имеют понятного представления в Dynamic. |
| Таблицу | Таблица() и ForAll() | Dynamic может представлять массив, который можно преобразовать в таблицу. Эти объекты могут быть массивами записей или массивами значений, которые фактически являются таблицами с одним столбцом. ForAll() можно использовать для создания таблицы с полностью типизированными записями. Дополнительные сведения см. в примерах, приведенных ниже в этой статье. |
| Текст | Текст() | Текст может быть преобразован напрямую. Если динамическое значение представляет число, перед преобразованием в текст необходимо преобразовать динамический в число сначала с помощью value(). |
Типы записей
Вы можете получить доступ к полям переменной, представляющей динамическую запись, используя обычную нотацию точек, используемую для записей. Однако существование полей не будет проверено до среды выполнения. В результате нет доступного intellisense. Если поле не существует или имеет базовое значение null, доступ к нему приведет к Пустому() значению.
Каждое поле записи также имеет тип Dynamic и должен быть правильно типирован. Поле может быть динамической записью простого типа. Если это запись, вы можете сформировать цепочку с точечной нотацией. Если какое-либо поле в цепочке не существует, возвращается значение Пусто().
В следующих примерах используются поля из динамической переменной с именем DynRecord.
Text(DynRecord.StringField)
Value(DynRecord.Field.ChildField)
Если имя поля состоит из недопустимого имени идентификатора, например когда имена полей начинаются с цифры или содержат недопустимые символы, такие как дефис, вы можете поместить имена полей в одинарные кавычки:
dynamic.'01'
dynamic.'my-field'
Доступ к динамическим столбцам
Иногда имена столбцов в записи могут быть динамическими. Используйте функцию ColumnNames, чтобы определить, какие имена столбцов доступны в записи, затем используйте функцию Column для получения значения именованного столбца.
Например:
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
Массивы
Динамическая переменная может содержать массив. Несмотря на то, что массив может быть массивом записей или массивом простых типов, преобразование динамического массива в таблицу с помощью функции Table() всегда приведет к одноколоночной таблице Dynamic. Такие функции, как ForAll() и Index(), не требуют предварительного создания Table() и, соответственно, не требуют, чтобы вы использовали одностолбцовое поле Value,
Например, чтобы получить второй номер в массиве динамических значений чисел ( [1, 2, 3] ), можно использовать следующую формулу для получения второй строки в таблице и преобразования столбца в число:
Value( Index( UOArray, 2 ) )
Если динамическое преобразование было преобразовано в таблицу () первым, вторая строка в таблице с одним столбцом является столбцом Value , содержащим динамический:
Value( Index( Table( UOArray ), 2 ).Value )
Для массива записей, имеющих текстовый столбец с именемField, действует та же логика.
Динамический доступ можно получить напрямую или при использовании функции Table() приведет к одноколоночной таблице Dynamic.
Столбец Field можно получить непосредственно из динамической функции Index( ).
Text( Index( UORecordArray, 2 ).Field )
При использовании функции Table() сначала извлеките столбец с одним столбцом для получения Value столбца, а затем перейдите к столбцуField:
Text( Index( Table( UORecordArray ), 2 ).Value.Field )
Чтобы преобразовать массив записей в типизированную таблицу, вы можете использовать функцию ForAll() и преобразовывать каждое отдельное поле.
ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )
Если динамический объект сначала преобразуется в таблицу, опять же результирующая таблица с одним столбцом Dynamic потребует использовать Value столбец для получения полей.
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
Преобразование в типизированные записи и таблицы
Это важно
- Использование AsType и IsType с динамическими значениями является экспериментальной функцией.
- Экспериментальные функции не предназначены для использования в рабочей среде и могут быть не завершены. Они доступны перед официальным выпуском, чтобы вы могли досрочно получить доступ и предоставить отзывы. Дополнительная информация: Общие сведения об экспериментальных, предварительных и устаревших версиях функций в приложениях на основе холста
- Поведение, описанное в этой статье, доступно только в том случае, если экспериментальная функция Пользовательские типы в разделе Параметры > Предстоящие функции > Экспериментальные включена (по умолчанию она отключена).
- Ваш отзыв очень важен для нас. Поделитесь с нами своим мнением на форуме сообщества по экспериментальным функциям Power Apps.
Вместо преобразования каждого простого значения по отдельности функции ParseJSON, IsType и AsType можно использовать для массового преобразования динамического объекта в типизированный объект. Используйте функцию Type для создания типа, который сопоставляет динамическую структуру с типизированной структурой.
Например, здесь мы интерпретируем строки JSON как значения даты и времени без необходимости вызывать функцию 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