Есть ли функция М для создания типа таблицы? - PullRequest
1 голос
/ 03 февраля 2020

На языке М есть функция Type.ForRecord, которую можно использовать для динамического создания типа записи.

// These two expressios are exchangeable

type [A = Int64.Type, optional B = text]

Type.ForRecord(
    [
         A = [Type = type number, Optional = false],
         B = [Type = type text, Optional = true]
    ],
    false
)

Используя это, мы можем создать новый тип записи на основе существующего типа. с дополнительным полем, как показано ниже.

// These two expressions are exchangeable

type [A = Int64.Type, optional B = text, optional C = date]

let
    existingType = [A = Int64.Type, optional B = text],
    newFieldName = "C",
    newFieldType = type date
in
    Type.ForRecord(
        Record.AddField(
            Type.RecordFields(existingType),
            newFieldName,
            [Type = newFieldType, Optional = true]
        ),
        false
    )

Теперь я ищу способ сделать то же самое с типами таблиц. Я хочу иметь возможность изменить существующий тип таблицы, добавив новый столбец. Имя и тип нового столбца динамически определяются во время выполнения.

// I want this result

type table [A = Int64.Type, B = text, C = date]

// How can I create a new table type adding column `C = date`?

let
    existingType = type table [A = Int64.Type, B = text],
    newColumnName = "C",
    newColumnType = type date
in
    ...

Я ожидал, что есть такая функция, как Type.ForTable, но я не смог ее найти. Есть ли идея?

1 Ответ

1 голос
/ 04 февраля 2020

Тривиальный способ сделать это следующим образом:

newType = type table [A = Int64.Type, B = text, newFieldName = newFieldType]

Но это не сработает, если ваш existingType является динамическим c.


Если вы сохраните определение existingType как обобщенную c запись (а не таблицу), вы можете получить новый тип таблицы, приведя его к типу таблицы после добавления нового поля записи.

let
    existingType = type /*no table here*/ [A = Int64.Type, B = text],
    newFieldName = "C",
    newFieldType = type date,
    newType =
    Type.ForRecord(
        Record.AddField(
            Type.RecordFields(existingType),
            newFieldName,
            [Type = newFieldType, Optional = false]
        ),
        false
    ),
    newTableType = type table newType
in
    newTableType
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...