воскресенье, 3 июня 2012 г.

OpenOffice Base - что же дальше

Я понимаю, что читатель истосковался по более сложному коду. И он скорo будет опубликован. Мое направление сейчас - обернуть функционалом стандартный котнрол Диалогов - ComboBox.

Напомню, что Combobox Диалогов это не совсем тот же элемент, что и Combobox Формы. Но он нам очень пригодился бы для реализации ввода во "всплывающие" и модальное диалоговое окно, где загружать форму было бы слишком неюзабельно. Пока.

пятница, 1 июня 2012 г.

Объекты Connection, Statement, ResultSet в OpenOffice

Для решения простых задач достаточно декларативно задать объекты данных в Мастерах-построителях или в Палитрах свойств объектов Формы. Если бы на этом возможности OpenOffice заканчивались, то кроме игр с данными ему сложно было бы найти применение. Вспоминаю сколько раз я раскрывал Star/OpenOffice, создавал подключение к серверу баз данных и с грустью закрывал, полистав весьма скудный (и до сих пор это так) Help.

Но время не стоит на месте. В Интернете начала накапливаться полезная информация о макросах OpenOffice и вот мы здесь.

Для начала работы следует получить объект Connection. Его можно получить несколькими способами. В частности из свойства ActiveConnection объекта Form или по символическому имени DataSource, которое можно задавать из Главного меню|OpenOffice Tools|Options|OpenOffice.org Base|Databases. Если вынести функцию GetConnection в скрипт из раздела My Macros, всегда будет достаточно изменить код ровно в одном месте чтобы измененить подключение.

Function GetConnection() As Variant

  Dim DataSource As Variant
  Dim Connection As Variant
  DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
  DataSource = DatabaseContext.GetByName("sourcename")
  GetConnection = DataSource.GetConnection()

End Function

Получив Connection надо создать Satement или PreparedStatement.

oStatement = GetConnection().CreateStatement
oResultSet = Statement.ExecuteQuery("select * from ...")
lCount = Statement.ExecuteUpdate("update ...")

Теперь особое предупреждение для любителей строить запросы конкатенацией строк. Не забудем, что OpenOffice является офисным приложением. Поэтому при переводе чисел с точкой в строку десятичная точка превращается... превращается ... правильно - в десятичную запятую, что скорее всего откажется воспринять ваш сервер баз данных. Для такого случая удобно воспользоваться параметрическим запросом.

pStatement = GetConnection().PrepareStatement("update ... set ... = ? where ... = ?")
pStatement.SetDouble(1, 123.456)
pStatement.SetString(2, "789" )
                                                    ' pStatement.ExecuteQuery
pStatement.ExecuteUpdate


Объект ResultSet, полученный в результате запроса поддерживает удобную (привычную) навигацию и может быть изменяемым. То есть все плюшки, известные по ODBC/JDBC/DAO/ADO  и иже с ними налицо. Впрочем это все уже можно прочитать в Интернете. Я же хотел дать зацепки для поиска нужных моментов. Пока.