Коллеги, здравствуйте! Хотел бы создать универсальную таблицу-шаблон-накопитель с заданными типами данных для столбцов, чтобы впоследствии транслировать типы данных по наименованиям столбцов одновременно в несколько последующих запросов (проработку начал из темы Задать для всех столбцов один тип в Power Query)
написал: с заданными типами данных для столбцов, чтобы впоследствии транслировать типы данных по наименованиям столбцов одновременно в несколько последующих запросов
если типы и имена столбцов заранее известны - то можно. Только непонятно как именно Вы хотите видеть решение и какова задача. Т.к. есть какие-то исходные данные и какие-то попытки решения, но никакого намека на тот результат, который ожидаете. Если в грубой форме, то можно запрос табValueType записать так:
Код
let
Источник =
{
{"ИНН", Int64.Type},
{"ЮЛ", type text},
{"Name", type text},
{"Дата", type datetime},
{"Текст3", Int64.Type},
{"Количество", type number},
{"Сумма", type number}
}
in
Источник
а потом в запросе Т записываете все очевидным образом:
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Т"]}[Content],
Value.Type = Table.TransformColumnTypes(Источник, табValueType)
in
Value.Type
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий, да, большое спасибо, это почти так, только плюсом, для большей гибкости, я хотел бы иметь возможность пропуска столбцов, чтобы работать со всеми таблицами от общего табValueType , если корректно формулирую свой вопрос
Т.е., в идеале, в табValueType создавать и накапливать все типы данных для всех столбцов, и раздавать типы на любые таблицы внутри структуры запросов
PooHkrd, в Table.Schema сократил табValueType до целевого набора столбцов (в каждом случае будет свой) и добавил игнорирование пропусков столбцов - на основных данных у меня поехало ... тестирую
Код
let Источник = Excel.CurrentWorkbook(){[Name="Т"]}[Content],
ListOfTypes = Table.ToRows(
Table.TransformColumns(
Table.Schema(Table.SelectColumns( табValueType , Table.ColumnNames( Источник ), MissingField.Ignore))[[Name],[TypeName]],
{{"TypeName", (x)=>Expression.Evaluate(x,#shared), Type.Type}})),
ChangedType = Table.TransformColumnTypes(Источник,ListOfTypes)
in
ChangedType
Доброго времени суток. Подскажите как список списков можно отфильтровать?
Код
let
Источник =
{
{"ИНН", Int64.Type},
{"ЮЛ", type text},
{"Name", type text},
{"Дата", type datetime},
{"Текст3", Int64.Type},
{"Количество", type number},
{"Сумма", type number}
}
in
Источник
к пример по этому списку
{"ИНН","ЮЛ", "Name"}
т.к. я наворотил хрен знает что
Код
список={{"текс", type text}, {"текс2", type text}, {"дата", type date}, {"дата2", type date}, {"число", type number}, {"число2", type number}},
#"Преобразовано в таблицу" = Table.FromList(список, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Добавлен пользовательский объект" = Table.AddColumn(#"Преобразовано в таблицу", "Пользовательский", each Record.FromList([Column1],{"имя","тип"})),
select=Table.ToRecords( Table.SelectRows( Table.FromRecords(#"Добавлен пользовательский объект"[Пользовательский]),each List.ContainsAny( {[имя]},names))),
#"Преобразовано в таблицу1" = Table.FromList(select, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Добавлен пользовательский объект1" = Table.AddColumn(#"Преобразовано в таблицу1", "Пользовательский", each Record.ToList([Column1]))[Пользовательский],
names = Table.ColumnNames(Источник),
let
src =
{
{"ИНН", Int64.Type},
{"ЮЛ", type text},
{"Name", type text},
{"Дата", type datetime},
{"Текст3", Int64.Type},
{"Количество", type number},
{"Сумма", type number}
},
filter = {"ИНН","ЮЛ", "Name"},
select = List.Select(src, (x)=> List.ContainsAny(x,filter))
in
select
Только осторожнее с List.Contains. Если список filter (именно filter, на объем src все равно) большой, то будет довольно медленно работать. В таком случае лучше на словаре из записей:
Код
let
src = {
{ "ИНН", Int64.Type },
{ "ЮЛ", type text },
{ "Name", type text },
{ "Дата", type datetime },
{ "Текст3", Int64.Type },
{ "Количество", type number },
{ "Сумма", type number }
},
filter = { "ИНН", "ЮЛ", "Name" },
filterRec = Record.FromList ( List.Repeat ( { true }, List.Count ( filter ) ), filter ),
select = List.Select ( src, ( x ) => Record.FieldOrDefault ( filterRec, x{0}, false ) )
in
select
mechanix 85, тут нет по 2 причинам: 1. в буфер следует брать либо получаемые каким-то кодом из данных списки, либо генерируемые типа {1..100}. 2. для примера вообще все равно Это же типизация столбцов. Ну сколько их? 20,50,100? Вообще любой код подойдет, разницу не ощутите
Доброе время суток. Коллеги, подскажите, пожалуйста, а в чём принципиальный смысл задавать определение имён столбцов и их типов как список? В чём профит? Чем так хуже?
Код
let
commonColumnTypeDefinition = [
#"ИНН" = Int64.Type,
#"ЮЛ" = type text,
#"Name" = type text,
#"Дата" = type datetime,
#"Текст3" = Int64.Type,
#"Количество" = type number,
#"Сумма" = type number
],
filter = { "ИНН", "ЮЛ", "Name" },
selectedColumnTypes = List.Transform(filter, each {_, Record.Field(commonColumnTypeDefinition, _)})
in
selectedColumnTypes
Андрей VG, не спорю ни в коем случае Я бы еще вместо списка filter взял бы тупо Table.ColumnNames таблицы данных и вместо Record.Field - Record.FieldOrDefault ( commonColumnTypeDefinition, _, type any ). А так - я отвечал на вопрос о фильтрации списков