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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с post_event 
V
    Опции темы
FMA
Дата 3.6.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Приветствую всех!
Работаю с FireBird 2.1. 
Есть БД, которая лежит на серваке, и множество клиентов, которые с ней работают по сети! Как при изменении одним пользователем данных в любой из таблиц БД, сообщить об проведенных изменениях другим?
Пользовался обработчиком сообщений post_event, но он немного не подходит, т.к. не удобно обновлять всю таблицу, проще как мне кажется обновить только измененные данные. А в post_event-e, как я понял, нельзя передать параметр, например ID измененной строки, вернее к имени-события его добавить можно, но как его потом получить на клиенте, т.к. предварительно зарегистрировали просто имя-события без дополнительного параметра!
Как на клиенте получить информацию только об измененных данных? Есть ли другие способы кроме post_event-a?
PM MAIL   Вверх
Akella
Дата 3.6.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

опять  smile

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

точно smile , как придумаешь компоненту или алгоритм, сразу можешь запатентовать smile 
PM MAIL   Вверх
Deniz
Дата 4.6.2009, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
FMA
Дата 4.6.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Akella
Дата 4.6.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Deniz, ну так как же обновить в гриде только изменённые записи, не переоткрывая весь набор данных?
PM MAIL   Вверх
Deniz
Дата 4.6.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 4.6.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

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

Добавлено через 4 минуты и 8 секунд
Чтобы реализовать что-то такое независимое от пользователя, нужно иметь не привязанный к набору данных грид. Чтобы ячейки этого грида можно было обновлять в отдельном потоке.
Какие будут ещё соображения? 
Если я ошибаюсь, то как сделать обновлений в гриде только нужных записей, не мешая пользователю?
PM MAIL   Вверх
Deniz
Дата 5.6.2009, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(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'ом (или что-то в этом духе). Смысл тратить время на реализацию данного механизма я не вижу, следовательно, если кто-то сильно хочет "удивить" пользователя и автоматически обновлять данные, удачи.
Сам объясняю пользователям так: "Представь, что это распечатанный список. Ты можешь его руками править и т.д. Но чтобы получить новые данные, тебе нужно его еще раз распечатать, т.е. обновить. Когда нужны новые данные жми кнопку." Вот и все.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 5.6.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

так и я о том же smile
PM MAIL   Вверх
Bose
Дата 7.6.2009, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



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

А как вариант - записывать ID всех изменённых записей в отдельную таблицу. А клиент, чтобы при получении события проверял эту таблицу и смотрел какие там данные появили с момента последней проверки. А где-нить в полночь таблицу эту чистить, например. 
PM MAIL WWW Skype   Вверх
Akella
Дата 7.6.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



А смысл такой таблицы,  если будет кнопка Обновить. 
PM MAIL   Вверх
Deniz
Дата 8.6.2009, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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

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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Bose
Дата 8.6.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



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

есть вероятность что пока один пользователь будет обновлять данные - в базе изменится больше чем одна запись.
PM MAIL WWW Skype   Вверх
Deniz
Дата 8.6.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.