Power query загрузка завершилась ошибкой

Hi
  • Remove From My Forums
  • Question

  • Hi

    I am using PQ in quite a few models but am experiencing the above error and lack of data in two specifically which are fired by task scheduler and VBA code runs under a Workbook_Open() event. ‘Background Refresh’, ‘Refresh on opening workbook’ and ‘refresh
    connection on refresh all’ are all switched OFF and my code iterates the connections refreshing each one explicitly. The two scenarios are:

    1. (Fired once a day) A two query model fetching data from a SQL server and comparing that to file names in a folder structure (Making sure the SQL Server and folder files are in sync). It works fine when right clicking the queries in PQ and refreshing but
      when opened though automation are left ‘hanging’ with the ‘Download did not complete’ error alongside each one. These load directly to the worksheet
    2. (Fired every 15 minutes), connects to an html document on the server (a licence file created by the ERP system), parses it and loads to the worksheet. Same thing, the workbook_open() event fires but the query never seems to complete. If I open manually
      and right-click, refreshes fine and quickly

    Any advice as to how I may get these working would be greatly appreaciated

Answers

  • I see. One other thing to try is to use the Application.OnTime function to schedule calling Workbook.Save() and Application.Quit() some time after the AfterCalculate event, rather than immediately; this should give both the table and the task pane enough
    time to update themselves.

    • Proposed as answer by

      Monday, March 16, 2015 7:34 AM

    • Marked as answer by
      Ed Price — MSFTMicrosoft employee
      Monday, March 16, 2015 7:34 AM

  • Could You Please, Upload Your Code For More understanding.

    Thanks

    • Proposed as answer by
      Neelesh P
      Wednesday, January 28, 2015 3:06 PM
    • Marked as answer by
      Ed Price — MSFTMicrosoft employee
      Monday, March 16, 2015 7:33 AM

  • Remove From My Forums
  • Question

  • Hi

    I am using PQ in quite a few models but am experiencing the above error and lack of data in two specifically which are fired by task scheduler and VBA code runs under a Workbook_Open() event. ‘Background Refresh’, ‘Refresh on opening workbook’ and ‘refresh
    connection on refresh all’ are all switched OFF and my code iterates the connections refreshing each one explicitly. The two scenarios are:

    1. (Fired once a day) A two query model fetching data from a SQL server and comparing that to file names in a folder structure (Making sure the SQL Server and folder files are in sync). It works fine when right clicking the queries in PQ and refreshing but
      when opened though automation are left ‘hanging’ with the ‘Download did not complete’ error alongside each one. These load directly to the worksheet
    2. (Fired every 15 minutes), connects to an html document on the server (a licence file created by the ERP system), parses it and loads to the worksheet. Same thing, the workbook_open() event fires but the query never seems to complete. If I open manually
      and right-click, refreshes fine and quickly

    Any advice as to how I may get these working would be greatly appreaciated

Answers

  • I see. One other thing to try is to use the Application.OnTime function to schedule calling Workbook.Save() and Application.Quit() some time after the AfterCalculate event, rather than immediately; this should give both the table and the task pane enough
    time to update themselves.

    • Proposed as answer by

      Monday, March 16, 2015 7:34 AM

    • Marked as answer by
      Ed Price — MSFTMicrosoft employee
      Monday, March 16, 2015 7:34 AM

  • Could You Please, Upload Your Code For More understanding.

    Thanks

    • Proposed as answer by
      Neelesh P
      Wednesday, January 28, 2015 3:06 PM
    • Marked as answer by
      Ed Price — MSFTMicrosoft employee
      Monday, March 16, 2015 7:33 AM

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

Общие сведения об извлечении, преобразовании, загрузке (ETL) о том, где могут возникать ошибки

При обновлении данных могут возникать ошибки двух типов.

Местных   Если в книге Excel возникает ошибка, по крайней мере, ваши усилия по устранению неполадок ограничены и ими можно управлять. Возможно, обновленные данные вызывали ошибку с функцией или создавали недопустимые условия в списке. Эти ошибки надоедливы, но их довольно просто отслеживать, определять и исправлять. Excel улучшена обработка ошибок с помощью более понятных сообщений и контекстных ссылок на целевые разделы справки, которые помогут вам разобраться и устранить проблему.

