Base: Самодельная "фильтрация" в формах

From Apache OpenOffice Wiki
Revision as of 08:26, 1 October 2009 by Vpanarin (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Самодельная фильтрация в формах.

Часто возникает задача фильтрации данных в табличных элементах управления. При этом по каким либо причинам навигатор фильтров использовать не хочется. В этом случае поля для задания фильтров размещаются в том же документе что и табличный элемент управления. Но для того чтобы фильтр заработал обычно приходится программировать. Рассмотрим несколько вариантов реализации фильтров.

Вариант 1. Использование свойства формы «filter».

Это классический вариант использования фильтров. С его помощью удобно реализовывать функциональность поиска по начальным буквам.

Ru-income-table-form.png

Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос:

Sub findTiker(oEvent)

Dim oControl 'Элемент управления - источник сообщения

Dim oForms 'Коллекция форм

Dim oForm 'Главная форма


oControl = oEvent.Source

oForms = oControl.getModel().getParent().getParent()

oForm = oForms.getByName("MainForm")

oForm.Filter = "Тикер like '" & oControl.Text & "*'"

oForm.reload()

End Sub

Так как в макросе вызывается конструкция oForm.reload(), то текстовое поле необходимо располагать в другой форме. Иначе оно будет сбрасываться после каждого вызова макроса.

Ru-navigator-form.png

Для того, что бы фильтр работал, в форме должен быть включен «Анализ команд SQL».

Ru-form-settings.png

Вариант 2. Использование параметризованного запроса.

Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. Рассмотрим такой запрос:

SELECT "ID" AS "ID",

"Наименование" AS "Наименование",

"Периодичность" AS "Периодичность",

"Сумма" AS "Сумма",

"ДатаНачала" AS "ДатаНачала",

"ДатаОкончания" AS "ДатаОкончания"

FROM "Доходы" AS "Доходы"

WHERE

( YEAR( "ДатаНачала" ) <= :CurrentYear OR YEAR( "ДатаНачала" ) IS NULL ) AND

( YEAR( "ДатаОкончания" ) >= :CurrentYear OR YEAR( "ДатаОкончания" ) IS NULL )

ORDER BY "ID" ASC

Параметром запроса является переменная CurrentYear.

Параметризованный запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «Данные» необходимо задать связи полей субформы и главной формы.(Замечу что в данном варианте можно отключить «Анализ команд SQL»).

Ru-form-settings-1.png

Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей».

File:Ru-link-fields.png

Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так:

Ru-income-table-form-1.png

Собственно фильтрация уже будет работать, но данные в подчиненной форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, опять придётся писать макрос:

Sub changeCurrentYear(oEvent)

Dim oControl 'Элемент управления - источник сообщения

Dim oModel 'модель элемента управления - источника сообщения

Dim oForm 'Главная форма

Dim oSubForm 'Подчиненная форма


oControl = oEvent.Source

oModel = oControl.getModel()

oForm = oModel.getParent()

oSubForm = oForm.getByName("SubForm")

oModel.commit() 'устанавливаем новое значение в соответствующее поле формы

oSubForm.reload()

End Sub

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

Sub changeCurrentYear(oEvent)

Dim oControl 'Элемент управления - источник сообщения

Dim oModel 'модель элемента управления - источника сообщения

Dim oForm 'Главная форма


oControl = oEvent.Source

oModel = oControl.getModel()

oForm = oModel.getParent()

oModel.commit() 'устанавливаем новое значение в соответствующее поле формы

oForm.updateRow()

oForm.reload()

End Sub

Вариант 3. Совсем без макросов.

Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить».

File:Ru-income-table-form-2.png

Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления.

Ru-navigator-form-1.png

У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму».

Ru-button-settings.png

Теперь фильтрация в табличке будет происходить при нажатии на кнопку «Обновить».

Personal tools