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 – поле связи индекса главной таблицы.
Алгоритм установки связи
Индексация по полям связи: в Database Desktop в окне Table Properties/Secondary Indexes/Define и сохранить (у child).
Установление ссылочной целостности: в Database Desktop в окне Table Properties/Referential Integrity/Define выбрать главную таблицу и внешний ключ подчиненной (child) и связь сохранить.
Организация связи Master – Detail (3 способа рассмотрены в Пособии) программно:
Table1.DatabaseName := 'proba'; //выбор псевдонима
Table1.TableName := 'tovar.db';//связь компонента доступа с таблицей
DataSource1.DataSet := Table1;//связь ком-та доступа с к-том связи
DBGrid1.DataSource := DataSource1;//к-та связи с к-том отображения
Table1.Open; //открытие набора данных
Table2.DatabaseName := 'proba';
Table2.TableName := 'prixod.db';
DataSource2.DataSet := Table2;
DBGrid2.DataSource := DataSource2;
Table2.MasterSource := DataSource1; //связывание с источником
Table2.Indexname := 'in_tov_prih'; //по индексному ключу
Table2.MasterFields := 'Tovar'; //данного поля
Table2.Open;
Модификация данных
Модификация данных непосредственно в таблицах нежелательна, т.к. это может привести к непредсказуемым событиям.
Модификация данных проводится только через отдельные формы данных с верификацией вводимых данных:
введения ограничений на диапазон данных,
проверка типа вводимых данных,
обработка исключительных ситуаций Try…Except, Try…Finaly.
Компонент Query
Обеспечивает реляционный способ доступа к данным, выборку данных удовлетворяющих запросу.
Name - имя компонента, используется компонентом DataSource для связи результата выполнения запроса с компонентом, обеспечивающим просмотр записей, например, DBGrid.
SQL - записанный на языке SQL запрос к БД,
Active - при значении True активизирует выполнение запроса.
Компонент Query: TDataSet очень похож на компонент Table.
Он также представляет данные в виде таблицы, колонки которой описываются компонентами TField.
Однако таблица компонента Query - логическая, формируется в результате SQL- запроса и может быть объединением нескольких физических таблиц.
Отличается от компонента Table:
нет идентификации таблицы свойства TableName (делается через SQL-запрос),
не содержит методов управления файлами, т.к. SQL-запрос обращается к таблицам сам,
нет смысла индексировать (делается в SQL-запросе),
нет механизма связи Master – Detail (делается в SQL-запросе).
SQL-запрос можно отладить в :
В программе SQL Explorer на вкладке Enter SQL,
В программе Database Desktop составить QBE-запрос и текст запроса посмотреть в окне SQL Editor, выполнив команду Query/Show SQL,
В построителе запросов SQL Builder, вызываемом из контекстного меню компонента Query.
Инициализация запроса:
В свойстве SQL компонента Query записать текст запроса и присвоить свойству Active = True.
При выполнении программы в таблице будет информация, соответствующая SQL-запросу.
Но лучше это осуществлять программно, используя метод Open для компонента Query при создании формы.
Виды SQL – запросов:
Статический – запрос включается в исходный код программы на этапе разработки и в процессе выполнения приложения не меняется.
Динамический – формируется или изменяется при выполнении приложения.
Такие запросы применяются, когда требуется учитывать действия пользователя.
Программная реализация SQL - запроса
Query1.Close; //закрывает предыдущий запрос
Query1.SQL.Clear; //удаляет предыдущий запрос
Query1.SQL.Add(Edit1.Text);//считывает запрос из поля Edit1.Text
Query1.Open; //открывает файл запросов