Удаленного   Однако ошибки, которые приходят из удаленного внешнего источника данных, являются другими. Произошла что-то в системе, которая может быть на улице, на полпути по всему миру или в облаке. Для таких типов ошибок требуется другой подход. Распространенные удаленные ошибки:

  • Не удалось подключиться к службе или ресурсу. Проверьте подключение.

  • Не удалось найти файл, к который вы пытаетесь получить доступ.

  • Сервер не отвечает и, возможно, находится в состоянии обслуживания. 

  • Это содержимое не доступно. Возможно, он был удален или временно недоступен.

  • Подождите… данные загружаются.

Вот несколько советов, которые помогут вам справиться с ошибками, которые могут возникнуть.

Поиск и сохранение конкретной ошибки    Сначала проверьте области Запросы & connections (Выберите Data > Queries & Connections, выберите подключение, а затем отобразите вылет). Узнайте, какие ошибки произошли при доступе к данным, и обратите внимание на дополнительные сведения. Затем откройте запрос, чтобы увидеть все конкретные ошибки в каждом шаге запроса. Все ошибки отображаются на желтом фоне для удобной идентификации. Запишите сообщение об ошибке или запишите ее на экране, даже если вы не полностью понимаете ее. Коллега, администратор или служба поддержки в вашей организации могут помочь вам понять, что произошло, и предложить решение. Дополнительные сведения см. в теме Работа с ошибками в Power Query.

Получить сведения о справке    На сайте Office справки и обучения. Она не только содержит большой объем справки, но и сведения об устранении неполадок. Дополнительные сведения см. в устранении и обходных решениях недавних проблем в Excel для Windows.

Использование технического сообщества    Используйте веб-Community Майкрософт для поиска обсуждений, относящихся к вашей проблеме. Весьма вероятно, что вы не первый, кто испытывает проблему, другие люди занимаются ее решением и даже могут найти решение. Дополнительные сведения см. в Microsoft Excel Community и Office Answers Community.

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

Обратитесь в Office поддержки      На этом этапе, скорее всего, вы понимаете проблему гораздо лучше. Это поможет вам сосредоточиться на беседе и сократить время, затраченное на поддержку Майкрософт. Дополнительные сведения см. в Microsoft 365 и Office службе поддержки клиентов.

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

Проблемы со службами и серверами    Скорее всего, причина — периодические ошибки сети и связи. Лучше всего подождите и попробуйте еще раз. Иногда проблема просто утихает.

Изменения расположения или доступности    База данных или файл были перемещены, повреждены, переведены в автономный режим на обслуживание или аварийно сбой базы данных. Дисковые устройства могут быть повреждены, а файлы будут потеряны. Дополнительные сведения см. в этой Windows 10.

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

Открытые или заблокированные файлы   Если открыт текст, CSV или книга, изменения, внесенные в файл, не включаются в обновление до тех пор, пока файл не будет сохранен. Кроме того, если файл открыт, он может быть заблокирован и к нему нельзя получить доступ, пока он не будет закрыт. Это может произойти, если другой человек использует версию Excel. Попросите их закрыть файл или проверить его. Дополнительные сведения см. в статьи Разблокировкафайла, заблокированного для редактирования.

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

Блокирование ошибок при сложении запросов    Power Query пытается повысить производительность, когда это возможно. Для более производительности и емкости часто бывает лучше выполнить запрос к базе данных на сервере. Этот процесс называется сгибом запроса. Тем не менее Power Query блокирует запрос, если существует вероятность компрометации данных. Например, слияние определено между таблицей книги и SQL Server таблицей. Для конфиденциальности данных книги за установлено SQL Server конфиденциальность данных организации. Поскольку политика конфиденциальности является более строгой, чем в организации, Power Query блокирует обмен информацией между источниками данных. Сгиб запроса происходит за кадром, поэтому вас может удивить, когда возникает ошибка блокировки. Дополнительные сведения см. взадачах Основные сведения о сгибе запросов, Сгибзапросов и Сгиб с помощью диагностики запросов.

Часто с помощью Power Query вы можете точно определить, в чем заключается проблема, и устранить ее самостоятельно.

Переименованные таблицы и столбцы    Изменения исходных имен таблиц и столбцов или столбцов почти наверняка приводят к проблемам при обновлении данных. Запросы используют имена таблиц и столбцов для формировать данные практически на каждом этапе. Не изменяйте или удаляйте исходные имена таблиц и столбцов, если только их не нужно использовать в источнике данных. 

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

