вторник, 29 мая 2012 г.

Подчиненные объекты form и списки в OpenOffice как реляцинные таблицы баз данных

Как мы уже уточнили в прошлом сообщении объект form может непосредственно входить в коллекцию forms,  а может быть подчиненным другому объекту form. Для этого открыв Навигатор форм надо выделить существующую form и правая кнопка мыши|new form.

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

ОК. Теперь в каждую из form добавим по элементу Table Control, выбрав соответствующую form в Навигаторе форм. При этом запустится Мастер, с предложением выбрать таблицу данных или запрос, если Вы еще явно не указали его в свойствах объекта form. После этого Мастер предложить выбрать отображаемые поля. Впрочем, этот процесс можно прервать и заполнить данные в визуальном Конструкторе.

Второй тип связи, который мы рассмотрим - связь типа Справочник. Это распространенный случай. Мы храним в таблице данных ключ объекта (GUID, autoincrement и т.п.) а в отображаемой таблице выводим его полное наименование. Для этого есть удобный механизм. В визуальном Конструкторе таблицы выделяем колонку правая кнопка мыши|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 процедуру обрабатывающую событие от клавиатуры.


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, чтобы перезагрузка form не "обнуляло" его текущее значение, введенное с клавиатуры. Пока.

Комментариев нет: