2011-01-10 2 views
0

У меня есть интерфейс базы данных Access, и я пытаюсь поместить кнопку в форму для удаления текущей записи. Я использовал следующий код VBA, чтобы удалить запись:Ошибка 2501 при попытке удалить запись

If Me.NewRecord Then 
    Me.Undo 
    Exit Sub 
End If 

DoCmd.RunCommand acCmdDeleteRecord 

Me.Requery 
Me.Refresh 

Когда я бег это на записи, которые я вставленная в базу данных с формой, она возвращает ошибку времени выполнения «2501» на DoCmd. Однако, если я запустил его на записи, которая уже существовала в базе данных, тогда код завершается по назначению.

Кроме того, никто еще не обращается к этой таблице базы данных, и я только открыл одну форму.

Когда я отправился удалять их из связанной таблицы вручную при доступе, я получил ту же ошибку, но я смог удалить их из базы данных с помощью SQL Server Management Studio.

Что могло случиться так?

EDIT

Я сделал еще некоторые исследования и выяснили, что я не могу редактировать новые записи в в базовой таблице, используя доступ либо. Я получаю сообщение об ошибке, сделанной другим пользователем.

+0

У вас есть уникальный ключ? Если вы удаляете и воссоздаете ссылку, у вас есть та же проблема? – Fionnuala

+0

Таблица полностью определена с хорошим первичным ключом. Я пробовал перематывать стол, и у меня все еще такая же проблема. – Rister

+0

У вас есть метка в вашем столе? –

ответ

1

За исключением рекомендации о том, чтобы в таблице было поле временной метки (помощник SSMA добавляет это ко всем таблицам, когда вы используете его для увеличения из Access, и это определенно то, что я рекомендую), у меня есть некоторая критика вашего кода , Я бы написал так:

If Me.NewRecord Then 
    Me.Undo 
    Else 
    DoCmd.RunCommand acCmdDeleteRecord 
    Me.Requery 
    End If 

Актуализировать избыточными после Requery, как вы уже самые последние данные.

Использование Exit Sub полезно для защитных предложений по вещам, которые не являются взаимоисключающими, но в этом случае у вас есть либо/или - либо вы собираетесь удалить существующую запись, либо отменить новую запись. Это можно обрабатывать в одном блоке If/Then/Else, а затем у вас есть одна точка выхода для вашей подпрограммы, что очень полезно в случае, если в будущем код станет более сложным.

+0

Я добавил временную метку, и она исправила проблему. Почему я раньше не сталкивался с этой проблемой? – Rister

+0

До тех пор, пока я обновляю таблицы Access/Jet/ACE на SQL Server, это было частью рекомендаций по увеличению. Это необходимость из-за связанных форм, так как это единственный способ, когда Jet/ACE может отслеживать, что было обновлено, а что нет (не сравнивая все поля, которые не являются надежными при наличии Nulls). –

Смежные вопросы