Ошибки уровня ячейки   Такие типы ошибок не предотвращают загрузку запроса, но отображают в ячейке сообщение Ошибка. Чтобы увидеть сообщение, выберите whitespace в ячейке таблицы, содержащей ошибку. Вы можете удалить, заменить или просто сохранить ошибки. Примеры ошибок в ячейках: 

  • Преобразования    Вы попытались преобразовать ячейку, содержащую 0, в целое число.

  • Математические    Вы пытаетесь умножить текстовое значение на числовое значение.

  • Объединения    Вы попытались объединить строки, но одна из них числовая.

Безопасно экспериментируйте и итерации    Если вы не уверены, что преобразование может иметь отрицательное влияние, скопируйте запрос, проверьте изменения и итерации с помощью вариантов команды Power Query. Если команда не работает, просто удалите созданное вами шаг и попробуйте еще раз. Чтобы быстро создать образец данных с одной схемой и структурой, создайте Excel таблицу из нескольких столбцов и строк и импортировать их (выберите данные > Из таблицы илидиапазона). Дополнительные сведения см. в таблицах Создание таблицы и Импорт из Excel таблицы.

Когда вы впервые будете понять, что можно делать с данными в редакторе Power Query, вам может показаться, что вы ребенок в конфетном магазине. Но не хочется есть все конфеты. Вы хотите избежать преобразования, которое может непреднамеренно вызывать ошибки обновления. Некоторые операции, например перемещение столбцов в другое место таблицы, не должны приводить к ошибкам в обновлении, так как Power Query отслеживает столбцы по их именам.

Другие операции могут привести к ошибкам обновления. Одним из общих правил может быть ваш световой свет. Не внося существенных изменений в исходные столбцы. Чтобы безопасно воспроизвести столбец, скопируйте исходный столбец с командой(Добавитьстолбец, Настраиваемый столбец, Дублировать столбец и так далее), а затем внести изменения в скопированную версию исходного столбца. Вот операции, которые иногда могут привести к ошибкам обновления, и некоторые из лучших методик, которые помогут ухладить работу.

Операции

Руководство

Фильтрации

Повышение эффективности за счет максимально ранней фильтрации данных в запросе и удаления ненужных данных для уменьшения лишней обработки. Кроме того, с помощью автофильтра можно искать или выбирать определенные значения, а также использовать фильтры для определенных типов, доступные в столбцах даты, даты и времени и времени (например, Месяц,Неделя,День).

Типы данных и заглавные колонок столбцов

Power Query автоматически добавляет в запрос два шага сразу после первого шага: «Продвиганые заглавные колонок», которая преобразует первую строку таблицы в заглавный, и Changed Type(Измененный тип), который преобразует значения из типа Данных Any в тип данных на основе проверки значений из каждого столбца. Это удобно, но иногда может потребоваться явно контролировать это поведение, чтобы предотвратить ошибки случайного обновления.

Дополнительные сведения см. в статьях Добавление и изменение типов данных и Повысить или понизить их в строках и столбцах.

Переименование столбца

Избегайте переименования исходных столбцов. Используйте команду Переименовать для столбцов, добавленных другими командами или действиями.

Дополнительные сведения см. в статье Переименование столбца.

Разделить столбец

Разделение копий исходного столбца, а не исходного столбца.

Дополнительные сведения см. в статье Разделение текстового столбца.

Объединение столбцов

Объединять копии исходных столбцов, а не исходных.

Дополнительные сведения см. в статье Объединение столбцов.

Удаление столбца

Если нужно сохранить небольшое количество столбцов, используйте выбор столбца, чтобы сохранить нужные.  

Рассмотрим разницу между удалением столбцов и удалением других столбцов. Когда вы удаляете другие столбцы и обновляете данные, новые столбцы, добавленные в источник данных после последнего обновления, могут остаться незащищенными, так как они будут считаться другими столбцы при повторном выполнении в запросе шага Удалить столбец. Такая ситуация не возникает при явном удалите столбец.

Наконечник      Скрыть столбец (как в Excel) не Excel. Однако если у вас много столбцов и вы хотите скрыть многие из них, чтобы сосредоточиться на своей работе, вы можете сделать следующее: удалить столбцы, запомнить созданный шаг, а затем удалить его перед загрузкой запроса обратно на таблицу.

Дополнительные сведения см. в статье Удаление столбцов.

Замена значения

При замене значения источник данных не редактируется. Вместо этого нужно изменить значения в запросе. При следующем обновлении данных ищемые значения могут немного измениться или перестать быть там, поэтому команда Заменить может не работать так, как планировалось изначально.

