Конференция "Базы" » не обновляется автоматически ClientDataSet [D7, IB6.x]
 
  • kjbnn © (31.01.12 00:09) [0]
    Имеется несколько одинаковых удаленных клиентов на  SocketConnection+ClientDataSet, которые подключаются к одной и той же таблице одной и той же базы. Сервер доступа к базе на SQLConnection.
    При редактировании данных и вызова ApplyUpdate(-1) одним клиентом на других ClientDataSet  автоматически почему-то не обновляется.
    Есть ли простое и красивое решение автоматического обновления?
  • Германн © (31.01.12 01:12) [1]

    > При редактировании данных и вызова ApplyUpdate(-1) одним
    > клиентом на других ClientDataSet  автоматически почему-то
    > не обновляется.

    А должен?


    > Есть ли простое и красивое решение автоматического обновления?

    Большинство считает автоматическое обновление весьма "некошерным".
    См. например тут http://pda.delphimaster.net/?id=1313671934&n=1

    Хотя зависит от конкретной задачи.
  • Ega23 © (31.01.12 01:58) [2]

    >  на других ClientDataSet  автоматически почему-то не обновляется.


    И не должно.
  • kjbnn © (01.02.12 10:31) [3]
    Хорошо, пусть не должно. Но ведь тогда должен существовать какой-то способ оповестить всех остальных об изменениях в БД чтобы сделать Refresh. Что за способ?
  • AV © (01.02.12 10:54) [4]

    >  оповестить всех остальных об изменениях в БД чтобы сделать
    > Refresh

    а смысл?
  • kjbnn © (01.02.12 11:48) [5]
    Например, кто-то изменяет конфигурацию системы, которая отражается в  компоненте TreeView клиента. То другие клиенты должны работать с актуальной информацией в своих TreeView.
    Например, первый клиент удалил какой-то элемент из TreeView, а второй пытается его редактировать, а третий вообще питается считать его состояние.
    Как же без CDS.Refresh? Ведь только после его вызова содержание набора данных можно считать действительным, а не устаревшим.

    Поясняю, что по системой понимается система управления чего либо состоящая и многочисленных и различных компонент (железок ,компьютеров и датчиков)
  • AV © (01.02.12 12:11) [6]
    А например, клиент отошел, ( а если еще + подключается через сотового, платит за трафик.) И подошел через пол-дня. Зачем ему траффик за пол-дня видеть?

    или вот

    >> Например, первый клиент удалил какой-то элемент из TreeView,
    второй обновил,
    >> пытается его редактировать,
    нажал Ok.

    А третий, нажал удалить, но на долю-секунды раньше.
    И как быть?

    А просто - изменения второго не принимаются, с ответом, что то, что ты хочешь изменить - более не существует, возможно было удалено.
  • Ega23 © (01.02.12 12:31) [7]

    > Например, кто-то изменяет конфигурацию системы, которая
    > отражается в  компоненте TreeView клиента. То другие клиенты
    > должны работать с актуальной информацией в своих TreeView.
    >
    > Например, первый клиент удалил какой-то элемент из TreeView,
    >  а второй пытается его редактировать, а третий вообще питается
    > считать его состояние.


    Вот, длинное обсуждение. Не поленись и прочитай до конца. При этом обдумай внимательно.
    http://pda.delphimaster.net/?n=3&id=1326056648&p=1

    Кстати, также имеет смысл заодно вот это прочитать, это не совсем по теме, но наверняка у тебя аналогичная "хотелка" возникнет. тоже не поленись, прочитай.
    http://pda.delphimaster.net/?n=18&id=1323259560&p=1
  • Германн © (01.02.12 13:18) [8]

    > Поясняю, что по системой понимается система управления чего
    > либо состоящая и многочисленных и различных компонент (железок
    > ,компьютеров и датчиков)

    Ну конечно. Такие задачи нужно решать только через использование БД! БД ведь всё сама умеет :)
  • Ega23 © (01.02.12 14:32) [9]

    > Поясняю, что по системой понимается система управления чего
    > либо состоящая и многочисленных и различных компонент (железок
    > ,компьютеров и датчиков)


    БД является хранилищем данных. Которая отдаёт данные по запросу. Спросил - получил. Не спросил - не получил.
    Есть конечно всякие искусственные свистелки-перделки, позволяющие нотифицировать кого-либо по факту изменения данных, но они:
    1. Отнюдь не универсальные
    2. Имеют массу ограничений
    3. Как правило весьма ресурсоёмкие
    4. Поддерживаются далеко не всеми СУБД, ибо в стандарте такого нет.
  • Германн © (02.02.12 01:10) [10]

    > Поясняю, что по системой понимается система управления чего
    > либо состоящая и многочисленных и различных компонент (железок
    > ,компьютеров и датчиков)

    Стоит что-нибудь почитать о трехзвенной архитектуре.
  • kjbnn © (02.02.12 16:37) [11]
    Клиент с ClientDataSet как раз и является клиентским ПО в 3-х трехзвенке.

    Почитав предложенное, подумав пришел к тому что:
    1. необходимость автообновления ClientDataSet это индивидуально (зависит от задачи)
    2. обновлять лучше по событию, для этого изменяющий запись в БД или сервер доступа к данным  должен позаботиться об оповещении остальных клиентов по поводу изменения в БД.
    3. Метод оповещения клиентов - любой, какой устроит (с помощью SocketServer, либо обратных вызовов сервером доступа к данным, и т.д.)

    В моем случае сложность только в том, что данные в клиенте (принял решение) хранятся не ClientDataSet, а копируются в переменные, на которые указывают элементы TreeView, чем и обуславливаются некоторое трудности обновления и редактирования данных. TreeView - требование ТЗ. Нормального конвертера  TreeView <> Набор Данных не нашел.

    Всем СПАСИБО!
  • Ega23 © (02.02.12 20:40) [12]

    >  Нормального конвертера  TreeView <> Набор Данных не нашел.


    Напиши свой, в чём проблема?
    ИМХО, все TDBTreeView писали  :)
  • AV © (03.02.12 08:36) [13]

    > все TDBTreeView писали  :)

    +1
    Елена Филиппова "королева" сайта Королевство Delphi имеет неплохую авторскую статью на этот счет.
    http://delphikingdom.ru/asp/viewitem.asp?catalogid=488
  • имя (21.08.12 18:34) [14]
    Удалено модератором
 
Конференция "Базы" » не обновляется автоматически ClientDataSet [D7, IB6.x]
Есть новые Нет новых   [119482   +94][b:0][p:0.001]