Руководство по написанию макросов и приложений электронных таблиц Марк Александр Бейн



Pdf просмотр
страница5/9
Дата21.11.2016
Размер4.07 Mb.
Просмотров2619
Скачиваний0
ТипРуководство
1   2   3   4   5   6   7   8   9
Глава 6. Работа с Базами данных
Усмешка Сфэн быстро испарилась.
“Что Вы подразумеваете? Какая база данных?”
“Ты же не думаешь, что мы были бы достаточно глупыми, чтобы хранить всю информацию здесь, не так ли?”
Сфен поглядела на Пигосселиса up and down. Усмешка вернулась, поскольку она указала пистолетом на Корора и взвела курок.
“Хорошо, вы оба мне не нужны, чтобы вернуть данные.”
“На самом деле ты ошибаешься. Я знаю пароль для доступа только к некоторым из данных.
Корора знает пароль для остальных. Мы нужны тебе оба живыми.”
Сфен аккуратно отпустила курок и засунула пистолет в кобуру.
“Хорошо. Ты выиграл этот раунд. Теперь об этих базах данных...”
И так, как сказала Сфэн, об этих базах данных...
В Главе 6 (как Вы, возможно, предположили), мы собираемся рассмотреть, как использовать макросы Calc с информацией, сохраненной в базе данных. К концу главы, Вы будете в состоянии:

Использовать макрос для подключение к базе данных;

Использовать SQL (Structured Query Language — Язык структурированных
запросов) в макросе для извлечения информации из базы данных и использования ее в электронной таблице;

Использовать макрос для добавления данных в базу данных;

Использовать макрос для обновления данных в базе данных.
То, чего мы не будем рассматривать:

Как разработать и построить базу данных;

Как настроить соединение с базой данных, используя ODBC (Open DataBase
Connectivity);

Полный объём SQL — мы рассмотрим только основы, которых вполне достаточно для чтения и записи в базу данных.
Так давайте начнем, получим доступ к базе данных.
Получение доступа к Базам данных
Приняв решение о том, что мы хотим использовать базу данных, возможно, стоит подумать о базах данных вообще.
Если вы введете в Google запрос “Что такое база данных?”, то вы сможете найти множество определений, но все они сводятся к одному и тому же — база данных — структурированный набор данных. Таким образом, используя это определение, базой данных может в действительности быть вебсайт или текстовые файлы в каталоге. Тем не менее, существуют ограничения на этот тип баз данных:

Поиск может быть трудным и зачастую медленным.

Легко организовать чтение данных одновременно для множества людей, но
- 72 -

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

Пути, которыми данные могут быть извлечены и проанализированы, обычно очень ограничены.
И именно поэтому большинство людей используют одну из легко доступных коммерческих баз данных, или предпочитают одну из многих free- или open-source.
Какие базы данных мы можем использовать?
Я не могу советовать Вам, какую база данных выбрать. Вы можете быть в организации, которая ограничивает вас той базой данных, которую компания уже купила, например:
Oracle, MS Access, и так далее.
Если у вас есть полностью открытый выбор, то вы можете выбрать одну из Kexi, MySQL и
PostgreSQL.
Если Вы действительно используете любую из этих баз данных, то Вы должны будете настроить возможность соединения с базой данных, и это зависит от вашей системы и ваших предпочтений. Распространенным является Open DataBase Connectivity (ODBC). Вы должны будете сделать две вещи:
1. Установить специфичный для базы данных драйвер для вашей системы.
2. Использовать программное обеспечение для подключения к базе данных для вашей системы для настройки подключения. Программное обеспечение может быть
(например) unixODBC для Linux или MS ODBC для Windows.
С другой стороны, так как Вы уже используете OpenOffice.org, можно просто придерживаться базы данных OpenOffice.org Base.
Регистрация базы данных в качестве источника данных OOo
Как только Вы настроили соединение с базой данных, Вы можете зарегистрировать ее в качестве источника данных OpenOffice.org — это делает доступ к данным несколько более простым. Это легко сделать перейдя в меню OOo и выбрав Файл | Создать | Базу данных.
Вам будет предоставлена следующие варианты: выбрать существующую базу данных
(существующий файл OpenOffice.org Base или подключение к базе данных) или Вы можете создать совершенно новую базу данных.
Как только Вы решили, что Вы хотите сделать, OOo зарегистрирует для Вас базу данных:
- 73 -