Дополнительные сведения см. в области Замена значений.

Pivot и Unpivot

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

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

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

Дополнительные сведения см. в статьях Сводные столбцы и Ото всех столбцов.

Предотвращение ошибок    Если внешним источником данных управляет другая группа в организации, им необходимо знать о вашей зависимости от них и избегать изменений в их системах, которые могут привести к проблемам ниже. Фиксировать влияние на данные, отчеты, диаграммы и другие артефакты, которые зависят от данных. Настройте линии связи, чтобы убедиться в том, что они понимают последствия, и примите необходимые меры, чтобы обеспечить бесперебойную работу. Находите способы создания элементов управления, которые минимизируют ненужные изменения и предугадать последствия необходимых изменений. Конечно, это легко сказать и иногда сложно сделать.

Future-proof with query parameters    Используйте параметры запроса для уменьшения изменений, например расположения данных. Вы можете создать параметр запроса, чтобы заменить новое расположение, например путь к папке, имя файла или URL-адрес. Существуют и другие способы уменьшения проблем с помощью параметров запроса. Дополнительные сведения см. в теме Создание запроса с параметрами.

См. также

Справка по Power Query для Excel

Методики работы с Power Query (docs.com)

Нужна дополнительная помощь?

В М можно вызвать и обработать ошибки во время выполнения. Если из других языков программирования вы знакомы с идеей исключения, обработка ошибок Power Query отличается по крайней мере одним существенным моментом.[1]

Предыдущая заметка     Следующая заметка

Рис. 1. Три поля записи error; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

Скачать заметку в формате Word или pdf, примеры в формате Excel

Сообщение об ошибке

В Power Query каждое выражение должно что-то возвращать. Как правило, это значение. Но выражение также может вызвать ошибку – особый способ указать, что не получилось вернуть значение. Один из способов вызвать ошибку – создать запись с ключевым словом error. Такая запись имеет три поля: причина, сообщение и подробности. Поля с любыми другими именами будут проигнорированы.

Листинг 1[2]

= error [

Reason = «Business Rule Violated»,

Message = «Item codes must start with a letter»,

Detail = «Non-conforming Item Code: 456»

]

Все три поля являются необязательными. Если поле Reason отсутствует, причина ошибки будет иметь значение по умолчанию – Expression.Error. Запись ошибки можно также создать с помощью функции Error.Record. В отличие от описанного выше подхода, в Error.Record атрибут Reason является обязательным.

Листинг 2

= error Error.Record(

«Business Rule Violated»,

«Item codes must start with a letter»,

«Non-conforming Item Code: 456»

)

Оба приведенных выше примера приводят к эквивалентной ошибке, изображенной на рис. 1 Глядя на рисунок, видно, как три поля/параметра соотносятся с отображаемым сообщением.

Вместо записи error также может принимать строку. Результирующее сообщение об ошибке будет иметь значение предоставленной строки, а его причина – значение Expression.Error.

Листинг 3

Рис. 2. Строка в error

Ярлык с многоточием

Существует также оператор быстрого доступа для создания ошибок, который пригодится во время разработки. Допустим, вы хотите протестировать запрос, часть кода которого еще не написана. Поскольку каждое выражение должно возвращать значение, или вызывать ошибку, вы не можете протестировать свой запрос, не поместив что-то в качестве заполнителя в нереализованные участки кода. Используйте оператор многоточия (…). При вызове … выдает ошибку Expression.Error: Значение не задано. Вот фрагмент кода, в котором не реализована ветвь else:

Листинг 4

let

a = 6,

Result = if a = 5 then true else ...

in

Result

Когда условие (а = 5) принимает значение false, вызывается «…», что приводит к ошибке. Обратите внимание, ключевое слово error не используется. Оператор многоточия как определяет, так и вызывает ошибку.

Особое поведение

Что именно происходит, когда возникает ошибка? Какое поведение возвращает ошибку, а не значение? Рассмотрим выражение:

В обычных условиях сначала выполняется функция GetValue(). Затем полученное значение передается в someFunction(), которая возвращает финальный результат. Предположим, GetValue() выдает ошибку. Дальнейшее выполнение выражения прекращается. someFunction() не вызывается. Ошибка GetValue() становится итогом выражения. Такое поведение также известно, как повышение. Ошибка передается тому шагу, с которого была вызвана someFunction().

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

Сдерживание ошибок

