Основні об’єкти СКБД Openoffice.org Base.

В OpenOffice.org використовується власний інтегрованний інтерфейс доступу до баз даних — Star Database Connectivity (SDBC). Головна мета створення цього інтерфейсу — забезпечити зручний доступ до джерел даних найрізноманітніших форматів. Тому доступ до даних в SDBC здійснюється за допомогою відповідних драйверів, які дозволяють користувачеві працювати з базою даних незалежно від її формату. Драйвери грунтуються на технології UNO, що дозволяє на їх основі розробляти нові драйвери, якщо це потрібно. Аналогом SDBC у VBA є бібліотеки ADO і DAO.

Користувач, що має досвід використання будь-якого офісного пакета, знає про певні відмінності між створенням документів, наприклад, в електронних таблицях та створенням баз даних в СКБД. Суть цих відмінностей полягає в тому, що всі офісні додатки, крім СКБД, є контейнерами, що містять у собі документи,як збережені на диску і відкриті, так і щойно створені. Вони дозволяють працювати з відкритим документом, а потім зберігати результат роботи у файлах на диску. Принцип роботи СКБД дещо інший, він передбачає постійне зберігання даних та їх структури на жорсткому диску, а сама програма лише забезпечує звертання користувача до даних на диску. Тому при запуску СКБД користувачеві кожен раз доводиться вибирати до якої бази чи джерела даних підключитися, або створювати нову базу даних, відразу зберігаючи її на диску. Ця відмінність проявляється і при створенні макросів — звертатися безпосередньо до СКБД, скажімо, через об’єкт ThisComponent для доступу до даних немає змісту, оскільки база даних не міститься в контейнері самої програми.

Головним об’єктом, так би мовити, вузловою точкою, з якої розпочинається доступ до бази даних, є робочий простір баз даних DatabaseContext, що створюється на основі сервісу com.sun.star.sdb.DatabaseContext. Його створюють методом createUnoService, кожного разу, коли макрос розпочинає роботу з базою даних і записують в деяку об’єктну змінну, наприклад:

Dim DbContext As Object
DbContext = createUnoService(“com.sun.star.sdb.DatabaseContext”)

Після цього можна отримати доступ до конкретної бази даних за її іменем, застосувавши до отриманого об’єкта метод getByName(). Параметром цього методу є назва бази, з якою вона зареєстрована в OOo Base. Приклад:


Sub DBQueries()
Dim DbContext As Object
Dim MyDataBase As Object
Dim QuerySet As Object
Dim QueryDef As Object
Dim I As Integer
DbContext = createUnoService(“com.sun.star.sdb.DatabaseContext”)
If Not DbContext.hasRegisteredDatabase(“Base1″) Then

DbContext.registerDatabaseLocation(“Base1″, “file:///D:/MyBase.odb”)
End If
MyDataBase = DbContext.getByName(“Base1″)
QuerySet = MyDataBase.getQueryDefinitions()
For I = 0 To QuerySet.Count() – 1
QueryDef = QuerySet(I)
MsgBox QueryDef.Name
Next I
End Sub

Макрос з наведеного прикладу створює контекст баз даних DbContext, за допомогою якого звертається до бази даних Base1 через об’єкт MyDataBase. Умовний оператор перевіряє чи база даних з такою назвою зареєстрована в OpenOffice.org Base (методи інтерфейсу XDatabaseRegistrations доступні, починаючи з ООо 3.3). Якщо ні, то метод registerDatabaseLocation реєструє з такою назвою базу даних, розташовану у файлі MyBase.odb на диску D. Наступні інструкції макроса переглядають список запитів, створених у цій базі даних та виводять їх назви.

Основним засобом обробки даних у будь-якій базі є запити. Як видно з наведеного прикладу до сукупності запитів БД можна звернутися за допомогою методу getQueryDefinitions. Крім перегляду імен запитів, можна, наприклад, створити новий запит, скориставшись у прикладі вище такими інструкціями:

QueryDef = createUnoService(“com.sun.star.sdb.QueryDefinition”)
QueryDef.Command = “SELECT * FROM Продаж”
QuerySet.insertByName(“NewQuery”, QueryDef)

Для запису команд запиту використовується мова запитів SQL, в наведених інструкціях використана команда SQL для вибірки усієї інформації з таблиці “Продаж”.

Ці приклади показують як можна керувати об’єктами бази даних із коду макросів, причому всі команди можуть бути виконані як із документа OOo Base, так і з інших контейнерів — текстових документів, електронних таблиць, тощо. Проте, щоб побачити їх результат, наприклад, запит NewQuery, доведеться відкривати базу даних в середовищі OOo Base. Такі макроси, очевидно, не мають великої практичної цінності – більшість користувачів швидше цікавитимуть макроси, які можуть вибирати потрібні дані із бази.

Розглянемо вибірку даних із бази на прикладі наступного макроса:

Sub MyQuery()
DatabaseContext = createUnoService(“com.sun.star.sdb.DatabaseContext”)
DataBase = DatabaseContext.getByName(“sample1″)
Connection = DataBase.GetConnection(“”, “”)
Statement = Connection.createStatement()
Result = Statement.executeQuery(“SELECT Прізвище FROM Клієнти”)
If Not IsNull(Result) Then
While Result.next
MsgBox Result.getString(1)
Wend
End If
End Sub

Перші дві інструкції знайомі нам з попередніх прикладів, вони створюють контекст бази даних і зв’язують об’єкт DataBase з фізичною базою даних “sample1″. Наступні команди створює підключення Connection до бази даних і об’єкт Statement для виконання запитів. Нарешті метод executeQuery об’єкта Statement виконує SQL-запит “SELECT Прізвище FROM Клієнти” і його результат поміщає у об’єкт Result. Імена усіх п’яти породжених макросом об’єктів (DatabaseContext, DataBase, Connection, Statement, Result) можна було б задати довільно, а також описати напочатку, використовуючи інструкцію опису Dim та тип Object.
Урезультаті виконання запиту виникає специфічний об’єкт, названий в прикладі Result, який утворюється на основі сервісу com.sun.star.sdbc.ResultSet. Власне, методи цього сервісу використані у фінальній частині макроса для обробки результатів запиту. Цей сервіс надає наступний набір методів для переміщення між записами з даними:

  • next() – перехід до наступного запису;
  • previous() – перехід до попереднього запису;
  • first() – перехід до першого запису;
  • last() – перехід до останнього запису.

Всі методи повертають логічне значення, що вказує чи було переміщення успішним, можна також скористатися методами для перевірки розташування ResultSet:

  • isBeforeFirst() – ResultSet перед першим записом;
  • isAfterLast() – ResultSet після останнього запису;
  • isFirst() – ResultSet є першим записом даних;
  • isLast() – ResultSet є останнім записом даних.

Для отримання окремих даних із результату запиту ResultSet цей сервіс має групу методів, назви яких утворені із префіксу “get” та назви відповідного типу даних, наприклад: getInt(), getLong(), getDouble(). Ці методи мають аргумент – номер поля (стовпця) з якого потрібно отримати дані. У прикладі вище використано конструкцію Result.getString(1) для отримання текстового вмісту із першого стовпця виконаного SQL-запиту.