Глава 6. Работа с Базами данных
Просмотр зарегистрированных источников данных
Несомненно, в некоторый момент Вы захотите увидеть список зарегистрированных источников данных. Один способ состоит в том, чтобы выбрать Вид | Источники данных
(или нажать F4).
Однако, Вы можете предпочесть использовать макрос для получения списка:
Sub
Main list_available_databases
End Sub
Sub list_available_databases
Dim dbContext as Object
Dim dbNames
Dim d
as Integer
Dim dbText as String dbContext
= createUnoService
(
"com.sun.star.sdb.DatabaseContext"
)
dbNames
= dbContext getElementNames
()
For d
=
0
To
UBound
(
dbNames
())
dbText
= dbText
& dbNames
(
d
) & chr
(
10
)
Next d
msgbox dbText
End Sub
Макрос создает сервис
DatabaseContext и получает доступ к его методу getElementNames для создания массива, содержащего список источников данных. Макрос в цикле перебирает элементы массива для создания строки, которая будет отображаться в текстовом окне:
Идентифицировав источники данных, Вы захотите сделать с ними что-нибудь полезное — это означает подключиться к базам данных и затем получить информацию из таблиц, содержащихся в них.
- 74 -

Получение доступа к Базам данных
Подключение к базе данных
Мы уже видели, что мы можем использовать сервис
DatabaseContext
, чтобы увидеть список зарегистрированных источников данных. Затем, мы можем использовать сервис для подключения к базе данных:
Sub
Main
Dim db as Object db
= connect_to_database
(
"ppi"
)
'В конце сессии подключение должно завершиться автоматически,
'но лучше самостоятельно завершить его работу:
disconnect_from_database
(
db
)
End Sub
Sub disconnect_from_database
(
db as Object)
db close db dispose
()
End Sub
Function connect_to_database
(
dbName as String) as Object
Dim dbContext
As Object
Dim oDataSource
As Object dbContext
= createUnoService
(
"com.sun.star.sdb.DatabaseContext"
)
oDataSource
= dbContext getByName
(
dbName
)
connect_to_database
= oDataSource
GetConnection
(
""
,
""
)
End Function
Вы заметили, что последняя строка кода содержит две пустых строки:
connect_to_database
= oDataSource
GetConnection
(
""
,
""
)
Они предназначены для имени пользователя и пароля в случае, если Вы в них нуждаетесь для того, чтобы подключиться к базе данных. Если ваша база данных требует указания имени пользователя и пароля (и очевидно, что разумнее их использовать), то Вы будете использовать что-нибудь вроде:
db
= oDataSource
GetConnection
(
"bainm"
,
"nottelling"
)
Таким образом, это достаточно легко. Теперь мы можем взглянуть на фактические таблицы в базе данных.
Доступ к таблицам базы данных
Как я упоминал в начале главы, мы не будем углубляться в тонкости проектирования и создания таблиц базы данных. Это потому, что методы и инструменты, которые вы будете иметь под рукой будет варьироваться в зависимости от реальной базы данных, которую Вы используете. Например, если если у вас есть MySQL или PostgreSQL, то вы можете создавать таблицы из командной строки или использовать инструменты сторонних производителей для создания таблиц в визуальном редакторе.
С другой стороны, если Вы имеете MS Access или Вы используете приложение
OpenOffice.org's Base, то тогда Вы будете использовать их встроенные формы и мастера создания таблиц.
Однако, независимо от базы данных, которую вы используете, Вам стоит потратить время на построения структуры данных прежде, чем Вы приступите к созданию макросов. Проще создавать макросы по хорошо структурированным данным, а не пытается подгонять Ваши данные под макросы.
Если Вы используете Base, то Вы можете создавать таблицы используя диалоговое окно Base
Проектирование таблицы.
- 75 -

