Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Основные операции с записями






Кроме средств реляционного доступа к базе (SQL), имеются более гибкие средства навигационного доступа к базе, манипулирующие отдельными записями при выполнении программы. Недостатком навигационного доступа является перегрузка сети из‑ за копирования таблиц. Поэтому такой доступ лучше применять к локальным базам.

Создание таблицы рассмотрим на примере.

Procedure TForm1.Button1Click(Sender: TObject); //кнопка создания

Begin With Table1 do //присоединение имени размещенной таблицы Table1

Begin Active: =False; {закрытие} Databasename: ='Stroiki'; {имя базы} TableName: ='Goroda'; {имя таблицы}TableType: =ttParadox; {тип СУБД}

FieldDefs.Clear; IndexDefs.Clear; //удаление всех полей и индексов

//метод добавления поля Add(‘< имя> ’, < тип: TFieldType>, < обязательное>)

FieldDefs.Add('Kg', ftInteger, 0, True); //добавление обязательного поля Kg

FieldDefs.Add('Ng', ftString, 0, True); //добавление обязательного поля Ng

IndexDefs.Add('', 'Kg', [ixPrimary, ixUnique]); //добавление первичного инд.

IndexDefs.Add('IndNg', 'Ng', [ixCaseInsensitive]); //добав. втор. инд. IndNg

CreateTable; {создание таблицы} IndexName: ='IndNg'; {текущий индекс}

Active: =True; {открытие таблицы} end; end;

Удаление таблицы производится методом DeleteTable.

Переименованиетаблицы производится методом RenameTable(S).

Блокировка/разблокировка таблицы устанавливается методом:

LockTable/UnLockTable(ltReadLock | ltWriteLock).

Сортировка таблицы устанавливается текущим индексом через свойства IndexName или IndexFieldName (для первичного ключа, ‘Kz; Ns’).

Перемещение по записям реализуется методами: First(первая), Last(последняя), Next(следующая), Prior(предыдущая), MoveBy(N) (пропустить N записей вперед или назад, если N< 0). При перемещении учитываются фильтры и ограничения. Установка на запись под номером N задается свойством таблицы RecNo: =N.

Использование закладок с адресами записей поясним на примере.

Var zakl: TBookmark //объявление переменной ‑ закладки

Begin Table1.DisabledControls; //откл. визуальных компонентов (п. 3.4.1)

zakl: =Table1.GetBookmark; //создание закладки с адресом текущей записи

If Table1.BookmarkValid(zakl) Then //проверка наличия закладки

Begin...Table1.GotoBookmark(zakl); //переход на запись по закладке

... Table1.FreeBookmark(zakl); {удаление закладки}

Table1.EnabledControls; {подкл. визуальных компонентов (п. 3.4.1)}...End;

Фильтрация по выражению реализуется заданием свойства Filter. Имена полей с пробелами заключаются в квадратные скобки. Если в конце символьной константы указать символ «*», то при сравнении учитываются только первые символы (Ns=’Дом*’). Обработчик события OnFilterRecord используется, если условие не может быть задано в виде выражения. Для активизации/деактивизации фильтра используется свойство Filtered. Дополнительные параметры фильтра задаются свойством FilterOptions: foCaseInsensitive (регистр не учитывается), foNoPartialCompare (полное соответствие строк при сравнении и символы «*» не учитываются).

Фильтрация по диапазону значений индексных полей методом SetRange([< начало> ], [< конец> ]) обладает большей скоростью. Первому и второму параметру ‑ массиву присваиваются начальные и конечные значения диапазона (для строк учитываются только первые символы). Если полей индекса несколько, то границы перечисляются через запятую. Свойство KeyExclusive=True исключает граничное значение диапазона.

Пример фильтрации по диапазону значений кодов заказчиков строек:

procedure TForm1.Button1Click(Sender: TObject); //кнопка фильтрации

begin With Datamodule2.Stroiki do begin //присоединение имени таблицы

Open; {открыть}IndexName: ='IndKz'; {переход на индекс под именам IndKz}

CancelRange; {отмена фильтрации}SetRange([2], [3]); {фильтрация}End; End;

Пример фильтрации по двум полям индекса: специальности «Токарь» и зарплате: Kadri.SetRange([‘Токарь’, 2000], [‘Токарь’, 10000])

Поиск записейметодами Locate и LookUp

Locate(S, V: Variant, P): Boolean ‑ поиск первой записи и установка ее в качестве текущей. Список имен полей и их значений для искомых записей в параметрах S, V. Последний параметр задает режимы: loCaseInsensitive (регистр не учитывается), loPartialKey (частичное совпадение значений). При успешном поиске возвращается True.

Примеры:

If not Datamodule2.Stroiki.locate('kz', 5, []) then ShowMessage('Нет записи');

Datamodule2.Stroiki.Locate('Kz; Kp', VarArrayOf([1, 4]), []); //два поля

