Форум — Ответы     (  К темам )
 ?  }{руст: Как состыковать работу двух клиентов в InterBaseExpress??? (09-02-2003 16:16:24)
Имеется две программы-клиента для работы с одной базой данных. Работают клиенты через компоненты InterbaseExpress. Как сделать так, чтобы при изменении данных одним клиентом, данные в другом клиенте обновлялись. Пробовал метод Refresh(), но он почему-то работает только в компонентах BDE, в компонентах Interbase работать отказывается. За любую помощь заранее спасибо.
 Павел (10-02-2003 11:37:59)
Можно посылать и получать обрабатывать
сообщения с помощью post_event, например создаете в базе триггер
на удаление, обновление, добавление записей таблицы,
изменения которой нужно отслеживать для всех клиентов
и в триггере посылаете сообщение

CREATE TRIGGER "ClientDelete" FOR "Client"
ACTIVE AFTER DELETE POSITION 0
as
begin
POST_EVENT 'Client';
end

а в программе-клиенте ловите и обрабатываете
это сообщение Client, например переоткрываете запрос
связанный с таблицей, где произошли изменения
Select * from "Client"
 }{руст (11-02-2003 18:27:13)
Большое спасибо за ответ. Но у меня возник ещё один вопрос. Для обновления данных необходимо переоткрыть запрос. Проблема возникает в том, как это сделать. Я пробовал методы Close() и Open(), а также использовал свойство Active. В BDE срабатывает как часы, а в компонентах Interbase обновления не происходит. Не могу понять почему. Просвятите пожалуйста.
 }{руст (11-02-2003 18:51:06)
Кстати, забыл уточнить, что при последовательном установлении свойства Active в Object Ispector-е сначала в false, а потом в true обновление происходит, а программно то же самое почему-то не работает.
 Павел (12-02-2003 12:57:03)
Возможно у Вас стоит CachedApdates в true, а нет ApplyUpdates
или начата транзакция и должен быть Commit в этом месте, а его нет
 }{руст (13-02-2003 06:40:18)
Павел, большое спасибо за ответ. Как оказалось, там действительно была активная транзакция.
 }{руст (16-02-2003 09:33:10)
После реализации вышеуказанного совета возникла новая проблема. Для отлова событий, передаваемых триггером клиенту я внёс в приложение компонент IBEvents со страницы InterBase. Добавил в него события в свойстве Events. После внёс в программый код метод RegisterEvents() для их регистрации. При обычной компиляции проекта работает всё нормально. Но после того, как в Project->Options я убрал галки с Build with runtime packages на странице Packages и с Use dinamic RTL на странице Linker, для компиляции конечного приложения, программа после запуска стала выдавать сообщение:
"Программа выполнила недопустимую операцию и будет закрыта. Программа QueryProject вызвала сбой при обращении к странице памяти в модуле QueryProject.exe по адресу ... Регистры ... Байты по адресу ... Содержимое стека ...".
После я попробовал те же самые операции на Delphi 6. Он тоже ругается на IBEvents. С чем это может быть связано? Заранее спасибо.
 Павел (16-02-2003 12:42:04)
>>После внёс в программый код метод RegisterEvents()

1. Попробуйте поставить в IBEvents свойство AutoRegister в true, а не использовать метод RegisterEvents(), может поможет

2. В любом случае лучше переходите с компонентов со страницы
InterBase на компоненты из библиотеки FIBPLus.
И также проверьте версию сервера и клиента InterBase, что у Вас,
переходите на более новую ( Firebird-1.0.2.908 )
 }{руст (17-02-2003 07:49:13)
Свойство AutoRegister я пробовал, ничего не получается. А InterBase стоит 6.5. Кстати, как я понял компоненты FIBPlus не из стандартной палитры. Не могли бы Вы подсказать, где их можно достать, а также, желательно, документацию по ним.
 Павел (18-02-2003 10:09:22)
Здесь на сайте в разделе Downloads, вообще они к сожалению платные,
есть более новые версии, но по понятным соображениям они здесь
на сайте не выложены.
(Firebird-1.0.2.908 тоже есть в Downloads — он бесплатный),
также советую скачать IB Expert — отличное визуальное средство
управления базами данных InterBase (или FireBird) — бесплатный для exUSSR.

А почему при обычной компиляции все работает, а при "Build with runtime ..."
нет — конечно надо разбираться, вряд ли тут дело в IBEvents, скорее в
чем то другом.