Страницы: 1 2 След.
RSS
PQ - Развернутый элемент отображает неверные данные
 
Добрый день.
Столкнулся со странным поведением PQ - ищу правду. После объединения 2 таблиц - развертываю столбец с таблицей, а данные не отображаются, хотя в самой таблице они есть.
Мои действия:
1. Объединяю 2 запроса PQ  в один.
2. При нажатии на ячейку Table внизу отображается ее содержание - и оно правильно. Вот скрин
3. Развертываю таблицу и данных нет - вот скрин

Что за чудеса?
Изменено: Денис - 04.02.2018 12:23:09
 
offtop Блин, теперь вместо "не работает ВПР... помогите!" начнут плодиться темы в "PQ не работает слияние..."
Денис, ну вот как вы себе представляете оказание вам помощи без предоставления исходных данных?
На текущий момент могу вас заверить функция Table.NestedJoin (как и ВПР) отлично работает!
Вот горшок пустой, он предмет простой...
 
Цитата
Денис написал:
ищу правду
ищу файл с запросом для поисков правды :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Там файл с запросом вряд ли поможет. Наверняка данные тащатся из выгрузок 1С или чего-то подобного. В результате в ключевых полях разные невидимые глазу знаки с кодом 160 и тому подобная нечисть. Денис, если данные предоставить не можете копайте в эту сторону. Вот здесь вариант как эти знаки можно искать.
Изменено: PooHkrd - 05.02.2018 09:28:30
Вот горшок пустой, он предмет простой...
 
PooHkrd, создал тестовый файл - ситуация повторяется.

Что смотреть.
1. Запрос и лист - Минимальный закуп. Например у 1 позиции определился минимальный закуп = 4.
2. Запрос и лист - Минимальная цена. Например у 1 позиции определилась минимальная цена = 9.
3. Итоговый лист, где я объединяю запросы "Минимальная цена" и "Минимальный закуп" - данные там не такие, как в самих запросах.
 
Проблема где-то у Вас в PQ. У меня все нормально отображается и разворачивается. Все данные на месте. Excel 365
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, можете дать скрин Итоговой таблицы?
Не то, что бы я вам не доверяю, просто охота убдеиться, что говорим об и тех же данных)
 
Тогда и меня проблема в PQ. Ибо тоже фигня какая-то разворачивается. Вот скриншоты до разворачиания, и после.
Вот горшок пустой, он предмет простой...
 
PooHkrd, фух. Пронесло. Я думал, что у меня начинаются танцы с бубном по обновлению экселя...

Продолжаем изучать эту мистику.
 
На изучение, честно говоря времени нет. Предлагаю такое решение: Используйте вместо функции Table.NestedJoin функцию Table.Join. Пример во вложении и с ним все работает корректно.
А про Table.NestedJoin, что называется хозяйкам на заметку, нужно пару запросиков будет проверить из моего загашника. Может кто-то из зубров подскажет что-то еще.
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо за рабочее решение.
Но действительно надо как-то теперь держать это в голове, так как часто пользуюсь это функцией.
 
Доброе время суток
Цитата
PooHkrd написал:
Ибо тоже фигня какая-то разворачивается
Никакой фигни там нет. Просто последствия "ленивого" выполнения Table.Distinct в запросе "Минимальный закуп" :) , обсуждаемого в другой теме PQ - Удаление дубликатов - какая логика?. Просто у ТС странная логика и требования к Power Query.
Цитата
я делал фильтрацию, для того, чтобы нужный дубликат всегда шел за главным значением
Чтобы это значило? Каким образом фильтрация может задавать порядок следования?
 
Цитата
Андрей VG написал:
Чтобы это значило? Каким образом фильтрация может задавать порядок следования?
может неправильно выразился. Имел в виду сортировку. Если и так непонятно, то буду более детально описывать)

Цитата
Андрей VG написал:
Никакой фигни там нет. Просто последствия "ленивого" выполнения Table.Distinct в запросе "Минимальный закуп"  , обсуждаемого в другой теме  PQ - Удаление дубликатов - какая логика? . Просто у ТС странная логика и требования к Power Query.
Получается, при использовании Table.Distinct нет смысла разворачивать столбцы?
 