Если ошибка возникает в выражении, которое что-то определяет (поле записи, ячейку таблицы, переменную в выражении let, …), ошибка содержится в этом чём-то. Последствия ошибки ограничены этим чем-то и логикой, которая пытается получить доступ к значению этого чего-то. Ниже последствия ошибки GetValue содержатся в той части запроса, на которую она повлияла. Ошибка не остановила выполнение запроса. Запрос завершился успешно и вернул запись. Два поля – FieldB и FieldC – вернули ошибку, потому что они являются чем-то, затронутым ошибкой.

Листинг 5

let

GetValue = () => error «Something bad happened!»,

DoSomething = (input) => input + 1,

Result = [

FieldA = 25,

FieldB = DoSomething(GetValue),

FieldC = FieldA + FieldB

]

in

Result

Рис. 3. Результат запроса

Сдерживание ошибок влечет за собой еще одну особенность. Ошибка сохраняется в чём-то, что ее содержит. Пока выполняется запрос, любая попытка получить доступ к значению этого чего-то приводит к повторному возникновению сохраненной ошибки. Когда происходит попытка доступа, логика, которая первоначально вызвала ошибку, не подвергается повторной оценке. Эта логика при повторном обращении могла бы вернуть допустимое значение. Но логика пропускается, и ранее сохраненная ошибка просто вызывается повторно.

Ниже функция GetDataFromWebService() вычисляется один раз, даже если к самим данным обращаются дважды. Если первое обращение вернуло ошибку, второе обращение тоже вернет  ошибку, сохраненную ранее.

let

Data = GetDataFromWebService() // повышенная ошибка

in

{ List.Sum(Data[Amount]), List.Max(Data[TransactionDate]) }

Ошибки верхнего уровня

Если ошибку не удалось сдержать, она передается из выражения в верхний уровень, как результат всего запроса. Далее в среду хоста и выполнение запроса останавливается. В следующем выражении ничто не содержит ошибку, поэтому её нельзя сдержать, и запрос завершается ошибкой:

Листинг 6

let

GetValue= () => error «Something bad happened!»,

SomeFunction = (input) => input + 1

in

SomeFunction(GetValue())

Сдерживание против исключения

Поведение Power Query по сдерживанию ошибок отличает его от большинства языков программирования, основанных на исключениях. В мире исключений ошибка автоматически распространяется вплоть до среды хоста, что приводит к завершению работы программы (если только в коде не будет предусмотрена обработка ошибок). В M ошибка локализуется, пока есть что-то, что ее содержит. Это позволяет успешно завершить запрос, даже если не удалось вычислить отдельные элементы.

Сдерживание ошибок – отличное поведение, учитывая цель использования M: обработка данных. Предположим, что выражение, определяющее значение столбца таблицы, содержит ошибку для одной ячейки из всей таблицы. В мире, основанном на исключениях, эта ошибка может привести к завершению всей обработки. В мире M ошибка просто влияет на эту единственную ячейку и любой код, который обращается к этой ячейке. Обработка продолжается, и будет получен результат.

На самом деле, из-за лени M, если к ячейке с ошибкой не будет обращений, то ошибка и не возникнет.

Листинг 7

let

Data = #table({«Col1»}, {{«SomeValue»}, { error «bad» }})

in

Table.RowCount(Data) // возвращает 2

Хотя одна ячейка и содержит ошибку, запрошенные данные (количество строк), не требуют вычисления значения ошибочной ячейки, поэтому выражение вернет значение 2.

Хотя сдерживание ошибок – отличное поведение по умолчанию, что, если оно не соответствует вашим потребностям? В частности, что делать с таблицами, если важно различать строки с ошибками и строки без ошибок? Возможно, вы не обращаетесь к содержимому строки напрямую, поэтому не делаете ничего, что могло бы вызвать распространение ошибок, но все же хотите знать, в каких строках есть ошибка, а в каких нет. Функции Table.SelectRowsWithErrors и Table.RemoveRowsWithErrors, то, что вам нужно.

Листинг 8

let

Data = #table({«Col1»}, {{«SomeValue»}, { error «bad» }})

in

[

RowsWithErrors = Table.RowCount(Table.SelectRowsWithErrors(Data)),

RowsWithoutErrors = Table.RowCount(Table.RemoveRowsWithErrors(Data))

]

Рис. 4. Список, содержащий количество строк с ошибками и без

Обработка ошибок

Понимая, какие операции способны вызывать ошибку, вы можете использовать ключевое слово try, чтобы проверить, не возвращает ли выражение ошибку. try используется в двух вариантах…

