Связанные таблицы 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

Единственный способ получить пробелы в нумерации - это удалить записи. Если это будет проблемой, вы должны использовать таблицу подсчета.

Другие вопросы по тегам