Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > работа с post_event


Автор: FMA 3.6.2009, 09:22
Приветствую всех!
Работаю с FireBird 2.1. 
Есть БД, которая лежит на серваке, и множество клиентов, которые с ней работают по сети! Как при изменении одним пользователем данных в любой из таблиц БД, сообщить об проведенных изменениях другим?
Пользовался обработчиком сообщений post_event, но он немного не подходит, т.к. не удобно обновлять всю таблицу, проще как мне кажется обновить только измененные данные. А в post_event-e, как я понял, нельзя передать параметр, например ID измененной строки, вернее к имени-события его добавить можно, но как его потом получить на клиенте, т.к. предварительно зарегистрировали просто имя-события без дополнительного параметра!
Как на клиенте получить информацию только об измененных данных? Есть ли другие способы кроме post_event-a?

Автор: Akella 3.6.2009, 18:36
Цитата(FMA @  3.6.2009,  09:22 Найти цитируемый пост)
Есть БД, которая лежит на серваке, и множество клиентов, которые с ней работают по сети! Как при изменении одним пользователем данных в любой из таблиц БД, сообщить об проведенных изменениях другим?

опять  smile

Добавлено через 47 секунд
Цитата(FMA @  3.6.2009,  09:22 Найти цитируемый пост)
проще как мне кажется обновить только измененные данные.

точно smile , как придумаешь компоненту или алгоритм, сразу можешь запатентовать smile 

Автор: Deniz 4.6.2009, 07:43
Цитата(Akella @  3.6.2009,  21:36 Найти цитируемый пост)
как придумаешь компоненту или алгоритм, сразу можешь запатентовать
а что там придумывать, все итак ясно как божий день.
Доп. таблица в БД. Поля: имя события, имя таблицы, ИД записи, дата+время
1. Клиент получил событие
2. select из таблицы на обновления, которые появились с предыдущего запроса
3. update нужных таблиц.
4. Обновление статуса последнего запроса
Не очень интересный алгоритм, много косяков будет, нужно сильно дорабатывать.
Лучше дать пользователю информацию, о том что данные изменились, пусть сам по кнопке обновляет.

Автор: FMA 4.6.2009, 08:45
Deniz благодарю за помощь!
Покапался в инете, и вообщем-то кроме подобной идеи ничего не нашел! К сожалению разработчики FireBird-а не горят желанием вводить параметр в структуру post_event!

Автор: Akella 4.6.2009, 14:34
Deniz, ну так как же обновить в гриде только изменённые записи, не переоткрывая весь набор данных?

Автор: Deniz 4.6.2009, 14:48
Цитата(Akella @  4.6.2009,  17:34 Найти цитируемый пост)
Deniz, ну так как же обновить в гриде только изменённые записи, не переоткрывая весь набор данных? 
ты меня удивляешь.
Код
  DataSet.Locate('id', updated_id, []);
  DataSet.Refresh;
как известно Refresh обновляет только текущую запись.
Да сам посмотри, что пишется в RefreshSQL.

Автор: Akella 4.6.2009, 15:38
Ну теперь представь. Пользователи А, Б, В обновили записи в разных местах таблицы: в начале, в середине и в конце. Теперь нужно, чтобы программа у пользователя Г (да и у всех остальных) пробежалась по гриду и выполнила RefreshSQL только на нужных записях. Т.е. курсор таблицы будет постоянно "блуждать", чтобы обновить ту или иную запись. А если работает 10-15 пользователей...

Добавлено через 2 минуты и 3 секунды
Пользователь ткнёт на запись а мышкой и начнёт перемещать мышь к кнопке Изменить. Пока будет перемещаться мышь... набор данных перепрыгнет на другую запись, чтобы обновить её. И так далее... Т.е. набор данных будет жить "своей жизнью".

Добавлено через 4 минуты и 8 секунд
Чтобы реализовать что-то такое независимое от пользователя, нужно иметь не привязанный к набору данных грид. Чтобы ячейки этого грида можно было обновлять в отдельном потоке.
Какие будут ещё соображения? 
Если я ошибаюсь, то как сделать обновлений в гриде только нужных записей, не мешая пользователю?

