Форум » GUI » Блокировка записи в Dbf-файле » Ответить

Блокировка записи в Dbf-файле

Andrey: Всем привет ! Есть ли какие новые методы получения сведений о блокированных записей для DBF ? Или всё что осталось с Клипера перешло в Харбор и нового ничего нет. Я про ЛетоДБ знаю. На клипере в своё время лет 20 назад делал блокировку записей через семафорные файлы. Целая статья была в фирменном журнале Клипера. Перетащил этот вариант в терминалку Харбора, до сих пор работает. Теперь делаю на МиниГуи новую задачу, хотелось бы понять как дальше работать с обычным DBF. Как можно сделать блокировку записи, чтобы другой процесс определял бы это и мог выдавать какой юзер это сделал ?

Ответов - 8

Dima: Andrey пишет: Перетащил этот вариант в терминалку Харбора, до сих пор работает. Andrey пишет: Теперь делаю на МиниГуи новую задачу А какая разница для блокировок терминалка это или XXXGui ? Функциям xxxLock() фиолетово какой у тебя вариант терминалка или нет. Если нужен расширенный функционал , пиши самопал...думаю сложного тут нет ни чего.

PSP: Уточни, как именно должно выглядеть "чтобы другой процесс определял бы это и мог выдавать какой юзер это сделал"?

Andrey: PSP пишет: Уточни, как именно должно выглядеть "чтобы другой процесс определял бы это и мог выдавать какой юзер это сделал"? Примерно так: Таблица, всё редактирование в таблице происходит ТОЛЬКО через карточку. В этой карточке если запись не кем не занята, то юзер её может править. Если карточка блокирована другим процессом, то должна появляться надпись: Запись блокирована другим юзером: 1, 2, 3 и нет редактирования полей карточки. Вот примерно так.


PSP: Я бы сделал так: а) добавить в каждую таблицу поле LockByUser (имя поля - для примера), в котором будет храниться идентификатор пользователя, заблокировшего запись; б) после успешной (dbRLock() == .T.) блокировки записи в это поле записывается идентификатор текущего пользователя (используем dbCommit()); в) по окончании редактирования записи, перед dbRUnLock(), поле LockByUser очищается, используем dbCommit() и производится разблокирование; г) если попытка блокирования записи окончится неудачей (dbRLcok() == .F.), читаем поле LockByUser и выводим информацию о пользователе, который в настоящий момент занял запись. Вроде всё...))

Dima: Andrey пишет: Таблица, всё редактирование в таблице происходит ТОЛЬКО через карточку. В этой карточке если запись не кем не занята, то юзер её может править. Не знаю что там имеется в виду под карточкой , но у себя сделал так: если кто то зашел в документ на редактирование (накладная например) , то блочу весь документ пока юзер из него не выйдет , включая конечно проверку на возможность такой блокировки и если она успешна то после её окончания блок снимаю. Месаги конечно вешаю если документ заблочить не удаётся пишу и кто блокнул. Хранится всё это дело в отдельной базе блокировок по видам документов. Ранее без этого дела N-кол-во юзеров могло зайти в документ и править его

SergKis: Dima пишет то блочу весь документ пока юзер из него не выйдет , включая конечно проверку на возможность такой блокировки и если она успешна то после её окончания блок снимаю. Использую механизм "владелец документа", т.е. кто создал тот может менять, другие, если определено, могут смотреть. "Владельца" можно сменить, тогда он может менять, как правило это разделяется временными операциями. Блокировки только при записи.

Andrey: Dima пишет: Не знаю что там имеется в виду под карточкой Примерно вот так: Dima пишет: Месаги конечно вешаю если документ заблочить не удаётся пишу и кто блокнул. Хранится всё это дело в отдельной базе блокировок по видам документов. А если прога слетела у кого то, кто заблокировал документ - как тогда делаешь ?

Andrey: PSP пишет: Я бы сделал так: Вроде получилось как надо ! Пример в новом МиниГуи SAMPLES\Advanced\Tsb_Basic_2 Запускаем 2-3 экземпляра программы и получается то что нужно !



полная версия страницы