jskonst

A blogging framework for hackers.

Фильтрация данных

В этом разделе будет представлен небольшой пример “фильтрации” данных. Предположим, мы хотели бы добавить возможность пользователю фильтровать своих питомцев по типам – только кошки, собаки и т.д. Для этого в окне пользователя следует добавить связанный элемент управления – справочник, как представлено на рис.1

form with combo

Рис.1 Дообавление меню для выбора типа животного

После этого следует видоизменить запрос списка животных таким образом, чтобы он стал включать в себя тип животного, а если тип отсутствует, то выводить полный список (рис.2)

Modify query

Рис.2 Изменение запроса, возвращающего список животных конкретного владельца

Для этого в запросе добавляем параметр, который связываем с полем TYPE таблицы PET. После чего исправляем текст запроса таким образом, чтобы в случае отсутствия параметра типа животного возвращался полный список питомцев. Следует помнить об аннотации @manual, поэтому запрос следует вызывать всякий раз, когда пользователь изменит тип животного.

Измененный текст запроса
1
2
3
4
5
6
7
8
9
10
/**
 * 
 * @author jskonst
 * @name PetsQuery
 * @manual
 */
Select *
From PET t1
 Where :owner = t1.OWNERID
 and (:petType is NULL or :petType = t1.TYPE)

Модификация запроса приведет к соответствующим изменениям в модели данных, в результате чего в запрос можно будет передавать дополнительный параметр petType. Добавим параметр модели petType, который свяжем с соответствующим параметром запроса, как показано на рис.3.

Modify model

Рис.3 Добавление параметра модели

Далее необходимо связать виджет справочник (modelCombo) с соответствующим параметром и полями таблицы модели данных petType. В свойствах виджета справочник в поле field укажем параметр модели – petType, а поля displayField and valueField укажем соответствующие поля NAME и PETTYPE_ID таблицы petTypes.

Correct Combo

Рис.4 Настраиваем параметры справочника

Поскольку в запросе указана аннотация @manual, то при изменении пользователем выбираемого животного в справочнике следует производить перевыполнение запроса. Поскольку изменение типа питомца приведет к изменению параметра модели, добавим код перевыполнения запроса в событие OnChanged параметров модели данных. На рис.3, справа представлен интерфейс установки обработчика события для параметров модели. В случае, если у запроса отсутствует аннотация @manual, то данную операцию можно не выполнять. В результате код обработчика будет иметь следующий вид:

1
2
3
4
5
6
7
function paramsOnChanged(evt) {
    if(evt.field === self.params.md.petType){
        //Если изменилось именно поле модели petType 
        //перевыполняем запрос
        self.pQuery.requery();
    }
}

Результат фильтрации представлен на рис.5 и рис.6.

Correct Combo

Рис.5 Тип питомца отсутствует

Correct Combo

Рис.6 Тип питомца – кот

Comments