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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.09.2014, 21:08
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Открытая транзакция и измененный Dataset

У меня ошибка возникает: недостаточно информации о ключевом столбце для обновления, после того как я делаю refresh датасету, в который недавно добавил запись.

В реалиях: пользователь заполняет счет, и вдруг понимает, что контрагента в базе еще нет: добавляет его, а в lookupcombobox'e выбора контрагента его не появляется.

Транзакция все это время открыта.

Как бороть недуг?
Ответить с цитированием
  #2  
Старый 23.09.2014, 22:00
kaakaa
 
Сообщения: n/a
По умолчанию

DataSet который связан с lookup компонентом должен быть в одной транзакции с изменяемым набором данных.
После внесения изменений, lookup набор данных нужно обновить.

PS
Трогать уровень изоляции транзакций не рекомендую.

Последний раз редактировалось kaakaa, 23.09.2014 в 22:44.
Ответить с цитированием
  #3  
Старый 24.09.2014, 10:28
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от kaakaa
DataSet который связан с lookup компонентом должен быть в одной транзакции с изменяемым набором данных.
После внесения изменений, lookup набор данных нужно обновить.

PS
Трогать уровень изоляции транзакций не рекомендую.
Функция вызова модальной формы и открытия транзацкии у меня реализована вот так (и видимо здесь нарушение):

Код:
procedure TFormMain.dxBarButton4Click(Sender: TObject);
begin
  BillsView.BeginUpdate;
  with TFormBillAdd.Create(Application) do
    try
      Connection.BeginTrans;
      if BillAddShow(ActiveUserID, Connection) then
      begin
        Connection.CommitTrans;
        aBills.Requery;
      end
      else
        Connection.RollbackTrans;
    finally
      Free;
    end;
  BillsView.EndUpdate;
end;

Сначала создаётся форма, потом открывается транзакция, но прикрепление ДатаСета к Connection (TADOCOnnection) идёт после открытия в методе BillAddShow

Код:
function TFormBillAdd.BillAddShow(aUser: Integer;
  iConnection: TADOConnection): Boolean;
begin
  // ...
  aEntities.Connection := iConnection;
  // ...
  Result := ShowModal = mrOK;
end;

В целом не обращал внимания на это до появления вышеописанной ошибки, т.к. даже если изменить aEntities, и после откатить транзацкию, то и изменения в aEntities тоже откатываются.

Вообще вопрос решился вчера совершенно случайно (не ту функцию по ctrl+пробел ввёл ) вместо Refresh получил Requery и всё заработало.
Ответить с цитированием
  #4  
Старый 24.09.2014, 12:36
kaakaa
 
Сообщения: n/a
По умолчанию

>>вместо Refresh получил Requery и всё заработало.
Дело в том, что Refresh обновляет только одну текущую запись набора данных, а Requery выполняет запрос заново.

Причина ошибки: Неполное понимание работы методов Refresh и Requery .

Решение:
В данном случае методом тыка.

PS
Освежите в памяти методы компонентов ADO.
Ответить с цитированием
Этот пользователь сказал Спасибо за это полезное сообщение:
Uniq! (24.09.2014)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter