|
|
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
Подскажите чайнику как реализовать блокировку записей, чтобы нельзя было изменять то , что редактирует другой пользователь... на уровне транзакций делать ? Хочется попроще, поскольку еще не разобралась... Делаю по книжке "Разарботка корп.приложений в 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() все эти процедуры описаны... согласно с примерами из книжки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 22:59:39 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
Что-то все сложно как-то у Вас есть такая штучка... хинт... select from some_table with (nolock) Если так работать с таблицами и его использовать, то их не блокируешь... Короче говоря, этот хинт используй. Если юзер у меня с таблицами работает, его использую. Если юзер собирается менять данные, то есть такая весчь, как Однозначная таблица (UniqueTable). Тогда даже в неизменяемом наборе (если вьюшек в нем не используешь) можно данные менять, ничего не блокируя при этом. Кто первый, тот и изменил данные, кто второй - тоже изменил... только второму покажут окошко с выбором... мол, данные изменены другим пользователем... и выбор - 3 варианта - изменить (наплевать, что там наменяли), копировать в буфер и отменить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:04:08 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
да всё у него нормально, Литвин как и Гетц туфту толкать не будет. Тут имеется в виду блокировка от того, чтобы юзера не могли одну и ту же запись редактировать одновременно, например какую нить накладную. у меня похожая фича для mdb сделана, и тож иногда типа записи остаются "заблокироваными", я так и не понял из-за чего. Сделал кноку "Разблокировать" и всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:12:48 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
cорри, не у него, а у неё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:13:49 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
хотя в данном случае можно и подумать. например если юзер начал редактировать запись срабатывает Dirty, но если он вдруг нажал Esc (отмена редактирования), то AfterUpdate не сработает, т.е блокировка останется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:19:10 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
А на кой это надо то вообще? Я понимаю, к примеру, бывают траблы, когда таблица блокируется... Никто тогда оттуда даже прочитать не может... так with (nolock) это устраняет. А так то... зачем дополнительно то блокировать? Смысл то какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:19:39 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
ShurgenzА на кой это надо то вообще? Я понимаю, к примеру, бывают траблы, когда таблица блокируется... Никто тогда оттуда даже прочитать не может... так with (nolock) это устраняет. А так то... зачем дополнительно то блокировать? Смысл то какой? есть смысл, например в mdb: хочешь отредактировать накладную, её содержимое копируется в лок.таблицу, а чтобы с оригиналом ничего не могли сделать (не удалить, не подтвердить, не оплатить и т.д) приходится вот таким способом её "блокировать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:23:48 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
Так сабж же об АДП... я ничего не спутал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:26:25 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
да, это ADP, но смысл похоже тот же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:29:35 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
"но если он вдруг нажал Esc (отмена редактирования)" то будет событие Form_Undo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:43:45 |
|
||
|
Блокировка записей (проект ADP)
|
|||
|---|---|---|---|
|
#18+
ну значит туда и надо вешать разблокировку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 16:46:52 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32776416&tid=1670420]: |
0ms |
get settings: |
4ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 313ms |

| 0 / 0 |
