Ограничения вводимых значений
Несколько возможноcтей ограничений вводимых значений предоставляют свойства полей:
Ø Для числовых полей имеются свойства MinValue и Maxvalue. При нарушении этих пределов будет генерироваться исключение EDatabaseError, которое лучше перехватывать в приложении, чтобы выдавать пользователю сообщение на русском языке. например, если требуется принимать на работу сотрудников от 20 до 30 лет, можно установить для поля Year_b ограничения MinValue=1970 и Maxvalue=1980.
Ø Можно использовать свойства CustomConstraint, которое позволяет написать ограничение на значение поля в виде строки SQL, например: (Year_b>1970) and (Year_b<1980). Свойство ConstraintErrorMessage содержит строку текста, который будет показан пользователю в случае, если он вводит данные, не удовлетворяющие поставленным ограничениям, например: «Возраст претендента на должность не подходит». Это свойство подходит не только к числовым полям.
Ø Можно использовать обработку события поляonValidate. Это событие возникает перед записью введенного значения поля в буфер записи. Тут можно предусмотреть любые проверки, при появлении недопустимых значений выдать пользователю сообщение.
Если все нормально, то после события onValidate возникает еще событие onСhange, в обработчике которого тоже еще не поздно сгенерировать исключение.
Есть возможность осуществлять проверку на уровне записи, анализируя различные ее поля. Для этого используется свойство Constraints компонента Table. При выборе этого свойства в Инспекторе объектов открывается окно, в котором, щелкая на кнопке Add можно занести набор ограничений, каждое из которых является самостоятельным объектом со свойствами CustomConstraint (строка SQL, определяющая допустимые ограничения) и ErorMessage (строка текста, которая будет представлена пользователю в случае нарушения ограничений). Например: «Принимаем только мужчин > 1955 г.р. и женщин > 1965 г.р.».
Вычисляемые поля
Создадим вычисляемое поле, значение которого вычисляется на основании значений других полей записи. Например, поле, вычисляющее возраст сотрудника по году его рождения:
Ø Вызвать Редактор полей двойным щелчком на Table1. Из контекстного меню Редактора полей выбрать раздел New. Появится окно добавления нового поля в разделе Field Properties (свойства поля) нужно указать:
_ имя поля (Name) – назовем его Age
_ тип данных (Type) – Smallint;
_ и для некоторых типов (например, для строк) – размер (Size).
Ø В группе радиокнопок Field Type выбрать Calculated.
Ø Нажать на кнопку OK и вернуться в окно Редактора полей, там появится новое поле Age. Изменить для этого поля в Инспекторе объектов значение DisplayLabel на «Возраст».
Ø Чтобы указать функцию вычислений надо выйти из Редактора полей, выделить Table1, перейти в Инспектор объектов и задать обработчик события OnCalcFields, которое наступает каждый раз, когда нада обновить значение вычисляемых полей таблицы. В этом обработчике можно использовать функцию DecodeDate для преобразования ее первого аргумента, имеющего тип TDateTime, в целые значения года, месяца и дня.
Следующий программный код можно использовать, чтобы отобразить текущие значения года, месяца, дня, часа, минуты, секунды, миллисекунды из функции Now, которая возвращает значение текущих даты и времени: Date + Time:
Фильтрация данных
Компонент Table позволяет также отфильтровывать данные по определенным критериям с использоваием свойств: Filter, Filtered, FilterOptions.
Свойство Filtered включает или выключает использование фильтра.
В свойстве Filter записывается сам фильтр в виде строки, содержащей ограничения на значения полей. Например, если свойство Filtered=trueи в свойстве Filterзаписано:
Ø Dep=’Цех 1’, то в таблице отобразятся только те записи, в которых поле Dep имеет значение ’Цех 1’
Ø Dep=’Цех *’ – отображение всех записей, в которых значение поля Dep начинается с ’Цех’ (При этом опция foNoPartialCompare свойства FilterOptions должно быть false). Свойство FilterOptionsсодержит опции foNoPartialCompare(=true – запрещает частичное совпадение при сравнении) и foCaseInsentitive – делает сравнение строк нечувствительным к региситру (если включить эту опцию, то «Цех 1» и «цех 1» будут считаться идентичными).
Ø При записи условий можно использовать операции отношения =,>,>=,<,<=,<>, а также логические операции and, or, not. Фильтр:
(Dep=’Цех 1’) and (Year_b<=1970) and (Year_b>=1940)
отобразит сотрудников цеха 1, чей год рождения лежит в заданных пределах. Но использовать в фильтре имена вычисляемых полей (например, поля Age) не разрешается.
Добавим в приложение возможность фильтрации отображаемых записей по отделам, по возрасту и по обоим критериям:
Ø Перенесем на форму группу радиокнопок RadioGroup (Name=RGF). Зададим в редакторе свойству RGF->Items строки: Нет, Все, Отдел, Возраст. RGF->ItemIndex==1, RGF->Columns=2, RGF->Caption=Фильтрация
Ø Перенесем на форму выпадающий список ComboBox (Name=CBDep) для выбора подразделения, по которому производится фильтрация. В свойство CBDep->Items занести список имен подразделений.
Ø Два элемента SpinEdit со страницы Samples (Name=SEmin и SEmax) для задания диапазона возраста при фильтрации. Задать в этих компонентах соотвествующие значения MaxValue, MinValue, Value.
Ø Кнопку с заголовком «Обновить».
Ø Фильтрация в приложении должна проводиться при следующих событиях:
o щелчок в группе радиокнопок RGFClick (его текст приведен ниже, для остальных событий проводится делегирование),
o при событии OnChange выпадающего списка отделов
o щелчок на кнопке «Обновить» (при изменении диапазона возраста).