ОПЕРАТИВНОЕ ОТОБРАЖЕНИЕ ИЗМЕНЕНИЙ В ТАБЛИЦЕ

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

ОПЕРАТИВНОЕ ОТОБРАЖЕНИЕ ИЗМЕНЕНИЙ В ТАБЛИЦЕ

Сообщение Luxor »

База данных Firebird 2.5
Приложение использует компоненты SQLdb
На форме компоненты IBConnection, SQLQuery, SQLTransaction

В программе работают два пользователя. Когда один пользователь вносит изменения в базу данных, то второй пользователь увидит изменения в базе если:
- перезайдет в базу по новой
- после того как выполнит модификацию записей в таблице

Если просто закрыть SQLQuery и потом открыть его, то изменений не отображается.

Отображение происходит с помощью SQLQuery.

Вставка записей или модификация происходит в процедуре

Код: Выделить всё

procedure InsertRecord
begin
  with TSqlquery.Create(Self) do
  begin
  DataBase:=IBConnection;
  SQL.Text:=insert into Table1 (Field1, Field2) Values (:Field1, :Field2);
  try
   ExecSQL;
   SQLTransaction.Commit;
  except
   SQLTransaction.Roollback;
  end;
  end;
end;


Как сделать чтобы у второго пользователя происходило обновление записей в базе данных, т.е. чтобы он оперативно видел изменения?
hovadur
постоялец
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Сообщение hovadur »

Я бы поставил бы одинарные кавычки после "SQL.Text := ", потом поставил бы в начало "SQLTransaction.StartTransaction", потом поставил бы "raise;" после Rollback, чтобы видеть возникающую ошибку, потом проверил бы что действительно добавляются записи в базу каким-нибудь менеджером, вроде flamerobin.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Скорее всего Вам помогут firebird events
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Можно использовать компонент TZIbEventAlerter из ZeosDbo.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

Brainenjii писал(а):Скорее всего Вам помогут firebird events

Можно чуть подробнее?
Не работал с этим...
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Luxor
Конкретно по твоей задаче - тебе нужны event-ы.
Работать с ними очень просто
В триггере делаешь post_event "Твоё событие"
На форме размещаешь компоненту - приёмник события от event-а. В UIB и ZEOS они есть. А в обработчике события делаешь refresh на данные.

А вот на практике - оно не нужно.
Мне тоже не однократно юзеры доказывали - что оно очень нужно. А потом - сами говорили - убери нафиг, мельтишит, отвелкает.
Достаточно сделать кнопку "Обновить".
Всё в итоге всегда сводится к тому, что пользователи делят свою работу на два логических, почти не персекающихся куска. И им же потом легче самих себя контролировать.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

Вот я тоже думал сделать кнопку для обновления. В принципе и пользователи не перенапрягуться. Нажмут, когда надо.

Добавлено спустя 3 часа 6 минут 40 секунд:
может вопрос туповат, но как обновить правильно данные на втором клиенте?
SQLQuery Close/Open - не помогает
SQLQuery.ACTIVE True/False так же не катит...
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Luxor писал(а):SQLQuery Close/Open - не помогает

Это должно работать.
Если не помогает - смотрите с какими параметрами стартовали транзакцию. Такое поведение обычно для транзакций-снимков (snapshot).
Либо на изменяющем клиенте транзакция не подтверждена.
Luxor
новенький
Сообщения: 72
Зарегистрирован: 10.06.2010 19:30:43

Сообщение Luxor »

alexs писал(а):
Luxor писал(а):SQLQuery Close/Open - не помогает

Это должно работать.
Если не помогает - смотрите с какими параметрами стартовали транзакцию. Такое поведение обычно для транзакций-снимков (snapshot).
Либо на изменяющем клиенте транзакция не подтверждена.


Как задавать параметры транзакции при использовании стандартного IBConnection (Как правильно записывать параметры?)
Если можно, приведите пример.
Про параметры читал, вроде все понятно.
Я так понимаю можно в свойстве PARAMS компонента SQLTransaction и при SQLTransaction.Active:=True эти параметры будут приняты.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

http://www.ibase.ru/devinfo/ibtrans.htm
Тут расписано.
Ответить