try ExpressionToTry otherwise FallbackExpression

… первый, try with otherwise, пытается выполнить ExpressionToTry. Если это выражение возвращает значение, всё Ok, переходим к следующему шагу запроса. Когда выражение выдает ошибку, вычисляется выражение otherwise и возвращается его значение.

try Number.FromText(input) otherwise 0

Если Number.FromText возвращает значение, оно и будет результатом выражения. Когда Number.FromText выдает ошибку, try обращается к части otherwise, и возвращает 0. Другими словами, если входные данные могут быть преобразованы в число, возвращается это число; в противном случае возвращается значение по умолчанию – 0.

Имейте в виду, что ошибки будут обработаны только в выражении, расположенном непосредственно справа от try. Если ошибку возвращает выражение otherwise, эта ошибка не будет обработана предшествующим try. Но… поскольку otherwise само по себе является выражением, try можно поместить внутрь него, чтобы обработать ошибку, вызванную otherwise.

try GetFromPrimary()

otherwise try GetFromSecondary()

otherwise «Возникли проблемы с обоими серверами. Возьми отгул на остаток дня :)»

Проблема с конструкцией try with otherwise в том, что она неразборчива: любая ошибка возвращает альтернативное значение. Иногда последующие действия зависят от типа ошибки. Для этих ситуаций подойдет второй вариант – простое выражение try.

Эта форма всегда возвращает запись. Если выражение завершилось успешно, эта запись имеет вид:

[

HasError = false,

Value = (значение выражения ExpressionToTry)

]

Если выражение вызвало ошибку, возвращаемая запись выглядит следующим образом:

[

HasError = true,

Error = (запись, описывающая возникшую ошибку)

]

Например:

Листинг 9

let

DoSomething = () => 45,

Result = try DoSomething()

in

Result // [HasError = false, Value = 45]

Рис. 5. Запись, возвращаемая try, если нет ошибки

Листинг 10

let

DoSomething = () => error «bad»,

Result = try DoSomething()

in

Result // [HasError = true, Error = [Reason = «Expression.Error», Message = «bad», Details = null]

Рис. 6. Запись, возвращаемая try, если есть ошибка

Запись, помещенная в поле Error, содержит ровно три поля: Reason, Message и Details.[3] Это верно, даже если в записи, первоначально использовавшейся для определения ошибки, отсутствовало одно или несколько из этих полей (помните, они необязательны при определении ошибки), или если она включала дополнительные поля.

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

let

Primary = try GetDataFromPrimary(),

Source =

if Primary[HasError] = false then Primary[Value]

    /* если Primary возвращает значение, используй его */

else if Primary[Error][Reason] = «External Source Error»

and Primary[Error][Message] = «Server is unreachable»

    then GetDataFromSecondary()

    /* если ошибка Primary вызвана тем, что его источник недоступен,

            запроси данные с сервера Secondary */

else error Primary[Error]

    /* если Primary вернул иную ошибку, верни её

            в качестве результата запроса */

in

Source

Используя try with otherwise, мы бы запросили Secondary, если Primary выдаст любую ошибку, а не только когда основной сервер недоступен:

try GetDataFromPrimary()

otherwise GetDataFromSecondary()

Масштаб (область действия)

Обработка ошибок должна происходить на уровне, на котором они возникают. Нельзя обработать ошибки, содержащиеся на другом уровне.

let

Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}})

in

try Data otherwise 0

try – бесполезный оператор в этом запросе. Возможно, разработчик надеялся с помощью try заменить ошибки нулями. Но в этом случае Data возвращает допустимую таблицу. Правда, в ней самой есть ячейки с ошибками, но эти ошибки содержатся на уровне ячеек. Поскольку они не влияют на выражение данных на уровне таблицы, try не дает эффекта.

try будет полезен в следующем случае, но его эффект может быть не таким, как предполагал разработчик.

Листинг 11

let

Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}})

in

try List.Sum(Data[Amount]) otherwise 0

List.Sum суммирует значения в столбце [Amount] таблицы Data. Если выражение, определяющее значение элемента, вызывает ошибку, она повышается. List.Sum прекращает суммирование и возвращает ошибку. try обрабатывает эту ошибку, возвращая 0 вместо суммы элементов списка. Скорее всего, цель у разработчика была иная. Он хотел заменить элементы с ошибками на 0, и суммировать числовые значения. Необходимо применить try так, чтобы обработка ошибок велась на уровне ячеек таблицы. Кажется, что можно сделать так:

