How-to: Фильтрация и сортировка
Пример 1
Условие
Есть остатки книг на складах.
CLASS Book 'Книга';
name 'Наименование' = DATA ISTRING[100] (Book);
CLASS Stock 'Склад';
name 'Наименование' = DATA ISTRING[100] (Stock);
// для примера сделано первичным свойством, хотя обычно оно вычисляемое
balance 'Остаток' = DATA INTEGER (Book, Stock);
Необходимо создать форму для отображения остатков книг на заданном складе в алфавитном порядке.
Решение
FORM onStockObject 'Остатки'
OBJECTS s = Stock PANEL
PROPERTIES(s) name SELECTOR
OBJECTS b = Book
PROPERTIES READONLY name(b), balance(b, s)
ORDERS name(b)
// Вариант 1
FILTERS balance(b, s)
// Вариант 2
FILTERGROUP bal
FILTER 'С поло жительным остатком' balance(b, s) > 0 'F10'
FILTER 'С отрицательными остатком' balance(b, s) < 0 'F9'
FILTER 'С остатком' balance(b, s) 'F8' DEFAULT
FILTER 'Без остатка' NOT balance(b, s) 'F7'
;
Вариант 1 устанавливает принудительный фильтр, который пользователь не сможет снять. Вариант 2 дает пользователю возможность выбирать между предопределенными критериями (по умолчанию будет использоваться тот, для которого установлена опция DEFAULT
).
Пример 2
Условие
Аналогично Примеру 1.
Необходимо создать форму для отображения остатков книг на нескольких складах, с возможностью фильтрации по одному складу. Сортировка должна быть сначала по складу, а внутри по наименованию книги.
Решение
filterStock = DATA LOCAL Stock ();
nameFilterStock 'Склад' = name(filterStock());
FORM onStockLocal 'Остатки'
PROPERTIES() nameFilterStock
OBJECTS sb = (s = Stock, b = Book)
PROPERTIES READONLY name(s), name(b), balance(b, s)
ORDERS name(s), name(b)
FILTERS s == filterStock() OR NOT filterStock()
;
В данном случае, склад нельзя объявлять через конструкцию OBJECTS
, поскольку тогда не будет возможности не указывать склад для фильтрации.