Функция INSERT работает так, как если бы она выполнялась в коде Access VBA, но таблица пустая.

Вопрос или проблема

Я создал функцию для заполнения временной таблицы данными. Когда происходит событие 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-запрос.

Потенциальные причины проблемы

  1. Отсутствие данных, соответствующих критериям запроса:

    • Проверьте, действительно ли данные в таблице tblQuestions соответствуют условиям, указанным в вашем SQL-запросе. В частности, обратите внимание на условие WHERE (((tblQuestions.EndDate) Is Null)). Если у всех записей EndDate задано значение, они не будут добавлены в вашу временную таблицу.
  2. Ошибки в вашем SQL-запросе:

    • Попробуйте выполнить ваш SQL-запрос напрямую в среде выполнения SQL (например, в окне запроса Access). Это поможет вам увидеть, возвращает ли запрос какие-либо данные и правильно ли он сформирован. Возможно, есть ошибка в ваших соединениях с таблицами или в самом запросе.
  3. Правильное использование ADODB.Connection:

    • Вы используете прямое соединение с CurrentProject.Connection. Убедитесь, что ваш объект соединения cnnTemp правильно инициализирован, и что вы используете правильные права доступа для выполнения операций вставки.
  4. Обработка транзакций:

    • Если в вашей базе данных настроены транзакции, убедитесь, что изменения не остаются «висячими» в состоянии транзакции. Это может быть причиной их невидимости.
  5. Проверка механизма ошибки:

    • В функции RunADOSQLAction не обрабатываются возможные ошибки выполнения запроса. Рекомендуется добавить обработчик ошибок, чтобы отслеживать любые исключения, которые могут возникнуть при выполнении cnnTemp.Execute (strSQLIn).
  6. Интеграция с другими частями кода:

    • Убедитесь, что функция fnBuildScoreData действительно вызывается из Form_Load, и что код правильно инициализирован. Возможно, функция не вызывается должным образом, и это приводит к отсутствию вставленных данных.

Рекомендации по устранению проблемы

  1. Тестируйте 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;
  2. Добавьте вывод отладочной информации: Вставьте сообщения об ошибках после выполнения запроса, чтобы знать, происходит ли действительно выполнение и какие значения (если есть) были вставлены.

  3. Используйте обработчик ошибок: Примените обработку ошибок в функции RunADOSQLAction, чтобы отследить, если что-то пойдет не так.

  4. Проверка прав доступа: Убедитесь, что у пользователя есть доступ на запись в указанную таблицу.

  5. Убедитесь в вызове функции: Подтвердите, что функция fnBuildScoreData действительно вызывается в событии Form_Load, добавив отладочный вывод или временно усилите видимость, например, открыв форму в режиме отладки.

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

Оцените материал
Добавить комментарий

Капча загружается...