Table.TransformColumns(Data, (input) => try input otherwise 0)

Однако, эта логика не улавливает ошибки, вызванные выражениями значений ячеек. Дело в том, что аргументы вычисляются до того, как их значения будут переданы в функцию. Если оценка приводит к ошибке, функция не вызывается. Вместо этого ошибка передается шагу, который вызвал функцию. В нашем случае, если выражение значения столбца выдает ошибку, функция преобразования (input) => … не вызывается, поэтому try не может обработать ошибку. Вместо этого ошибка передается обратно в Table.TransformColumns.

Проблема заключается в том, что выражение значения ячейки должно быть вычислено внутри try. Чтобы добиться этого, надо вернуться на уровень строки, и использовать функцию, которая получает строку. Затем внутри функции использовать ссылку на значение столбца строки и вот его подставить в try. Лишь тогда try сможет обработать ошибку. Чтобы реализовать это, нужно создать новый столбец, значения которого формировать путем проверки try. Затем можно удалить исходный столбец, а новому столбцу дать старое имя.

Листинг 12

let

Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}),

ErrorsReplacedWithZero = Table.AddColumn(

Data,

«NewAmount»,

(row) => try row[Amount] otherwise 0

),

RemoveOldAmount = Table.RemoveColumns(ErrorsReplacedWithZero, {«Amount»}),

RenameNewAmount = Table.RenameColumns(RemoveOldAmount, {«NewAmount», «Amount»})

in

List.Sum(RenameNewAmount[Amount]) // возвращает 10

Это довольно сложно. Но пример хорошо иллюстрирует общий подход к использованию try на уровне ячеек. Если же, как в нашем пример, вы просто хотите заменить любую ошибку значением по умолчанию, используйте Table.ReplaceErrorValues.

Листинг 13

let

Data = #table({«Amount»}, {{10}, {error «help!»}, {error «save me!»}}),

ErrorsReplacedWithZero = Table.ReplaceErrorValues(

Data,

{{«Amount», 0}}

) // заменяет ошибки в столбце Amount нулями

in

List.Sum(ErrorsReplacedWithZero[Amount]) // возвращает 10

Применить try к элементам списка сложнее. Для списков нет функции List.ReplaceErrorValues. Самым простым решением может быть преобразование списка в таблицу, обработка ошибки, а затем обратное преобразование таблицы в список.

Листинг 14

let

Data = {10, error «help!», error «save me!»},

#»Преобразовано в таблицу» = Table.FromValue(Data),

#»Замененные ошибки» = Table.ReplaceErrorValues(#»Преобразовано в таблицу», {{«Value», 0}}),

Value = #»Замененные ошибки»[Value],

#»Вычисленная сумма» = List.Sum(Value)

in

#»Вычисленная сумма»

Рис. 7. Сумма элементов списка, содержащего ошибки

Нарушения правил

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

let

Data = GetData(), // for testing use: #table({«ItemCode»}, {{«1»}, {«A2»}})

Validated = Table.TransformColumns(

Data,

{

«ItemCode»,

each if Text.StartsWith(_, «A») then _ else error Error.Record(

      «Invalid Data»,

«ItemCode does not start with expected letter»,

_

)

}

)

in

Validated

Такую проверку полезно применить в базовом запросе, на который будут ссылаться несколько других запросов. Это позволит вам выполнить проверку один раз (вспомните принцип Не повторяйся, Don’t repeat yourself), гарантируя, что пользователи, пытающиеся использовать ошибочные данные, будут предупреждены о наличии аномалий.

Другой вариант – добавить столбец со значениями true и false, в зависимости от того, соблюдается ли правило:

let

Data = GetData(), // for testing use: #table({«ItemCode»}, {{«1»}, {«A2»}})

Validated = Table.AddColumn(

Data,

«ValidItemCode»,

each Text.StartsWith(_[ItemCode], «A»),

type logical

)

in

Validated

В этом примере логика заботится о том, является ли ItemCode допустимым. Если разработчик забудет выполнить проверку, неверные данные могут рассматриваться как действительные. В отличие от этого, подход замены несоответствующих данных ошибками гарантирует, что попытка получить доступ к недопустимому значению, закончится ошибкой. Пользователь будет вынужден поправить данные в источнике. Какой вариант выбрать, зависит от вашего контекста.

В следующей заметке

