![]() |
|
|
![]()
|
|
| Katerpillar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 19.6.2007 Репутация: нет Всего: нет |
Народ, не знаю в какой раздел и запостить... Пусть будет в общем...
Есть БД Клиент-сревер. Необходимо мгновенно (если запущено приложение) уведомлять клиента об изменениях в БД, если они касаются его... Напрмер... Введен документ (приказ), определены люди, с которыми этот приказ необходимо согласовать, кого ознакомить. Ответственное лицо меняет статус документа из оформляемого на "на согласовании" или " на ознакомлении" и тут же у соответствующих пользователей должно появится сообщение, типа "У Вас новый документ в папке "на согласование""... Пробовал реализовывать через UTP, посылать, что-то типа служебных слов при изменении статуса (#recheck# например), а у клиента при получении этого слова просто Query.Close, Query.Open... Хер... Коряво. И почему-то не всегда работает в нашем домене... Запросы рабочие (проверено), просто сообщения по UTP отсылаются без проблем... Может кто подскажет другую идею реализации? Проверять по таймеру совсем уж коряво... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 9 Всего: 51 |
Katerpillar,
завести таблицу в которую писать log последних событий в базе(например "Введен документ ID=xxx, определены люди, ID=XXX, ID=YYYс которыми этот приказ необходимо согласовать, кого ознакомить. Ответственное лицо меняет статус документа из оформляемого на "на согласовании" или " на ознакомлении"). С клиента переодически проверять эту таблицу - не появилось ли нужного документа. После этого обновлять(Query.Close, Query.Open) соответствующие датасеты. Какая база-то используется? В Интербейсе например есть механизм уведомлений пользователя о каких-либо событиях(SQL: post_event, компонент: TIBEventAlerter) |
|||
|
||||
| Katerpillar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 19.6.2007 Репутация: нет Всего: нет |
SQL Server 2000... Есть таблица логов... Триггерами туда все пишется... Но ведь придется _периодически_ проверять... А это не вариант - это коряво...
Вот с Алертер есть в IB... А в ADO+SQL Server такое сотворить можно? Но вряд ли вроде... Вот как Агент@Mail.ru узнает, что письмо пришло? Ну ведь не по таймеру же... |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
а как??? через каждый интервал времени проверка идет! Сервер не должен заботится о рассылке, клиенты должны заботится о получении нужных им данных... а при помощи тригерров?! |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 9 Всего: 51 |
||||
|
||||
| Katerpillar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 19.6.2007 Репутация: нет Всего: нет |
А вот и не по таймеру... Настроил UTP. Все моментально происходит. До этого не получалось по причине кривых рук. Всем спасибо. Можно закрывать тему.
P.S.: А вообще, таймер в БД - дрянь вещь. Прикиньте каждые, допустим, 5 секунд нагружать сеть передачей таблицы с 3 мио записей... Особенно, если в ней ничего не поменялось. Добавлено через 8 минут и 27 секунд
Я же написал... Триггерами в лог пишутся действия над данными (insert/update, таблица, ключевое поле записи). В саму таблицу пишется информация. Проверять по таймеру лог? Там записей будет больше, чем в самой таблице... Проверять по таймеру таблицу? Так может просто всех пользователей заставить по сети фильмы друг другу качать? Я понимаю, что сервер не должен заботиться... Вот я и хочу в приложении позаботиться... Но таймер - это сильно для студентов... ЗЫЖ Все равно, огромное спасибо всем! (А в агенте мейловском не таймер - проверено, и не UTP, конечно, как у меня... Там TCP стандартный... медленный, но верный |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 9 Всего: 51 |
Мммм.. а зачем всю таблицу тянуть? Делаешь SELECT только записей со времени последней проверки. Также можно ограничить записи только теми, которые необходимы концретному юзеру. Таких, я думаю будет совсем немного. |
|||
|
||||
| Katerpillar |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 19.6.2007 Репутация: нет Всего: нет |
Можно. Сначала смотрим лог, что поменялось со времени последней проверки (храним инфу о последней проверке), потом делаем селект только выбранных по логу записей из таблицы документов, нужных определенному юзеру... И делаем это все время... Вот это вот "все время" меня в таймере и напрягает... Я сделал так... В момент смены статуса посылается служебное сообщение по UTP #recheck#. Активные пользователи получают сообщение и делается Close, Open одного запроса. В лог ваще не лезем... Никто, кроме админа БД в лог не лезет. Кому как нравится... Видимо. Сенкс. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |