Поиск данных
Begin
Фильтрация данных
Фильтрация – выделение подмножества данных по какому-либо условию.
Записи можно отфильтровать по выражению либо диапазону.
Свойство Filtered компонента Table включает и отключает фильтрацию, а сам фильтр записывается в свойство Filterстрокового типа:
Table1.Filter := '<имя_поля>=<значение>';
Можно записать:
case RadioGroup1.ItemIndex of
0: Table1.Filter := 'Adres=''Пермь''';
1: Table1.Filter := 'Adres=''Москва''';
2: Table1.Filter := 'Adres=''Ижевск''';
end;
И в зависимости от выбранной кнопки будет произведена фильтрация по тому или иному значению.
Пример: удалить из связанных таблиц указанный товар
s := Table1.FieldByName('Tovar').AsString;//выделено наименова
//по данному наименованию фильтруют подчиненную таблицу
Table2.Filtered := True;
Table2.Filter := 'Tovar=' + '''' + s + '''' ;//если там записей нет, то выходит
If Table2.RecordCount = 0 then exit;
//если есть записи, то удаляет весь отфильтрованный набор данных
if Table2.RecordCount > 0 then
For i :=1 to Table2.RecordCount do Table2.Delete;
end;
Table1.Delete; //удаляют запись в главной таблице
end;
Table2.Filtered := false; //отключает фильтр
LookUp(const KeyFields : string;
const KeyValues : variant;
const ResultFields : String) : Variant; -
метод предназначен для поиска значения ResultFields в записи с ключевым полем KeyFields = KeyValues.
Res := Table1.Lookup('Id', 2, 'Name');
Если ни одна запись набора не удовлетворяет заданному условию, то результат NULL.
Locate (const KeyFields : string;
const KeyValues : variant;
Options : TLocateOptions ) : Boolean; -
метод делает текущей самую первую запись набора данных, для которой выполнились условия совпадения значения KeyValues ключевого (индексированного!!!) поля KeyFields при опциях
loCaseInsensitive – без учета регистра,
loPartialKey – частичного совпадения.
Пример:
If not Table1.Locate('name', Edit1.Text, [loPartialKey, loCaseInsensitive ])
Then ShowMessage('Заданная строка не найдена');
Здесь поиск производится по не полному соответствию, а по частичному, т.е. достаточно ввести один символ, чтобы вывести записи, начинающиеся с этого символа, в противном случае - указанное сообщение.
Работа со связанными таблицами
Связь между таблицами организуется через поля связи.
Поля связи должны быть индексированы.
Связь между таблицами обычно вида 1:М, т.е. одна – главная, другая – подчиненная (Parents – Child).
После установки связи при перемещении указателя в главной таблице автоматически становятся доступны в подчиненной таблице записи, у которых значения внешнего ключа совпадает со значением первичного ключа главной таблицы.
Существуют требования к обеспечению целостности отношения.
Целостность сущностей — каждое отношение должно описывать экземпляры только одной сущности и обладать первичным ключом (parent’s key).
Другими словами, отношения должны быть нормализованы, и в их физических реализациях (таблицах) не должно быть одинаковых записей.
Ссылочная целостность — связываемые отношения должны иметь общие атрибуты (поля).
Существует 3 механизма обеспечения ссылочной целостности.
1. Запрещающий (prohibit) — нельзя изменять значение ключа родителя или удалять его, если ему соответствуют записи в дочерней таблице.
2. Каскадное удаление (cascade):
• при изменении значения ключа родительской таблицы автоматически изменяет соответствующие значения в дочерней таблице;
• удалить записи родительской таблицы можно лишь в том случае, если удалены зависимые записи в дочерней таблице.
3. При удалении записи, на которую имеются ссылки, во всех ссылающихся записях значение ключа автоматически становится неопределенным.
Для организации связи между таблицами в подчиненной таблице используют свойства
MasterSource : TDataSource – источник данных главной таблицы,
IndexName – текущий индекс подчиненный таблицы,
IndexFieldNames – поле связи текущего индекса подчиненной таблицы,
MasterField : String – поле связи индекса главной таблицы.