C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблемы многопользоват.работы с БД, FireBird+FIBPlus+обновление данных
Guest
Отправлено: 16.06.2005, 10:15


Не зарегистрирован







Хотел посоветоваться.
Пишу программу для работы с БД FireBird + через FIBPlus (С++Builder 6)
БД — многопользовательская, и с программой (и БД )одновременно
будет работать несколько (1-10) человек.

В связи с этим вопрос — кто как организует обновление информации
в таблицах, допустим когда секретарь вводит в базу данных новую
организацию и она должна появиться в уже открытых таблицах
других и прочие подобное изменение информации ...

Хочу сделать это через механизм событий БД, в триггере при
изменении (вставке, редактировании, удалении записей таблиц)
например post_event 'DeviceAlert'

SQL
CREATE TRIGGER "Device_Event" FOR "Device"
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS begin post_event 'DeviceAlert';
end


и "принимающий" события компонент TSIBfibEventAlerter из FIBPLus

CODE

void __fastcall TMod::FIBAlertEventAlert(TObject *Sender,
     AnsiString EventName, int EventCount)
{
    if(EventName == "DeviceAlert" && Device->Active){
      Device->Close(); Device->Open();
      }
    if(EventName == "CustomerAlert" && Customer->Active){
      Customer->Close(); Customer->Open();
      }
}


но возникает вопрос — как быть с child-таблицами,
и с тем, что в таблицах люди уже стоят на какой-то определенной
записи — как это запомнить и вернуть при переоткрытии,
или есть еще какие-то способы ?

Кто как делает? Заранее спасибо за советы. smile.gif
Guest
Отправлено: 16.06.2005, 10:28


Не зарегистрирован







Да, забыл написать.
Можно конечно попробовать запоминать данные
через TBookmark

CODE


   TBookmark BKMR_Device;

    if(EventName == "DeviceAlert" && Device->Active){
      BKMR_Device = Device->GetBookmark();
      Device->Close(); Device->Open();
      Device->GotoBookmark(BKMR_Device);
      }


но как быть со связанными таблицами, которые открываются
через свойство DetailConditions->dsForceOpen — проверять,
открыты ли эти наборы данных, запоминать перед
переоткрытием положение в них с помощью TBookmark
и восстанавливать после ???
А насколько корректно работает TBookmark ?
Не будет ли "ошибок" попадания не на ту запись,
ведь таблица (данные в таблице )уже изменились ?




olegenty
Отправлено: 16.06.2005, 11:18


Ветеран

Группа: Модератор
Сообщений: 2412



на ibase.ru есть статья об этом.
Guest
Отправлено: 16.06.2005, 11:54


Не зарегистрирован







Что-то не нашел такой статьи.
А название не подскажите ?
olegenty
Отправлено: 16.06.2005, 12:34


Ветеран

Группа: Модератор
Сообщений: 2412



Название — обновление клиентских наборов данных. а ссылка — вот:
http://ibase.ru/devinfo/clientrefresh.htm
Guest
Отправлено: 17.06.2005, 10:03


Не зарегистрирован







Эту статью читал, но не уверен что этот
способ достаточно удобный и что его
вообще реально используют. wink.gif

olegenty
Отправлено: 17.06.2005, 11:13


Ветеран

Группа: Модератор
Сообщений: 2412



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

Вернуться в Работа с базами данных в C++Builder