Member 12600972 Ответов: 1

Мне нужна помощь в отладке проблемы SQL / access/VBA


Я унаследовал базу данных ACCESS от кого-то, кто с тех пор покинул компанию. Он имеет большую форму,которая имеет множество выпадающих и текстовых элементов управления. После их заполнения пользователь нажимает кнопку, чтобы обновить запись во внешнюю базу данных.

Это прекрасно работало до трех недель назад, но теперь создает периодические ошибки для большинства пользователей. Проблема в том, что последние два поля в форме не всегда обновляются. Когда это происходит, код генерирует сообщение об ошибке 3164: "поле не может быть обновлено", и запись не обновляется. В настоящее время существует около 1000 записей, которые не были обновлены правильно.

Существует оператор SQL SELECT, который используется в наборе записей, который затем становится местом хранения всех значений элементов управления в форме. Каждый из элементов управления имеет тег, в котором хранится имя поля (в наборе записей), которое должно быть обновлено значением элемента управления. Таким образом, существует петля, похожая на:

rs.Edit
For Each ctl In Me.Controls
                rs(ctl.Tag).value = ctl.value
Next
rs.Update


(Существует некоторая проверка, чтобы убедиться, что мы используем только правильный тип элементов управления, что поле, идентифицируемое значением тега, на самом деле находится в наборе записей (rs), и что мы не обновляли эту запись раньше точно такими же значениями, но я оставил все это для ясности)

Я отладил модуль, где это происходит, и ошибка находится в строке rs(ctl.Tag).value = ctl.value. Код находится в функции, которая определяется как " Public Sub UpdateFields(ByVal rs As Recordset)"

Вызывающий модуль создал набор записей следующим образом:

UpdateFields getRecNumSaveRS(txtRecNum)


(где getRecNumSaveRS - это имя функции, создающей набор записей на основе номера записи, переданного в качестве параметра)

Я изменил код, чтобы :

Dim rs As Recordset
.
.
.
Set rs = getRecNumSaveRS(txtRecNum)
UpdateFields rs
rs.Close
Set rs = Nothing


.. потому что я знал, что не закрытие и удаление набора записей может привести к ошибкам, но это, похоже, не помогло.

В нашей группе нет других людей с ИТ-опытом, поэтому у меня нет никакой помощи. Если кто-нибудь может предложить какую-либо помощь, я могу проверить здесь, или вы можете написать мне по электронной почте на ian-dot-n-dot-dennis-at-healthnet-dot-com

Что я уже пробовал:

1) гуглить везде
2) Добавление точек останова для поиска места выхода ошибок кода (это происходит до обновления rs.)
3) Добавление rs. Close и установка rs = Nothing
4) Добавление таймеров для повторного запуска строки rs (ctl. Tag). value = ctl. value (снова удалено, потому что они не помогли)
5) проверка того, что используется правильная версия приложения

Ничего не работает (беда в том, что он работает в основном на моей машине и его трудно эмулировать)

CHill60

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

1 Ответов

Рейтинг:
6

Gustav Brock

Это довольно запутанно и необычно, и может быть сделано лучше/проще, но вы можете начать с передачи набора записей по ссылке:

Public Sub UpdateFields(ByRef rs As DAO.Recordset)


Member 12600972

Отличная идея, и реализована она потому, что помогает с утилизацией набора записей, однако мы все равно получаем ту же ошибку (не на моей машине, Тхо :) )

Gustav Brock

Вам также придется дважды проверить значение, которое вы пытаетесь обновить:

РС(ЦТЛ.Теге).Значение = ПНО.Значение