Поделиться через


Динамические значения

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) } )

Преобразование в типизированные записи и таблицы

Это важно

Вместо преобразования каждого простого значения по отдельности функции 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