Страницы: 1
RSS
Сводная таблица, внешнее подключение - как организовать обновление?
 
Ковыряюсь с подключением сводной таблицы к внешнему источнику, удалось настроить такое подключение с созданием PT с нуля. Работает все замечательно. Но вот с обновлением подключения в уже имеющейся таблице (чтобы заново не отстраивать ее структуру) пришлось помучиться. Сначала пытался обновить подключение у PT, которая ссылается на лист той же рабочей книги, ничего не вышло. Пытался менять PivotCaches, прописывая строку подключения и sql-запрос, но все мимо.
В итоге, получилось сделать только так:
- на листе имеется таблица с внешним подключением и готовой структурой
- создаю новое подключение
- обновляю подключение в таблице, указав новое:
Код
ActiveWorkbook.Connections.Add "AccDatabase", "", _
   "ODBC;DSN=MS Access Database;DBQ=" & _
   dbFullName & ";DefaultDir=" & dbPath & ";" &_
   "DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;", _
       "SELECT * FROM `" & dbFullName & "`." & dbTableName, 2

PT.ChangeConnection ActiveWorkbook.Connections("AccDatabase")
В итоге, возникли вопросы:
- можно ли как-то проще обновлять кэш из внешнего источника (например, добавлять соединение сразу при обновлении кэша через какой-нибудь SourceData)?
- и можно ли все-таки переделать PT с внутренним кэшем на внешний.
Заранее благодарен!

И ещё выявилась проблема, что при обновлении описанным мной способом, часто слетает подключение. А при построении новой таблицы всегда все в порядке.
Изменено: Ungrateful - 23.09.2019 18:49:45
 
Наконец-то удалось решить проблему самому, не прошло и суток. Оставлю информацию здесь, вдруг кому-то понадобится.
Код
dbFileName = "Db.accdb"
dbTableName = "Выгрузка"
dbPath = ActiveWorkbook.Path
dbFullName = dbPath & "\" & dbFileName
ConnectionName = "Подключение"

With ActiveWorkbook.Connections(ConnectionName)
   With .ODBCConnection
            .CommandText = "SELECT * FROM `" & dbFullName & "`." & dbTableName
            .CommandType = xlCmdSql
            .Connection = "ODBC;DSN=MS Access Database;DBQ=" & dbFullName & ";DefaultDir=" & dbPath & ";" & _
            "DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
        End With
        .Refresh
End With
А с созданием нового подключения и последующей заменой им старого в PT (мой предыдущий метод) есть проблема: поскольку подключения создаются новые, нужно старые удалять, но:
- если удалять после создания, тогда система, видя что подключение с таким именем уже существует, добавляет в конце цифру, а программа заточена на удаление всех подключений, отличных от заданного имени... соответственно, имя с цифрой удаляется, что не приводит ни к чему хорошему;
- если удалять до создания, тогда "летит" вся сводная таблица, которая теряет подключение и становится фотографией на листе, пока не будет создано подключение с тем именем, которое использовалось PT.
В общем, вариант с обновлением по всем параметрам лучше.
Страницы: 1
Наверх