Параметризация выбора источника-ссылки для запроса Power Query, Как реализовать выбор источника-ссылки (из двух запросов) для итогового запроса Power Query
Уважаемые специалисты и эксперты в области Power Query, подскажите пожалуйста, можно ли параметризировать выбор источника-ссылки для запроса. Видела несколько рассмотренных тем о параметризации пути к файлу/папке, и успешно их применяю, а вот попыталась пойти по тому же пути но к запросу - не получается, название запроса воспринимается PQ как текст (что-то видимо не так делаю). Задача следующая. Существует два больших запроса (в примере в файле схематично обозначены Размер1 и Размер2). Периодически используется то один, то другой, но выход, хотелось бы, чтобы всегда был один, так как далее с ним всегда производятся одни и те же действия. Подскажите, пожалуйста, как реализовать выбор источника (только не таблицы, а именно одного из запросов) для итогового запроса Выход. Например, чтобы в зависимости от значения, указанного в таблице Выбор, источником был соответствующий запрос. И далее, также в зависимости от этого же выбора, запрос либо сразу выгружался (если Размер1), либо (если Размер2) перед выгрузкой выполнялось слияние еще с одним запросом (Вес). Так можно?
ЕленаЕлина, не мудрите, да не мудримы будете добавил к вашим запросам еще 2: 1. загружаем в отдельный запрос таблицу "Выбор" - называем запрос например "выбор" в таблице в этом запросе нажимаем пр кн на значение ячейки и выбираем "Детализация" (так проще сразу) - получаем результат запроса как текст из ячейки таблицы "Выбор"
Скрытый текст
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица5"]}[Content],
Выбор = Источник{0}[Выбор]
in
Выбор
2. создаем пустой запрос, например с названием "результат" в котором пишем условие на значение в таблице "Выбор" - обратите внимание, что пишем после if просто название предыдущего запроса из п.1 (выбор) и названия запросов Выход и Размер1 безо всяких кавычек:
Скрытый текст
Код
let
Источник = if выбор="Размер2" then Выход else Размер1
in
Источник
3. выгружаем запрос "результат" из п.2 на лист, потом после выбора значения в таблице Выбор (там выпадающий список будет??) надо обновить выгруженную таблицу из запроса "результат", либо написать тем же макрорекордером макрос: "после выбора значения из выпадающего списка обновляй таблицу, выгруженную из запроса"
ПС: естественно, вообще все запросы можно объединить в один
ЕленаЕлина, а чем вам не нравится?) у вас миллионы строк в запросах? если таблицы в неск десятков-сотен строк то можно и тысячу запросов создать и ничего не изменится....
либо как у Alex, либо вкладывать функции в друг друга...можно вообще все в одну строку написать....только на таком объеме, да и на объеме в 100 раз большем, ничего не будет заметно в приросте производительности, у вас нет ничего, чтобы тормозило
ЕленаЕлина, если кратко, то с помощью Expression.Evaluate и среды #shared мы дали понять, чтоб PQ текст из Таблицы Выбор определил как конкретный запрос. Можете в пустом запросе написать: =#shared и посмотреть, что будет Ну а если более детально, то читайте справку по функции Expression.Evaluate и ссылку из сообщения от voler83,
voler83, у меня и большие запросы, и в таблицах много строк (десятки-сотни тысяч), поэтому пытаюсь экономить во всем. Еще и опыта у меня маловато. Может по общим меркам все не так и долго... Вы правы. Спасибо еще раз.
ЕленаЕлина написал: в таблицах много строк (десятки-сотни тысяч
тогда делайте как Alex или пишите запрос единым текстом сразу начиная с if , а после if через вложенные let...in или пользовательские функции сразу запросы, выдающие результат конечный , т.к. если как у меня, то получение в качестве результата результат запроса "Вывод" приведет к его пересчету при обращении к нему, а в нем join, т.е. запрос "Вывод" будет пересчитан дважды - сам по себе и при обращении к нему по имени, это не годится.
AlienSx, здравствуйте! Очень рада новой встречи с вами. Спасибо, оба варианта подходят. А эти варианты равнозначны по применению, не подскажете? Дело вкуса или существуют какие-нибудь рекомендации к применению.
ЕленаЕлина написал: А эти варианты равнозначны по применению, не подскажете?
Результат то они один дают в вашем конкретном случае. Expression.Evaluate, все-таки, не (столько) для того, чтобы вытянуть поле записи, которую выдает #shared, по имени этого поля. Record.FieldOrDefault имеет преимущество в данном случае - вы можете не беспокоиться об ошибке, если такого поля в записи нет. Мне очень нравится Expression.Evaluate, но здесь отдаю предпочтение Record.FieldOrDefault. Про performance ничего не скажу - едва ли уместно оценивать скорость в данном случае. P.S. Вообще, как мне кажется, это своего рода стереотип - если #shared, то где-то поблизости должен быть Expression.Evaluate (и наоборот). Все от ситуации зависит. В данном конкретном случае Expression.Evaluate, кмк, применять особого смысла нет.