Как стать автором
Обновить

Программирование LibreOffice Base. Часть 2

Время на прочтение4 мин
Количество просмотров11K
В части 2 будет рассмотрена связь между таблицами базы данных и формами. В частности как задавать связь между двумя таблицами и использовать таблицы-«справочники» в качестве источника данных для выпадающих списков.

Версии OpenOffice и LibreOffice, для которых актуально данное сообщения от 3.0 до 6.2 (текущая версия LibreOffice). Начиная именно с версии 3.0 в OpenOffice Base появилась возможность сохранять скрипты в файле базы данных (с расширением .odb), что позволяет удобно распространять код макросов OO Basic

С формами в OpenOffice Base произошла некоторая путаница. Дело в том, что в процессе эволюции программного обеспечения от офисного пакета к среде для работы с базами данных, оказалось, что Формы, Форма, Forms и Form — это немного не одно и то же. И Form — это не только Form. Поясню подробнее.

Когда Вы открываете базу данных OpenOffice Base в режиме редактирования, то видите в левой части экрана четыре закладки. В русифицированной версии это будет звучать как

  • Таблицы
  • Запросы
  • Формы
  • Отчеты

В этом смысле Форма является некоторым самостоятельным приложением, которое запускается в отдельном окне. Замечу еще, что на самом деле это окно в котором запускается экземпляр OpenOffice Writer.

Примечание. Поскольку форма это фактически экземпляр OpenOffice Writer — приложение можно создавать без загрузки компонента OpenOffice Base — прямо в OpenOffice Writer.

Каждая Форма имеет коллекцию Forms объектов Form. Вначале эта коллекция пустая. Несмотря на это, Вы можете открывать и закрывать Форму. И даже выводить в ней текстовую информацию. И только при добавлении нового элемента управления (например Button) система создаст объект Form с именем по умолчанию Form, если Вы до этого времени не создали такой объект сами.

Создавать новые Form удобнее всего из Навигатора форм (на палитре изображается в виде компаса), который также можно вызвать из меню View|Toolbar|Form Navigation. Объекты Form создаются или на верхнем уровне в коллекции Forms, или подчиненные другому объекту Form. Это никак не отражается на внешнем виде Формы, но может быть полезными при задании связей между таблицами.

Скриншот
image


Тут надо отметить одну аномалию объекта Form. Этот объект является в первую очередь объектом, связанным с таблицей базы данных или с запросом SQL. Можно думать о Form как об объекте ResultSet (так оно и есть на самом деле). С другой стороны, Form является контейнером для элементов управления, подобно FORM в документе HTML (и это тоже правда).

Откройте только что созданную Форму в режиме редактирования (правая кнопка мыши|Edit). Создайте в ней новый объект Form с именем Form, или другим Вам понравившимся именем. В этом элементе Form создайте дочерний элемент Form.

C каждой Form нужно связать существующую таблицу базы данных, запрос или SQL-запрос. В подчиненной Form можно задать правила, чтобы отражались данные отфильтрованные по значению связанных полей в основной Form по типу Master/Slave. Для этого в редакторе свойств подчиненной Form нужно заполнить свойства link master fields и link slave fields.

Теперь в каждую из Form добавим по элементу Table Control, выбрав соответствующую Form в Навигаторе форм>. Элемент Table Control отсутствует в панели доступных элементов. Для отображения расширенного списка элементов нужно в палитре элементов активировать кнопку More Controls. После добавления элемента Table Control необходимо войти в режим редактирования этого элемента и добавить необходимые для отображения колонки таблицы (правая кнопка мыши -> Insert/Replace/Delete Column)

Второй тип часто встречающийся на практике тип связи между таблицами (после Master/Slave), и который мы рассмотрим — связь типа Справочник. Мы храним в таблице данных ключ объекта GUID, autoincrement, а в отображаемой таблице выводим его полное наименование, взятое из связанной таблицы-«справочника». Для этого есть удобный механизм. В визуальном Конструкторе таблицы добавляем колонку типа List Box. Если была уже создана колонка типа Numeric/Text, в которой отображается ключ (а не наименование), есть возможность изменить его тип на List Box (правая кнопка мыши|Replace With|List Box). Далее редактируем список свойств колонки. На закладке data свойству Тype of List Content присваиваем значение SQL. Запрос в свойствеList Content должен в первой колонке содержать отображаемое значение, а свойство Bound Field индекс колонки с ключевым полем (если считать, что первая колонка имеет индекс 0). То есть в подавляющем большинстве запросов это будет 1 для запросов типа

SELECT USERNAME, USERID FROM USERS ORDER BY USERNAME

Пока что была описана работа в режиме конфигуратора без программирования. Добавим функциональности при помощи макросов OO Basic.

Создадим фильтр для таблицы базы данных по значению, введенному в текстовое поле. Для этого напишем на языке OO Basic процедуру, обрабатывающую событие от клавиатуры.

 Sub TextBox_onKeyUp(oEvent)
   oDocument = ThisComponent
   oDocument.LockControllers
   sText = oEvent.Source.text
   if Len(sText) > 3 Then
     oForm =  ThisComponent.Drawpage.Forms.getByName("MyForm")
     oForm.Filter = "USERNAME LIKE '" + sText  + "%'"
     oForm.reload()
   End If
   oDocument.UnlockControllers 
End Sub

Свяжем эту процедуру с событием Key released текстового поля (на закладке event списка свойств элемента). Заметим, что это текстовое поле должно быть расположено в другой Form (не в той на которую накладывается фильтр), чтобы перезагрузка oForm.reload() не «обнуляло» его текущее значение, введенное с клавиатуры.

Продолжение следует.
Теги:
Хабы:
+9
Комментарии1

Публикации