Difference between revisions of "Base: Самодельная "фильтрация" в формах"

From Apache OpenOffice Wiki
Jump to: navigation, search
m (Вариант 2. Использование параметризованного запроса.)
Line 8: Line 8:
  
 
[[File:ru-paper-form.png]]
 
[[File:ru-paper-form.png]]
 +
  
 
Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос:
 
Для обеспечения этой функциональности на событие «Текст изменен» текстового поля необходимо повесить следующий макрос:
  
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
  
 
Так как в макросе вызывается конструкция 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. Использование параметризованного запроса.===
Line 44: Line 47:
 
Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. Рассмотрим такой запрос:
 
Вместо того чтобы задавать условие фильтрации в тексте макроса это условие можно задать в тексте параметризованного запроса. Этот способ более удобен для сложных условий фильтрации. Рассмотрим такой запрос:
  
SELECT "ID" AS "ID",  
+
:SELECT "ID" AS "ID",  
  
"Наименование" AS "Наименование",  
+
:: "Наименование" AS "Наименование",  
  
"Периодичность" AS "Периодичность",  
+
:: "Периодичность" AS "Периодичность",  
  
"Сумма" AS "Сумма",  
+
:: "Сумма" AS "Сумма",  
  
"ДатаНачала" AS "ДатаНачала",  
+
:: "ДатаНачала" AS "ДатаНачала",  
  
"ДатаОкончания" AS "ДатаОкончания"  
+
:: "ДатаОкончания" AS "ДатаОкончания"  
  
FROM "Доходы" AS "Доходы"  
+
:FROM "Доходы" AS "Доходы"  
  
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
  
 
Параметром запроса является переменная CurrentYear.
 
Параметром запроса является переменная CurrentYear.
Line 71: Line 74:
  
 
[[File:ru-form-settings-1.png]]
 
[[File:ru-form-settings-1.png]]
 +
  
 
Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей».
 
Если нажать на кнопку «…» у свойства «Связь с главным полем» или «Связь с подчиненным полем» поднимется диалог «Связь полей».
  
 
[[File:ru-link-settings.png]]
 
[[File:ru-link-settings.png]]
 +
  
 
Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так:
 
Название параметра запроса в списке полей отсутствует, его приходится вводить вручную. Редактируемая форма выглядит вот так:
  
 
[[File:ru-income-table-form.png]]
 
[[File:ru-income-table-form.png]]
 +
  
 
Собственно фильтрация уже будет работать, но данные в подчиненной форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, опять придётся писать макрос:
 
Собственно фильтрация уже будет работать, но данные в подчиненной форме будут обновляться только тогда, когда будет меняться запись в главной форме. Для того, чтобы табличка обновлялась при редактировании текстового поля, опять придётся писать макрос:
  
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
+
:End Sub
  
 
В том случае, если изменение текстового поля можно сразу сохранять в базу, макрос может выглядеть так:
 
В том случае, если изменение текстового поля можно сразу сохранять в базу, макрос может выглядеть так:
  
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
  
 
===Вариант 3. Совсем без макросов.===
 
===Вариант 3. Совсем без макросов.===
Line 137: Line 143:
  
 
[[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:Документация]]

Revision as of 08:44, 1 October 2009

Самодельная фильтрация в формах.

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

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

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

Параметризованный запрос можно использовать в субформах. Для этого в настройках субформы на вкладке «Данные» необходимо задать связи полей субформы и главной формы.(Замечу что в данном варианте можно отключить «Анализ команд 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


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

Personal tools