Цитата
PooHkrd написал:
фигня какая-то разворачивается
я не сильно вдумывался в сами данные, но ведь они есть? Я так понял изначально, что разворачиваются null вместо данных. А это не так - данные-то есть. И у меня такие же данные разворачиваются, как у Вас. Понятно, что должен быть поставщик 2, а не 1. Видимо в этом проблема. Но не в этом же:
Цитата
Денис написал:
Развертываю таблицу и данных нет
Видимо, я просто невнимательно прочитал аннотацию к файлу, где проблема уже чуть иначе была раскрыта.
А данные в этом случае берутся из начального источника - т.е. из Минимальная цена -шаг Источник. Что действительно странно.
Изменено: Дмитрий Щербаков - 05.02.2018 11:41:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Денис написал:
Получается, при использовании Table.Distinct нет смысла разворачивать столбцы?
Получается, что вы не правильно решаете задачу. Фактически вам нужно для каждой подгруппы и подтаблицы, задаваемой набором столбцов в Table.Distinct выбрать единственную запись, определяемую набором и правилами упорядочивания. Так это будет правильно. Как это реализовать мышиным хардкодом - не знаю, так как им не пользуюсь.
Пример, как лучше находить таблицы с минимальными ценами и закупами, с учётом того, что в вашем случае можно просто выбирать такие записи подгрупп по минимуму Цены/Закупа.
Успехов.
P. S. И спасибо за демо ошибки - всегда чувствовал, что в Power Query следует соблюдать SQL подход, а не надеяться, что данные будут следовать друг за другом в неизменном виде.
Изменено: Андрей VG - 05.02.2018 11:56:47
 
Цитата
Андрей VG написал:
Фактически вам нужно для каждой подгруппы и подтаблицы, задаваемой набором столбцов в Table.Distinct выбрать единственную запись, определяемую набором и правилами упорядочивания.
Да я уже перепробовал наверное 5 разных способов нахождения минимального значения)) Но вот понравилось это делать через удаление дубликатов, по следующим причинам: иногда ситуация усложняется и например минимальное значение может быть одинаково и надо уже ориентироваться на самого поставщика - какой из них более приоритетный. И этим можно управлять через любые сортировки, то есть главное чтобы нужное значение было на первом месте, а последующие - удалятся. И сортировка оказалась самым простым способом в этом плане. Но вышли подводные камни...

Цитата
Андрей VG написал:
P. S. И спасибо за демо ошибки - всегда чувствовал, что в Power Query следует соблюдать SQL подход, а не надеяться, что данные будут следовать друг за другом в неизменном виде.
Пожалуйста) А вот я не SQL программист, и для меня эти баги прям проблема-проблема...
 
Цитата
Денис написал:
и например минимальное значение может быть одинаково и надо уже ориентироваться на самого поставщика - какой из них более приоритетный
Как выше писал это
Цитата
Андрей VG написал:
выбрать единственную запись, определяемую набором и правилами упорядочивания
Пример для минимальной цены
Код
let
    Источник = #"Все таблицы",
    grouped = Table.Group(#"Все таблицы", {"№"}, {"needed", each Table.First(Table.Sort(_, {{"Цена", Order.Ascending}, {"Поставщик", Order.Descending}})) }),
    delGroupCols = Table.RemoveColumns(grouped,{"№"}),
    result = Table.ExpandRecordColumn(delGroupCols, "needed", {"№", "Цена", "Закуп", "Поставщик"})
in
    result

Цитата
Денис написал:
эти баги
Это не баги. Это неправильное понимание и не знание структур и алгоритмов ;)
Изменено: Андрей VG - 05.02.2018 12:52:51
 
