Страницы: 1
RSS
Power Query и Оператор If-Then-Else
 
[Добрый день уважаемые форумчане!!!

Хотел задать вопрос по поводу оператора If Then Else в запросе Power Query
Очень нужно сделать работающий код  “If Then Else “ как на vba  или ином языке. Принцип везде одинаков.

Создал специально простенькую задачку чтобы всем было понятно. Важен именно синтаксис, поэтому разобрав простую задачку и вникнув в синтаксис и реальные задачи смогу решать с большим количеством полей и условий.

Есть исходная таблица. Есть ячейка условия с выбором «1» или «0». В зависимости от заданного  условия «1» или «0» в итоговом запросе происходит фильтрация по полю Флаг.
Ответы типа задать параметр и через него передавать в запрос «1» или «0» не устраивают. Так как задача не настоящая в реальных задачах есть условия не только фильтрации а допустим выполнять определенную операцию – шаг в коде запроса или нет.

Например -
Если истина  тогда -  Фиильтровать по определённой  колонке
Иначе  - удалить определённый столбец и всё в таком духе.

С обычной фильтрацией я конечно бы разобрался. Нужен именно синтаксис «If Then Else» .

Код типа
Код
If a=1 then
        let    Источник =…,    #"Измененный тип" …,  
        #"Строки с примененным фильтром" ..in  
       #"Строки с примененным фильтром"
else
        let    
        Источник = …    #"Измененный тип" = …,    
        #"Удалённый Столбец"
      = Table.SelectRows(#"Измененный тип", each [Флаг] = 0)in    #" Удалённый Столбец  "

Не устраивает !!!!
Т.е. если выполняется условие то выполняется один запрос включающий много шагов. Иначе выполняется другой запрос так же состоящий из нескольких шагов.
Этот вариант я приложил. Код можете посмотреть в приложенном файле.

Он тоже не устраивает если много параметров по которым происходит выбор условий  то код становится просто монструозным и не читабельным. Да и в принципе его тяжело создать а иногда и невозможно.


1 Пункт)
Нужен код типа
Код
let    Источник =…,    
#"Измененный тип" …,                
If a=1 then                        
        #"Строки с примененным фильтром" ..                
   Else                              
       #"Удалённый Столбец"
…
#"Сортированные строки"
#"Переупорядоченные столбцы"………
in  
#"Строки с примененным фильтром"


2 Пункт )
Также Хотелось при таком написании  чтобы каждый шаг виделся так же в редакторе кода, чтобы оставалась возможность удобно просматривать и редактировать код.
Если же в оператор Then и Else прописывать целиком весь запрос то шаги этих запросов не видны и в сложном запросе где много шагов его невозможно будет отлаживать.

Если откроете во вложенном файле запрос «Запрос_Основной» то увидите следущую картину

А в «Применённые шаги» хотелось бы видеть именно все шаги

Например

Повторюсь пример простой и шагов мало но когда запрос сложный где много условий и шагов хотелось бы в условие не записывать весь запрос целиком а выбор конкретного шага в этом запросе в зависимости от условия !!!

Буду ОЧЕНЬ БЛАГОДАРЕН  если кто-нибудь откликнется и поможет решить такую сложную для меня задачу !!!

PS
Прошу прощения что без картинок так и не разобрался как их прикрепить вместо них сайт отображает много-много текста. Хотя при редактировании темы картинки отображаются корректно.
 
Задачу нужно озвучивать в названии темы, а не Ваши представления о функции.
Предложите, заменят модераторы

Код в сообщении оформлять с помощью кнопки <...>
Изменено: vikttur - 29.07.2021 14:40:43
 
Весь текст задачи в тему вставить?
Изменено: Ермолов_А_П - 05.08.2021 09:54:51
 
Читайте правила форма! Там и о названии, и о бездумном цитировании написано

Цитата
не разобрался как их прикрепить вместо них сайт отображает много-много текста.
Так Вы не ссылками прикрепляйте, а файлами
 
