Topic: Пример доступа к одной записи несколькими пользователями
Решил я придумать механизм, запрещающий нескольким пользователям одновременно редактировать одну запись
для этого вводятся служебные поля в таблицу БД
далее вводятся несколько глобальных переменных
var
isBlocked: boolean; // состояние блокировки редактируемой записи
// (открыта ли она другим пользователем)
isNewRecord: boolean;
RecordID: string; // идентификатор записи
затем при открытии окна редактирования проверяю, заблокирована ли уже запись. если нет, блокирую ее
procedure frmEditor_OnShow (Sender: string; Action: string);
begin
isBlocked:= false;
RecordID:= '';
isNewRecord:= true;
// проверка, новая запись или нет
if Action = 'NewRecord' then Exit;
isNewRecord:= false;
// получаем идентификатор записи
RecordID:= IntToStr(frmMain.GridMain.dbItemID);
// получаем состояние блокировки записи
isBlocked:= SQLExecute('SELECT blocked FROM main WHERE id='+RecordID);// если запись уже заблокирована, покажем предупреждающую надпись и блокируем редактор
if isBlocked then
begin
frmEditor.lblWarning.Caption:= 'Запись редактируется пользователем ' +
SQLExecute('SELECT block_user FROM main WHERE id='+RecordID);
EnableEditor(false);
end else
// иначе монополизируем открытую запись (запишем флаг blocked и имя пользователя)
begin
SQLExecute('UPDATE main SET blocked=1 WHERE id='+RecordID);
SQLExecute('UPDATE main SET block_user='''+GetUserName+''' WHERE id='+RecordID);
end;
end;
при закрыти редактора разблокируем запись
procedure frmEditor_OnClose (Sender: string; Action: string);
begin
// разблокируем запись, если запись была НЕ ЗАБЛОКИРОВАНА и НЕ НОВАЯ
if (not isBlocked) and (not isNewRecord) then
SQLExecute('UPDATE main SET blocked=0 WHERE id='+RecordID);
// разблокируем редактор
if isBlocked then EnableEditor(true);
end;