Страницы: 1
RSS
Обработка ошибки Power Query
 
Коллеги, добрый день.
Не нашёл внятный ответ на свой вопрос в сети, потому спрашиваю (ну, или лохо искал).
Есть такой код:
Код
let
    Источник = try PostgreSQL.Database(Сервер_Предыдущая_таблица{0}, База_Предыдущая_таблица{0}) otherwise null
in
    Источник

Этот код должен соединиться с сервером и выдать его содержание.
Однако, иногда, соединение может не поизойти.
Тогда выдаётся информационное сообщение типа:
DataSource.Error: PostgreSQL: 3D000: база данных "super" не существует
Сведения:
   DataSourceKind=PostgreSQL
   DataSourcePath=192.168.1.7;super
   Message=3D000: база данных "super" не существует
   ErrorCode=-2147467259

А как можно выполнить обработку этого, чтобы выдавалась таблица с единственным столбцом и единственной записью null.
Простой try ... otherwise не помог.
Изменено: KG - 27.04.2024 09:41:19
 
не знаю, правильно ли отработает, если ошибка не возникает, т.к. проверить не на чем, но null выдает:

let
   fn1 = (a)=> a,

a= PostgreSQL.Database(Сервер_Предыдущая_таблица{0}, База_Предыдущая_таблица{0}),
 
 q = try fn1(a) otherwise  
#table(    {"column"},
     { {null}}    )
in
  q
Изменено: voler83 - 27.04.2024 10:21:51
 
voler83, походу не сработало

Вот такой код:
Код
let
    fn1 = (a)=> a,
    a = PostgreSQL.Database(Сервер_Предыдущая_таблица{0}, База_Предыдущая_таблица{0}),
    q = try fn1(a) otherwise  
        #table(
            {"column"},
            {{null}}
        )
in
    q


выдал вместо таблички ответ:
DataSource.Error: При чтении данных от поставщика произошла ошибка: 'Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера'
Сведения:
   DataSourceKind=PostgreSQL
   DataSourcePath=192.168.1.7;super
Изменено: KG - 27.04.2024 14:39:04
 
KG, я проверял на локальной таблице, намеренно создав ошибку при ее загрузке - если не могла загрузиться - выдавало null, если убирал ошибку - загружалась таблица. Если честно - я даже не знаю как это работает через функцию)) попробовал ради эксперимента находу, предполагая, что если не выполняется функция, то генерится какой-то другой универсальный тип ошибки для try/otherwise нежели тип ошибки, которую выдает сам запрос к БД и которую try не может воспринять. Попробуйте допилить.

П.С.: а это у вас единственный текст запроса в вашем запросе или кусок? М. быть что-то до выполнения этого куска в запросе происходит?
+ попробуйте без создания таблицы просто написать .... otherwise 1 - выведет единичку?
+ попробуйте в функцию дописать какую-то обработку параметра a - любую, попробуйте подобрать - например,  fn1 = (a)=> List.Contains(a, "@@@")
есть мысль, что выдаваемое сообщение для try это также не ошибка , пусть тогда функция принудительно генерит ошибку - ведь PostgreSQL.Database должна список выдавать? - значит List.Contains должна на любом списке сработать, попробуйте так или допилите по смыслу:

let    fn1 = (a)=>  List.Contains(a, "@@@"),
   a = PostgreSQL.Database(Сервер_Предыдущая_таблица{0}, База_Предыдущая_таблица{0}),
   q = try fn1(a) otherwise 1 ,
b = if q <> 1 then a else #table(
           {"column"},
           {{null}}
       )

in
   b

upd: если просто вставить этот код в запрос - все работает, выдает null, + если вместо а подставить загруженный список значений - также все работает - выдает список
// если функция списка List.Contains (находящаяся внутри пользовательской функции fn1) не может примениться к получаемому запросом к БД значению, то генерится ошибка и вся пользовательская функция выдает ошибку и тогда срабатывает try, при этом не имеет значения, какой текст List.Contains ищет в списке, главное чтобы она на вход получила список и сработала. Но это работает, если PostgreSQL.Database выдает список значений, когда срабатывает правильно.
Изменено: voler83 - 27.04.2024 15:38:27
Страницы: 1
Наверх