Вот я прям чувствовал, что не надо использовать удаление дублей. И вот оно - подтверждение моей чуйки  :D  Всегда дубли убираю через группировку, и с такой ерундой ранее не встречался.
Андрей VG, тогда не очень понятно почему Table.Join сработал как ожидалось, а Table.NestedJoin подложил такую свинью. Где хоть ознакомиться, что такое сочетание функции приводит к такому вот результату?
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
не очень понятно почему Table.Join сработал как ожидалось, а Table.NestedJoin подложил такую свинью
всё же соглашусь с ТС, наверное баг. PQ же не на прямую выполняется, а как и SQL, проходит цепочку преобразований через анализатор, оптимизатор, компилятор перед выполнением. Видимо где то на этих этапах для nestedjoin теряется использование сортировки перед distinct. Типа - а зачем? Если любой первый? Можно писать баг отчёт разработчикам. Говорят, что подобные вещи они быстро исправляют.
А где ещё есть, не знаю. Стараюсь делать детерминированные решения. Хотя и тут бывают баги. Например у меня вылетало отправляемое на сортировку соединение сделанная через list.generate таблица нарастающего итога по столбцу исходной таблицы с исходной таблицей по общему столбцу индекса с сообщением о нехватки памяти. То есть если не вкючать сортировку итоговой таблицы по индексу исходного порядка, то всё хорошо и вывод есть. Но стоит только добавить - сообщение об ошибке.
 
PooHkrd, я тоже начинал пробовать через группировку, но до конца реализовать не получилось. А именно:
  1. Вот он выбрал минимальное значение из нескольких строк, а как сделать чтобы он также оставил другие столбцы, соответствующие этому минимальному значению. (то есть подгрузил столбец поставщик, цена и другие)
  2. Как правильно делать группировку, если у нас встречается одинаковые значения и надо уже смотреть по поставщику.
Вот эти вопросы меня и остановили при использовании группировкой...
Цитата
Андрей VG написал:
Это не баги. Это неправильное понимание и не знание структур и алгоритмов
Отчасти это так, но в данной ситуации я пользовалсяь стандартными функциями и они не сработали)
 
Цитата
Андрей VG написал:
PQ же не на прямую выполняется, а как и SQL, проходит цепочку преобразований через анализатор, оптимизатор, компилятор перед выполнением.
А вот это натолкнуло меня на идею. Попоробовал - взлетело!
Table.Buffer -вот еще одно решение, и еще одно объяснение, почему я раньше не натыкался на такой баг - месяца 4 назад начал все промежуточные запросы закидывать в память - и работает быстрее и, как оказывается, глюков с очередностью шагов меньше.
Для ТС - каждый последний шаг в двух сливаемых запросах запихиваем в функцию Table.Buffer и вуаля.
Цитата
Денис написал:
Вот он выбрал минимальное значение из нескольких строк, а как сделать чтобы он также оставил другие столбцы, соответствующие этому минимальному значению. (то есть подгрузил столбец поставщик, цена и другие)
Как правильно делать группировку, если у нас встречается одинаковые значения и надо уже смотреть по поставщику.
1. Сделали группировку по минимальному значению
2. Сливаем результат с таблицей, которая была до группировки по двум ключевым столбцам "код номенклаутры" и "значение минимальной цены"
3. Разворачиваем столбец с минимальной ценой по получившемуся столбцу отфильтровываем все строки со значением <> null
На выходе получили только строки с минимальной ценой
Ну а как вы поставщиков с одинаковой минимальной ценой отсеивать будете я логики не видел.
Изменено: PooHkrd - 05.02.2018 16:05:05
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Для ТС - каждый последний шаг в двух сливаемых запросах запихиваем в функцию Table.Buffer и вуаля.
Попробовал - тоже получилось!
Видимо, все тяжелые запросы надо заканчивать буфером.

Цитата
PooHkrd написал:
Ошибка
а это про что?
 