Глава 6. Работа с Базами данных
После чего Вы можете использовать Base (с таблицей в режиме Редактирования) для заполнения таблиц вручную (так как мы еще не написали макрос, чтобы делать это) как показано на рисунке ниже:
Конечно, в настоящее время, Вы можете предпочесть использовать базу данных, которая поставляется с Base — Biblio.
Ранее мы видели, что использование сервиса
DatabaseContext позволило нам перебрать the доступные источники данных и подключаться к любой из баз данных, зарегистрированных в
OpenOffice.org.
Теперь мы можем использовать сервис для получения списка таблиц в базе данных:
Sub
Main
Dim db
As Object db
= connect_to_database
(
"ppi"
)
list_tables
(
db
)
disconnect_from_database
(
db
)
End Sub
Sub list_tables
(
db as Object)
Dim dbTables as Object
Dim dbTableNames
Dim opText as String dbTables
= db getTables dbTableNames
= dbTables getElementNames opText
= join
( dbTableNames
, chr
(
10
))
msgbox opText
- 76 -

Получение доступа к Базам данных
End Sub
Вы заметите, что подпрограмма list_tables не создает подключения к базе данных; вместо этого функция connect_to_database возвращает ее в виде переменной db
. А она представляет собой подключение, и может быть передана любому из макросов, которые вы напишете.
Когда Вы запустите макрос
Main
, вы увидите список таблиц.
Конечно, если Вы используете свою собственную базу данных или OOo Biblio, то тогда Вы получите различный список — но вы получили идею.
Не забывайте, что Вы всегда должны будете выполнять connect_to_database
; без этого у
Вас нет подключения к базе данных. Если Вы действительно хотите написать какой-нибудь автономный макрос, который Вы можете выполнять независимо и который использует базу данных, то Вы должны будете включить строку db
= connect_to_database
(
"ppi"
)
В нашем примере
Main выполняет всю работу для нас — вызывает подпрограмму для подключения к базе данных, а затем вызывает макрос для составления списка таблиц. Таким образом, получив список всех таблиц в базе данных, мы можем теперь начать думать об извлечении данных из них.
Выполнение запросов к таблицам
Мы собираемся использовать следующую простую процедуру:

Подключиться к базе данных;

Послать оператор SQL базе данных;

Получить результат от базы данных;

Использовать результаты.
Так как мы уже узнали, как подключиться к базе данных, давайте продолжим и сделаем остальное:
Sub
Main
Dim db
As Object db
= connect_to_database
(
"ppi"
)
simple_query
(
db
)
disconnect_from_database
(
db
)
End Sub
Function capitalize (
iName as String) as String
Dim wordStart as String
Dim wordEnd as String wordStart
=
UCase
(
Mid
(
iName
,
1
,
1
))
wordEnd
=
LCase
(
Mid
(
iName
,
2
))
capitalize
= wordStart
& wordEnd
End Function
Sub simple_query
(
db as Object)
Dim oSql as String
Dim i
as Integer
Dim oRowSet as Object
Dim oResult as String
- 77 -

