Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Expression.Evaluate - Power Query, Пояснить работу Expression.Evaluate в Power Query
 
Спасибо.
Expression.Evaluate - Power Query, Пояснить работу Expression.Evaluate в Power Query
 
В последнее время на сайтах (https://www.thebiccountant.com/2016/03/08/select-rows-that-have-no-empty-fields-using-expression-eva..., https://bondarenkoivan.wordpress.com/2016/01/25/rename-columns-of-nested-tables-in-power-query/, https://blog.crossjoin.co.uk/2015/02/06/expression-evaluate-in-power-querym/) описывают функцию Expression.Evaluate. Не могу понять её смысл и применение в Power Query. Можете пояснить зачем эта функция и где её применять?
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
Спасибо будем изучать. И ещё вопрос, для подмены итогов и подитогов функцию summarize нужно писать отдельно или всё вместе?
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
Спасибо. Тогда не понятно как срабатывает мера в DAX (в таблице факт она работает, а если работаем со справочником, то нет (связь многие к одному)):
Код
План (работает с таблицей факт):=SWITCH ( IF ( HASONEVALUE ( 'ТаблицаФакт'[Показатель, ед. изм.] ); VALUES ( 'ТаблицаФакт'[Показатель, ед. изм.] ) ); "Содержание, г/т"; [Содержание, г/т (план)]; SUMX ('ТаблицаФакт'; 'ТаблицаФакт'[План] )
Если добавить функцию RELATEDTABLE (фильтрацию от справочника к таблице факт ) и итератор SUMX (для всех данных), то работает от справочника.
Код
План (_1):=VAR CorrectRezult =
    RELATEDTABLE ( 'ТаблицаФакт' ) -- создаем фильтрацию от справочника к Таблице факт
VAR poiskSoder =
    IF (
        HASONEVALUE ( 'ТаблицаФакт'[Показатель, ед. изм.] );
        VALUES ( 'ТаблицаФакт'[Показатель, ед. изм.] )
    ) = "Содержание, г/т" -- поиск "Содержания" и передаче ей Меры или выражения
VAR Rezultat =
    SUMX ( CorrectRezult; 'ТаблицаФакт'[План] ) -- проводим итерацию по строкам
RETURN
     Rezultat
ВОПРОС: что передать переменной, когда она отфильтровала от справочника и отыскала: IF(HASONEVALUE('ТаблицаФакт'[Показатель, ед. изм.] );
       VALUES('ТаблицаФакт'[Показатель, ед. изм.])) = "Содержание, г/т", чтобы она могла понять, какую брать строчку по добыче и какую по металлу, чтобы рассчитывать.
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
А если у Вас таких показателей 513 шт. (бурение, переработка, дробление, извлечение, перевозка, транспортировка и т.д.), что тогда писать на каждую меру? Выводится же данные когда выводишь показатели со справочника (План (Sum):=SUM( 'ТаблицаФакт'[План] ), просто итоги он складывает, а нужно, чтобы рассчитывал. Значит будем разбираться со связями, да и мысль посетила, а если создать виртуальный столбец или таблицу? Будем продолжать изучать DAX. Мера План (SWITH) же работает в таблице факт, значит должна работать и со справочником.
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
Добавил лист "Сводная", построил три сводных и расписал.
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
пример во вложении.
DAX. Главная и подчинённая таблица. Создать меру., Не работает мера с подчиненной таблицы при создании сводной таблицы
 
Есть таблица факт и справочник. В таблице факт Содержание рассчитываются как Металл / Добычу и * 1000. Меры и пример (во вложении) представлены ниже:
Код
1. Металл, кг (план):=CALCULATE ( SUM ( 'ТаблицаФакт'[План] ); 'ТаблицаФакт'[Показатель, ед. изм.] = "Металл, кг" )
2. Добыча, т (план):=CALCULATE ( SUM ( 'ТаблицаФакт'[План] ); 'ТаблицаФакт'[Показатель, ед. изм.] = "Добыча руды, т")
3. Содержание, г/т (план):=DIVIDE ( [Металл, кг (план)]; [Добыча, т (план)]; 0 ) * 1000
4. План (SWITCH):=SWITCH ( IF ( HASONEVALUE ( 'ТаблицаФакт'[Показатель, ед. изм.] ); VALUES ( 'ТаблицаФакт'[Показатель, ед. изм.] ) ); "Содержание, г/т"; [Содержание, г/т (план)]; SUMX (
'ТаблицаФакт'; 'ТаблицаФакт'[План] )
Когда работаешь с таблицей факт или отдельными мерами, данные рассчитывает правильно, т.е. металл 3.5 г/т (и в итогах, во всех сводных таблицах). Если Показатели и Наименование Подразделений добавляю со справочника (хочу спрятать таблицу факт от пользователя), Содержание не считается, в сводной таблице Содержание исчезает.  Если делаем меру через SUM: План (Sum):=SUM( 'ТаблицаФакт'[План] ), итоговые содержания складываются, а нужно рассчитывать, согласно формулы. Так же возникает вопрос, может в модель данных не тянуть Содержание, в связи с тем, что оно рассчитывается и как правильно написать меру, чтобы управлять со справочника.
Преобразовать список с помощью List.Accumulate в PQ, Решение задачи в Power Query с помощью List.Accumulate
 
Спасибо Вам.
Преобразовать список с помощью List.Accumulate в PQ, Решение задачи в Power Query с помощью List.Accumulate
 
Спасибо Вам за Ваши идеи.
Преобразовать список с помощью List.Accumulate в PQ, Решение задачи в Power Query с помощью List.Accumulate
 
Андрей - спасибо, у Вас немного не то получилось. Я выкладываю файл со своими решениями, Вашими и Михаила Л (ОЧЕНЬ ОРИГИНАЛЬНОЕ РЕШЕНИЕ). Вы спрашивали почему List.Accumulate, отвечаю: изучаю язык М и хочу разобраться по глубже. Разобрал функции List.Generate и List.Accumulate, понял принцип работы. Нашёл свою ошибку, с ссылками нужно быть осторожным на языке М. Так же понял, что можно их использовать - это уменьшит на несколько шагов в PQ.
Сделал 4900 строк в листе и прогнал все варианты, могу сказать, что List.Accumulate на больших данных для преобразования не лучший способ использовать, на малых данных ДА! List.Generate можно и нужно использовать на больших данных, но это моё мнение.
Спасибо Михаилу Л за оригинальное решение, как говорится "Век живи и век учись", всё гениальное ПРОСТО.
Преобразовать список с помощью List.Accumulate в PQ, Решение задачи в Power Query с помощью List.Accumulate
 
Есть лист данных (во вложении файл), нужно преобразовать с помощью List.Accumulate, задача решена с помощью List.Generate. Если есть какие-то мысли решения данной задачи ещё другим способами - прошу поделиться идеями?
Преобразовать данные Power Query для сводной таблицы
 
Я готов оплатить за Ваш вектор направления. Вы потратили на меня время и дали новый импульс изучения Power Query. Тем более я делаю это для облегчения своей жизни на работе, а то "копировать и вставить" - надоело. За раздел "Работа" спасибо. Попробую сначала сформулировать и изложить свою идею на бумагу и первое это обращусь к Вам, а затем напишу туда.  
Преобразовать данные Power Query для сводной таблицы
 
Да показываем, в первом варианте я её вообще упустил из виду. Заранее Вам спасибо. В Power Query учусь, да есть есть такое дело: по принципу "как умею". Но не останавливаюсь, прогрессирую :)  
Преобразовать данные Power Query для сводной таблицы
 
Сегодня перепишу вариант решения на условный столбец с несколькими критериями ввода и на группировку по процессам и отпишусь. Проанализирую по времени запросов.
Преобразовать данные Power Query для сводной таблицы
 
Рабочий вариант решения во вложении и код ниже, но он уж очень большой получается
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Удаленные столбцы" = Table.RemoveColumns(Источник,{"План", "Факт"}),
    #"Условный столбец добавлен" = Table.AddColumn(#"Удаленные столбцы", "ПГР / ОГР", each if [#"№ п/п"] = 1 then "ПГР + ОГР" else if [#"№ п/п"] = 2 then "ПГР" else if [#"№ п/п"] = 3 then "ОГР" else null),
    #"Заполнение вниз" = Table.FillDown(#"Условный столбец добавлен",{"Наименование работ", "ПГР / ОГР"}),
    Фильтр = Table.SelectRows(#"Заполнение вниз", each ([#"ПГР / ОГР"] <> "ПГР + ОГР")),
    Подразделение = Table.AddColumn(Фильтр, "Наименование подразделения", each if Text.Contains([Наименование работ], """") then Text.BetweenDelimiters([Наименование работ], """", """") 
                                                                                else if Text.Contains([Наименование работ], "ПНР", Comparer.OrdinalIgnoreCase)  then  "Екатерина 1 + Екатерина 2" 
                                                                                else null),
    УдалВерхСтрок = Table.RemoveFirstN (Подразделение, 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    #"Другие удаленные столбцы" = Table.SelectColumns(УдалВерхСтрок,{"ПГР / ОГР", "Наименование подразделения", "Наименование работ", "Ед. изм."}),
    СтартоваяТаблица = #"Другие удаленные столбцы",
    ПГР_OriginalTable = Table.SelectRows(СтартоваяТаблица, each ([#"ПГР / ОГР"] = "ПГР")),
    СтолбецПроцессПГР = Table.AddColumn(ПГР_OriginalTable, "Наименование процесса", each if Text.Contains([Наименование работ], "попутная", Comparer.OrdinalIgnoreCase) then "Добыча руды - попутная" 
                                    else if Text.Contains([Наименование работ], "очистная", Comparer.OrdinalIgnoreCase) then "Добыча руды - очистная" 
                                    else if Text.Contains([Наименование работ], "добыча руды", Comparer.OrdinalIgnoreCase) then "добыча руды" 
                                    else if Text.Contains([Наименование работ], "перевозка", Comparer.OrdinalIgnoreCase) then "Перевозка" 
                                    else if Text.Contains([Наименование работ], "Закладка", Comparer.OrdinalIgnoreCase) then "Закладка" 
                                    else if Text.Contains([Наименование работ], "Проходка", Comparer.OrdinalIgnoreCase) then "Проходка горных выработок" 
                                    else if Text.Contains([Наименование работ], "Крепление", Comparer.OrdinalIgnoreCase) then "Крепление" 
                                    else if Text.Contains([Наименование работ], "Бурение ПГР", Comparer.OrdinalIgnoreCase) then "Бурение ПГР"  
                                    else if Text.Contains([Наименование работ], "Проходческое", Comparer.OrdinalIgnoreCase) then "Бурение проходческое" 
                                    else if Text.Contains([Наименование работ], "крепь", Comparer.OrdinalIgnoreCase) then "Бурение под крепь" 
                                    else if Text.Contains([Наименование работ], "очистное", Comparer.OrdinalIgnoreCase) then "Бурение очистное" 
                                    else if Text.Contains([Наименование работ], "СЭР", Comparer.OrdinalIgnoreCase) then "Бурение СЭР" 
                                    else if Text.Contains([Наименование работ], "Водоотлив", Comparer.OrdinalIgnoreCase) then "Водоотлив" 
                                    else null),
    ЗаполнениеНаименований_ПГР = Table.FillDown(СтолбецПроцессПГР,{"Наименование процесса", "Наименование подразделения"}),
    #"Table_Добыча рудыПГР" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each Text.Contains([Наименование процесса], "Добыча руды")),
    #"Строки с примененным фильтром" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each Text.Contains([Наименование процесса], "бурение", Comparer.OrdinalIgnoreCase)),
    #"Удаленные верхние строки" = Table.RemoveFirstN (#"Строки с примененным фильтром", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    Table_БурениеПГР = Table.SelectRows(#"Удаленные верхние строки", each ([Наименование работ] <> "в т.ч. Бурение под крепь" and [Наименование работ] <> "в т.ч. Очистное" and [Наименование работ] <> "в т.ч. Проходческое" and [Наименование работ] <> "в т.ч. СЭР")),
    #"Строки с примененным фильтром1" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each ([Наименование процесса] = "Перевозка")),
    Перевозка = Table.RemoveFirstN (#"Строки с примененным фильтром1", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "в т.ч. ООО ""Полиметалл ДВ""") <> true),
    Table_ПеревозкаПГР = Table.ReplaceValue(Перевозка,"в т.ч.","",Replacer.ReplaceText,{"Наименование работ"}),
    #"Строки с примененным фильтром2" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each Text.Contains([Наименование процесса], "Закладка")),
    #"Замененное значение" = Table.ReplaceValue(#"Строки с примененным фильтром2","в т.ч. ","",Replacer.ReplaceText,{"Наименование работ"}),
    Table_ЗакладкаПГР = Table.SelectRows(#"Замененное значение", each ([Наименование подразделения] <> "Ресурсы Албазино")),
    #"Строки с примененным фильтром3" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each ([Наименование процесса] = "Крепление")),
    Table_КреплениеПГР = Table.RemoveFirstN (#"Строки с примененным фильтром3", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    #"Строки с примененным фильтром4" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each ([Наименование процесса] = "Водоотлив")),
    #"Замененное значение1" = Table.ReplaceValue(#"Строки с примененным фильтром4","в т.ч. ","",Replacer.ReplaceText,{"Наименование работ"}),
    Table_ВодоотливПГР = Table.RemoveFirstN (#"Замененное значение1", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Ольгинский") <> true),
    #"Строки с примененным фильтром5" = Table.SelectRows(ЗаполнениеНаименований_ПГР, each ([Наименование процесса] = "Проходка горных выработок")),
    #"Замененное значение2" = Table.ReplaceValue(#"Строки с примененным фильтром5","в т.ч. ","",Replacer.ReplaceText,{"Наименование работ"}),
    Table_ПроходкаПГР = Table.RemoveFirstN (#"Замененное значение2", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    ПГР_Resultat = #"Table_Добыча рудыПГР" & Table_ПеревозкаПГР & Table_ЗакладкаПГР & Table_ПроходкаПГР & Table_КреплениеПГР & Table_БурениеПГР & Table_ВодоотливПГР,
    ОГР_OriginalTable = Table.SelectRows(СтартоваяТаблица, each ([#"ПГР / ОГР"] = "ОГР")),
    УдалВерхИтоги = Table.RemoveFirstN (ОГР_OriginalTable, 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    СтолбецПроцессОГР = Table.AddColumn(УдалВерхИтоги, "Наименование процесса", each if Text.Contains([Наименование работ], "добыча руды", Comparer.OrdinalIgnoreCase) then "Добыча руды" 
                                    else if Text.Contains([Наименование работ], "перевозка", Comparer.OrdinalIgnoreCase) then "Перевозка" 
                                    else if Text.Contains([Наименование работ], "вскрыша", Comparer.OrdinalIgnoreCase) then "Вскрыша" 
                                    else if Text.Contains([Наименование работ], "бурение взрывных", Comparer.OrdinalIgnoreCase) then "Бурение взрывных" 
                                    else if Text.Contains([Наименование работ], "бурение контурное", Comparer.OrdinalIgnoreCase) then "Бурение контурное" 
                                    else if Text.Contains([Наименование работ], "бурение СЭР", Comparer.OrdinalIgnoreCase) then "Бурение СЭР" 
                                    else if Text.Contains([Наименование работ], "Взрывание", Comparer.OrdinalIgnoreCase) then "Взрывание скважин" 
                                    else if Text.Contains([Наименование работ], "Дробление", Comparer.OrdinalIgnoreCase) then "Дробление щебня" 
                                    else if Text.Contains([Наименование работ], "Водоотлив", Comparer.OrdinalIgnoreCase) then "Водоотлив" 
                                    else if Text.Contains([Наименование работ], "Осушени", Comparer.OrdinalIgnoreCase) then "Осушение борта" 
                                    else null),
    ЗаполнениеНаименований_ОГР = Table.FillDown(СтолбецПроцессОГР,{"Наименование подразделения", "Наименование работ", "Ед. изм.", "Наименование процесса"}),
    Table_ДобычаОГР = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "Добыча руды")),
    Table_ПеревозкаОГР = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "перевозка", Comparer.OrdinalIgnoreCase)),
    #"Строки с примененным фильтром6" = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "Вскрыша")),
    #"Строки с примененным фильтром7" = Table.SelectRows(#"Строки с примененным фильтром6", each not Text.Contains([Наименование работ], "всего")),
    Table_ВскрышаОГР = Table.ReplaceValue(#"Строки с примененным фильтром7","в т.ч. ","",Replacer.ReplaceText,{"Наименование работ"}),
    #"Строки с примененным фильтром8" = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "Взрывание")),
    Table_Взрывание = Table.SelectRows(#"Строки с примененным фильтром8", each not Text.Contains([Наименование работ], "всего")),
    Пользовательская1 = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "Водоотлив") or Text.Contains([Наименование процесса], "Дробление") or Text.Contains([Наименование процесса], "Осушение")),
    Table_Водоотлив = Table.ReplaceValue(Пользовательская1,"Екатерина 1 + Екатерина 2","Общий",Replacer.ReplaceText,{"Наименование подразделения"}),
    Бурение = Table.SelectRows(ЗаполнениеНаименований_ОГР, each Text.Contains([Наименование процесса], "Бурение")),
    УдалВерхСтрок_ОГР = Table.RemoveFirstN (Бурение, 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Анфисинский") <> true),
    #"Строки с примененным фильтром9" = Table.SelectRows(УдалВерхСтрок_ОГР, each not Text.Contains([Наименование работ], "всего") and not Text.Contains([Наименование работ], "итого")),
    Пользовательская2 = Table.RemoveLastN (#"Строки с примененным фильтром9", 
                                each List.Contains( try Record.FieldValues(_) otherwise "FALSE", "Итого бурение ООО ""Ресурсы Албазино""") <> true),
    Table_Бурение = Table.RemoveLastN(Пользовательская2,1),
    ОГР_Resultat = Table_ДобычаОГР & Table_ПеревозкаОГР & Table_ВскрышаОГР & Table_Бурение & Table_Взрывание & Table_Водоотлив,
    Resultat = ПГР_Resultat & ОГР_Resultat
in
    Resultat
Преобразовать данные Power Query для сводной таблицы
 
Спасибо PooHkrd. Я переделал желаемую таблицу (разнёс: наименование подразделения, наименование работ, процесс). Файл во вложении. Так же в Power query есть полурабочий вариант. Я не могу сообразить в каком направлении двигаться. Перебирать данные логикой, в моём понимании неправильно. Завтра изменятся данные и снова переписывать, так же не хочется тянуть в модель данных Итого и Всего (это лишних 171 строчка). Могу направить файлы, как сделал по другим предприятиям.  
Изменено: Николай Савенко - 29.11.2019 10:22:17
Преобразовать данные Power Query для сводной таблицы
 
По функции Максима Зеленского fnGetRowsOutline не получилось, она работает на уровни структуры строк. А в данной таблице нет уровней, здесь разбивается на блоки, они разбиты.
Изменено: Николай Савенко - 27.11.2019 18:20:04
Преобразовать данные Power Query для сводной таблицы
 
Спасибо, сейчас попробуем и отпишусь вечером
Преобразовать данные Power Query для сводной таблицы
 
Я добавил рядом столбец, что должно получиться. В скобках процесс и наименование подразделения, а так же, что не нужно тащить в данные.
Изменено: Николай Савенко - 27.11.2019 18:20:17
Преобразовать данные Power Query для сводной таблицы
 
Предложения по быстрому способу преобразования данных (файл во вложении) по блокам (выделены рамкой - столбец "Наименование работ"), убрать всего и итого для работы в Power Pivot и сводной таблицы. С условным столбцом получается громостко и Power Query при большом объёме (таблиц 1600 шт.) зависает.
Изменено: Николай Савенко - 29.11.2019 17:09:38
Power query.Ошибка List.ReplaceMatchingItems при замене на листе
 
Нашёл решение:
Код
Resultat=List.Generate (
                         ()=> [id=0, L = if Данные{id} = null 
                                               then Данные{id}   
                                               else List.NonNullCount(List.FirstN ((Данные), id)) + 1], 
                         each [id] < List.Count(Данные), 
                         each [id= [id] + 1, L = if Данные{id} = null 
                                               then Данные{id}
                                               else List.NonNullCount(List.FirstN ((Данные), id)) + 1],
                         each [L])
Изменено: Николай Савенко - 20.10.2019 06:58:49
Power query.Ошибка List.ReplaceMatchingItems при замене на листе
 
Что за ошибка в Power query (приложен файл), и как обойти:
 
Код
Данные = { null, 1, null, null, null, null, 4, null, null, 2, null, 3, null, 4, null, null, 5, null, 10, null, null, null },
СписокЗамен = List.Zip({List.RemoveNulls(Данные), {1..List.NonNullCount(Данные)}}),
Custom2 = List.ReplaceMatchingItems(Данные, СписокЗамен)

Нужно получить (цифры по порядку, не изменяя null):

Код
Результат = { null, 1, null, null, null, null, 2, null, null, 3, null, 4, null, 5, null, null, 6, null, 7, null, null, null }

Ошибка кроется в одинаковых данных (цифра 4) в #"Данные", если поставить другую цифру, то отрабатывает формула - отлично. Нужно искать другой подход замен.
Изменено: Николай Савенко - 18.10.2019 22:47:10
Замена текста с помощью List Generator Power query по условию
 
У меня получилось превратить в функцию:
Код
(ListColumn as list, N as number)=> 
    List.Generate(
        () => [id = 0, check = if Text.StartsWith( ListColumn{id}, "В т.ч." ) then 0 else N, l = ListColumn{id}],
        each [id] < List.Count (ListColumn),
        each [id = [id] + 1, check = if Text.StartsWith( ListColumn{id}, "В т.ч." ) then 0 else [check] + 1, l = if check > 0 and check <= N then "В т.ч. " & Text.Replace( ListColumn{id}, Text.Split( ListColumn{id}," "){0}, Text.Lower(Text.Split(ListColumn{id}," "){0}))  else ListColumn{id}],
        each [l])
Замена текста с помощью List Generator Power query по условию
 
Спасибо PooHkrd, как говорил товарищ Ленин: "Учиться, учиться и ещё раз учиться". Вы меня заставили по-другому взглянуть на Power query.
Замена текста с помощью List Generator Power query по условию
 
Спасибо, так просто :)
Замена текста с помощью List Generator Power query по условию
 
Не правильно работает код, будем дальше разбираться, что не так делаю.
Замена текста с помощью List Generator Power query по условию
 
Решил свою задачу вот так, прошу прокомментировать, может есть лучше вариант решения:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="ГР_Светлое__4"]}[Content],
    ChangedType = Table.TransformColumnTypes(Source,{{"Наименование работ, ед. изм.", type text}, {"План-сутки", type number}, {"Факт-сутки", type number}}),
    Set = [List = List.Buffer( ChangedType[#"Наименование работ, ед. изм."] ), Count = List.Count(List), Q = 4],
    Maker = List.Buffer (List.Generate(
        () => [id = 0, check = if Text.StartsWith( Set[List]{id}, "В т.ч." ) then 0 else Set[Q], l = Set[List]{id}],
            each [id] < Set[Count],
            each [id = [id] + 1, 
                        check = if Text.StartsWith( Set[List]{id}, "В т.ч." ) 
                                then 
                                    0 
                                else 
                                    [check] + 1, 
                l = if check > 0 and check <= Set[Q] 
                        then 
                            "В т.ч. " & Text.Replace( Set[List]{id}, Text.Split( Set[List]{id}," "){0}, Text.Lower(Text.Split(Set[List]{id}," "){0})) 
                        else 
                            Set[List]{id}],
            each [l])),
    t1 = List.Buffer (ChangedType[#"Наименование работ, ед. изм."]),
    //функция замены значений по списку
    TranslateFunction = (InputText)=> 
     let
       //функция замены значений
       DoRep = List.Generate(
                          ()=> [cnt=0, text=InputText], 
                          each [cnt]<=List.Count(t1), 
                          each [cnt=[cnt]+1, 
                                text=Text.Replace([text], t1{[cnt]}, Maker{[cnt]})], 
                          each [text]),
       GetLastValue = List.Last(DoRep)
     in
      GetLastValue,
    Output = Table.TransformColumns(ChangedType, {"Наименование работ, ед. изм.", each TranslateFunction(_), type text})
in
    Output
Замена текста с помощью List Generator Power query по условию
 
Согласен, что частным компаниям. Но всё зависит от объёмов производства. Чем больше объёмы, тем меньше себестоимость.
Замена текста с помощью List Generator Power query по условию
 
Спасибо всем огромное.  
Страницы: 1 2 След.
Наверх