Цитата
Денис написал:
Видимо, все тяжелые запросы надо заканчивать буфером.
Здесь не в этом дело. Обычно буфером я заканчиваю запросы, к которым обращаюсь более одного раза из-за корявого кэширования в Экселевском PQ. Но в данном случае Буфер ограничивает запрос в отдельную структуру для оптимизаторов, про которые писал Андрей VG. Т.е. выполнение действий с данными происходит не как с единой цепочкой от последнего запроса к первому. А сначала отдельно вычисляются два запроса, результаты запихиваются в оперативку, и последний запрос работает уже с результатами, а не разворачивает цепочки.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Здесь не в этом дело. Обычно буфером я заканчиваю запросы, к которым обращаюсь более одного раза из-за корявого кэширования в Экселевском PQ
я, конечно, утрировал. Нужна какая-та мера по использованию Table.Buffer, но в принципе если завершать все важные запросы Buffer = Table.Buffer() ничего критичного не должно произойти. Или может наступить переполнение буффера?
 
Ну, на сколько вам оперативки хватит. Все же массивы по нескольку миллионов строк закидывать в оперативку я бы не рекомендовал .
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Обычно буфером я заканчиваю запросы, к которым обращаюсь более одного раза из-за корявого кэширования в Экселевском PQ
имеется в виду обращаетесь в рамках одной книги или разных? То есть если очень часто обращаюсь к таблице, которая загрузила данные с сайта. Причем обращение идет из разных книг. Желательно тогда этот запрос с данными с сайта закончить буффером получается?
 
Денис, я уже упоминал ранее что не умею обращаться к запросам из других книг. К таблицам, да, но не к запросам. Соответственно, если вы затащили в книгу данные с сайта чтобы сохранить в таблицу, а потом используете полученную таблицу в других книгах, то зачем её еще и в буфер размещать?
Изменено: PooHkrd - 05.02.2018 17:30:06
Вот горшок пустой, он предмет простой...
 
PooHkrd, Я Понял. Актуально только в рамках одной книги)
 
Подведем итог этого тикета, может кому-то будет также полезно при использовании PQ.

Правило.
Если в рамках одной книги вы используете промежуточные запросы PQ для расчета данных, то необходимо в этих запросах последним шагом делать Table.Buffer.

Пример.
Предположим, что в рамках одной книги у вас есть следующие запросы: Поставщик1, Поставщик2, Обработка1, Обработка2, Обработка3, Итоговый результат.
Запросы Поставщик1, Поставщик2 - это обращение к внешним файлам (в нашем случае прайсы поставщиков).
Обработка1, Обработка2, Обработка3 - это промежуточные запросы, где вы делаете операции на основании данных из запросов Поставщик1, Поставщик2.
Итоговый результат - объединяете запросы Обработка1, Обработка2, Обработка3 в один запрос.
Таким образом в запросах Обработка1, Обработка2, Обработка3 последний шаг должен быть Table.Buffer.

Инструкция по шагам.
Для того, чтобы сделать расчет данных в Обработка1 на основании запроса Поставщик1, то необходимо навести мышкой на запрос Поставщик1, нажать правой кнопкой мыши и выбрать "Ссылка". У вас откроется новый запрос, где источник данных будет запрос "Поставщик1". Можно сразу открыть Расширенный редактор и вставить шаг Table.Buffer. Далее переходите в стандартное окно и между шагами Источник и Buffer вставляете нужные операции - код сам будет модифицироваться. Если система будет спрашивать "Вы действительно хотите вставить шаг?" отвечайте "Вставить".

Код получится такой:
Код
let
    Источник = Поставщик1,
    Buffer = Table.Buffer(Источник)
in
    Buffer

P.S. Это никак не претендует на правду, но в рамках пользовательского опыта показало, что данное правило просто необходимо, а не просто рекомендуемо.
 
Цитата
Денис написал:
то необходимо в этих запросах последним шагом делать Table.Buffer.
берегите оперативку. Буфер выделяется в рамках одного mashup-процесса, и на один процесс объем памяти, если не ошибаюсь, в пределах 256 Мб. На больших таблицах, если памяти одного процесса не хватит,  данные начнут сбрасываться в дисковый кэш, что приведет к снижению производительности вместо улучшения.
F1 творит чудеса
Страницы: 1 2 След.
Наверх