Автор: Deniz 5.6.2009, 06:20
Цитата(Akella @  4.6.2009,  18:38 Найти цитируемый пост)
Ну теперь представь... 
см. мои рекомендации.
Цитата(Deniz @  4.6.2009,  10:43 Найти цитируемый пост)
Не очень интересный алгоритм, много косяков будет, нужно сильно дорабатывать.
Лучше дать пользователю информацию, о том что данные изменились, пусть сам по кнопке обновляет.

Цитата(Akella @  4.6.2009,  18:38 Найти цитируемый пост)
Пользователь ткнёт на запись а мышкой и начнёт перемещать мышь к кнопке Изменить. Пока будет перемещаться мышь... набор данных перепрыгнет на другую запись, чтобы обновить её. И так далее... Т.е. набор данных будет жить "своей жизнью".
реализовать что-то типа DisableEvents/EnableEvents на момент обновления не проблема.
"И пусть весь мир подождет" (с)
Цитата(Akella @  4.6.2009,  18:38 Найти цитируемый пост)
Чтобы реализовать что-то такое независимое от пользователя, нужно иметь не привязанный к набору данных грид.
такое возможно когда работа идет на низком уровне в потомках DataSet'а или грид должен быть StringGrid'ом (или что-то в этом духе). Смысл тратить время на реализацию данного механизма я не вижу, следовательно, если кто-то сильно хочет "удивить" пользователя и автоматически обновлять данные, удачи.
Сам объясняю пользователям так: "Представь, что это распечатанный список. Ты можешь его руками править и т.д. Но чтобы получить новые данные, тебе нужно его еще раз распечатать, т.е. обновить. Когда нужны новые данные жми кнопку." Вот и все.

Автор: Akella 5.6.2009, 09:51
Цитата(Deniz @  5.6.2009,  06:20 Найти цитируемый пост)
Лучше дать пользователю информацию, о том что данные изменились, пусть сам по кнопке обновляет.

так и я о том же smile

Автор: Bose 7.6.2009, 06:14
С практической точки зрения, лучше ничего не обновлять и просто сообщать пользователю что данные изменились. Если он работает и ему это надо, то он сам обновит. Зачем на сервер нагрузку лишнюю создавать? =)

А как вариант - записывать ID всех изменённых записей в отдельную таблицу. А клиент, чтобы при получении события проверял эту таблицу и смотрел какие там данные появили с момента последней проверки. А где-нить в полночь таблицу эту чистить, например. 

Автор: Akella 7.6.2009, 08:42
А смысл такой таблицы,  если будет кнопка Обновить. 

Автор: Deniz 8.6.2009, 05:34
Цитата(Bose @  7.6.2009,  09:14 Найти цитируемый пост)
А как вариант - записывать ID всех изменённых записей в отдельную таблицу.
т.е. мой вариант в 3 посте тебе не понравился?  smile 

Цитата(Akella @  7.6.2009,  11:42 Найти цитируемый пост)
А смысл такой таблицы,  если будет кнопка Обновить.
когда пользователь нажал на кнопку обновить, можно обновить только измененные записи.

Автор: Bose 8.6.2009, 13:37
Цитата(Deniz @  8.6.2009,  04:34 Найти цитируемый пост)
т.е. мой вариант в 3 посте тебе не понравился?  

есть вероятность что пока один пользователь будет обновлять данные - в базе изменится больше чем одна запись.

Автор: Deniz 8.6.2009, 14:29
Цитата(Bose @  8.6.2009,  16:37 Найти цитируемый пост)
есть вероятность что пока один пользователь будет обновлять данные - в базе изменится больше чем одна запись. 
ты описал тоже самое
сравни
Цитата(Deniz @  4.6.2009,  10:43 Найти цитируемый пост)
Доп. таблица в БД. Поля: имя события, имя таблицы, ИД записи, дата+время
1. Клиент получил событие
2. select из таблицы на обновления, которые появились с предыдущего запроса
3. update нужных таблиц.
4. Обновление статуса последнего запроса
думаю на этом пора закончить, а то автор уже пометил вопрос как решенный, а мы все не уймемся  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)