Difference between revisions of "RU/kb/00000359"
(Корректировка кода) |
m (moved RU/kb/50000002 to RU/kb/00000359) |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 62: | Line 62: | ||
Параметрический запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «'''Данные'''» необходимо задать связи полей субформы и главной формы. | Параметрический запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «'''Данные'''» необходимо задать связи полей субформы и главной формы. | ||
− | {{ | + | {{Note|В данном варианте можно отключить «Анализ команд SQL».}} |
[[File:ru-form-settings-1.png]] | [[File:ru-form-settings-1.png]] | ||
Line 137: | Line 137: | ||
− | {{ | + | {{SignYear|Sancho|А. Е. Харламенков|2009}} |
{{RUkbBaseBottom}} | {{RUkbBaseBottom}} |
Latest revision as of 17:23, 17 September 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.
Параметрический запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «Данные» необходимо задать связи полей субформы и главной формы.
Если щёлкнуть по кнопке […] у свойства «Связь с главным полем» или «Связь с подчинённым полем» откроется диалог «Связь полей».
Название параметра запроса в списке полей отсутствует, его требуется вводить вручную. Редактируемая форма выглядит следующим образом:
Собственно, "фильтрация" уже будет работать, но данные в подчинённой форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, следует создать макрос:
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. Без макросов
Этот вариант работает с параметрическим запросом. Создаём форму с параметризованным запросом как во втором варианте. При этом создавать макрос не требуется. В документ добавляем кнопку «Обновить».
Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления.
У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму».
Теперь фильтрация в таблице будет происходить при нажатии на кнопку «Обновить».