Вопрос или проблема
Я создал функцию для заполнения временной таблицы данными. Когда происходит событие Form_Load для формы, она вызывает функцию и должна заполнить таблицу. Набор данных небольшой, всего 23 записи.
Public Function fnBuildScoreData()
Dim strSQL As String
strSQL = "INSERT INTO tmpQuestion ( QuestionID, CategoryID, PossibleScore, Question, ShortDesc, QuestionOrder) SELECT tblQuestions.QuestionID, " & _
"tblQuestions.CategoryID, tblQuestions.PossibleScore, tblQuestions.Question, tblQuestions.ShortDesc, tblQuestions.QuestionOrder " & _
"FROM (tblQuestions LEFT JOIN tblCategory ON tblQuestions.CategoryID = tblCategory.CategoryID) LEFT JOIN tblScores ON " & _
"tblQuestions.QuestionID = tblScores.QuestionID WHERE (((tblQuestions.EndDate) Is Null)) ORDER BY tblQuestions.QuestionOrder"
If RunADOSQLAction(strSQL) = False Then
fnBuildScoreData = ACTION_FAILED
GoTo ExitFunction
End If
End Function
Я запускаю оператор INSERT через функцию, которая фактически выполняет SQL-код и возвращает, был ли код успешно выполнен. Каждый раз она возвращает УСПЕХ. Я также пробовал DoCmd.RunSQL (strSQL) с моей строкой SQL, но таблица все равно пустая.
Вот другой код:
Public Function RunADOSQLAction(strSQLIn As String) As Boolean
Dim cnnTemp As ADODB.Connection
If Left(strSQLIn, 6) = "SELECT" Then
MsgBox "Вы не можете использовать эту функцию для обработки оператора SELECT.", vbOKOnly, "RunADOSQLAction"
RunADOSQLAction = False
Else
Set cnnTemp = New ADODB.Connection
Set cnnTemp = CurrentProject.Connection
cnnTemp.Execute (strSQLIn)
RunADOSQLAction = True
End If
End Function
Я в замешательстве по этому поводу. Не понимаю, почему он не выполняется при вызове VBA кода?
Ответ или решение
Согласно вашему описанию, вы сталкиваетесь с проблемой, когда функция вставки данных в таблицу в Access VBA выполняется успешно, но таблица оказывается пустой после выполнения. Давайте проанализируем вашу ситуацию более подробно, чтобы выяснить возможные причины этой проблемы.
Понимание контекста задачи
Вы создали функцию fnBuildScoreData
, которая выполняет SQL-запрос на вставку данных в временную таблицу tmpQuestion
из базовой таблицы tblQuestions
. Данные должны заполняться из таблиц tblQuestions
, tblCategory
и tblScores
при выполнении события Form_Load
. Ваша функция возвращает статус выполнения и использует вспомогательную функцию RunADOSQLAction
, чтобы выполнить SQL-запрос.
Потенциальные причины проблемы
-
Отсутствие данных, соответствующих критериям запроса:
- Проверьте, действительно ли данные в таблице
tblQuestions
соответствуют условиям, указанным в вашем SQL-запросе. В частности, обратите внимание на условиеWHERE (((tblQuestions.EndDate) Is Null))
. Если у всех записейEndDate
задано значение, они не будут добавлены в вашу временную таблицу.
- Проверьте, действительно ли данные в таблице
-
Ошибки в вашем SQL-запросе:
- Попробуйте выполнить ваш SQL-запрос напрямую в среде выполнения SQL (например, в окне запроса Access). Это поможет вам увидеть, возвращает ли запрос какие-либо данные и правильно ли он сформирован. Возможно, есть ошибка в ваших соединениях с таблицами или в самом запросе.
-
Правильное использование
ADODB.Connection
:- Вы используете прямое соединение с
CurrentProject.Connection
. Убедитесь, что ваш объект соединенияcnnTemp
правильно инициализирован, и что вы используете правильные права доступа для выполнения операций вставки.
- Вы используете прямое соединение с
-
Обработка транзакций:
- Если в вашей базе данных настроены транзакции, убедитесь, что изменения не остаются «висячими» в состоянии транзакции. Это может быть причиной их невидимости.
-
Проверка механизма ошибки:
- В функции
RunADOSQLAction
не обрабатываются возможные ошибки выполнения запроса. Рекомендуется добавить обработчик ошибок, чтобы отслеживать любые исключения, которые могут возникнуть при выполненииcnnTemp.Execute (strSQLIn)
.
- В функции
-
Интеграция с другими частями кода:
- Убедитесь, что функция
fnBuildScoreData
действительно вызывается изForm_Load
, и что код правильно инициализирован. Возможно, функция не вызывается должным образом, и это приводит к отсутствию вставленных данных.
- Убедитесь, что функция
Рекомендации по устранению проблемы
-
Тестируйте SQL-запрос: Сначала выполните ваш
SELECT
запрос отдельно, чтобы убедиться, что он возвращает ожидаемые данные:SELECT tblQuestions.QuestionID, tblQuestions.CategoryID, tblQuestions.PossibleScore, tblQuestions.Question, tblQuestions.ShortDesc, tblQuestions.QuestionOrder FROM (tblQuestions LEFT JOIN tblCategory ON tblQuestions.CategoryID = tblCategory.CategoryID) LEFT JOIN tblScores ON tblQuestions.QuestionID = tblScores.QuestionID WHERE tblQuestions.EndDate IS NULL ORDER BY tblQuestions.QuestionOrder;
-
Добавьте вывод отладочной информации: Вставьте сообщения об ошибках после выполнения запроса, чтобы знать, происходит ли действительно выполнение и какие значения (если есть) были вставлены.
-
Используйте обработчик ошибок: Примените обработку ошибок в функции
RunADOSQLAction
, чтобы отследить, если что-то пойдет не так. -
Проверка прав доступа: Убедитесь, что у пользователя есть доступ на запись в указанную таблицу.
-
Убедитесь в вызове функции: Подтвердите, что функция
fnBuildScoreData
действительно вызывается в событииForm_Load
, добавив отладочный вывод или временно усилите видимость, например, открыв форму в режиме отладки.
Если предложенные шаги не помогают, возможно, потребуется углубленное тестирование и анализ конфигурации вашей базы данных для выявления корня проблемы.