Модификация данных и связанные таблицы в Delphi

Понятия редактирования, добавления и удаления данных можно объединить в едином понятии модификации набора данных. Модифицируемость, то есть возможность изменения набора данных, зависит от различных условий. Delphi предоставляет программисту широкие возможности ограничения модифицируемости набора данных с помощью соответствующих свойств.

 

Ярким примером наложения ограничении на модифицируемость набора данных является переключение его в режим «только для чтения». Например, если мы хотим, чтобы возможности пользователя ограничивались исключительно просмотром записей из набора данных без возможности их редактирования или занесения в них новых записей, можно использовать свойство Readonly. Данное свойство имеет по умолчанию значение false, то есть набор данных можно модифицировать. Приведенная ниже строка кода позволяет перевести набор данных Tablel в режим «только для чтения»: Table1.Readonly := true


ВНИМАНИЕ: Значение свойства Readonly можно изменять только в том случае, когда набор данных закрыт, то есть свойство Active набора данных установлено в false.

 

Заметим, что установка свойства Readonly в true ограничивает как полномочия пользователя по изменению данных, так и программные возможности, то есть в данном случае программа тоже не сможет сделать никакие изменения в наборе данных.


Практически аналогичное средство для ограничения модифицируемости набора данных имеет и набор данных Query. Для этого применяется свойство RequestLive. По умолчанию свойство Query имеет значение false, что означает доступ к набору данных в режиме «только для чтения». Для обеспечения модифицируемости набора данных нужно установить значение свойства в true.


Чтобы проверить, можно ли модифицировать набор данных, предусмотрено свойство CanModify. Это свойство имеет значение true, если набор данных можно модифицировать, и false, если нельзя.

Для редактирования текущей записи набора данных необходимо сначала перевести его в режим редактирования. Перевод набора данных в состояние редактирования можно осуществлять двумя методами:

  1. программно, с помощью метода Edit;
  2. визуально, посредством компонентов, отображающих данные, например DBGrid. 


ПРИМЕЧАНИЕ: Набор данных может автоматически переключаться в режим редактирования. Для этого нужно, чтобы значение свойства DataEdit компонента DataSource было установлено в true. Иначе с помощью визуальных компонентов изменить данные будет нельзя. 

Если набор данных является немодифицируемым (CanModify равно false), при попытке редактирования сгенерируется исключительная ситуация. Если набор данных не содержит ни одной записи, то он будет переведен в режим вставки записи.


Если набор данных является модифицируемым, то будут произведены следующие действия:

  • сгенерируется событие BeforeEdit, которое можно обработать;
  • из набора данных повторно считывается текущая запись и блокируется доступ к ней других пользователей (временно устанавливается доступ только для чтения);


ПРИМЕЧАНИЕ: Если блокирование записи невозможно (запись уже редактируется другим пользователем), генерируется исключительная ситуация. Выполнение метода Edit в данном случае прекращается.


  • если запись содержит вычисляемые поля, они пересчитываются;
  • набор данных переводится в режим редактирования;
  • генерируется событие для связанного с набором данных источника данных;
  • последним генерируется событие АfterEdit 


Для того чтобы сделанные изменения были сохранены в наборе данных, нужно вызвать метод Post, который выполняет следующие действия:

  • записывает новые данные в физическую таблицу;
  • снимает блокировку записи;
  • переводит набор данных в режим просмотра


ВНИМАНИЕ: Если при вызове метода Post набор данных не находился в режиме редактирования, то будет сгенерирована исключительная ситуация.
После модификации набора данных может возникнуть ситуация, когда изменения не отображаются в визуальных компонентах, связанных с ним.

 

В таких случаях нужно вызывать метод Refresh. Этот метод заново считывает информацию из набора данных и обновляет содержимое компонентов.
Приведем простой пример изменения данных в одном из полей набора данных (листинг 6.1).
Листинг 6.1. Изменение данных в поле Name


Если вы решили отказаться от изменений, сделанных в текущей записи, и возвратить набор данных в режим просмотра, можно воспользоваться методом Cancel. При вызове данного метода будут сгенерированы события BeforeCancel и AfterCancel.


Рассмотрим простой пример отмены сделанных изменений в текущей записи. Предположим, что для записи изменений на форме присутствует кнопка Post. Тогда обработчик нажатия этой кнопки может выглядеть так, как показано в листинге 6.2.


Листинг 6.2. Запись или отмена сделанных изменений в наборе данных


Для редактирования текущей записи можно заменить последовательность присваивания значений полей и вызовов метода Post методом SetFields.
Метод SetFields имеет один параметр Values, содержащий массив значений, которые присваиваются полям набора данных.

 

