Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2011, 17:17   #1
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию Сохранение DBGrid

Наверное эта тема уже обсуждалась, дайте, пожалуйста, ссылку на решение этой проблемы.
У меня следующая конструкция: ClientDataSet+DataSource+DBGrid, при переходе в DBGrid с одной записи на другую происходит сохранение (по-видимому) в буфер ClientDataSet, после чего, если форму закрыть без сохранения (не нажимая кнопку), то изменения на форме остаются. Как сделать так, чтобы этот буфер очищался или еще что-нибудь лишь бы изменения принимались по нажатию кнопки, а не в результате перемещения между записями.

И еще, когда я пытаюсь выполнить при нажатии на кнопку сохранения:
Код:
ClientDataSet.Edit;
ClientDataSet.ApplyUpdates(-1);
то появляется ошибка "Missing data provider or data packet"

Прошу прощения, если вопрос слишком глупый
alenov8 вне форума Ответить с цитированием
Старый 21.02.2011, 21:05   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var xSavePoint: Integer;
...
xSavePoint:=ClientDataSet.SavePoint; //после открытия ClientDataSet
...
ClientDataSet.SavePoint:=xSavePoint; //если без сохранения и ApplyUpdates не делать
Чтобы использовать ApplyUpdates ClientDataSet должен быть нацелен на DataSetProvider и один из Connection-ов (DComConnection, SocketConnection, LocalConnection и пр.). DataSetProvider в свою очередь на Query (класс Query зависит от способа соединения с базой данных)
Есть вариант использования SaveToFile и LoadFromFile, но тогда без базы данных и ApplyUpdates.
ClientDataSet.Edit на DBGrid не надо делать.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.02.2011 в 21:11.
Аватар вне форума Ответить с цитированием
Старый 21.02.2011, 21:48   #3
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию

Огромное спасибо! То что нужно.

Код:
procedure TMainForm.FormShow(Sender: TObject);
begin
 xSavePoint:=ClientDataSet.SavePoint;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ClientDataSet.SavePoint:=xSavePoint;
end;

procedure TMainForm.SaveButtonClick(Sender: TObject);
begin
........
  ClientDataSet.SavePoint:=0;
end;
В таком виде получается желаемый эффект
alenov8 вне форума Ответить с цитированием
Старый 21.02.2011, 22:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

ClientDataSet.SavePoint:=0; -- ??? Не понял зачем левую константу присваивать?
SavePoint это некая точка состояния информации, значение которой меняется после каждой команды редактирования. Присвоение ей ранее сохраненных значений очень напоминает откат SQL-транзакции, даже не представляю к чему может привести присваивание произвольных констант. не очень уверен, но 0 скорее всего отменит все модификации
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.02.2011, 09:57   #5
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию

Да, согласен. Это глупость.
Я хотел, чтобы состояние после сохранения зафиксировалось и откат происходил уже на эту точку.
Наверное правильнее после сохранения еще раз присваивать этой точке значение?
Код:
xSavePoint:=ClientDataSet.SavePoint;
alenov8 вне форума Ответить с цитированием
Старый 22.02.2011, 10:05   #6
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию

Правда и без этой строчки вроде все работает.
Не очень правда понятно почему

В любом случае большое спасибо. Я уже хотел расставаться с DBGrid из-за этих автосохранений)
alenov8 вне форума Ответить с цитированием
Старый 23.02.2011, 13:10   #7
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию

Еще один вопрос по этой же базе данных.
Как сбросить счетчик в xml. Там есть вот такой тег:
Код:
<PARAMS AUTOINCVALUE="6"/>
Если вставить, а потом удалить запись, то этот счетчик сохраняет свое значение, т.е. появляются пропуски. Как его можно скорректировать, например, такой строкой:
Код:
ClientDataSet.FieldByName('ID').AsInteger:=ClientDataSet.RecNo
или как-нибудь иначе?
alenov8 вне форума Ответить с цитированием
Старый 23.02.2011, 21:05   #8
alenov8
Новичок
Джуниор
 
Аватар для alenov8
 
Регистрация: 21.02.2011
Сообщений: 6
По умолчанию

На этом форуме нашел обсуждение нескольких аналогичных ситуаций, когда значение счетчика не сбрасывалось при удалении записи. Советуют в свойствах поля сделать его автоинкрементным... Но оно у меня и так автоинкрементное!

Помогите, пожалуйста! Должно быть какое-то стандартное решение этой проблемы
alenov8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение таблицы из dbgrid в файл (oracle, delphi) blr_spy БД в Delphi 8 26.07.2010 13:59
DBGrid. ReadOnly. Сохранение изменений cnst_bus БД в Delphi 3 18.01.2010 13:40
сохранение изменений в DBGrid/DBGridEh, при изменении фокуса ячейки dalien БД в Delphi 6 30.07.2009 15:36
перенос данных из DBGrid в DBGrid KingSize БД в Delphi 17 24.04.2009 09:30
Сохранение нескольких записей из DbGrid в базу Canadec БД в Delphi 5 06.09.2007 14:26