Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

17 Декабрь 2017, 13:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Подключение к текущей БД  (Прочитано 3160 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Стартовое сообщение: 12 Декабрь 2014, 22:49 »

Как с помощью макроса выполнить подключение к текущей БД? Способы типа
Код:
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( "Имя моей БД" )
не работают, вылетает следующая ошибка:


* Безымянный.png (20.74 Кб, 364x142 - просмотрено 57 раз.)
« Последнее редактирование: 12 Декабрь 2014, 22:53 от Кротяка » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 315


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 13 Декабрь 2014, 10:11 »

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

Для начала исправьте код (в последней строке):
Код:
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")


Записан

Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Ответ #2: 13 Декабрь 2014, 10:14 »

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

Пол: Мужской
Сообщений: 2 315


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 13 Декабрь 2014, 11:07 »

Правильная функция для подключения к базе данных:
Код:
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
Функции подключения и отключения пишутся один раз для всех макросов которым нужно работать с базами.
Записан

Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Ответ #4: 13 Декабрь 2014, 19:46 »

Благодарю.
Записан
dndn
Пользователь
**
Offline Offline

Сообщений: 93



WWW
« Ответ #5: 17 Декабрь 2014, 01:34 »

Уже разобрался, нужно указать полный путь к базе в формате 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
Записан
Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Ответ #6: 24 Декабрь 2014, 01:15 »

К сожалению ни один из вариантов не помог. Объясняю ситуацию. У меня при открытии БД открывается форма "Главное меню", на которой расположены кнопки навигации. На событие "При загрузке" этой формы установлен макрос с подключением к БД. Он не срабатывает(проверял с помощью MsgBox). Но даже если я при открытии БД(и соответственно, формы "Главное меню") "вручную" запускаю макрос, в котором записан вышеизложенный код(пробовал все варианты),то при попытке открыть какой либо объект БД OO бъёт ошибку о том, что подключение не выполнено. Помогает только перезапуск формы, а это не совсем правильно. Скажите, есть пути решения проблемы?
« Последнее редактирование: 24 Декабрь 2014, 01:44 от Кротяка » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 315


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 24 Декабрь 2014, 01:33 »

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

Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Ответ #8: 24 Декабрь 2014, 12:35 »

Пожалуйста

* БД.rar (66.31 Кб - загружено 11 раз.)
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 315


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #9: 24 Декабрь 2014, 17:32 »

Во всех макросах, которые открывают формы строку кода:
Код:
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Регистрация и закрывает фГлавное_меню
Записан

Кротяка
Новичок
*
Offline Offline

Пол: Мужской
Расположение: Донецк
Сообщений: 31


« Ответ #10: 25 Декабрь 2014, 00:43 »

К сожалению проблема не решилась
Считаю нужным уточнить, что проверять нужно при открытии файла БД, а соответственно при автоматическом открытии формы "фГлавное_меню", а не после её закрытия и последующего открытия вручную в списке форм
« Последнее редактирование: 25 Декабрь 2014, 00:50 от Кротяка » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!