При этом порядок перечисления значений должен соответствовать порядку следования нолей в наборе данных. Если параметр Values содержит количество значений меньшее, чем число полей набора данных, то эти значения присваиваются первым полям, а остальные не будут изменены. Если вы хотите оставить значение какого-либо поля без изменений, в качестве соответствующего значения Values следует задать nil.


ВНИМАНИЕ: Ключевые слова nil и null имеют разный смысл: nil означает отсутствие значения, null подразумевает нулевое значение. 


После выполнения метода SetFields метод Post выполнять не нужно. Набор данных будет автоматически обновлен и переведен в режим просмотра.
В следующем примере изменяются значения сразу нескольких полей набора данных:


Первое и третье поля текущей записи набора данных Table1 остаются без изменений, а второе и четвертое поля изменяются назначения «Сидоров А.Е.» п 3400.

 

Сразу следует заметить, что добавлять новые записи можно только к модифицируемому набору данных. Для добавления записи следует:

  • перевести набор данных в режим вставки;
  • задать значения для полей новой записи;
  • подтвердить добавление новой записи или отказаться от нее.

Добавление новых записей возможно с помощью одного из четырех методов:

  • Insert;
  • InsertRecord;
  • Append;
  • AppendRecord.


Рассмотрим эти методы более подробно. Метод Insert выполняет следующие действия:

  1. переводит набор данных в режим вставки записи;
  2. сдвигает записи на одну вперед, начиная от текущей;
  3. вставляет на место текущей записи новую пустую запись.

После перевода данных в режим вставки для задания значений полей можно использовать такие же методы, которые мы применяли при редактировании записи. Можно присваивать новые значения отдельным нолям и вызывать метод Post либо использовать метод SetFields.


ПРИМЕЧАНИЕ: Если при переходе в режим вставки запись добавляется к подчиненному набору данных, связанному с главным набором данных связью master—detail, то индексные поля автоматически получат нужные корректные значения. Программист может не заботиться об их заполнении.

 

Рассмотрим простой пример вставки новой записи:


Здесь мы заполняем два поля Name и Oklad значениями из полей редактирования Edit1 и Edit2.


Метод InsertRecord позволяет объединить возможности методов Insert и SetFields. Данный метод имеет параметр Values, аналогичный такому же параметру метода SetFields. Таким образом, метод InsertRecord вставляет в текущую позицию курсора новую запись, задавая значения ее полей.
Например:
Table1. InsertRecord ([nil. 'Сидоров A.E.', ml. 3400]);
Метод Append аналогичен методу Insert за тем исключением, что вставляет новую запись в конец набора данных, то есть новая запись будет последней записью. Метод AppendRecord аналогичен методу InsertRecord, но добавляет новую запись в конец набора данных, так же, как и метод Append.

Удалять записи можно только из модифицируемого набора данных. Текущая запись, то есть та, на которую указывает курсор, удаляется с помощью метода Delete. Если удаление произведено успешно, то текущей становится следующая запись. Если была удалена последняя запись, курсор переместится на предыдущую запись.

ВНИМАНИЕ: При попытке удаления записи из пустого набора данных будет сгенерирована исключительная ситуация.
При удалении записи последовательно генерируются события BeforeDelete и AfterDelete. Для удаления всех данных из таблицы можно применять метод EmptyTable.

 

ВНИМАНИЕ: Метод EmptyTable разрешен только в режиме исключительного доступа к таблице.


Различные таблицы базы данных могут быть связаны между собой с помощью полей связи. Поля связи обязательно должны быть индексированными.
Таблицы связываются по принципу «главный—подчиненный». При перемещении по записям главной таблицы будут автоматически становиться доступными те записи подчиненных таблиц, у которых значения поля связи равно значению поля связи текущей записи главной таблицы. Таким образом, это очень похоже на фильтрацию записей в подчиненных таблицах.


Для установления связи между главной и подчиненной таблицами используются следующие свойства подчиненной таблицы:

  • MasterSource — источник данных главной таблицы;
  • IndexNames — текущее индексное поле подчиненной таблицы;
  • IndexFieldNames — поле или поля связи текущего индекса подчиненной таблицы;
  • MasterFields — поле или поля связи индекса главной таблицы.


Перечислим основные особенности при работе со связанными таблицами:

  • если вы редактируете значение поля связи, нужно изменять и соответствующие значения поля связи у всех подчиненных таблиц во избежание нарушения связи между таблицами;
  • при удалении записи в главной таблице необходимо удалять соответствующие ей записи во всех подчиненных таблицах. Такое удаление называется каскадным.

Мы не будем на этом занятии рассматривать пример работы со связанными таблицами. Отложим его до занятия, посвященного созданию вашей первой локальной базы данных.

dle

Помоги проекту! Расскажи друзьям об этом сайте: