Коллеги, добрый день. Не нашёл внятный ответ на свой вопрос в сети, потому спрашиваю (ну, или лохо искал). Есть такой код:
Код
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 не помог.
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, я проверял на локальной таблице, намеренно создав ошибку при ее загрузке - если не могла загрузиться - выдавало 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 выдает список значений, когда срабатывает правильно.