Синхронизация содержимого наборов данных в разных приложениях
При многопользовательском режиме доступа к БД из нескольких копий одного и того же приложения бывает необходимо обеспечить такую функциональность, чтобы каждый пользователь видел подтвержденные изменения, внесенные другими пользователями.
В клиентских приложениях, работающих в рамках архитектуры "клиент-сервер", подобная функциональность обеспечивается автоматически при уровне изоляции транзакций (Read Committed) и при условии использования компонента TTable. Компонент TQuery, выполнив запрос на чтение к удаленной БД, показывает записи НД в неизменном виде, независимо от того, изменялось ли после запроса содержимое таблицы БД. Для обновления информации в НД, реализуемом при помощи TQuery, приходится закрывать и повторно открывать компонент TQuery, т.е. повторно выполнять запрос к удаленной БД. При уровне изоляции транзакций Repeatable read пользователь в рамках транзакции видит данные только в том состоянии, в котором они находились на момент старта транзакции.
В приложениях, работающих в архитектуре "файл-сервер" (с использованием таблиц локальных СУБД Paradox, dBase), не происходит обновления в наборе данных (находящегося в режиме dsBrowse) в приложении одного пользователя, после внесения изменения в эту таблицу БД другим пользователем в своем
приложении. Отображение изменений производится лишь после выполнения данным пользователем метода Post или Delete. Если НД находится в состоянии dsBrowse, его обновление можно реализовать периодически, например, с помощью таймера:
procedure TFormI.TimerlTimer(Sender: TObject) ;
begin
IF Table1.State = dsBrowse THEN Table1.Refresh; end;
или, если нужно обновлять все НД приложения:
procedure TFormI.TimerlTimer(Sender: TObject);
var DSCnt : Integer;
i : Integer; begin
WITH Session.Databases [0] do begin
DSCnt := DataSetCount; // Получаем количество открытых НД
FOR i := О ТО DSCnt - 1 do // Обновляем каждый из них
IF DataSets[i].State = dsBrowse THEN
DataSets[i].Refresh;
END;//with
end;
Если нужно обновлять лишь некоторые из наборов данных, указатели на них можно поместить в список TStringsListl. Этот список можно создать и наполнить в момент создания формы (но не в момент ее активизации, т.к. форма может активизироваться много раз - после минимизации или после вызова другого приложения). При разрушении формы список удаляется:
var
DSList : TStringList;
procedure TFormI.FormCreate(Sender: TObject);
begin
DSList := TStringList.Create; // Создаем список
DSList.AddOb]ect(' '/Tablel); // Помешаем в него ссылку на Tablel
DSList. Add0b;ect (' \Table2); // и Table2
Timeri.Enabled := True; // Включаем таймер
end;
procedure TFormI.TimerlTimer(Sender: TObject) ;
var i : Integer;
begin
WITH DSList do begin
FOR i := 0 TO Count - 1 do
IF (Objects [i] as TDataSet).State = dsBrowse THEN (Objects[i] as TDataSet).Refresh;
END;//with
end;
procedure TFormI.FormDestroy(Sender: TObject);
begin
DSList.Free;
end;