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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 07:20   #1
truevoxdei
 
Регистрация: 29.06.2007
Сообщений: 4
По умолчанию изменить запись в наборе DataSet не внося изменение в БД

Озадачился вопросом касательно DataSet в Delphi.
Можно ли в наборе DataSet'a (например ADODataSet) изменять запись (модифицировать, например, добавление чего-то к строке), так что-бы DataSet не вносил изменения в саму БД. А то модификация записи в наборе DataSet сразу вносится в БД.
Может быть есть такая возможность, как например у датасета в .Net, есть такая возможность, как dataset.addnew(), а вот в delphi не нашел...
Или надо копать в сторону кэширования?
truevoxdei вне форума Ответить с цитированием
Старый 28.04.2009, 08:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вообще-то ты в набор можеш вносить все что угодно и в БД это не попадет, пока ты не выполниш методы слива инфы в нее типа Post или Flush.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.04.2009, 13:06   #3
truevoxdei
 
Регистрация: 29.06.2007
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вообще-то ты в набор можеш вносить все что угодно и в БД это не попадет, пока ты не выполниш методы слива инфы в нее типа Post или Flush.
Это понятно, что пока не выполнишь Post... Тогда вот привожу код.
Работаю с формированием отчета используя компоненты из Fast Report.
Работает, но не так как надо. Плюс добавляется как в отчет, так и заноситься в БД.

procedure TForm1.frxDBDataset1Next (Sender: TObject);
begin

if vartostr(frxDBDataset1.DataSet.Fiel dValues['PLUS'])='1' then
begin
frxDBDataset1.DataSet.Edit;
frxDBDataset1.DataSet.FieldValues['answer']:='+'+frxDBDataset1.DataSet.FieldVa lues['answer'];

end;
end.

Данный код висит на событии OnNext. Т.к. по сути этот датасет (frxDatabase1) и призван передавать в отчет набор данных, никоим образом не затрагивая записи в БД. Или я ошибаюсь?

frxDBDataset1 связан с таблицей Answers в БД (создал в аксесе для примера) через компонент ADOTable1.
Что-то я делаю неправильно, но вот что? Разбираюсь.

Или может лучше тогда обработку каждой записи повесить на ADOTable?
truevoxdei вне форума Ответить с цитированием
Старый 28.04.2009, 13:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой... А зачем тебев БД + кидать?
Если он важен только в отображении, то и добавляй его в соответствующем событии от FRеport в текст компонента отображения.
Вот например в Qreport есть событие OnPrint. Там и прописывается для отображения дополнения.

Типа такого
Код:
procedure TForm1.QRDBText1Print(sender: TObject; var Value: String);
begin
 if TQRDBText(sender).DataSet.FieldByName(PLUS).AsInteger:=1
  then value:='+'+value;
end;
I'm learning to live...

Последний раз редактировалось Stilet; 28.04.2009 в 13:37.
Stilet вне форума Ответить с цитированием
Старый 28.04.2009, 15:43   #5
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Может через транзакции попробовать?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  AdoConnection1.RollbackTrans;
  Adotable1.Close;
  Adotable1.Open;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  AdoConnection1.BeginTrans;
  Adotable1.Insert;
  Adotable1.FieldByName('caption').AsString:='trans';
  Adotable1.Post;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  AdoConnection1.CommitTrans;
end;
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 31.08.2009, 13:15   #6
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вообще-то ты в набор можеш вносить все что угодно и в БД это не попадет, пока ты не выполниш методы слива инфы в нее типа Post или Flush.
В хелпе пишут обратное.
Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.

Как бы так извратиться, чтоб автоматический пост не вызывался? У меня есть DBGrid и я хочу вносить изменения в базу после редактирования только после нажатия кнопки "save to DB", а по умолчанию все сохраняется автоматом
Dim0n вне форума Ответить с цитированием
Старый 31.08.2009, 13:24   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

тогда нужно заводить дублирующий датасет или мемори_дата или мемори_тейбл и с ними работать при отображении/редактировании в дбгриде
т.е. все изменения будут висеть в памяти (заведешь доп.поле, в котором будет висеть флаг изменения) и по кнопке "Сохранить" будешь пробегать по датасету и в зависимости от состояния флага в доп.поле вставлять/обновлять/удалять данные из основной таблицы
soleil@mmc вне форума Ответить с цитированием
Старый 31.08.2009, 13:40   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как бы так извратиться, чтоб автоматический пост не вызывался?
Странно, никогда у меня этоне работало. Всегда приходилось принудительно вызывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2009, 14:30   #9
Dim0n
Пользователь
 
Регистрация: 03.07.2008
Сообщений: 11
По умолчанию

soleil@mmc , уж больно закрученый способ, наверняка есть какой нибудь человечный вариант.
Stilet Видимо разработчики компонент подкрутили (юзаю Delphi 2009)
Dim0n вне форума Ответить с цитированием
Старый 31.08.2009, 14:51   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

человечный вариант это делать отдельную форму редактирования записи
в каждый конкретный момент редактируется одна запись

еще стоит учесть, что 90% данных, которые нужно редактировать в нормальной проге представляют из себя смесь данных из нескольких таблиц
soleil@mmc вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание при наборе определенных слов mus-chek Microsoft Office Word 12 01.11.2008 08:20
dataset sergei64_89 Общие вопросы .NET 1 19.09.2008 20:14
DataSet nimf БД в Delphi 3 28.01.2008 23:03
при ручном наборе некоторые процедуры неработают? zAlexandrz Общие вопросы Delphi 8 10.11.2007 18:43