Глава 6. Работа с Базами данных
oSql
=
"SELECT SURNAME, FIRSTNAME, RATE"
_
&
" FROM ""investigator"""
oRowSet
= createUnoService
(
"com.sun.star.sdb.RowSet"
)
oRowSet activeConnection
= db oRowSet
Command
= oSql oRowSet execute while oRowSet
Next oResult
= oResult
_
& capitalize
(
oRowSet getString
(
2
)) &
" "
_
& capitalize
(
oRowSet getString
(
1
)) &
" "
_
&
"£"
& oRowSet getFloat
(
3
) _
&
" "
& chr
(
13
)
wend msgbox oResult
, ,
"PPI Hourly Rate "
End Sub
Вы увидите из подпрограммы simple_query
, что мы создаем сервис
RowSet
, который затем использует подключение к базе данных для посылки SQL-выражения базе данных и получения результата. Далее, нам только надо с помощью цикла перебрать
RowSet
, извлекая информацию из него строка за строкой.
Есть несколько вещей, которые надо рассмотреть прежде, чем мы пойдем дальше. Первая из которых следующие три строки кода:
oRowSet activeConnection
= db oRowSet
Command
= oSql oRowSet execute
Лично я вполне этим доволен, но вы можете предпочесть формат
With
. Если это так, то Вы можете изменить код на:
With oRowSet activeConnection
= db
Command
= oSql execute
End With
Другая вещь — функция capitalize
. Она используется просто для красивого форматирования каких-либо имен (так как они, возможно, были сохранены в нижнем регистре, или в верхнем регистре, или в любом возможном их сочетании). Конечный результат выглядит следующим образом:
Помещение всего этого в электронную таблицу
Мы видели, как легко получить данные из базы данных. Мы можем теперь посмотреть на то, как на самом деле сделать что-нибудь полезное с информацией. Самая очевидная вещь, которую можно сделать — загрузить данные в электронную таблицу:
Sub
Main
Dim db
As Object db = connect_to_database
(
"ppi"
)
load_investigator
(
db
)
disconnect_from_database
(
db
)
End Sub
Sub load_investigator
(
db as Object)
Dim oDoc as Object
- 78 -

