Здравствуйте, столкнулся с проблемой. Не знаю как ее лучше решить, поэтому обратился к функции List.Generate. Необходимо сравнить текущее значение строки столбца ПК с набором диапазонов из другого заброса и если есть вхождения, то выдать значение ячейки ПК. Но почему то функция выдает ошибку Expression.Error: Поле "ПК" записи не найдено. В языке М не силен. Буду премного благодарен, если вы мне поможете и укажите на ошибку. Файл прилагаю. Запрос называется РасстановкаСлева.
Вот сам код
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], #"Удаленные дубликаты" = Table.Distinct(Источник, {"ПК", "Наименование"}), #"Добавлен пользовательский объект" = Table.AddColumn(#"Удаленные дубликаты", "Тип", each List.Accumulate (Справочник, [Наименование], (state, current) => Text.Replace (state, current[Найти], current[Заменить]))), #"Строки с примененным фильтром1" = Table.SelectRows(#"Добавлен пользовательский объект", each ([Тип] = "ПЧ")), #"Замененное значение" = Table.ReplaceValue(#"Строки с примененным фильтром1","+","",Replacer.ReplaceText,{"ПК"}), #"Измененный тип" = Table.TransformColumnTypes(#"Замененное значение",{{"Уклон слева", type number}, {"ПЧ слева", type number}, {"ПЧ справа", type number}, {"Уклон справа", type number}, {"ПК", type number}}), #"Строки с примененным фильтром" = Table.SelectRows(#"Измененный тип", each ([ПЧ слева] <> null)), #"Сгруппированные строки" = Table.Group(#"Строки с примененным фильтром", {"ПК", "Тип"}, {{"Число полос слева", each Table.RowCount(Table.Distinct(_)), Int64.Type}, {"ПЧ слева", each Number.Round(List.Sum([ПЧ слева]), 2), type nullable number}}), #"1" = Table.AddColumn(#"Сгруппированные строки", "Категория", each (if (тИсхИнф {0} [Значение]) <> null then if ( ([ПК] >= (тИсхИнф {0} [ПК от])) and ([ПК] <= (тИсхИнф {0} [ПК до])) ) then (тИсхИнф {0} [Значение]) else 0 else 0) + (if (тИсхИнф {1} [Значение]) <> null then if ( ([ПК] >= (тИсхИнф {1} [ПК от])) and ([ПК] <= (тИсхИнф {1} [ПК до])) ) then (тИсхИнф {1} [Значение]) else 0 else 0) + (if (тИсхИнф {2} [Значение]) <> null then if ( ([ПК] >= (тИсхИнф {2} [ПК от])) and ([ПК] <= (тИсхИнф {2} [ПК до])) ) then (тИсхИнф {2} [Значение]) else 0 else 0)), #"Добавлен пользовательский объект1" = Table.AddColumn(#"1", "Пользовательский", each //List.First( //List.Sort( List.Generate( () => [i = 1, state = //try ( if ( ([ПК] >= (Группировка2 {0} [ПК от])) and ([ПК] <= (Группировка2 {0} [ПК до])) ) = true then [ПК] else null //) //otherwise (null) ], each [i] <= List.Count (Группировка2[ПК от]), each [ i = [i] + 1, state = //try ( if ( ([ПК] >= (Группировка2 {[i]} [ПК от])) and ([ПК] <= (Группировка2 {[i]} [ПК до])) ) = true then [ПК] else null //) //otherwise (null) ], each [state] ) //, Order.Descending) //) ) in #"Добавлен пользовательский объект1"
buchlotnik На счет пары строк не знаю, но вот попробую объяснить.
Вот абстрактный пример:
Есть несколько диапазонов (такой диапазон находится в запросе Группировка2 и представлен в виде двух столбцов начало и конец) приблизительно выглядит так:
Начало Конец 1) 10 20 2) 50 70 3) 150 200
и т.д.
Скажем есть последовательность нарастаемых чисел, допустим от 0 до 300. Она представлена в столбце ПК с неким шагом (шаг может быть произвольным):
ПК 1) 0 2) 5 3) 10 4) 15 5) 17.3 6) 20 7) 25
и т.д.
Мне нужно найти совпадения, т.е. совпадают ли числа с диапазоном и если совпадают, то вывести значение столбца ПК
Как-то так это должно выглядеть (здесь столбец с диапазоном приведу в качестве наглядного примера):