Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.09.2011, 11:10
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию Редактирование таблицы

Доброго времени суток!

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

по кнопке "перейти в режим редактирования":
Код:
   DBGrid1.Options:=DBGrid1.Options-[dgRowSelect]+[dgEditing];
   DBGrid1.DataSource.DataSet.Edit;


по кнопке "сохранить изменения":
Код:
 t := MessageBox(0
    , PChar('Ñîõðàíèòü èçìåíåíèÿ äëÿ òåêóùåé çàïèñè?')
    , PChar('Âíèìàíèå!')
    , MB_YESNO + MB_ICONINFORMATION
    );
 case t of
    IDYES: begin
        fmChild1.DBGrid1.DataSource.DataSet.Post;
        fmChild1.DBGrid1.Options:=fmChild1.DBGrid1.Options-[dgEditing]+[dgRowSelect];
        ShowMessage('Èçìåíåíèÿ óñïåøíî ñîõðàíåíû!');
      end;
    IDNO: begin
        fmChild1.DBNavigator1.BtnClick(nbCancel);
      end;
  end;

Все вроде бы устраивает, кроме 2 пунктов:
1) если одно поле было выделено, но оставлено без изменений, либо очищено - может всплыть ошибка 'DataSource not in edit or insert mode'
2) редактирование приоисходит в режиме "реального времени", т.е., если пользователь ввел данные и нажал на кнопку "сохранить изменения", выбрал пункт "отмена", то отмена произойдет только для последней редактируемой ячейки, нельзя ли сделать так, чтобы отмена происходила для всех внесенных изменений?

Помогите, кто чем может....
__________________
Memento Mori(арти)
Ответить с цитированием
  #2  
Старый 13.09.2011, 12:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

2) Использовать транзакции
1) Проверять состояние таблицы
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 13.09.2011, 16:11
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

используй транзакцию.
при нажатии кноп Edit запускаешь транзакцию.
при нажатии кн Отмена- команда отката Transaction1.RollBack
при нажати кн Сохранить- Transaction1.Commit;
При выполнении этих команд запрос автоматически закрывается.
поэтому DBGrid обнуляется.
поэтому надо написать процедуру переоткрытия запроса.

есть еще команды RollBackRetaining, CommitRetaining- они не закрывают запрос. Поэтому переоткрывать не нужно
Ответить с цитированием
  #4  
Старый 14.09.2011, 00:01
Аватар для Shoni
Shoni Shoni вне форума
Прохожий
 
Регистрация: 02.09.2011
Адрес: Кострома
Сообщения: 45
Версия Delphi: 7
Репутация: 165
По умолчанию

Я мучаюсь с Access, это правда, что для работы транзакции нужно трехзвенное приложение делать (Приложение на клиенте, которое общается с приложением на сервере, которое уже общается локально с базой)?
__________________
Memento Mori(арти)
Ответить с цитированием
  #5  
Старый 14.09.2011, 06:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нет, не правда.
Просто надо приинудительно начать клиентскую транзацию.
Если правильно помню - у TADOCOnnection метод StartTransaction.
Ответить с цитированием
  #6  
Старый 14.09.2011, 07:06
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

ADOConnection.BeginTrans - начало транзакций,
ADOConnection.CommitTrans - подтвердить транзакции,
ADOConnection.RollbackTrans - откат на момент начала транзакций.

Обычно используется конструкция такого типа:

Код:
try //пытаемся выполнить следующие операции
  ADOConnection.BeginTrans; //начало транзации
  ...
  {Операции с БД}
  ...
  ADOConnection.CommitTrans; //подтверждение изменений
except // если в блоке try возникла ошибка, то...
  ADOConnection.RollbackTrans; //откатываем базу (точнее просто не сохраняем изменения)
end;

В Вашем случаи, на нажатие сохранить - Commit, на Отмена - Rollback.
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 14.09.2011 в 07:30.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025