Помещение всего этого в электронную таблицу
Dim oURL
as String
Dim oSheet as Object
Dim oCell as Object
Dim oRowSet as Object
Dim i
as Integer oURL
=
"private:factory/scalc"
oDoc
= starDeskTop loadComponentFromURL
(
oURL
,
"_blank"
,
0
,
Array
() )
oSheet
= oDoc
Sheets
(
0
)
oSheet
Name
=
"PPI Investigator"
oRowSet
= get_rowset
(
db
, sql_select
_
(
"investigator"
,
Array
(
"SURNAME"
,
"FIRSTNAME"
,
"RATE"
)))
While oRowSet
Next i
= i
+
1
oCell
= oSheet getCellByPosition
(
0
,
i
)
'Remember to use capitalize from page 8
oCell
String
= capitalize
(
oRowSet getString
(
2
))
oCell
= oSheet getCellByPosition
(
1
,
i
)
oCell
String
= capitalize
(
oRowSet getString
(
1
))
oCell
= oSheet getCellByPosition
(
2
,
i
)
oCell
Value
= capitalize
(
oRowSet getString
(
3
))
Wend
End Sub
Вы поймете, конечно, что здесь нет ничего нового. Мы только используем некоторые из методов, о которых мы узнали в Главе 4 (где мы манипулировали данными в электронной таблице), Главе 5 (где мы форматировали содержимое электронных таблиц), и этой главе (где мы извлекли информацию из базы данных, и ввели функции, такие как capitalize
).
Однако, есть несколько функций, которые мы вызываем из load_investigator
, которые Вам могут быть интересны. Первая — функция sql_select
. Если Вы предпочитаете не создавать
SQL самостоятельно, Вы можете использовать ее, чтобы сделать всю работу за Вас. Все, что
Вы должны сделать - передать ей имя таблицы (в виде строки) и список полей (в виде массива):
Function sql_select
(
iTable as String, iFields
())
sql_select
=
"SELECT "
& join
(
iFields
,
","
) _
&
" FROM """
& iTable
+
""""
End Function
Другая функция — get_rowset
. Если Вы не хотите помнить, как создавать
RowSet
, то Вы можете использовать ее, чтобы она сделала эту работу за Вас. Просто передайте ей SQL выражение, и это возвратит Вам
RowSet в виде объекта:
Function get_rowset
(
db as Object, iSql as String) as Object
Dim oRowSet as Object oRowSet
= createUnoService
(
"com.sun.star.sdb.RowSet"
)
oRowSet activeConnection
= db oRowSet
Command
= iSql oRowSet execute get_rowset
= oRowSet
End Function
После всего этого, результатом является таблица, содержащая результат запроса, который Вы послали базе данных:
Я уверен, что Вы найдете эти методы очень полезными. Однако это скорее ограничивает, не правда ли? Вам необходим полностью новый макрос для каждого набора данных, который вы хотите загрузить. Вместо этого давайте изучим более общий подход.
- 79 -

Глава 6. Работа с Базами данных
Загрузка данных в рабочие листы пользователя
Я не знаю как Вы, но я люблю использовать код для поиска оригинальных решений проблем.
Я не особо люблю просто вводить одни и те же старые строки кода снова, и снова, и снова.
Таким образом, давайте посмотрим на изменения в макросе load_investigator
, который будет работать для любых данных, которые мы хотим поместить в электронную таблицу:
Sub
Main
Dim doc as Object
Dim db
As Object db
= connect_to_database
(
"ppi"
)
doc
= open_spreadsheet ppi_sheets
(
db
, doc
)
disconnect_from_database
(
db
)
End Sub
Мы все еще используем функцию connect_to_database
(по очевидным причинам); однако, мы также добавили added open_spreadsheet и ppi_sheets
Function open_spreadsheet
Dim oURL
as String oURL
=
"private:factory/scalc"
open_spreadsheet
= starDeskTop loadComponentFromURL
(
oURL
,
"_blank"
,
0
,
Array
())
End Function
Вы сможете сразу понять, что все, что делает open_spreadsheet
— содержит код, который мы уже использовали достаточно часто и открывает пустую электронную таблицу. Именно в ppi_sheets выполняется вся работа с базой данных:
Sub ppi_sheets
(
db as Object, iDoc as Object)
Dim sheetName as String
Dim fields
Dim oRowSet as Object
Dim r
as Integer sheetName
=
"PPI Investigator"
oRowSet
= get_rowset
(
db
, sql_select
(
"investigator"
, _
Array
(
"SURNAME"
,
"FIRSTNAME"
,
"RATE"
,
"'END_OF_RECORD'"
)))
r
= oRowSet
RowCount
+
1
load_sheet
(
iDoc
, sheetName
, oRowSet
)
capitalize_column
(
iDoc
, sheetName
,
0
, r
)
capitalize_column
(
iDoc
, sheetName
,
1
, r
)
format_column
(
iDoc
, sheetName
,
2
, r
,
"£#,##0.00"
)
deleteSheets
(
iDoc
)
End Sub
Хорошо, ничего спорного здесь нет. Вы сможете понять из названия функции, что происходит. Однако, Вам может быть интересно, почему 'END_OF_RECORD'
используется в
SQL выражении. Это не реальное имя поля; мы используем его, чтобы отметить завершение записи в каждой строке. Вы можете увидеть это при использовании в подпрограмме load_sheet
:
Sub load_sheet
(
iDoc as Object, iName as String, iRowSet as Object)
Dim oSheet as Object
Dim oCell as Object
Dim r
as Integer
Dim c
as Integer
Dim endMarker as String oSheet
= iDoc createInstance
(
"com.sun.star.sheet.Spreadsheet"
)
iDoc
Sheets insertByName
(
iName
, oSheet
)
If Not isNull
(
iRowSet
) Then
While iRowSet
Next r
= r
+
1
c
=
1
- 80 -

Помещение всего этого в электронную таблицу
endMarker
=
""
While endMarker
<>
"END_OF_RECORD"
oCell
= oSheet getCellByPosition
(
c

1
, r
)
if isNumeric
(
iRowSet getString
(
c
)) Then oCell
Value
= iRowSet getString
(
c
)
Else oCell
String
= iRowSet getString
(
c
)
End If c
= c
+
1
endMarker
= iRowSet getString
(
c
)
Wend
Wend
End If
End Sub
Подпрограмма load_sheet полезна, потому что Вы можете использовать ее для добавления совершенно нового рабочего листа, присвоения ему подходящего имени и загрузки в него содержимого
RowSet
После загрузки данных, которые нам необходимы, подпрограмма ppi_sheets вызывает несколько специальных подпрограмм для выполнения некоторого форматирования. Макрос capitalize_column использует функцию capitalize и применяет ее к части столбца:
Sub capitalize_column
( iDoc as Object, iSheetName as String, _
iColumn as Integer, iRow as Integer)
Dim oCell as Object
Dim oSheet as Object
Dim r
as Integer oSheet
= iDoc
Sheets getByName
(
iSheetName
)
For r
= 0 to iRow oCell
= oSheet getCellByPosition
(
iColumn
, r
)
oCell
String
= capitalize
(
oCell
String
)
Next r
End Sub
Мы можем также применить форматы чисел для любого столбца, который нам нужен:
Sub format_column
( iDoc as Object, iSheetName as String, _
iColumn as Integer, iRow as Integer, iFormat as String)
Dim oCell as Object
Dim oSheet as Object
Dim r
as Integer oSheet
= iDoc
Sheets getByName
(
iSheetName
)
For r
=
0
to iRow oCell
= oSheet getCellByPosition
(
iColumn
,
r
)
'Функция getNumberFormat была создана в главе 5
oCell
NumberFormat
= getNumberFormat
(
iDoc
, iFormat
)
Next r
End sub
В заключение, мы удаляем любые неиспользуемые рабочие листы:
Sub deleteSheets
(
iDoc as Object)
iDoc
Sheets removeByName
(
"Sheet1"
)
iDoc
Sheets removeByName
(
"Sheet2"
)
iDoc
Sheets removeByName
(
"Sheet3"
)
End Sub
По завершении процесса мы имеем отформатированную электронную таблицу только с нужными рабочими листами:
- 81 -

Глава 6. Работа с Базами данных
Конечно, мы можем иметь другие таблицы в базе данных, например наш друг Пигосселис имел бы таблицу, содержащую все случаи PPI:
И для использования другой таблицы мы должны добавить только немного дополнительного кода:
sheetName
=
"PPI cases"
oSql
=
"select TITLE, DETAILS, FIRSTNAME, SURNAME, 'END_OF_RECORD' "
_
&
" from ""investigator"" i, ""cases"" c "
_
&
" where i.ID = c.INVESTIGATOR_ID"
_
&
" order by c.ID "
oRowSet
= get_rowset
(
db
, oSql
)
load_sheet
(
iDoc
, sheetName
, oRowSet
)
r
= oRowSet
RowCount
+
1
capitalize_column
(
iDoc
, sheetName
,
2
, r
)
capitalize_column
(
iDoc
, sheetName
,
3
, r
)
На сей раз SQL выражение немного более сложное — вместо того, чтобы использовать содержимое одной таблицы, мы объединяем содержимое двух таблиц (что часто называют
Join запросом). Конечным результатом является лист, содержащий подробную информацию из обеих таблиц:
Вы заметите, что ширина столбцов не оптимизирована, но я не собираюсь делать все за Вас.
Все, что Вы должны сделать, создать новую подпрограмму, подобную capitalize_column и format_column
, но на сей раз использовать свойство столбца
OptimalWidth
(если Вы помните, мы использовали его в Главе 5).
Добавление новых записей в базу данных
До сих пор мы извлекли статические данные из базы данных, но мы не ограничимся этим.
Можно легко собрать информацию из электронных таблиц или ручным вводом, а затем использовать ее с запросом insert для создания нового набора записей в таблице. В этом примере, мы сначала должны выбрать строку в рабочем листе PPI Investigator.
- 82 -

Добавление новых записей в базу данных
Затем мы вызываем макрос add_case
(выбрав Сервис | Макросы | Выполнить макрос...).
Макрос получит имя сыщика из выделения, а затем спросит пользователя (например,
Пигосселиса) о новых подробностях случая.
Sub add_case
Dim oRange as Object
Dim oSheet as Object
Dim oCell as Object
Dim surname as string
Dim firstname as string
Dim title as string
Dim details as string
Dim r
as Integer oRange
= thisComponent getCurrentSelection getRangeAddress r
= oRange startRow oSheet
= thisComponent
CurrentSelection getSpreadsheet surname
= ucase
(
oSheet getCellByPosition
(
0
, r
).
String
)
firstname
= ucase
(
oSheet getCellByPosition
(
1
, r
).
String
)
If surname
=
""
Or firstname
=
""
Then msgbox
"Пожалуйста выберите строку, содержащую имя"
stop
End If
While title
=
""
title
= inputbox
(
"Введите название случая (введите 0 чтобы остановиться)"
)
Wend
If title
=
0
Then stop
End If
While details
=
""
details
= inputbox
(
"Введите подробности (введите 0 чтобы остановиться)"
)
Wend
If details
=
0
Then stop
End If create_case
(
surname
, firstname
, title
, details
)
End Sub
Вы заметите, что подпрограмма непосредственно собирает часть информации из электронной таблицы.
surname
= ucase
(
oSheet getCellByPosition
(
0
, r
).
String
)
firstname
= ucase
(
oSheet getCellByPosition
(
1
, r
).
String
)
В то время как остальная часть данных получена ручным вводом как:
title
= inputbox
(
"Введите название случая (введите 0 чтобы остановиться)"
)
details
= inputbox
(
"Введите подробности (введите 0 чтобы остановиться)"
)
Собранная информация передается подпрограмме create_case
:
Sub create_case
(
iSurname as String, iFirstName as String, _
iTitle as String, iDetails as String)
Dim id as Integer
Dim oSql as String
Dim oResult as Object
Dim oStatement as Object
Dim db as object db
= connect_to_database
(
"ppi"
)
id
= investigator_id
(
db
, iSurname
, iFirstName
)
- 83 -

Глава 6. Работа с Базами данных
oSql
=
"insert into ""cases"" "
_
&
"(""TITLE"",""DETAILS"",""INVESTIGATOR_ID"") values "
_
&
"('"
& iTitle
&
"','"
& iDetails
&
"',"
& id
&
")"
oStatement
= db createStatement oResult
= oStatement executeQuery
(
oSql
)
disconnect_from_database
(
db
)
End Sub
Вы можете задаться вопросом, почему подпрограмма содержит строку:
db
= connect_to_database
(
"ppi"
)
Если Вы помните, предварительно подключение к базе данных было создано, когда Вы сначала выполняли
Main
. Оно было, конечно, уничтожено, когда
Main завершился. Однако, на сей раз
Main не вызывалась, и поэтому для того чтобы выполнить create_case корректно ей требуется свое собственное подключение (и, конечно, свое собственное отключение).
В завершение, подпрограмма посылает базе данных SQL выражение insert
:
oSql
=
"insert into ""cases"" "
_
&
"(""TITLE"",""DETAILS"",""INVESTIGATOR_ID"") values "
_
&
"('"
& iTitle
&
"','"
& iDetails
&
"',"
& id
&
")"
Однако, прежде, чем она выполняет вставку, create_case получает поле investigator_id
— номер, сохраненный в таблице investigator
, и мы используем функцию investigator_id
:
Function investigator_id
(
db as Object, iSurname as String, iFirstName as String)
Dim oRowSet as Object
Dim oSql oSql
=
"select ID from investigator "
_
&
"where SURNAME ='"
& iSurname
&
"'"
_
&
" and FIRSTNAME = '"
& iFirstName
&
"'"
oRowSet
= get_rowset
(
db
, oSql
)
oRowSet
Next investigator_id
= oRowSet getInt
(1)
End Function
Вы также заметили, что функция получает информацию из одной таблицы, но это фильтрация для получения единственного ID номера (добавляя условие Where к SQL).
Последний момент, который требуется понимать состоит в том, что мы не используем
RowSet при вставке в базу данных; мы просто создаем выражение, а затем выполняем SQL:
oStatement
= db createStatement oResult
= oStatement executeQuery
(
oSql
)
Обновление Базы данных
Пока мы узнали как:

Использовать SQL для выполнения запроса к базе данных и использовать полученную информацию для заполнения рабочего листа;

Использовать выражение SQL insert в макросе для создания новых записей в базе данных.
Следующее что мы можем сделать - обновить данные уже в базе данных; опять получим информацию из электронной таблицы. Допустим, что Пигосселис изменил некоторые детали в своем рабочем листе “PPI Cases” (возможно изменилось одной из названий случаев), тогда все, что он должен сделать — выполнить Сервис | Макросы | Выполнить макрос... для запуска макроса, который просмотрит рабочий лист, ища любые изменения:
Sub update_case
Dim oRange as Object
Dim oSheet as object
Dim oRowSet as Object
Dim oCell as Object
Dim oSql as String
Dim r
as Integer
- 84 -

Обновление Базы данных
Dim c
as Integer
Dim oResult as Object
Dim oStatement as Object
Dim db as Object db
= connect_to_database
(
"ppi"
)
oRange
= thisComponent getCurrentSelection getRangeAddress oSheet
= thisComponent
CurrentSelection getSpreadsheet oRowSet
= get_rowset
(
db
, sql_select
(
"case"
,
Array
(
"TITLE"
,
"DETAILS"
)))
r
=
1
oCell
= oSheet getCellByPosition
(
0
, r
)
While oCell
String
<>
""
And Not oRowSet isLast oRowSet absolute
(
r
)
oCell
= oSheet getCellByPosition
(
0
, r
)
If oCell
String
<> oRowSet getString
(
1
) Then oSql
=
"""TITLE"" = '"
& oCell
String
&
"'"
End If oCell
= oSheet getCellByPosition
(
1
, r
)
If oCell
String
<> oRowSet getString
(
2
) Then
If oSql
<>
""
Then oSql
= oSql
&
","
End If oSql
= oSql
&
"""DETAILS"" = '"
& oCell
String
&
"'"
End If
If oSql
<>
""
Then oSql
=
"Update ""cases"" set "
& oSql
_
&
" where ""TITLE"" = '"
& oRowSet getString
(1) &
"'"
_
&
" and ""DETAILS"" = '"
& oRowSet getString
(2) &
"'"
End If oStatement
= db createStatement oResult
= oStatement executeQuery
(
oSql
)
r
= r
+
1
Wend disconnect_from_database
(
db
)
End Sub
Процесс обновления базы данных подобен вставке новых данных:

Информация получается из электронной таблицы, используя адрес диапазона.

Соответствующее SQL выражение строится на основе информации.

SQL выражение передается базе данных, но снова никакой
RowSet не создается.
Главное различие в том, что вместо того, чтобы брать отдельную строку данных из электронной таблицы, проверяется каждая строка. Макрос сравнивает каждую строку с содержанием соответствующей строки в
RowSet
. Если имеется различие, то выполняется обновление.
Резюме
В этой главе мы узнали, как использовать данные, сохраненные в базе данных. И таким образом мы теперь в состоянии использовать макрос для получения и использования данных из базы данных, создания новых записей в базе данных и обновления существующих записей в базе данных.
Если Вы используете какую-нибудь базу данных отличную от OpenOffice.org Base, то Вы должны будете установить драйвер для базы данных, которую Вы собираетесь использовать, сконфигурировать ваше программное обеспечение ODBC таким образом, чтобы база данных была доступна на вашей системе, и зарегистрировать базу данных в OpenOffice.org в качестве источника данных. Вы можете тогда подключиться к ней используя сервис
DatabaseContext
С подключением Вы можете извлекать информацию из базы данных, добавлять новые записи
- 85 -

Глава 6. Работа с Базами данных
в таблицы базы данных и обновлять существующие записи в базе данных. Вы также узнали, как извлекать информацию из базы данных, а также как вставлять новую запись или обновлять существующую.
Так или иначе...
Пигосселис игнорировал Сфен и резко упал назад со своего стула. Все, о чем он действительно знал, была увеличивающаяся боль в его голове и сердце Корора, бьющемся через его спину. Он пробовал сконцентрироваться на содержании отчета, теперь тлеющего в мусорном ведре.
В конце концов он сдался и снова потерял сознание.
В Главе 7 мы покажем, как Пигосселис создал тот отчет, когда рассмотрим 'Работу с другими
документами'.
- 86 -



Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал