Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление данных в БД, Одновременный показ изменений 
:(
    Опции темы
richy
Дата 3.12.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Ребят такая проблема у меня....Сетевая БД, работающая под Interbase 6...Задача: Если пользователь на сервере создает запись или изменяет ее в DBGrid, то через 3-5 сек. на всех компах в сети, в таких же программах клиентах должна отображаться эта запись, т.е. все поьзователи в сети, работающие с этой БД, если вносят изменения в DBGrid, то все должны видеть это и также могли изменять. (Изменения происходят у меня в БД, если перезапускать программу или набор данных)...вот....Прошу Вашей помощи....как это можно осуществить, желательно подробно...
Заранее большое спасибо...))

Это сообщение отредактировал(а) richy - 3.12.2007, 16:13
PM MAIL   Вверх
Exai1e
Дата 3.12.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Код

...
Вносим изменения | данные
...
  
IBTransaction1.CommitRetaining;
Query1.Close;
Query1.Open;


разве не работает в сетевой версии сети ?...

Примерно вот так:
Код

procedure TfmMain.btnAddInfoClick(Sender: TObject);
begin
  {Вносим данные в базу}
  IBQuery2.Params.ParamByName('MEDNAME' ).Value := edtName.Text;
  IBQuery2.Params.ParamByName('MEDTYPE' ).Value := cbType.Text;
  IBQuery2.Params.ParamByName('MEDCOUNT').Value := StrToInt(edtCount.Text);
  IBQuery2.Params.ParamByName('MEDPRICE').Value := StrToInt(edtPrice.Text);
  IBQuery2.Params.ParamByName('MEDREC'  ).Value := cbRec.Text;
  IBQuery2.Params.ParamByName('MEDPACK' ).Value := edtPack.Text;
  IBQuery2.Params.ParamByName('MEDABOUT').Value := edtAbout.Text;
  try
    IBQuery2.ExecSQL;
  except
    ShowMessage('Добавление данных в базу не удалось');
    IBTransaction1.RollbackRetaining;
    exit;
  end;
  IBTransaction1.CommitRetaining;
  IBQuery1.Close;
  IBQuery1.Open;
end;


Это сообщение отредактировал(а) Exai1e - 3.12.2007, 21:38


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
richy
Дата 4.12.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Цитата(Exai1e @ 3.12.2007,  21:31)
Код

...
Вносим изменения | данные
...
  
IBTransaction1.CommitRetaining;
Query1.Close;
Query1.Open;


разве не работает в сетевой версии сети ?...

Примерно вот так:
Код

procedure TfmMain.btnAddInfoClick(Sender: TObject);
begin
  {Вносим данные в базу}
  IBQuery2.Params.ParamByName('MEDNAME' ).Value := edtName.Text;
  IBQuery2.Params.ParamByName('MEDTYPE' ).Value := cbType.Text;
  IBQuery2.Params.ParamByName('MEDCOUNT').Value := StrToInt(edtCount.Text);
  IBQuery2.Params.ParamByName('MEDPRICE').Value := StrToInt(edtPrice.Text);
  IBQuery2.Params.ParamByName('MEDREC'  ).Value := cbRec.Text;
  IBQuery2.Params.ParamByName('MEDPACK' ).Value := edtPack.Text;
  IBQuery2.Params.ParamByName('MEDABOUT').Value := edtAbout.Text;
  try
    IBQuery2.ExecSQL;
  except
    ShowMessage('Добавление данных в базу не удалось');
    IBTransaction1.RollbackRetaining;
    exit;
  end;
  IBTransaction1.CommitRetaining;
  IBQuery1.Close;
  IBQuery1.Open;
end;

Большое спасибо, сегодня попробую....
PM MAIL   Вверх
richy
Дата 4.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Цитата(richy @ 4.12.2007,  15:39)
Цитата(Exai1e @ 3.12.2007,  21:31)
Код

...
Вносим изменения | данные
...
  
IBTransaction1.CommitRetaining;
Query1.Close;
Query1.Open;


разве не работает в сетевой версии сети ?...



Да нет....мы нетак поняли друг-друга.....Проблема не так выглядит....Сеть, в ней 2 компа, на одном запущено приложение и соединенное с БД и на другом запущено это же приложение и тоже соединено с этой же БД....суть задачи: Если пользователь на первом компе вводит данные в DBGrid, то автоматически в реальном времени на другом компе появляется эти же данные в DBGrid....т.е. это похоже на работу программы RAdmin, второй пользователь по сети видит все, что происходит на мониторе другого компа и может делать там все....Как можно это осуществить и что бы не было проблем синхронизации
PM MAIL   Вверх
nettle
Дата 4.12.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.1.2007
Где: BG

Репутация: нет
Всего: нет



Вот етот компонент TIBEventAlerter попробовал?
В папке Demos\db\ibdemo на delphi есть... 
PM MAIL   Вверх
Exai1e
Дата 5.12.2007, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Так вроде 
Код

IBTransaction1.CommitRetaining;
Query1.Close;
Query1.Open;

как раз таки и обновляет данные, и пользователь на второй машине должен увидеть изменения...


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SergeBS
Дата 5.12.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



