Страницы: 1
RSS
Table.TransformColumns и вложенная таблица
 
Здравствуйте, уважаемые знатоки Excel и Power Query. Возникла задача, решение которой я никак не могу найти. В приложенном файле есть таблица на листе "Контакты", она формируется из нескольких запросов. Последний столбец (если смотреть в Power Query) содержит эту же таблицу с листа "Контакты". Мне нужно модифицировать столбцы "Описание_1", "Описание_2", "Цвет" по условию если значения этих столбцов во вложенной таблице не равно null, тогда установить значения в исходной (не во вложенной) таблице равное значению из вложенной таблице, иначе оставить как есть. Это позволит мне менять значения вручную, а если его нет, то будет значение по умолчанию, или нулевое значение.
В принципе, я могу эту задачу решить, через развертывания вложенной таблицы, создания условных столбцов, удаления лишних и.т.д. Но это как-то не оптимально.
Я понимаю, что задачу, наверное можно решить через Table.TransformColumns, но со всем запутался с синтаксисом, да и мозг ещё не привык к функциональному программированию. Прошу вас, натолкните на правильные мысли.
 
Machestro, Во вложенной таблице всегда одна строка?
 
Цитата
Андрей Лящук написал:
Во вложенной таблице всегда одна строка?
Да
 
Задам вопрос по другому. Вот есть формула, которая не разворачивая вложенную таблицу, делает то, что нужно.
Код
Table.ReplaceValue(#"Объединенные запросы1",each [Цвет],each if [#"Контакты"][Цвет]{0} <> null then [#"Контакты"][Цвет]{0} else [Цвет],Replacer.ReplaceValue,{"Цвет"})

Как можно применить данную строку, к интересующим меня столбцам?

Изменено: Machestro - 06.04.2019 17:30:43
 
как-то так, наверно
Код
let
    Таблица1_Table = Excel.CurrentWorkbook(){[Name="Описания"]}[Content],
    #"Измененный тип 1" = Table.TransformColumnTypes(Таблица1_Table,{{"Тип", type text}, {"Контакт", type text}, {"Цепь", type text}, {"Напряжение", type text}, {"Клеммник", type any}, {"Описание_1", type any}, {"Описание_2", type any}, {"Цвет", type text}}),
    #"Объединенные запросы" = Table.NestedJoin(#"Измененный тип 1",{"Тип"},Данные1,{"Тип_Для_Контактов"},"Данные1",JoinKind.LeftOuter),
    #"Развернутый элемент Данные1" = Table.ExpandTableColumn(#"Объединенные запросы", "Данные1", {"Индекс", "Позиция", "Место", "N_Монтажка"}, {"Индекс", "Позиция", "Место", "N_Монтажка"}),
    #"Строки с примененным фильтром1" = Table.SelectRows(#"Развернутый элемент Данные1", each ([Позиция] <> null)),
    #"Переименованные столбцы" = Table.RenameColumns(#"Строки с примененным фильтром1",{{"Позиция", "Поз"}}),
    #"Переупорядоченные столбцы" = Table.ReorderColumns(#"Переименованные столбцы",{"Поз", "Место", "Контакт", "N_Провода", "Цепь", "Напряжение", "Описание_1", "Описание_2", "Цвет", "Тип", "Клеммник", "Индекс"}),
    #"Объединенные запросы1" = Table.NestedJoin(#"Переупорядоченные столбцы",{"Индекс", "Контакт"},#"Контакты (Служебная)",{"Индекс", "Контакт"},"Контакты (Служебная)",JoinKind.LeftOuter),
    #"Переименованные столбцы1" = Table.RenameColumns(#"Объединенные запросы1",{{"Контакты (Служебная)", "Контакты"}}),
    fn = (a,b)=>let 
        c=(d)=>{d,each e(Record.Field(a[Контакты]{0},d),_)},
        e=(f,g)=>if f=null then g else f,
        h=List.Transform(b,each c(_))
    in         
        Record.TransformFields(a,h),
    Custom1 = Table.FromRecords(Table.TransformRows(#"Переименованные столбцы1", each fn(_,{"Описание_1", "Описание_2", "Цвет"})))
in
    Custom1
 
Андрей Лящук, Ваше решение работает как надо, благодарю вас за отклик. Выглядит, это конечно страшно, но главное работает. Буду разбираться, что к чему
Страницы: 1
Наверх