Уважаемые, кто подскажет, имеется ли возможность обращаться к полям таблицы не по имени, а по номеру позиции. Проблема в том, что в табличках, которые приходится подгружать каждый день новые имена полей (например даты), а умножать на цену нужно именно поле [03.12.2016] которое находится на 4 месте в примере? Как в запросе обратиться к полю по номеру столбца в таблице? Привожу пример, как я это делаю сейчас через понижение/повышение заголовков, но есть ощущение что это костыль и можно как-то правильнее что ли.
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
#"Пониженные заголовки" = Table.DemoteHeaders(Источник),
#"Столбец с суммой" = Table.AddColumn(#"Пониженные заголовки", "Сумма продаж сегодня", each [Column3]*[Column4]),
#"Замененные ошибки" = Table.ReplaceErrorValues(#"Столбец с суммой", {{"Сумма продаж сегодня", null}}),
#"Повышенные заголовки" = Table.PromoteHeaders(#"Замененные ошибки", [PromoteAllScalars=true]),
#"Переименованные столбцы" = Table.RenameColumns(#"Повышенные заголовки",{{"Column7", "Сумма продаж сегодня"}})
in
#"Переименованные столбцы"
Я сделал только пример на основе Вашей таблицы, а не решил Вашу задачу. Попробуйте использовать "Table.ColumnNames". Эта функция возвращает массив, содержащий заголовки столбцов, и затем можно обращаться к нужному заголовку по порядковому номеру в этом массиве, выбирая нужный заголовок. Нумерация в массиве начинается с нуля, поэтому в Вашем случае нужно использовать число 3, чтобы обратиться к 4-му заголовку.
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
#"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Код", Int64.Type}, {"Товар", type text}, {"Цена", Int64.Type}, {"03.12.2016", Int64.Type}, {"02.12.2016", Int64.Type}, {"01.12.2016", Int64.Type}}),
#"SelCol" = Table.SelectColumns(#"Измененный тип", Table.ColumnNames(#"Измененный тип"){3})
in
#"SelCol"
Спасибо за наводку, но пока не получается применить к своей задаче. Пытаюсь обращаться к столбцу через функцию Table.Column() с указанием поля через Table.ColumnNames но она на выходе дает ошибку и в её описании говорит что не может применить оператор * к операндам типа List. Значит нужно как-то показать что требуется перемножать соответствующие элементы из двух списков. Как, пока не понятно. Буду копать дальше, как найду выложу пример, если раньше не подскажет кто еще.
Максим Зеленский, Круто! Работает. Огромное спасибо! А как в функции Record.FieldValues(_) работает обращение к таблице через знак "_" ? Там же должно быть обращение к данным типа Record?
А, это любопытно. Функция Table.AddColumn - итератор, она перебирает кажду строку и выполняет некое действие. Конструкция each + _ обозначает "для каждой строки", где _ это текущий элемент перечисления, в нашем случае - строка.
Можно по-другому посмотреть: Таблица может быть рассмотрена как список записей. Чтобы добавить столбец, в каждую запись надо добавить поле. Перебираем список, на каждом шаге передавая текущую запись как аргумент для функции. При использовании each текущий элемент перебора обозначается как "_"
Дабы не создавать новую тему, попробую спросить здесь. Подскажите пожалуйста, что прописать в настраиваемом столбце, чтобы в нем выводились данные из столбца, который находится левее или правее столбца, имя которого мне известно. Другими словами, условно половина таблицы имеет плавающую структуру - в ней добавляются столбцы с неизвестными именами, в то время как другая половина по своей структуре не меняется. Хотелось бы иметь возможность ссылаться на новые столбцы, указывая в качестве отправной точки один из тех столбцов, что остаются без изменений. Например, указать имя столбца и задать параметр что-то вроде -3, обозначив тем самым что я хочу видеть данные из столбца который находится левее на 3 столбца от нужного.
Спасибо, очень похоже на то, что я ищу. Я, правда, еще не силен в PQ, и, насколько понимаю, вместо (tbl) должно быть указано имя нужной мне таблицы. А нельзя ли заставить PQ воспринимать в качестве таблицы то, что я вижу во время предварительного просмотра, чтобы не выгружать лишний раз не нужные мне данные. То есть вписать данный код прямо между шагами существующего запроса, а PQ при этом воспринимал таблицей то, что окажется выше этих строчек кода?
Александр, вместо tbl должно быть имя переменной (шага), содержащей нужную таблицу. В созданном мной примере эта переменная называется tbl:
Код
let
tbl = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
x = List.PositionOf(Table.ColumnNames(tbl),"НужныйСтолбец"),
addClmn = Table.AddColumn(tbl,"НовыйСтолбец", each Record.FieldValues(_){x-2})
in
addClmn
Александр, еще вариант. Столбец слева от известного. Первой цифрой регулируем номер столбца от искомого( 1=первый слева от искомого, 2=второй слева от искомого). Второй цифрой выбираем сколько столбцов оставить
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Custom1 = List.LastN(List.RemoveLastN(List.RemoveLastN(Table.ColumnNames(Source), each _<>"Известный"),1), 1),
Custom2 = Table.SelectColumns(Source,Custom1)
in
Custom2
Добрый день, форумчанам. Вопрос как у автора темы, только решение нужно немного иное. Есть номер столбца по которому нужно отфильтровать <> null.
Можно как то выбрать столбец не по названию, а по его номеру?
Пример таблицы прикладываю.
Код
let
Source = Excel.CurrentWorkbook(){[Name="Primer"]}[Content],
#"Строки с примененным фильтром" = Table.SelectRows(Source, each ([Column5] <> "null"))
in
#"Строки с примененным фильтром"
Спасибо за ответ, все заработало. Пробовал я этот вариант, но почему то выдавал ошибку, на стадии попытки в фигурные скобки просто цифру столбца добавить. Видимо, где то, что то упускал.