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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2012, 11:39   #1
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
Сообщение Delphi + ADO + Access, транзакции...

Добрый день!
Помогите пожалуйсти решить такую задачу. Есть две таблицы в Access.
PrihodDoc
Код:
id_doc счетчик
NomerDoc
DataDoc
id_kontragent
id_podrazdelenie
summa
coment
PrihodTovar
Код:
id счетчик
id_doc
id_tovar
kolvo
cost
summa
coment
Соединяюсь через ADOConnection.
Таблицу PrihodDoc открываю через Query1 запросом:
Код:
select * from PrihodDoc
Таблицу PrihodTovar в Query2, указал DataSource = DataSource1 (Query1 соответсвенно) связываю через запрос:
Код:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
    Screen.Cursor := crSQLWait;
    try
      with ADOQuery2 do begin
        DisableControls;
        Close;
        SQL.Text := 'select * from PrihodTovar where id_doc= :id_doc';
        Open;
        EnableControls;
      end;
    finally
    Screen.Cursor := crDefault;
    end;
end;
Необходимо при добавлении новой записи в PrihodDoc, в новой форме, реализовать заполнение данных, в том числе и табличной части PrihodTovar, но в любой момент сделать отмену или наоборот сохранить внесенные изменения. Решил реализовать это через транзакцию, но вот тут и есть загвоздка. При редактировании существующих данных транзакция срабатывает, т.к. id таблицы PrihodDoc существует. А при добавлении новой записи, id не присваевается пока запись не будет записана, соответсвенно в связанной таблице PrihodTovar данные не привязываются. Решил сначала запостить запись, а потом уже открыть ее на редактирование, все равно транзакция начата, но не тут то было:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
     PrihodForm:=TPrihodForm.Create(Application);
     PrihodForm.Caption:='Приход*';
     ADOConnection1.BeginTrans;
     ADOQuery1.Append;
     ADOQuery1.FieldByName('DataDoc').AsDateTime := Date;
     ADOQuery1.Post;
     ADOQuery1.Edit;
     if PrihodForm.ShowModal = mrOK
       then
         begin
             ADOConnection1.CommitTrans
         end
       else
         begin
           ADOConnection1.RollbackTrans;
         end;

     PrihodForm.release;
end;
Откат не срабатыват. Точнее срабатывает, но только для Query2. А новая запись в Query1 остается. В связи с чем вопрос, как быть?
Может есть возможность получать id счетчика в базе до сохранения записи? Или как то все таки транзакцию настроить?
Можно конечно удалять запись, в случае отмены, но как то это не красиво получается.

Последний раз редактировалось Highlander1981; 06.03.2012 в 11:49.
Highlander1981 вне форума Ответить с цитированием
Старый 06.03.2012, 16:56   #2
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

Уточняю. На самом деле как показала проверка, запись все-таки в базу не записывается при RollBack, она просто остается висеть в DBGridEh. Соответсвенно вопрос темы снят, все работат!

Теперь возникает другой вопрос, что надо сделать, чтобы видеть актуальные данные без перезапроса Query1?
Highlander1981 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi+Ado+Access kmvteam БД в Delphi 26 09.07.2010 02:08
delphi+ado+access Jo2000 Помощь студентам 16 27.02.2010 08:04
Delphi <--> ADO <--> Access acid02 БД в Delphi 4 09.04.2009 16:29
Транзакции + ADO azat БД в Delphi 3 14.01.2008 11:47
Delphi+ADO+Access Turpa Помощь студентам 12 15.10.2007 23:29