richy
Идешь на ibase.ru и читаешь статью на эту тему. Поскольку просто из Делфи это невозможно при разумных затратах. Не будешь же каждую секунду проверять, были изменения или нет.
PM MAIL   Вверх
Deniz
Дата 6.12.2007, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(SergeBS @  5.12.2007,  19:05 Найти цитируемый пост)
Не будешь же каждую секунду проверять, были изменения или нет. 
есть компонент TIBEventAlerter.

richy, не советую автоматически делать Close Open при получении события от TIBEventAlerter, лучше какую-нибудь кнопку подсветить или еще чего, но обновление должен запустить пользователь. Т.е. твое дело сообщить, что есть изменения, а пользователь сам решит когда ему обновиться.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SergeBS
Дата 6.12.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Deniz
Прочитай ВНИМАТЕЛЬНО что этот alerter делает.
PM MAIL   Вверх
Deniz
Дата 6.12.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



SergeBS, можно ссылочку на внимательное прочтение?

Добавлено через 4 минуты и 38 секунд
Возможно не так компонент назвал, в IBX TIBEvents, в FIBPlus TSIBfibEventAlerter1. Что не так?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
nettle
Дата 6.12.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.1.2007
Где: BG

Репутация: нет
Всего: нет



для успешная работа IBEvents надо покопать у db design - тригери before/after insert, before/after update.
вот пример:
Код

CREATE TRIGGER INVOICE_AFTERINSERT FOR INVOICE
ACTIVE AFTER INSERT POSITION 0
AS
begin
  POST_EVENT "INVOICE_REFRESH";
end

CREATE TRIGGER INVOICE_AFTERUPDATE FOR INVOICE
ACTIVE AFTER UPDATE POSITION 0
AS
begin
  POST_EVENT "INVOICE_REFRESH";
end

...у IBAlerter компонент ловиш event: "INVOICE_REFRESH"
PM MAIL   Вверх
richy
Дата 8.12.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Ребят всем спасибо, буду пробовать....))
PM MAIL   Вверх
SergeBS
Дата 10.12.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Deniz
Все проще. И в статье об этом пишется. Послать сообщение стандартным для винды способом  можно. Но нет гарантии, что оно будет получено. И нет квитирования, что оно получено.
Поэтому и ищут более другие способы. Ну и заодно пытаются поменьше ресурсов сожрать на эту задачу. Я в свое время изрядно попыхтел, чтобы обеспечить гарантированную рассылку с сервака по нужным адресам в локалке сообщение о неудаче с бэкапом.
PM MAIL   Вверх
Deniz
Дата 10.12.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Off:
Цитата(SergeBS @  10.12.2007,  13:59 Найти цитируемый пост)
И в статье об этом пишется. 
ну дай ссылку на статью, мне интересно почитать.

Цитата(SergeBS @  10.12.2007,  13:59 Найти цитируемый пост)
Послать сообщение стандартным для винды способом  можно. Но нет гарантии, что оно будет получено. И нет квитирования, что оно получено.
если сообщение, посланное с помощью компонентов IB, не дошло до клиента, то вероятнее всего связь уже оборвалась, и это сообщение клиенту уже по барабану, все равно нужно переподключаться и выбирать новые записи.
В общем дай ссылку почитаю, просветлюсь, реально интересно.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SergeBS
Дата 11.12.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Deniz
IBASE.RU - Маленькие хитрости Interbase:
Цитата

Q: Как сделать так, что бы у двух пользователей, работающих с одной и той же таблицей, данные на экране отображались одинаковые? Т.е. один отредактировал (добавил), а у другой увидел.

A: Это обсуждалось уже много раз и в разных конференциях. Общий вывод был такой:

   1. Можно использовать события (events). Для этого в триггерах на вставку/ изменение/ удаление записей надо поставить команду посылки события POST_EVENT "I am changed", а в программе использовать компонент для их отлова. К сожалению, события кривовато работают, самый непрятный момент - то что после завершения программы поток живет еще 7 секунд (и не спрашивайте меня - почему), результат - access violation. Один из лучших компонентов для подписки на события сервера и их обработки на клиенте, в котором решено большинство проблем - SuperIBEventAlerter, включен в поставку FIBPlus 4.4 (неофициальный сайт разработчиков: users.i.com.ua), а также компоненты TIBEvents из InterBase Express (начиная с версии IBX v4.5) базируются на этом коде.
   2. Обновлять данные автоматически в момент прихода события - неправильно (представьте, что у Вас не 2, а 202 сотрудника редактируют один датасет, при этом он достаточно объемный, собирает данные из десятка таблиц и открывается секунд 10...), хотя можно - если таблица маленькая, меняется редко, и еще хорошо бы следить, в каком состоянии сейчас датасет (dsBrowse, dsEdit, ...) чтоб пользователь не разбил компьютер при очередной потере редактируемых данных в результате обновления датасета smile
   3. Самое лучшее - бросить на форму кнопку "Обновить", которая включается при получении события, а пользователь пусть сам решает, когда ее нажать и обновить данные.
   4. Можно переоткрывать датасет по таймеру через заданные интервалы времени, но это серьезно повышает загрузку сервера
   5. Еще вариант - http://www.ibase.ru/devinfo/ClientRefresh.htm, но если честно, мне он кажется слишком сложным. Вроде бы в IB 6.x/FB обещают сделать возможность регистрации на события по маске, тогда вместе с событием будет возможность передачи номера обновленного документа.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1274 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.