Страницы: 1
RSS
Power Query. Массовая загрузка данных из MS Access
 
Добрый день!

Имеется множество файлов *.mdb (Access 97-2003), из которого необходимо извлечь данные. Я создал запрос "Получить данные" => "Из других источников" => "Из OLEDB" и преобразовал его в функцию. Затем попытался применить полученную функцию к списку файлов, но столкнулся с проблемой. При каждой попытке подключения к базе данных выходит запрос имени пользователя и пароля. Явно указать пользовательские данные (User Id=admin;Password=;) в строке подключения Power Query не дает. Снимал флажок "Требовать утверждения пользователя для новых машинных запросов баз данных" в настройках безопасности и менял настройки конфиденциальности запросов, но безуспешно.
Прошу помочь в решении проблемы. Заранее благодарен!
 
Запрос то хоть с функцией покажете? Или как?
Вот горшок пустой, он предмет простой...
 
Конечно).

(dbFilePath) =>
let
   Source = OleDb.DataSource("provider=Microsoft.Jet.OLEDB.4.0;data source='" & dbFilePath & "'", [Query="SELECT * FROM [SomeTable];"])
in
   Source
 
Доброе время суток
Цитата
ArtGo написал:
множество файлов *.mdb (Access 97-2003)...
"Из OLEDB"
А чем плох Access.Database?
Код
let
    dbTables = Table.FromColumns({{"C:\Path\1.mdb", "C:\Path\2.mdb"}}, {"BaseFile"}),
    toTables = List.Transform(dbTables[BaseFile], each Access.Database(File.Contents(_), [CreateNavigationProperties=false]){[Schema="",Item="TData"]}[Data]),
    result = Table.Combine(toTables)
in
    result
 
Как в Ваш запрос "засунуть" SQL код? Дело в том, что есть готовое решение на SQL. Запрос соединяет несколько таблиц посредством конструкции INNER JOIN. Отказавшись от SQL, придется реализовывать всю функциональность в PQ.
 
Цитата
ArtGo написал:
Как в Ваш запрос "засунуть" SQL код?
А как по вашему посту понять, что вопрос идёт про SQL запрос? И если нужен SQL, то и делайте SQL запрос к нескольким базам данным. Пример - как составлять SQL запрос к внешней базе Access.
 
Цитата
Андрей VG написал:
А как по вашему посту понять, что вопрос идёт про SQL запрос?
SQL запрос мне составлять не нужно. Проблема лишь в необходимости ввода имени пользователя для каждого подключения.

PS: Ваш запрос выдает ошибку

Data Format. Error: He удается открыть базу данных, созданную в предыдущей версии приложения.

Поэтому и использую подключение через OleDb (ODBC).
Изменено: ArtGo - 05.12.2019 13:50:55
 
Сделайте запрос к одному из ваших файлов через MS Query, с выводом в таблицу. В свойствах подключения сформируется строка типа такой.

По идее в ней сохранится логин и пароль, попробуйте эту строку использовать в запросе PQ через OLEDB.
Вот горшок пустой, он предмет простой...
 
Цитата
ArtGo написал:
Data Format. Error: He удается открыть базу данных, созданную в предыдущей версии приложения.
У меня не выдаёт. Возможно, у вас совсем древняя версия mdb. Версию Access 2003 Power Query вполне себе открывает.
Цитата
ArtGo написал:
SQL запрос мне составлять не нужно.
Вы уж определитесь, что верно
Цитата
ArtGo написал:
Как в Ваш запрос "засунуть" SQL код?
Цитата
ArtGo написал:
Проблема лишь в необходимости ввода имени пользователя для каждого подключения.
OleDb.DataSource и Odbc.DataSource заточены на использование создания безопасного подключения. Хотите опасного - тогда через VBA.
 
Цитата
PooHkrd написал:
По идее в ней сохранится логин и пароль, попробуйте эту строку использовать в запросе PQ через OLEDB
Пробовал. PQ пресекает подобные попытки. PQ честно предупреждает, что нельзя использовать строки вида User ID=UserName на момент составления запроса.
Изменено: ArtGo - 05.12.2019 14:33:19
 
Андрей VG, а вот та картинка, что я нарисовал сверху. Так не сработает?
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
а вот та картинка, что я нарисовал сверху. Так не сработает?
Привет, Алексей.
Так проблема в том, что нужно сделать несколько OleDb.DataSource подключений к нескольким базам данных. Условно есть папка, где лежит несколько файлов mdb. Нужно выполнить к каждой из них SQL запрос, и результаты этих запросов объединить в одну таблицу, которую где-то будет использоваться (вывод на лист, либо источник для сводной, либо в модель данных).  Как-то так, если правильно ставить вопрос задачи в терминах Power Query.
Вот тут и проблема. Так как OleDb.DataSource это подключение к базе данных, то для него требуется логин и пароль. И каждое такое подключение Power Query с целью безопасности требует вводить ручками (есть запрет для ввода данных в строке запроса). Если для примера взять базу Access и прописать User Id. то получим сообщение
Цитата
Expression.Error: OLE DB: Строка подключения недопустима. Свойство подключения "user id" можно указать только с помощью учетных данных.
Сведения:
   Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Path\1.mdb;User Id=Admin;
Вариант, как всё-таки выполнить SQL запрос к базе Access через Access.Database
Код
let
    dbTables = Table.FromColumns({{"C:\Path\1.mdb", "C:\Path\2.mdb"}}, {"BaseFile"}),
    toTables = List.Transform(dbTables[BaseFile], each Value.NativeQuery(Access.Database(File.Contents(_)), "Select * From TData")),
    result = Table.Combine(toTables)
in
    result
 
Цитата
Андрей VG написал:
Вариант, как всё-таки выполнить SQL запрос к базе Access через Access.Database
Сконвертировал одну базу, попробовал. Все работает. Касаемо формата файлов. Вполне возможно что это формат Access 97 (?).
Видимо придется писать скрипт. Всем спасибо за содействие!
Страницы: 1
Наверх