Подключение к текущей БД

Автор Кротяка, 12 декабря 2014, 22:49

0 Пользователи и 1 гость просматривают эту тему.

Кротяка

Как с помощью макроса выполнить подключение к текущей БД? Способы типа Function GetConnection() As Variant
  Dim DataSource As Variant
  Dim Connection As Variant
  DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
  DataSource = DatabaseContext.GetByName("Имя моей БД")
  GetConnection = DataSource.GetConnection()
End Function
либо DataSource = DatabaseContext.GetByName(ThisComponent.getURL()) или просто oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DataBaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "Имя моей БД" )
не работают, вылетает следующая ошибка:

rami

Если вы вместо гвоздя ударили молотком по пальцу, это не значит что молоток "не работает".

Для начала исправьте код (в последней строке):
Function GetConnection() As Variant
  Dim DataSource As Variant
  Dim Connection As Variant
  DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
  DataSource = DatabaseContext.GetByName("Имя моей БД")
  GetConnection = DataSource.GetConnection("","")
End Function

Ошибка:
Type: com.sun.star.container.NoSuchElementException
Message: Имя моей БД.

означает, что база с именем "Имя моей БД" не найдена среди зарегистрированных баз.
1. База "Имя моей БД" не зарегистрирована совсем (если вы её скачали)
2. База "Имя моей БД" была зарегистрирована, но вы её переместили в другую папку или переименовали базу или папки её содержащие.
3. Неправильное имя базы(например, лишний пробел или вместо русской буквы "а" английская "a")



Кротяка

#2
Уже разобрался, нужно указать полный путь к базе в формате URI(изначально я указывал только имя файла). Выглядит всё вот так:DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("file:///Полный путь к файлу базы")

rami

Правильная функция для подключения к базе данных:
Function ConnectToDataBase(dbName as String) as Object
Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName(dbName)
ConnectToDataBase=oDataSource.GetConnection("","")
End Function

В макросе пишете:
Sub Macros
...
...
db=ConnectToDataBase("Имя моей БД")   'вызов функции подключения
...
...
DisconnectFromDataBase(db)            'вызов функции отключения
End Sub

Функция отключения:
Sub DisconnectFromDataBase(db as Object)
db.close
db.dispose()
End Sub

Функции подключения и отключения пишутся один раз для всех макросов которым нужно работать с базами.

Кротяка


dndn

Цитата: Кротяка от 13 декабря 2014, 10:14
Уже разобрался, нужно указать полный путь к базе в формате URI(изначально я указывал только имя файла). Выглядит всё вот так:DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("file:///Полный путь к файлу базы")


Нет, не "file:///Полный путь к файлу базы", а "имя_зарегистрированой_базы"
Если база зарегистрирована (а она обязана быть зарегистрированной), то имя ее найдешь в меню "Сервис" => "Параметры" => "OpenOffice Base" => "Базы данных". Ищи ее справа в списке, в колонке "Название базы".

Можно еще, не указывая явно, извлечь имя базы из источника данных для формы следующим кодом:
oForm = ThisComponent.Drawpage.Forms.getByName( "Имя_Формы" )
dbName = oForm.DataSourceName


Тогда полный код подключения к существующей базе будет выглядеть так:
Public Function ConnectCurrentDB As Object
  oForm = ThisComponent.Drawpage.Forms.getByName( "Имя_Формы" )
  dbName = oForm.DataSourceName
  dbContext = createUnoService( "com.sun.star.sdb.DatabaseContext" )
  oDataSource = dbContext.getByName( dbName )
  ConnectCurrentDB = oDataSource.GetConnection( "","" )
End Function

Кротяка

#6
К сожалению ни один из вариантов не помог. Объясняю ситуацию. У меня при открытии БД открывается форма "Главное меню", на которой расположены кнопки навигации. На событие "При загрузке" этой формы установлен макрос с подключением к БД. Он не срабатывает(проверял с помощью MsgBox). Но даже если я при открытии БД(и соответственно, формы "Главное меню") "вручную" запускаю макрос, в котором записан вышеизложенный код(пробовал все варианты),то при попытке открыть какой либо объект БД OO бъёт ошибку о том, что подключение не выполнено. Помогает только перезапуск формы, а это не совсем правильно. Скажите, есть пути решения проблемы?

rami

Можете выложить оригинальную базу или образец базы с формой и макросами?

Кротяка

Пожалуйста

rami

Во всех макросах, которые открывают формы строку кода:ThisDatabaseDocument.FormDocuments.GetByName("ф1Регистрация").open
заменить на:ThisComponent.Parent.FormDocuments.getByName("ф1Регистрация").Open
Смысл: ThisComponent это текущая форма Parent это её родительский объект (база данных) FormDocuments это список форм.
Макрос Sub ORegistration_CMenu
    ThisComponent.Parent.FormDocuments.getByName("ф1Регистрация").Open
    ThisDatabaseDocument.FormDocuments.GetByName("фГлавное_меню").close
End Sub

открывает форму ф1Регистрация и закрывает фГлавное_меню

Кротяка

#10
К сожалению проблема не решилась
Считаю нужным уточнить, что проверять нужно при открытии файла БД, а соответственно при автоматическом открытии формы "фГлавное_меню", а не после её закрытия и последующего открытия вручную в списке форм