Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 Практический раздел.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
5 Мб
Скачать
☆

Редактирование

Помимо поиска, фильтрации и навигации, существует другая не менее важная группа действий, выполняемых с наборами данных. Это редактирование (изменение), удаление и добавление записей. Все эти операции доступны только в том случае, если источник данных, во-первых, поддерживает модификацию данных как таковую, а во-вторых, если она разрешена в данный момент времени. В частности, компонент Table поддерживает модификацию, а за возможность ее производить отвечает свойство ReadOnly: если оно установлено в истину, то править данные нельзя, а если в ложь (что принято по умолчанию) - то можно. Проверить, допустимо ли изменение данных, можно при помощи свойства CanModify, доступное во время выполнения. И если оно содержит значение истины, то можно смело приступать к правке.

ПРИМЕЧАНИЕ

Следует отметить, что предоставить пользователю возможность правки данных возможно при помощи визуальных компонент - без написания какого-либо кода вообще, для чего достаточно воспользоваться компонентами DBGrid и DBNavigator.

Редактирование записей заключается в изменении значений их полей. Отредактирована в один момент времени может только одна запись, причем только текущая (та, на которую ссылается курсор). Поэтому перед редактированием следует выбрать запись, например, при помощи метода Locate. После этого последовательно выполняются следующие операции:

  • перевод набора данных в режим редактирования (вызов метода Edit);

  • собственно изменение значений полей записи;

  • подтверждение изменений (метод Post) или отказ от них (метод Cancel).

В виде программного кода это реализуется следующим образом:

Table1.Edit;

Table1.FieldByName('CUST_NAME').AsString:=Edit1.Text;

Table1.Post;

Здесь мы меняем значение поля CUST_NAME в текущей записи на содержимое однострочного редактора. Если бы требовалось изменить значение, скажем, числового поля, то следовало бы либо преобразовать значение Edit1.Text в число, либо использовать другой компонент, например, UpDown:

Table1.FieldByName('ANY_INT_VALUE').AsInteger:=UpDown1.Position;

Вместе с тем, если используются DB-ориентированные версии компонент, связанные с текущим набором данных, то метод Edit вызывать не придется, т.к. он будет вызван косвенно самим компонентом. Собственно, в таком случае, как это уже рассматривалось в предыдущей главе, вообще никаких действий предпринимать не придется, более того, если набор данных не поддерживает редактирование, то связанные с ним компоненты не дадут даже возможности попытаться изменить данные, уберегая и пользователя, и разработчика от возможных ошибок. С этой точки зрения для последовательного редактирования единичных записей предпочтительнее использовать именно такую, полностью автоматическую связку. Что касается программного изменения, то оно может оказаться очень полезным, а подчас и незаменимым, например, при обработке массивов данных.

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

with Table1 do

begin

First;

while not Table1.Eof do

begin

Edit;

FieldByName('BILL_SUMM').AsCurrency:=FieldByName('BILL_SUMM').AsCurrency*1.2;

Post;

Next;

end;

end;

Обратите внимание, что метод Edit вызывается при каждой итерации цикла, поскольку после обработки метода Post таблица возвращается к режиму чтения. Так же полезно знать, что метод Next, в случае необходимости, может сам вызывать метод Post, однако если вместо Next использовать, скажем, FindNext, то Post вызван не будет. Поэтому, во избежание возможных ошибок в процессе модернизации кода, желательно вызывать метод Post явно.