Difference between revisions of "Base: Самодельная "фильтрация" в формах"
m |
|||
(8 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | ==Самодельная фильтрация в формах.== | + | ==Самодельная "фильтрация" в формах.== |
Часто возникает задача фильтрации данных в табличных элементах управления. При этом по каким либо причинам навигатор фильтров использовать не хочется. В этом случае поля для задания фильтров размещаются в том же документе что и табличный элемент управления. Но для того чтобы фильтр заработал обычно приходится программировать. Рассмотрим несколько вариантов реализации фильтров. | Часто возникает задача фильтрации данных в табличных элементах управления. При этом по каким либо причинам навигатор фильтров использовать не хочется. В этом случае поля для задания фильтров размещаются в том же документе что и табличный элемент управления. Но для того чтобы фильтр заработал обычно приходится программировать. Рассмотрим несколько вариантов реализации фильтров. | ||
Line 8: | Line 8: | ||
[[File:ru-paper-form.png]] | [[File:ru-paper-form.png]] | ||
+ | |||
Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос: | Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос: | ||
+ | <source lang="oobas"> | ||
Sub findTiker(oEvent) | Sub findTiker(oEvent) | ||
− | |||
Dim oControl 'Элемент управления - источник сообщения | Dim oControl 'Элемент управления - источник сообщения | ||
− | |||
Dim oForms 'Коллекция форм | Dim oForms 'Коллекция форм | ||
− | |||
Dim oForm 'Главная форма | Dim oForm 'Главная форма | ||
− | |||
oControl = oEvent.Source | oControl = oEvent.Source | ||
− | |||
oForms = oControl.getModel().getParent().getParent() | oForms = oControl.getModel().getParent().getParent() | ||
− | |||
oForm = oForms.getByName("MainForm") | oForm = oForms.getByName("MainForm") | ||
− | |||
oForm.Filter = "Тикер like '" & oControl.Text & "*'" | oForm.Filter = "Тикер like '" & oControl.Text & "*'" | ||
− | |||
oForm.reload() | oForm.reload() | ||
− | |||
End Sub | End Sub | ||
+ | </source> | ||
Так как в макросе вызывается конструкция oForm.reload(), то текстовое поле необходимо располагать в другой форме. Иначе оно будет сбрасываться после каждого вызова макроса. | Так как в макросе вызывается конструкция oForm.reload(), то текстовое поле необходимо располагать в другой форме. Иначе оно будет сбрасываться после каждого вызова макроса. | ||
[[File:ru-navigator-form.png]] | [[File:ru-navigator-form.png]] | ||
+ | |||
Для того, что бы фильтр работал, в форме должен быть включен «Анализ команд SQL». | Для того, что бы фильтр работал, в форме должен быть включен «Анализ команд SQL». | ||
[[File:ru-form-settings.png]] | [[File:ru-form-settings.png]] | ||
+ | |||
===Вариант 2. Использование параметризованного запроса.=== | ===Вариант 2. Использование параметризованного запроса.=== | ||
− | Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. | + | Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. Строго говоря к механизму фильтрации этот способ отношения не имеет, он основан на механизме форм "мастер-подчиненный". Но с точки зрения конечного пользователя разницы практически нет. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Рассмотрим такой запрос: | |
− | |||
− | |||
− | |||
− | |||
+ | <source lang="tsql"> | ||
+ | SELECT "ID", | ||
+ | "Наименование", | ||
+ | "Периодичность", | ||
+ | "Сумма", | ||
+ | "ДатаНачала", | ||
+ | "ДатаОкончания" | ||
+ | FROM "Доходы" | ||
WHERE | WHERE | ||
− | |||
( YEAR( "ДатаНачала" ) <= :CurrentYear OR YEAR( "ДатаНачала" ) IS NULL ) AND | ( YEAR( "ДатаНачала" ) <= :CurrentYear OR YEAR( "ДатаНачала" ) IS NULL ) AND | ||
− | |||
( YEAR( "ДатаОкончания" ) >= :CurrentYear OR YEAR( "ДатаОкончания" ) IS NULL ) | ( YEAR( "ДатаОкончания" ) >= :CurrentYear OR YEAR( "ДатаОкончания" ) IS NULL ) | ||
− | |||
ORDER BY "ID" ASC | ORDER BY "ID" ASC | ||
+ | </source> | ||
Параметром запроса является переменная CurrentYear. | Параметром запроса является переменная CurrentYear. | ||
Line 71: | Line 61: | ||
[[File:ru-form-settings-1.png]] | [[File:ru-form-settings-1.png]] | ||
+ | |||
Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей». | Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей». | ||
− | [[File:ru-link- | + | [[File:ru-link-settings.png]] |
+ | |||
Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так: | Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так: | ||
Line 80: | Line 72: | ||
[[File:ru-income-table-form.png]] | [[File:ru-income-table-form.png]] | ||
− | |||
+ | Собственно "фильтрация" уже будет работать, но данные в подчиненной форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, опять придётся писать макрос: | ||
+ | |||
+ | |||
+ | <source lang="oobas"> | ||
Sub changeCurrentYear(oEvent) | Sub changeCurrentYear(oEvent) | ||
− | |||
Dim oControl 'Элемент управления - источник сообщения | Dim oControl 'Элемент управления - источник сообщения | ||
− | |||
Dim oModel 'модель элемента управления - источника сообщения | Dim oModel 'модель элемента управления - источника сообщения | ||
− | |||
Dim oForm 'Главная форма | Dim oForm 'Главная форма | ||
− | |||
Dim oSubForm 'Подчиненная форма | Dim oSubForm 'Подчиненная форма | ||
− | |||
oControl = oEvent.Source | oControl = oEvent.Source | ||
− | |||
oModel = oControl.getModel() | oModel = oControl.getModel() | ||
− | |||
oForm = oModel.getParent() | oForm = oModel.getParent() | ||
− | |||
oSubForm = oForm.getByName("SubForm") | oSubForm = oForm.getByName("SubForm") | ||
− | |||
oModel.commit() 'устанавливаем новое значение в соответствующее поле формы | oModel.commit() 'устанавливаем новое значение в соответствующее поле формы | ||
− | |||
oSubForm.reload() | oSubForm.reload() | ||
+ | End Sub | ||
+ | </source> | ||
− | |||
В том случае, если изменение текстового поля можно сразу сохранять в базу, макрос может выглядеть так: | В том случае, если изменение текстового поля можно сразу сохранять в базу, макрос может выглядеть так: | ||
+ | |||
+ | <source lang="oobas"> | ||
Sub changeCurrentYear(oEvent) | Sub changeCurrentYear(oEvent) | ||
− | |||
Dim oControl 'Элемент управления - источник сообщения | Dim oControl 'Элемент управления - источник сообщения | ||
− | |||
Dim oModel 'модель элемента управления - источника сообщения | Dim oModel 'модель элемента управления - источника сообщения | ||
− | |||
Dim oForm 'Главная форма | Dim oForm 'Главная форма | ||
− | |||
oControl = oEvent.Source | oControl = oEvent.Source | ||
− | |||
oModel = oControl.getModel() | oModel = oControl.getModel() | ||
− | |||
oForm = oModel.getParent() | oForm = oModel.getParent() | ||
− | |||
oModel.commit() 'устанавливаем новое значение в соответствующее поле формы | oModel.commit() 'устанавливаем новое значение в соответствующее поле формы | ||
− | |||
oForm.updateRow() | oForm.updateRow() | ||
− | |||
oForm.reload() | oForm.reload() | ||
− | |||
End Sub | End Sub | ||
+ | </source> | ||
− | ===Вариант 3. | + | ===Вариант 3. Без макросов.=== |
Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить». | Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить». | ||
[[File:ru-income-table-form-1.png]] | [[File:ru-income-table-form-1.png]] | ||
+ | |||
Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления. | Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления. | ||
[[File:ru-navigator-form-1.png]] | [[File:ru-navigator-form-1.png]] | ||
+ | |||
У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму». | У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму». | ||
[[File:ru-button-settings.png]] | [[File:ru-button-settings.png]] | ||
+ | |||
Теперь фильтрация в табличке будет происходить при нажатии на кнопку «Обновить». | Теперь фильтрация в табличке будет происходить при нажатии на кнопку «Обновить». | ||
[[Category:Документация]] | [[Category:Документация]] |
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. Без макросов.
Этот вариант работает с параметризованным запросом. Создаем форму с параметризованным запросом как во втором варианте. Но макрос не пишем. В документ добавляем кнопку «Обновить».
Кнопка должна принадлежать той же форме, к которой принадлежит и табличный элемент управления.
У кнопки выставляем свойство «Тип кнопки» в значение «Обновить форму».
Теперь фильтрация в табличке будет происходить при нажатии на кнопку «Обновить».