Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Оперативное информирование :-)


Автор: Katerpillar 19.6.2007, 08:18
Народ, не знаю в какой раздел и запостить... Пусть будет в общем...

Есть БД Клиент-сревер. Необходимо мгновенно (если запущено приложение) уведомлять клиента об изменениях в БД, если они касаются его... Напрмер... Введен документ (приказ), определены люди, с которыми этот приказ необходимо согласовать, кого ознакомить. Ответственное лицо меняет статус документа из оформляемого на "на согласовании" или " на ознакомлении" и тут же у соответствующих пользователей должно появится сообщение, типа "У Вас новый документ в папке "на согласование""... Пробовал реализовывать через UTP, посылать, что-то типа служебных слов при изменении статуса (#recheck# например), а у клиента при получении этого слова просто Query.Close, Query.Open... Хер... Коряво. И почему-то не всегда работает в нашем домене... Запросы рабочие (проверено), просто сообщения по UTP отсылаются без проблем...

Может кто подскажет другую идею реализации? Проверять по таймеру совсем уж коряво...

Автор: Bose 19.6.2007, 13:28
Katerpillar, 
завести таблицу в которую писать log последних событий в базе(например "Введен документ  ID=xxx, определены люди, ID=XXX, ID=YYYс которыми этот приказ необходимо согласовать, кого ознакомить. Ответственное лицо меняет статус документа из оформляемого на "на согласовании" или " на ознакомлении"). 

С клиента переодически проверять эту таблицу - не появилось ли нужного документа. После этого обновлять(Query.Close, Query.Open) соответствующие датасеты. 

Какая база-то используется? В Интербейсе например есть механизм уведомлений пользователя о каких-либо событиях(SQL: post_event, компонент: TIBEventAlerter)

Автор: Katerpillar 19.6.2007, 14:18
SQL Server 2000... Есть таблица логов... Триггерами туда все пишется... Но ведь придется _периодически_ проверять... А это не вариант - это коряво... 

Вот с Алертер есть в IB... А в ADO+SQL Server такое сотворить можно? Но вряд ли вроде...

Вот как Агент@Mail.ru узнает, что письмо пришло? Ну ведь не по таймеру же...

Автор: Rodman 19.6.2007, 14:36
Цитата(Katerpillar @  19.6.2007,  13:18 Найти цитируемый пост)
Ну ведь не по таймеру же

    а как??? через каждый интервал времени проверка идет!

Сервер не должен заботится о рассылке, клиенты должны заботится о получении нужных им данных...
Цитата(Katerpillar @  19.6.2007,  13:18 Найти цитируемый пост)
А в ADO+SQL Server такое сотворить можно?

а при помощи тригерров?!

Автор: Bose 19.6.2007, 16:14
Цитата(Katerpillar @  19.6.2007,  14:18 Найти цитируемый пост)
от как Агент@Mail.ru узнает, что письмо пришло? Ну ведь не по таймеру же...

По таймеру, по таймеру. Масса вещей в приложениях происходит именно по нему smile 

Автор: Katerpillar 20.6.2007, 06:37
А вот и не по таймеру... Настроил UTP. Все моментально происходит. До этого не получалось по причине кривых рук. Всем спасибо. Можно закрывать тему.

P.S.: А вообще, таймер в БД - дрянь вещь. Прикиньте каждые, допустим, 5 секунд нагружать сеть передачей таблицы с 3 мио записей... Особенно, если в ней ничего не поменялось.

Добавлено через 8 минут и 27 секунд
Цитата(Rodman @ 19.6.2007,  14:36)
Цитата(Katerpillar @  19.6.2007,  13:18 Найти цитируемый пост)
Ну ведь не по таймеру же

    а как??? через каждый интервал времени проверка идет!

Сервер не должен заботится о рассылке, клиенты должны заботится о получении нужных им данных...
Цитата(Katerpillar @  19.6.2007,  13:18 Найти цитируемый пост)
А в ADO+SQL Server такое сотворить можно?

а при помощи тригерров?!

Я же написал... Триггерами в лог пишутся действия над данными (insert/update, таблица, ключевое поле записи). В саму таблицу пишется информация. Проверять по таймеру лог? Там записей будет больше, чем в самой таблице... Проверять по таймеру таблицу? Так может просто всех пользователей заставить по сети фильмы друг другу качать?

Я понимаю, что сервер не должен заботиться... Вот я и хочу в приложении позаботиться... Но таймер - это сильно для студентов...

ЗЫЖ Все равно, огромное спасибо всем! (А в агенте мейловском не таймер - проверено, и не UTP, конечно, как у меня... Там TCP стандартный... медленный, но верный smile )

Автор: Bose 20.6.2007, 13:01
Цитата(Katerpillar @  20.6.2007,  06:37 Найти цитируемый пост)
P.S.: А вообще, таймер в БД - дрянь вещь. Прикиньте каждые, допустим, 5 секунд нагружать сеть передачей таблицы с 3 мио записей... Особенно, если в ней ничего не поменялось.

Мммм.. а зачем всю таблицу тянуть? Делаешь SELECT только записей со времени последней проверки. Также можно ограничить записи только теми, которые необходимы концретному юзеру. Таких, я думаю будет совсем немного.

Автор: Katerpillar 20.6.2007, 14:15
Цитата(Bose @ 20.6.2007,  13:01)
Цитата(Katerpillar @  20.6.2007,  06:37 Найти цитируемый пост)
P.S.: А вообще, таймер в БД - дрянь вещь. Прикиньте каждые, допустим, 5 секунд нагружать сеть передачей таблицы с 3 мио записей... Особенно, если в ней ничего не поменялось.

Мммм.. а зачем всю таблицу тянуть? Делаешь SELECT только записей со времени последней проверки. Также можно ограничить записи только теми, которые необходимы концретному юзеру. Таких, я думаю будет совсем немного.

Можно. Сначала смотрим лог, что поменялось со времени последней проверки (храним инфу о последней проверке), потом делаем селект только выбранных по логу записей из таблицы документов, нужных определенному юзеру... И делаем это все время... Вот это вот "все время" меня в таймере и напрягает... 

Я сделал так... В момент смены статуса посылается служебное сообщение по UTP #recheck#. Активные пользователи получают сообщение и делается Close, Open одного запроса. В лог ваще не лезем... Никто, кроме админа БД в лог не лезет.

Кому как нравится... Видимо. 

Сенкс.  smile 

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