Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИОСУ.doc
Скачиваний:
33
Добавлен:
19.03.2015
Размер:
14.55 Mб
Скачать

26. Основные методы модифицируемого набора данных(нд). Редактирование набора данных и проблемы редактирования.

Для рассм-я навигацион. методов необх-мо использ-ть понятия курсора НД (указатель текущей записи в конкретн НД).

Сущ. 5 методов измен-я курсора НД.

Procedure First; устан. курсор на 1ую позицию в НД

Last; устан. курсор на последн.

Next; устан. курсор на след. запись

Prior; устан. курсор на предыд. запись

function MoveBy(n:Integer):integer; перемещает курсор на n записей к концу НД, если n>0 и к началу, если n<0.

Св-во BOF, EOF класса TDataSet имеет тип Boolean и показыв. не явл. ли текущ. запись 1ой или последней соотв-но.

Пр.1… Table1.First;

While not Table1.EOF do begin…. Table.Next; end;

Т.к. BDE не способна опред-ть место нахождения курсора в НД возникает потребность проверки момента попадания на 1ую или последн. запись для комфортности работы.

… with ttZakazch do begin

if not BOF then Prior else begin First;end;

Редактир-е НД.

ReadOnly:=True; св-во опред-ет возможна ли модификация НД, это св-во м. изменять, если НД закрыт. Table1.Active:=False;

Для редактир-я текущей записи НД необх. перевести его в режим редактир-я, кот. можно осущ-ть 2мя способами: программно Edit и визуально посредством компонентов отображения.

Для автоматич. переключения в режим редактир-я у комп-та DataSource необх-мо устан. св-во DataEdit:=True; У не модифицируемого НД св-во CanModify:= false;

У модифицируемого НД будут произведены след. действия:

  1. сгенерируется событие BeforeEdit.

  2. из НД повторно считывается текущая запись и блокируется доступ к ней др. пользователей и временно устан-ся только для чтения.

  3. пересчитываются все вычисляемые поля

  4. НД перевод в реж. редактир-я

  5. генерир. событие OnDataChange для связан. с НД ист-ком данных.

  6. AfterEdit генерир. событие.

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

-записываются данные в физич. таблицу

-снимается блокировка записи

-переход в реж. просмотра.

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

Пр.

if zakazchik.CanModify=true then begin zakazchik.edit;

zakazchik.FieldByname(‘Name’);

AsString:=Edit1.text; zakazchik.post; zakazchik.refresh; end

else Message (‘ Редактир-ть нельзя ‘, mtInformation,[mtOk],0)

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

Пр.

with tbZakazch do begin

if tbZakaz.Locate(‘Zakazch_cod’,Fieldbyname(‘Zakazch_cod’).Asvariant,[]) then

ShowMessage(‘ его удалять нельзя, у него есть заказы ‘) else if

MessageDlg(‘ удалить ‘,mtConfirmation,[mbYes,mbNo],0)=mbYes then Delete; end;…

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

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

Пор-к следования полей НД. Если поле остается без измен-ий, то ей присваивается знач-е nil(пустое).