link1136 link1137 link1138 link1139 link1140 link1141 link1142 link1143 link1144 link1145 link1146 link1147 link1148 link1149 link1150 link1151 link1152 link1153 link1154 link1155 link1156 link1157 link1158 link1159 link1160 link1161 link1162 link1163 link1164 link1165 link1166 link1167 link1168 link1169 link1170 link1171 link1172 link1173 link1174 link1175 link1176 link1177 link1178 link1179 link1180 link1181 link1182 link1183 link1184 link1185 link1186 link1187 link1188 link1189 link1190 link1191 link1192 link1193 link1194 link1195 link1196 link1197 link1198 link1199 link1200 link1201 link1202 link1203 link1204 link1205 link1206 link1207 link1208 link1209 link1210 link1211 link1212 link1213 link1214 link1215 link1216 link1217 link1218 link1219 link1220 link1221 link1222 link1223 link1224 link1225 link1226 link1227 link1228 link1229 link1230 link1231 link1232 link1233 link1234 link1235 link1236 link1237 link1238 link1239 link1240 link1241 link1242 link1243 link1244 link1245 link1246 link1247 link1248 link1249 link1250 link1251 link1252 link1253 link1254 link1255 link1256 link1257 link1258 link1259 link1260 link1261 link1262 link1263 link1264 link1265 link1266 link1267 link1268 link1269 link1270 link1271 link1272 link1273 link1274 link1275 link1276 link1277

Форум — Ответы     (  К темам )
 ?  }{руст: Как состыковать работу двух клиентов в 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, скорее в
чем то другом.