LookUp(S, V: Variant, S2): Variant ‑ поиск первой записи и считывание значений полей, перечисленных в S2; возвращение их значения в массиве типа Variant, не перемещая указатель текущей записи. При отсутствии записи возвращается пустое значение (функция VarIsNull() (п. 1.1.7)).

Пример поиска по трем полям:

Var R: Variant;... Begin...

R: =Datamodule2.Stroiki.LookUp('Kz; Kp', VarArrayOf([1, 1]), 'Ns; Kz; Kp');

If not VarIsNull(R){не пустое значение (п.1.1.7)} Then Label1.Caption: =R[0];

Поиск записей по индексным полям текущего индекса

FindKey(KeyValues: array of const): Boolean ‑ точный поиск записи по значениям индексных полей (массив KeyValues).

Пример поиска записи по индексу с полями Kz=2, Kp=1:

Procedure TForm1.Button1Click(Sender: TObject); //обработчик поиска

Begin Datamodule2.Stroiki.Active: =True; With Datamodule2.Stroiki do

Begin IndexFieldNames: ='Kz; Kp'; //установка текущего индекса

If FindKey([2, 1]) Then Label1.Caption: =FieldValues['Ns']; End; End;

FindNearest -приближенный поиск, аналогичный предыдущему, но при отсутствии записи делает текущей запись, ближайшую к отсутствующей.

Свойство KeyFieldCount указывает число первых полей индекса, участвующих в поиске.

Изменение таблицы (включение, удаление и изменение записей). Возможность изменения таблицы или запроса из одной исходной таблицы задается свойствами ReadOnly=False, RequestLive=True. Для проверки возможности изменения таблицы можно использовать свойство CanModify(True). Можно запретить изменения отдельных полей. Для изменения таблицы визуальными компонентами (DBEdit, DBGRid) нужно указать свойство AutoEdit=True для источника данных DateSource. Для учета изменений в окнах форм следует периодически выполнять метод Refresh.

Редактирование текущей записи производится в последо­ва­тель­ности: проверить свойство CanModify=True и выполнить метод Edit (If Table1.CanModify Then Table1.Edit); изменить значения нужных полей; подтвердить или отменить изменения методами Post или Cancel. При переходе к другой записи подтверждение выполняется автоматически. При невозможности подтверждения генерируется исключительное состояние OnPostError. Метод SetFields (Values: Array of const) позволяет заменить значения поля элементами массива Value. Если указать значение Nil, то соответствующее поле сохранит текущее значение. Порядок и типы элементов массива должны соответствовать порядку и типам полей записи (Table1.SetFields([Nil, ’Химмаш’, Nil, 1234]). После выполнения метода таблица возвращается в режим просмотра.

Добавление записей производится в последо­ва­тель­ности: проверить свойство CanModify и выполнить один из методов Insert, InsertRecord, Append, AppendRecord; отредактировать новую добавленную текущую запись. Метод Insert добавляет пустую запись перед текущей записью. Метод InsertRecord объединяет методы Insert и SetFields. Методы Append и AppendRecord аналогичны методам Insert и InsertRecord, но вставляют запись в конец таблицы.

Физическое удаление текущей записи производится методом Delete, и после удаления текущей записью будет следующая запись после удаленной. При возникновении ошибки при удалении генерируется исключительная ситуация OnDeleteError.

Работа со связанными таблицами имеет следующие особенности.

1. Поля связи должны быть индексированными.

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

3. При удалении записи родительской таблицы нужно удалить все соответствующие записи в дочерних таблицах (каскадное удаление)

4. При добавлении записи в дочернюю таблицу поля связи формируются автоматически по значению поля связи родительской таблицы.

При разработке приложения следует обеспечить организацию связи между таблицами, каскадное удаление записей и редактирование полей связи. Для организации связи в дочерней таблице используются свойства: MasterSource(источник данных родительской таблицы, например: SourceStroiki), IndexName (текущий индекс дочерней таблицы), IndexFieldNames(поле или имя связи текущего индекса дочерней таблицы, Kp), MasterFields(поле или имя связи индекса родительской таблицы, Kp).

Механизм транзакций позволяет перевести базу для клиент‑ сер­вер­ной СУБД (п. 3.14) из одного целостного состояние в другое целостное состояние. Метод StartTransaction начинает транзакцию, и все изменения будут накапливаться в оперативной памяти без вывода их в базу. Метод Commit завершает транзакцию, и все изменения выводятся в базу. При возникновении исключительной ситуации методом RollBack можно отменить транзакцию и сохранить исходное состояние базы на начало транзакции. До выполнения метода Commit сохраняется исходное сос­тояние базы. Указанные методы относятся к компоненту DataBase (п. 3.14).

Примерная схема использования транзакций для объекта DataBase1:

Database1.Starttransaction; //начало транзакции для базы (объект DataBase1)

Try < включение, удаление или редактирование записей> Database1.Commit

Exception Database1.Rollback; {отмена транзакции при ошибках} End.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.