Difference between revisions of "RU/kb/50000002"
(section begin=title) |
(Корректировка кода) |
||
Line 1: | Line 1: | ||
− | <section begin=title /><noinclude>{{DISPLAYTITLE:База Знаний: | + | <section begin=title /><noinclude>{{DISPLAYTITLE:База Знаний: {{OOoB|1}}. </noinclude>Фильтрация данных в табличных элементах управления<noinclude>}}</noinclude><section end=title /> |
{{BreadCrumbL10n|RU/kb/module/base/forms}} | {{BreadCrumbL10n|RU/kb/module/base/forms}} | ||
__NOTOC__ | __NOTOC__ |
Revision as of 22:37, 22 January 2011
Если, при фильтрации данных в табличных элементах управления, по каким либо причинам навигатор фильтров использовать не целесообразно, следует поля для задания фильтров размещать в том же документе что и табличный элемент управления. При этом, для того чтобы фильтр заработал, обычно, требуется создать макрос. Рассмотрим несколько вариантов реализации фильтров.
Вариант 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.
Параметрический запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «Данные» необходимо задать связи полей субформы и главной формы. Template:Documentation/Note
Если щёлкнуть по кнопке […] у свойства «Связь с главным полем» или «Связь с подчинённым полем» откроется диалог «Связь полей».
Название параметра запроса в списке полей отсутствует, его требуется вводить вручную. Редактируемая форма выглядит следующим образом:
Собственно, "фильтрация" уже будет работать, но данные в подчинённой форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, следует создать макрос:
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. Без макросов
Этот вариант работает с параметрическим запросом. Создаём форму с параметризованным запросом как во втором варианте. При этом создавать макрос не требуется. В документ добавляем кнопку «Обновить».
Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления.
У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму».
Теперь фильтрация в таблице будет происходить при нажатии на кнопку «Обновить».
Vpanarin
2009