Я планирую рассказать о том, что остается за кулисами: организации разделов кода и о том, как M предоставляет возможность аннотировать значения дополнительной информацией (метаданными). Однако перед этим обсудим, как работает система типов в Power Query.

[1] Заметка написана на основе статьи Ben Gribaudo. Power Query M Primer (Part 15): Error Handling. Если вы впервые сталкиваетесь с Power Query, рекомендую начать с Марк Мур. Power Query.

[2] Номер листинга соответствует номеру запроса в приложенном Excel файле.

[3] Судя по рис. 6 современная реализация M создает пять полей.

Оглавление:

  • Как исправить ошибку Power BI при загрузке предыдущей таблицы
  • 1. Удалить и воссоздать запрос
  • 3. Отменить изменения

Видео: HUGE EGGS Surprise Toys Challenge with Inflatable water slide 2023

Видео: HUGE EGGS Surprise Toys Challenge with Inflatable water slide 2023

Если у вас есть отчет Power BI, подключенный к данным в файле Excel в службе Power BI или клиенте Desktop, вы можете обновить данные, используя кнопку обновления, чтобы обновить таблицу. Однако некоторые пользователи сообщают об ошибке Power bi при загрузке предыдущей таблицы на своей панели мониторинга Power BI.

Выполните перечисленные шаги, чтобы исправить загрузку, отмененную из-за ошибки при загрузке предыдущей таблицы Power BI.

1. Удалить и воссоздать запрос

  1. Начните с сохранения затронутого кода запроса М.
  2. Затем удалите затронутый запрос из панели инструментов.
  3. Теперь заново создайте запрос, используя ранее сохраненный M-код.
  4. Попробуйте обновить базу данных еще раз и проверьте, не возникает ли снова ошибка при загрузке предыдущей таблицы.

Если проблема не устранена, проверьте, не содержит ли какой-либо из запросов неправильную формулу DAX.

  1. Если вы обнаружите неправильную формулу DAX в любом из запросов, удалите формулу.
  2. Загрузите запрос еще раз и проверьте наличие улучшений.
  3. Ошибка может возникнуть из-за неправильного синтаксиса, который иначе пропустит ваше внимание.

3. Отменить изменения

  1. Если вы получили сообщение об ошибке после изменения листа Excel, связанного с вашей службой Power BI, вы можете исправить ее, отменив изменения.
  2. Просто отмените изменения, внесенные в файл Excel.
  3. Убедитесь, что вы отменили изменения, внесенные в лист Excel для каждого запроса, и обновили таблицы вручную, чтобы устранить ошибку.
  4. Если проблема не устранена, попробуйте использовать Direct Query вместо Import Query, когда получите данные.
  5. Другая причина, по которой может возникнуть ошибка, заключается в том, что вы изменили имя для любой из таблиц в Excel, а не в PBix. Чтобы это исправить, откройте расширенный редактор и переименуйте таблицы в соответствии с именами в файле Excel.

Google Chrome теперь загружает веб-страницы быстрее

Google Chrome теперь загружает веб-страницы быстрее

Как и любое другое программное обеспечение, веб-браузер Google Chrome постоянно обновляется в течение года. Последняя версия веб-браузера — Chrome 56, которая улучшает время перезагрузки страницы. Помощь Facebook По всей видимости, Facebook стоит за обновлением, поскольку гигант социальных сетей дал понять Google, что время перезагрузки Chrome было ниже, чем у браузеров. Google приступил к …

Почему Windows Group загружает файлы по дате?

Почему Windows Group загружает файлы по дате?

Если файлы в папке «Загрузки» сгруппированы по дате в Windows 10, используйте параметр «Сохранить как» или отключите группировку файлов для всех папок.

Что делать, если ваш компьютер ничего не загружает

Что делать, если ваш компьютер ничего не загружает

У вас проблемы, потому что ваш компьютер ничего не загружает? Не беспокойся. Миллиарды загрузок происходят почти до минуты в глобальном масштабе. Когда вы дошли до того, что ваш компьютер ничего не загрузит, даже после того, как вы попробовали все, что знаете, разочарование перешло, и вы захотели заменить его…

Почему power bi не загружает предыдущую таблицу?

Понравилась статья? Поделить с друзьями:
  • Power query xlsb error
  • Power query expression error столбец таблицы не найден
  • Postgresql create table error
  • Postgresql 42p01 ошибка отношение не существует
  • Postgresql 42703 error column does not exist position 26