powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка записей (проект ADP)
12 сообщений из 12, страница 1 из 1
Блокировка записей (проект ADP)
    #32776416
Gal13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите чайнику как реализовать блокировку записей, чтобы нельзя было изменять то , что редактирует другой пользователь... на уровне транзакций делать ?
Хочется попроще, поскольку еще не разобралась...
Делаю по книжке "Разарботка корп.приложений в Access 2002" Пол Литвин.

две хранимые процедуры,которые заносят SPID - идентификатор процесса SQL Server и идентификатор редактируемой записи в таблицу отдельную.... потом читают таблицу, если запись изменяется то выводится соответствующее сообщение, что нельзя редактировать запись....

CREATE PROCEDURE dbo.procReserveShipment ( @ShipmentId int, @ok int OUTPUT)
AS
SET NOCOUNT ON
DECLARE @error_save int, @rowcount_save int
INSERT INTO tblShipmentReservation (SPID, ShipmentId)
VALUES (@@SPID, @ShipmentId)
SELECT @error_save=@@ERROR, @rowcount_save=@@ROWCOUNT
IF @error_save<>0
SELECT @ok = 0
ELSE
BEGIN
IF @rowcount_save =1
SELECT @ok = -1
ELSE
SELECT @ok = 0
END
RETURN

вставляет в таблицу резервирования новую строчку. Вызывается из обработчика формы Dirty

Private Sub Form_Dirty(Cancel As Integer)
Dim cmdReserve As New ADODB.Command
Dim prm As ADODB.Parameter
On Error GoTo HandleErr
With cmdReserve
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdStoredProc
.CommandText = "procReserveShipment"
Set prm = .CreateParameter("@ShipmentId", adInteger, adParamInput)
prm.Value = shipment_numb.OldValue
mfOriginalShipId = shipment_numb.OldValue
.Parameters.Append prm
Set prm = .CreateParameter("@ok", adInteger, adParamOutput)
.Parameters.Append prm
.Execute options:=adExecuteNoRecords
If .Parameters("@ok") <> -1 Then
Err.Raise 1
End If

End With
ExitHere:
Set cmdReserve = Nothing
Set prm = Nothing
Exit Sub

HandleErr:
MsgBox ("This record is being edited by another user, Please try again later")
Cancel = True
Resume ExitHere

End Sub

вторая процедура освобождает запись....

CREATE PROCEDURE dbo.procUnreserveShipment (@shipId int)
AS
SET NOCOUNT ON
DELETE tblShipmentReservation
WHERE SPID=@@SPID AND ShipmentId=@shipId
RETURN


вызывается из AfterUpdate
Private Sub Form_AfterUpdate()
Dim cmdUnreserve As New ADODB.Command
Dim prm As ADODB.Parameter
On Error GoTo HandleErr
If mfInserting Then
GoTo ExitHere
End If
With cmdUnreserve
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdStoredProc
.CommandText = "procUnreserveShipment"
Set prm = .CreateParameter("@shipId", adInteger, adParamInput)
prm.Value = mfOriginalShipId
.Parameters.Append prm
.Execute options:=adExecuteNoRecords
End With
ExitHere:
Exit Sub
HandleErr:
MsgBox ("Unexpected error saving record ")
Resume ExitHere

End Sub

кроме того....

Private Sub Form_AfterInsert()
mfInserting = True
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
mfInserting = True
End Sub

чтобы не резервировать запись которая еще не вставлена в таблицу...

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

Никак не могу понять в чем дело...

AfterUpdate()
AfterDelConfirm()
AfterInsert()
BeforeInsert()
Dirty()
Delete()

все эти процедуры описаны... согласно с примерами из книжки...
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777866
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то все сложно как-то у Вас

есть такая штучка... хинт...

select from some_table with (nolock)

Если так работать с таблицами и его использовать, то их не блокируешь... Короче говоря, этот хинт используй.

Если юзер у меня с таблицами работает, его использую. Если юзер собирается менять данные, то есть такая весчь, как Однозначная таблица (UniqueTable).

Тогда даже в неизменяемом наборе (если вьюшек в нем не используешь) можно данные менять, ничего не блокируя при этом.

Кто первый, тот и изменил данные, кто второй - тоже изменил... только второму покажут окошко с выбором... мол, данные изменены другим пользователем... и выбор - 3 варианта - изменить (наплевать, что там наменяли), копировать в буфер и отменить
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777896
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да всё у него нормально, Литвин как и Гетц туфту толкать не будет.
Тут имеется в виду блокировка от того, чтобы юзера не могли одну и ту же запись редактировать одновременно, например какую нить накладную.

у меня похожая фича для mdb сделана, и тож иногда типа записи остаются "заблокироваными", я так и не понял из-за чего. Сделал кноку "Разблокировать" и всё
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777900
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cорри, не у него, а у неё
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777921
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя в данном случае можно и подумать.

например если юзер начал редактировать запись срабатывает Dirty, но если он вдруг нажал Esc (отмена редактирования), то AfterUpdate не сработает, т.е блокировка останется.
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777923
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на кой это надо то вообще?

Я понимаю, к примеру, бывают траблы, когда таблица блокируется... Никто тогда оттуда даже прочитать не может... так with (nolock) это устраняет.

А так то... зачем дополнительно то блокировать? Смысл то какой?
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777943
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShurgenzА на кой это надо то вообще?

Я понимаю, к примеру, бывают траблы, когда таблица блокируется... Никто тогда оттуда даже прочитать не может... так with (nolock) это устраняет.

А так то... зачем дополнительно то блокировать? Смысл то какой?

есть смысл, например в mdb:
хочешь отредактировать накладную, её содержимое копируется в лок.таблицу, а чтобы с оригиналом ничего не могли сделать (не удалить, не подтвердить, не оплатить и т.д) приходится вот таким способом её "блокировать"
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777949
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так сабж же об АДП... я ничего не спутал?
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777957
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, это ADP, но смысл похоже тот же
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32777999
ищ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"но если он вдруг нажал Esc (отмена редактирования)"
то будет событие Form_Undo
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32778011
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну значит туда и надо вешать разблокировку
...
Рейтинг: 0 / 0
Блокировка записей (проект ADP)
    #32778073
Фотография Shurgenz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нажать отмену, то останутся данные, измененные первым юзером. Только ошибка выскочит... ее то и профиксить надо... Err.Clear, типа
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка записей (проект ADP)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]