Difference between revisions of "Base: Самодельная "фильтрация" в формах"
| Line 111: | Line 111: | ||
| </source> | </source> | ||
| − | ===Вариант 3.  | + | ===Вариант 3. Без макросов.=== | 
| Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить». | Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить». | ||
Latest revision as of 04:54, 2 October 2009
Самодельная "фильтрация" в формах.
Часто возникает задача фильтрации данных в табличных элементах управления. При этом по каким либо причинам навигатор фильтров использовать не хочется. В этом случае поля для задания фильтров размещаются в том же документе что и табличный элемент управления. Но для того чтобы фильтр заработал обычно приходится программировать. Рассмотрим несколько вариантов реализации фильтров.
Вариант 1. Использование свойства формы «filter».
Это классический вариант использования фильтров. С его помощью удобно реализовывать функциональность поиска по начальным буквам.
Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос:
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(), то текстовое поле необходимо располагать в другой форме. Иначе оно будет сбрасываться после каждого вызова макроса.
Для того, что бы фильтр работал, в форме должен быть включен «Анализ команд SQL».
Вариант 2. Использование параметризованного запроса.
Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. Строго говоря к механизму фильтрации этот способ отношения не имеет, он основан на механизме форм "мастер-подчиненный". Но с точки зрения конечного пользователя разницы практически нет.
Рассмотрим такой запрос:
SELECT  "ID", 
	"Наименование", 
	"Периодичность", 
	"Сумма", 
	"ДатаНачала", 
	"ДатаОкончания"
FROM "Доходы"
WHERE 
	( YEAR( "ДатаНачала" ) <= :CurrentYear OR YEAR( "ДатаНачала" ) IS NULL ) AND 
	( YEAR( "ДатаОкончания" ) >= :CurrentYear OR YEAR( "ДатаОкончания" ) IS NULL ) 
ORDER BY "ID" ASC
Параметром запроса является переменная CurrentYear.
Параметризованный запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «Данные» необходимо задать связи полей субформы и главной формы.(Замечу что в данном варианте можно отключить «Анализ команд SQL»).
Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей».
Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так:
Собственно "фильтрация" уже будет работать, но данные в подчиненной форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, опять придётся писать макрос:
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. Без макросов.
Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить».
Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления.
У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму». 
Теперь фильтрация в табличке будет происходить при нажатии на кнопку «Обновить».










