Как заставить стандартные функции доступа работать после подключения к внешней базе данных?

#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, без вашей помощи я бы никогда не решил эту проблему.