#vba #ms-access
#vba #ms-доступ
Вопрос:
Код VBA для внешнего подключения был предоставлен мне нашим ИТ-отделом. Я написал это не сам. Я просто внес некоторые коррективы, чтобы заставить его работать с моей базой данных. Я не эксперт. Функция Clear_Analysis
просто удаляет все записи из табели tbl_Analysis
. Эта функция Analysis_Check
работает во всех моих других функциях. Я хочу проверить, содержит ли таблица какие-либо записи.
Function Analysis_Check() If DCount("*", "tbl_Analysis") = 0 Then MsgBox ("No Records!") End If If DCount("*", "tbl_Analysis") lt;gt; 0 Then MsgBox ("Success!") End If End Function
Но эта функция больше не работает после подключения к внешней SQL-базе данных.
Как мне заставить это работать в той же функции?
Function Analysis_LIMS() Dim objRec Dim objConn Dim cmdString Dim insertString Call Clear_Analysis Set objRec = CreateObject("ADODB.Recordset") Set objConn = CreateObject("ADODB.Connection") objConn.ConnectionString = "Provider=.....; " objConn.Open Set localDbConn = CreateObject("ADODB.Connection") localDbConn.ConnectionString = "...;Persist Security Info=False;" localDbConn.Open cmdString = "SELECT DISTINCT t.rapportnaam, t.norm FROM taken t" Set objRec = objConn.Execute(cmdString) Do While Not objRec.EOF insertString = "INSERT INTO tbl_Analysis ([Analysis], [Analysis_Norm]) VALUES ('" amp; objRec("rapportnaam") amp; "', '" amp; objRec("norm") amp; "')" localDbConn.Execute (insertString) objRec.MoveNext Loop Call Analysis_Check localDbConn.Close
Я хочу добавить функцию вызова Analysis_Check
в конце функции Analysis_LIMS
Я также попытался сделать Dcount отдельной функцией и вызвать эту функцию в конце функции Analysis_LIMS
, я могу подтвердить, что в таблице определенно есть записи tbl_Analysis
. Но для обоих методов функция Dcount дает 0 в качестве ответа. Это не так.
Если я создам кнопку в той же форме , которая вызывает функцию Analysis_Check
, то функция Analysis_Check
действительно работает. Но после этого, если я вызываю функцию Analysis_Check
через функцию Analysis_LIMS
, в результате я получаю всплывающее сообщение «Записей нет», я нажимаю «ОК», затем появляется второе всплывающее сообщение «Успешно». Если затем я сделаю то же самое снова, но без использования этой временной кнопки, это даст только сообщение «Нет записей», но в нем определенно есть записи, tbl_Analysis
я понятия не имею, что я делаю неправильно или почему Доступ ведет себя так. Я думаю, это как-то связано с набором записей? Может быть, установить набор записей в CurrentDb? Любая помощь будет оценена по достоинству.
Ответ №1:
Вероятно, проблема со временем, так как вызовы запросов будут выполняться в другом контексте.
Попробуйте либо с DoEvents
:
Do While Not objRec.EOF insertString = "INSERT INTO tbl_Analysis ([Analysis], [Analysis_Norm]) VALUES ('" amp; objRec("rapportnaam") amp; "', '" amp; objRec("norm") amp; "')" localDbConn.Execute (insertString) objRec.MoveNext Loop DoEvents
или используйте DAO:
Dim Records As DAO.Recordset Set Records = CurrentDb.OpenRecordset("Select * From tbl_Analysis", dbOpenDynaset, dbAppendOnly) Do While Not objRec.EOF Records.AddNew Records!Analysis.Value = objRec("rapportnaam").Value Records!Analysis_Norm.Value = objRec("norm").Value Records.Update objRec.MoveNext Loop Records.Close
Комментарии:
1. Совершенно другой ответ. Мне нужно научиться лучше читать. 🙂
2. @KostasK.: Добро пожаловать в клуб!
3. Спасибо, Густав. Я могу подтвердить, что это вопрос времени. Я внедрил функцию 10-секундного сна, а затем она работает. Задержка на 1 или 3 секунды не работает. Я собираюсь внедрить ваше решение и сделать его более эффективным. Задержка в 10 секунд, конечно, не лучшее решение. Я собираюсь попробовать это как можно скорее.
4. Метод ДАО работает для меня! Еще раз спасибо stackoverlow, без вашей помощи я бы никогда не решил эту проблему.