1 (edited by DenNik 2015-02-01 18:23:44)

Topic: Пример доступа к одной записи несколькими пользователями

Решил я придумать механизм, запрещающий нескольким пользователям одновременно редактировать одну запись
для этого вводятся служебные поля в таблицу БД
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=584&download=0

далее вводятся несколько глобальных переменных

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;

Post's attachments

Attachment icon screen1.png 13.48 kb, 336 downloads since 2015-02-01 

2 (edited by DenNik 2015-02-01 18:09:57)

Re: Пример доступа к одной записи несколькими пользователями

для теста сделал копию приложения в другую папку с доступом к одной и той же БД.
вроде работает smile
http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=585&download=0

Post's attachments

Attachment icon screen2.png 178.26 kb, 398 downloads since 2015-02-01 

Re: Пример доступа к одной записи несколькими пользователями

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

Re: Пример доступа к одной записи несколькими пользователями

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

Re: Пример доступа к одной записи несколькими пользователями

Благодарю за пример.

Dmitry.

6 (edited by mitrich45 2015-02-03 07:53:59)

Re: Пример доступа к одной записи несколькими пользователями

интересный пример! Спасибо DenNik
Кстати тут подумал, как то можно реализовать на этом примере скрипт, чтобы указывал на пользователя где открыта печатная форма (например: у пользователя ххх открыта печатная форма)

Re: Пример доступа к одной записи несколькими пользователями

mitrich45
В последней бета версии я исправил ошибку, которая блокировала базу данных при открытом предпросмотре отчета для печати.
http://myvisualdatabase.com/forum/viewtopic.php?id=977

Dmitry.

Re: Пример доступа к одной записи несколькими пользователями

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

Re: Пример доступа к одной записи несколькими пользователями

DenNik
Вы про сворачивании программы? да, исправлено и ссылка обновлена.

Dmitry.