Обновление клиентских наборов данных

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
VitGun
Сообщения: 4
Зарегистрирован: 14 окт 2007, 21:57

Обновление клиентских наборов данных

Сообщение VitGun » 14 окт 2007, 22:07

Ох щас меня материть будут местные гуру, но все же...

Есть небольшое приложение. Delphi + IBX + Firebird 2.0

в базе 1 таблица, 2 поля ID и NAME

на форме грид и кнопка. по нажатию в таблицу добавляется запись.

Так вот. Запускаю два экземпляра приложения. В одном жму кнопку - запись добавилась. Понятно, что для того чтобы во втором экземпляре изменения появились нужно октрыть НД заново, но как это сделать без участия пользователя? Как отловить событие изменения НД и открыть его заново?


Сразу скажу, что статью здесь я читал....только смысл до меня не дошел. Мне для каждой таблицы создавать триггер и еще дополнительную таблицу для регистрации изменений? Извините, но мне это бредом кажется. А если у меня 1000 рабочих таблиц?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 00:19

рекомендую в несколько попыток поиском найти обсуждения подобных тем здесь и на sql.ru. В общем случае рекомендации сводятся к следующим:

1. представьте, что 20 пользователей тыкают кнопки. сколько раз в секунду у них будет автоматически перерисовываться экран, и зачем?
2. эвенты имеет смысл использовать для редких обновлений. Или когда данные меняются где-то в одном месте, а мониторят их изменения (только!) в другом
3. обычно дешевле для глаз и для сети сделать для пользователя кнопку (или "горячую клавишу") для переоткрытия набора данных. Потому что никаким иным способом кроме перевыполнения запроса обновленные данные увидеть невозможно (еще и нужен уровень изолированности ReadCommitted).

кроме того, обычно при таком переоткрытии запроса текущее положение курсора пользователя, разумеется, "соскакивает". представьте как пользователь будет материть вас, пытаясь встать на запись и отредактировать ее, когда события будут ему перерисовывать грид каждые 5-10 секунд.

VitGun
Сообщения: 4
Зарегистрирован: 14 окт 2007, 21:57

Сообщение VitGun » 15 окт 2007, 09:44

Ну не совсем так все плохо как вы описали. Пользователей у меня будет 2, ну максимум 3. А вот с таким как быть? Есть справочник. Допустим сотовых телефонов. 1 пользователь добавил туда новую модель, но в другой запущенной копии приложения этой модели нет. Как тогда? тоже вручную переоткрывать набор данных? Боюсь что в ТАКОМ случае меня юзеры убьют, а не за перерисовку грида.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 09:51

тоже вручную переоткрывать набор данных?
а КАК еще ??? Вы же понимаете, что данные можно прочитать оператором select, и никак иначе.

VitGun
Сообщения: 4
Зарегистрирован: 14 окт 2007, 21:57

Сообщение VitGun » 15 окт 2007, 10:11

Нет...это я понимаю....но не вручную же его переоткрывать. Возьмите большие учетные системы. Там что юзер тоже постоянно тычет "Refresh"?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 окт 2007, 10:22

Там что юзер тоже постоянно тычет "Refresh"?
ему это обычно не надо. или область refresh составляет небольшое количество записей.

- Маняаааа! Ты новый товар в справочник забила?
- Даааа
- А где он? я уже полчаса листаю, и не вижу его!

собственно, при чем тут автоматический или ручной refresh ?

я собственно не отговариваю - хотите, используйте events.
Кстати. статью Плотникова м.б. Вам еще рано читать. в смысле, Вы events пробовали?

добавлю цитату из первого письма
Извините, но мне это бредом кажется. А если у меня 1000 рабочих таблиц?
Вот ЭТО как раз больше похоже на бред. Пользователю нужно будет видеть конкурирующие изменения во всех 1000 таблицах?

VitGun
Сообщения: 4
Зарегистрирован: 14 окт 2007, 21:57

Сообщение VitGun » 15 окт 2007, 10:41

я собственно не отговариваю - хотите, используйте events.
Кстати. статью Плотникова м.б. Вам еще рано читать. в смысле, Вы events пробовали?
Пробовал. Работает вроде. Но такой подход критикуют. Почему? Ну я согласен, что грид будет перерисовываться и указатель возвратится на 1-ю запись, но ведь перед закрытием его можно запомнить и после открытия поставить курсор на ту же запись.
Вот ЭТО как раз больше похоже на бред. Пользователю нужно будет видеть конкурирующие изменения во всех 1000 таблицах?
Может быть. Спорить не осмелюсь.

Спасибо что уделили время моей теме.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 окт 2007, 10:43

VitGun писал(а):Ну не совсем так все плохо как вы описали. Пользователей у меня будет 2, ну максимум 3.
Не вижу особой разницы с 20-ю.
Если Васькин нацелился на редактирование записи и уже занёс палец над кнопкой, а в этот момент Петькин уже ткнул - у Васькина произошёл рефреш, но остановить палец он уже не смог - ткнул в другую запись. Внимание вопрос - будет ли Васькин жаловаться на Петькина, или скооперируются и открутят голову тебе?
VitGun писал(а):А вот с таким как быть? Есть справочник. Допустим сотовых телефонов. 1 пользователь добавил туда новую модель, но в другой запущенной копии приложения этой модели нет. Как тогда? тоже вручную переоткрывать набор данных?
Когда так говорят, мне всегда представляется эдакая команда гремлинов, в мешочках тащит данные (вручную!) на клиента. Либо юзер с красными глазами, который в екселе пытается JOIN таблиц имитировать. Нажать F5 юзеру ничуть не напряжно, к тому же он контролирует удобное время обновления сам.
Почитай к примеру вот тут, достаточно бурное обсуждение было.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 15 окт 2007, 11:07

Мы делали на событиях: с десяток пользователей + репликация.
Нормально работало. ;-)
Правда фечилось не всё заново, а только изменённые/добавленные/удалённые.
Ну и не напрямую в датасет на грид зацепленный, а в мастер датасет впамять.
В гриде отображались дочерние датасеты, зацепленные на мастер, отфильтрованные и отсортированные. ;-)
Использовали EhLib.

P.S. Сейчас придерживаемся подобной же модели, но используем Qt + Python.

Ответить