Difference between revisions of "RU/kb/00000359"

From Wiki
Jump to navigationJump to search
(удалён лишний элемент)
(RUsignyear)
Line 137: Line 137:
  
  
{{RU/documentation/signyear||Vpanarin|2009}}
+
{{RUsignyear||Vpanarin|2009}}
 
{{KbBaseBottom}}
 
{{KbBaseBottom}}

Revision as of 00:10, 29 August 2010

База Знаний: Base. Формы


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

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

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

Ru-paper-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", 
	"Наименование", 
	"Периодичность", 
	"Сумма", 
	"ДатаНачала", 
	"ДатаОкончания"
FROM "Доходы"
WHERE 
	( YEAR( "ДатаНачала" ) <= :CurrentYear OR YEAR( "ДатаНачала" ) IS NULL ) AND 
	( YEAR( "ДатаОкончания" ) >= :CurrentYear OR YEAR( "ДатаОкончания" ) IS NULL ) 
ORDER BY "ID" ASC

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

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

Documentation note.png В данном варианте можно отключить «Анализ команд SQL».

Ru-form-settings-1.png


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

Ru-link-settings.png


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

Ru-income-table-form.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. Без макросов

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

Ru-income-table-form-1.png


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

Ru-navigator-form-1.png


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

Ru-button-settings.png


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



Template:RUsignyear Template:KbBaseBottom