|
|
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
Наверное, этот вопрос здесь уже рассматривался, но я не нашел. Если кто знает, то скиньте ссылку или подскажите. В таблице на SQL Server на каждый update записи отрабатывает стандартный триггер, т.е. происходит заполнение полей user_modify и date_modify. Клиент работает на Access'е (связанные таблицы через ODBC файловый DSN). Если встать на запись в таблице и изменить ее, затем перейти на любую другую а потом снова вернуться, то при первой же попытке изменения записи выскакивает стандартное сообщение: "Другой пользователь изменил запись". Сообщение не критично, пользователь просто нажимает Ok и продолжает работать - дальше все корректно. Просто пользователей это очень сильно раздражает. Причина понятна - триггер отработал, значения полей user_modify и date_modify изменились, но Access об этом еще ничего "не знает" - запись пока еще не обновлена. Подскажите пожалуйста, как это можно исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:12 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
Отмена стандартного предупреждения...Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:18 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
На самом деле тут небольшой баг. Access почему-то так реагирует Если в триггере присутствуют "прямые" ссылки на таблицы inserted или deleted в теле запроса на UPDATE Для того чтобы уйти от этого нужно отделить обращение к этим таблицам от основного тела запроса например Юзать их через подзапрос DECLARE @CurUserName varchar(20) DECLARE @CurDt smalldatetime,@UP_ID int SET @CurUserName=SUBSTRING(SYSTEM_USER, CHARINDEX('\', SYSTEM_USER) + 1, 20) SET @CurDt=GetDate() SELECT @UP_ID=[ID] FROM UP_Current_v UPDATE dbo.PL_Plateg SET KtoIzm = @CurUserName, KogdaIzm = @CurDt,UP_ID_Izm=@UP_ID WHERE ID IN (SELECT ID FROM inserted) Или сначала слить их содержимое в временную таблицу и дальше использовать ее SELECT inserted.ID,inserted.Status , deleted.Status AS OldStatus,inserted.AO_ID INTO #TmpInsDel_tbl FROM inserted INNER JOIN deleted ON inserted.ID=deleted.ID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 15:43 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
а set nocount on в начале триггера не помогает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 16:24 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
Ничего не помогает! Триггер переписал, set nocount on сделал... Все равно, аксесу это по барабану. Как выдавал мессагу, так и выдает... Может, в триггере что-то не так, хотя сам триггер отрабатывает корректно... ------------------------------ SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO set nocount on go ALTER trigger tbl_акты_protokol_update on tbl_акты for update as declare @user_name varchar(20) declare @date_change smalldatetime declare @id int set @user_name = substring (system_user, charindex('\', system_user) + 1, 20) set @date_change = getdate() select @id = id_акт FROM tbl_акты update tbl_акты set _user_change = @user_name, _date_change = @date_change where id_акт in (select id_акт from inserted) GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO ------------------------- Но в принципе и старый триггер работал хорошо. Проблема-то в другом - акссес "не видит" в связанной таблице результатов отработки этого триггера и осуществляет принудительное обновление записи при выскакивании мессаги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 16:36 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
А так? ALTER trigger tbl_акты_protokol_update on tbl_акты for update as set nocount on declare @user_name varchar(20) declare @date_change smalldatetime declare @id int set @user_name = substring (system_user, charindex('\', system_user) + 1, 20) set @date_change = getdate() select @id = id_акт FROM tbl_акты update tbl_акты set _user_change = @user_name, _date_change = @date_change where id_акт in (select id_акт from inserted) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 16:52 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
и еще юзер наверное редактирует данные наверное не в таблице а все таки в табличной форме а там наверняка указана строка синхронизации ? да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 16:56 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
И так тоже не помогает... Короче, триггер на SQL Server тут совершенно не при чем. Мне бы как-нибудь на клиенте это сделать... Пробовал на обработке события Error формы написать, как мне посоветовали. Быстренько начиркал: ============== Private Sub Form_Error(DataErr As Integer, Response As Integer) If DataErr = 7787 Then Application.SetOption "Error Trapping", 2 'Break On Unhandled Errors End If End Sub ============== Все равно не помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 17:03 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
А вообще отключить триггер пробывал? Может дело не в нем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 17:42 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
А вообще отключить триггер пробывал? Может дело не в нем? --------------------- А в чем же еще? Когда триггера не было, все работало. Да нет, тут все очень хорошо можно проследить прямо на таблице: изменил запись, а поля _date_change и _user_change "на ходу" не обновились, как это можно наблюдать в Enterprise Manager. Потом, естестественно, когда я пытаюсь что-то поменять в этой же записи, Access вдруг "вспоминает" об этих изменениях и выдает мессагу, после которой значения этих полей обновляются. Вот, собственно и все. Может, я как-то не так обработку ошибки написал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2004, 20:32 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
Хм у меня таких проблемм нет правда работаю с ADP Может сделать рефреш лишний раз Из обходных решений в голову приходит только сделать отдельную таблицу для user_modify и date_modify или изменять их с клиента по событию формы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 11:42 |
|
||
|
Другой пользователь изменил запись...
|
|||
|---|---|---|---|
|
#18+
Может сделать рефреш лишний раз Пробовал - помогает как-то уж очень криво, т.е. при включенном пользователем фильтре уже не прокатывает, а без фильтра все Ок... Короче, сейчас я просто отключил (до лучших времен или пока что-то нормальное в голову не придет) это сообщение в обрабочике ошибки на форме: Response = acDataErrContinue Ошибка перестала появляться, но зато теперь есть риск затереть все, что заполнено в поле. На уровне пользователя это выглядит так: меняем запись, переходим на другую (как правило для того, чтобы оттуда что-то скопировать), затем возвращаемся и как только пытаемся ввести 1-й символ в поле, всё поле выделяется (символ при этом не вводится - ведь отработал рефреш записи после отключенного сообщения об ошибке), а затем, если автоматически продолжить ввод, т.е. при вводе 2-го символа - все, разумеется затирается. Т.е. надо щелкнуть мышкой в нужном месте и продолжать работать. Как ни странно, но этот супер-дибильно-кривой способ пользователи посчитали лучше, чем периодическое выскакивание мессаги. :-) Попросили оставить этот вариант... Хотя по моему, уж лучше стандартное сообщение, чем такие "маленькие хитрости" экранного интерфейса. На всякий случай старый вариант держу в запасе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2004, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32499100&tid=1674974]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 450ms |

| 0 / 0 |