Цитата
Ермолов_А_П написал:
“If Then Else “ как на vba  или ином языке. Принцип везде одинаков.
да, и здесь точно такой же
Цитата
Ермолов_А_П написал:
простенькую задачку чтобы всем было понятно
в том-то и дело что вы эту простенькую задачку решаете как-то адски сложно и не ясно зачем это.
можно что-то менее абстрактное - какую реально задачу решаете?
Соблюдение правил форума не освобождает от модераторского произвола
 
я ничего не понял но попробуйте вот это
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Дата", type datetime}, {"ФИО", type text}, {"Флаг", Int64.Type}}),
    #"Строки с примененным фильтром" = Table.SelectRows(#"Измененный тип", each [Флаг] = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content]{0}[Флаг])
in
    #"Строки с примененным фильтром"
 
В зависимости от задачи, можно и аналог switch сделать, а не мастерить сложные конструкции из if-then-else
 
Подозреваю, что вам вот это https://www.planetaexcel.ru/techniques/24/2152/  стоит пристально изучить.
 
Цитата
DrillPipe написал:
В зависимости от задачи, можно и аналог switch сделать, а не мастерить сложные конструкции из if-then-else
Добрый день.
Посмотрел Функцию switch.
И это не то что мне нужно.
Как я понял функция switch может вернуть одному конкретному столбцу один из вариантов значений в зависимости от условия.
Мне нужно в зависимости от условия не присваивать значение какому то конкретному столбцу а выполнить тот или инной шаг в списке применённые шаги

Допустим -

Код
If a=1 then                        
       Шаг 1 (Строки с примененным фильтром по столбцу "Имя" )                
   Else                              
       Шаг2 (Удалённый Столбец "Фамилия")
Шаг3
Шаг4
Шаг5
ит.д.
.....
in  
   .....
Изменено: Ермолов_А_П - 02.08.2021 14:04:05
 
Здраствуйте.
Суть задачи от количества столбцов не меняется
Нужно именно решение типа
Код
If a=1 then                        
       Шаг 1 (Строки с примененным фильтром по столбцу "Имя" )                
   Else                              
       Шаг2 (Удалённый Столбец "Фамилия")
Шаг3
Шаг4
Шаг5
ит.д.
.....
in  
   .....


Изменено: Ермолов_А_П - 05.08.2021 09:55:45
 
Так что ли нужно?
Код
let
    flag = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content]{0}[Флаг],
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    ChangedType = Table.TransformColumnTypes(Source,{{"Дата", type date}, {"Флаг", type number}, {"ФИО", type text}}),
    FilteredRows1 = Table.SelectRows(ChangedType, each ([Флаг] = 1)),
    FilteredRows0 = Table.SelectRows(ChangedType, each ([Флаг] = 0)),
    Out = if flag = 1 then FilteredRows1 else FilteredRows0
in
    Out
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:...
Спасибо большое !!!
То что нужно !!!
Изменено: Ермолов_А_П - 05.08.2021 09:56:31
 
Большое спасибо сердобольным помощникам за то, что добавили работы по чистке темы от тупого копирования...
 
И снова Здраствуйте !!!
Задачу которую мне было нужно решить, реализовал ещё 2 года назад.
Сейчас решил выложить логику запроса который хотел реализовать.
Вдруг кому нибудь да пригодиться !

Сделал простенькую табличку.
На её основе сделал запрос.
На Листе1 расположена Яейка с возможностью выбора  значения - Фильтр_Иванов или Сортировка_Сумма.
В зависимости от того что выбрано в ячейке запрос выполняет то или иное действие.
А именно
              или фильтрует Таблицу по полю "ФИО" Значению "Иванов"
              или сортирует Таблицу по полю "Сумма"
Смысла в данном примере особо нет, просто описать логику работы оператора.
Пример очень простой думаю всем будет понятно !!!

Логика в моей задаче была намного сложнее.
В таблице было много столбцов
условий по полям было много.
Шагов в запросе тоже было много.
Но благодаря логике if then else я всё равно намного упростил запрос и сделал его короче и лаконичнее.
Иначе он был бы просто монструозным и не читаемым.

Ещё раз спасибо - PooHkrd - за то что помог разобраться!!!
Страницы: 1
Наверх