| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 20.6.2007, 06:37 | ||
| А вот и не по таймеру... Настроил UTP. Все моментально происходит. До этого не получалось по причине кривых рук. Всем спасибо. Можно закрывать тему. P.S.: А вообще, таймер в БД - дрянь вещь. Прикиньте каждые, допустим, 5 секунд нагружать сеть передачей таблицы с 3 мио записей... Особенно, если в ней ничего не поменялось. Добавлено через 8 минут и 27 секунд
Я же написал... Триггерами в лог пишутся действия над данными (insert/update, таблица, ключевое поле записи). В саму таблицу пишется информация. Проверять по таймеру лог? Там записей будет больше, чем в самой таблице... Проверять по таймеру таблицу? Так может просто всех пользователей заставить по сети фильмы друг другу качать? Я понимаю, что сервер не должен заботиться... Вот я и хочу в приложении позаботиться... Но таймер - это сильно для студентов... ЗЫЖ Все равно, огромное спасибо всем! (А в агенте мейловском не таймер - проверено, и не UTP, конечно, как у меня... Там TCP стандартный... медленный, но верный |
| Автор: Bose 20.6.2007, 13:01 | ||
Мммм.. а зачем всю таблицу тянуть? Делаешь SELECT только записей со времени последней проверки. Также можно ограничить записи только теми, которые необходимы концретному юзеру. Таких, я думаю будет совсем немного. |
| Автор: Katerpillar 20.6.2007, 14:15 | ||||
Можно. Сначала смотрим лог, что поменялось со времени последней проверки (храним инфу о последней проверке), потом делаем селект только выбранных по логу записей из таблицы документов, нужных определенному юзеру... И делаем это все время... Вот это вот "все время" меня в таймере и напрягает... Я сделал так... В момент смены статуса посылается служебное сообщение по UTP #recheck#. Активные пользователи получают сообщение и делается Close, Open одного запроса. В лог ваще не лезем... Никто, кроме админа БД в лог не лезет. Кому как нравится... Видимо. Сенкс. |