2013-03-21 2 views
0

Мой вопрос менее определенно ищет идеи для решения и многое другое для проверки правильности моего собственного решения, так как прошло какое-то время (по крайней мере, две основные версии), поскольку я работал с ADODB в Excel VBA.Сводная таблица с динамическим запросом к внешнему источнику данных

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

Я создал кнопку «Обновить», которая отображает форму, в которой есть все фильтры, которые обычно нужны пользователю. Пользователь вводит значения фильтра, я анализирую и проверяю их, формируя правильную инструкцию SQL из значений. Тогда я столкнулся с проблемой, когда я это делаю:

'this has to be dynamic becuase I'm distributing to multiple users, using different testing/production databases on different workstations. 
mypivottable.PivotCache.Connection = "ODBC;" & driver & myserver & myuser & trusted & app & workstationid & databse 

'this also has to be dynamic becuase of the sql filters 
mypivottable.PivotCache.CommandText = sql 

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

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

Есть ли лучший способ сделать это? Существует ли программный способ очистки только неиспользуемых соединений?

ответ

1

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

Sub test() 
' add logic... 

    ' then change sql code 
    With ThisWorkbook.Connections("your connection name").OLEDBConnection 
      .CommandText = Array("select * from mytable where id = 1") ' adjust accordingly 
      .Refresh 
    End With 
End Sub 

Все, что вам действительно нужно сделать, это захватить текущее соединение затем обновить свойство CommandText. Кстати, я не уверен, почему мне нужно было использовать Array(), но у меня были проблемы без него.

На самом деле я написал сообщение в блоге об использовании SQL для создания сводной таблицы (link here). Может быть, я должен сделать еще один о создании динамического контента :)

Смежные вопросы