Связанные таблицы MS Access Lock с VBA
Я относительно новичок в разработке баз данных, но у меня есть опыт программирования от 4 до 6 лет (в основном на Java). Мне удалось создать базу данных, которая уже работает довольно хорошо, даже в сети. Он разделен на Back End и Front End, и у каждого пользователя есть копия FE. Я использую DMax для установки идентификатора подписчика, потому что каждому подписчику нужен уникальный, последовательный идентификатор.
Моя единственная проблема заключается в том, что, когда пользователи добавляют подписчика одновременно, он сохраняет только последнее добавление. Есть ли способ заблокировать связанную таблицу, когда один пользователь добавляет информацию (с помощью VBA)?
Если это возможно, могут ли другие пользователи проверить, заблокирована ли таблица?
Спасибо!
РЕДАКТИРОВАТЬ:
Это код, который генерирует число. Он также проверяет, есть ли в последовательности пустые места (например, если 5,6,8, то это будет 7).
Dim counter As Integer
counter = 1
Dim validation As Boolean
validation = False
max = Nz(DMax("Numero", "Inscripciones"), 0) + 1
While validation = False
If Not IsNull(DLookup("[Numero]", "Inscripciones", "[Numero] = " & Nz([counter], 0))) Then
If (counter <= max - 1) Then
counter = counter + 1
Else
validation = True
End If
Else
validation = True
End If
Wend
Запись никак не сохраняется до тех пор, пока не будет нажата кнопка. Эта генерация номера происходит за 5 инструкций, прежде чем я сохраню запись.
2 ответа
Это не дает прямого ответа на ваш вопрос. Но найти первое пропущенное число в цикле очень неэффективно, особенно если уже существует много последовательных чисел.
Например, если в таблице есть номера 1..200, ваш код будет вызывать DLookup
200 раз. Повышение вероятности того, что два экземпляра будут запускать этот цикл одновременно и приводить к одному и тому же результату.
Вместо этого используйте запрос SQL, подобный этому, чтобы найти первое пропущенное число:
SELECT MIN(i1.Numero + 1) AS Missing
FROM Inscripciones i1
LEFT JOIN Inscripciones i2
ON i2.Numero = i1.Numero+1
WHERE i2.Numero IS NULL
(адаптировано отсюда)
Это будет работать очень быстро. Поместите это прямо перед сохранением записи, и вероятность столкновения будет очень мала. И если ошибка возникает из-за повторяющегося числа, перехватите ошибку и повторите запрос.
Обратите внимание, что в этом запросе не будет найдено пропущенное число 1. Если это актуальный случай, проверьте его отдельно.
Вы не объясняете, где и как вы используете этот крайне неэффективный и расточительный код или многое другое о вашей форме, поэтому мне придется использовать свой хрустальный шар и просто предоставить работоспособное решение. Используя связанную форму с установленными значениями блокировки записей, в событии before_update добавьте следующее:
If Me.NewRecord Then
numero = nz(dmax("[Numero]", "Inscripciones"), 0) + 1
End If
Единственный способ получить пробелы в нумерации - это удалить записи. Если это будет проблемой, вы должны использовать таблицу подсчета.