Создание запроса с ошибкой CreateQueryDef из-за того, что таблица / объект только для чтения - PullRequest
0 голосов
/ 04 октября 2019

Я изменил часть кода, чтобы создать запрос из строки кода SQL и экспортировать его в текстовый файл.

Раньше у меня это работало, но после попытки реализовать это в подпрограмме большего размера теперь выдается сообщение о том, что таблица / объект не может быть обновлена, поскольку она доступна только для чтения (ошибка 3027).

Это происходит независимо от того, выполняется ли код сам по себе или из другого кода.

Найдите код экспорта ниже:

Public Sub exportQuery(exportSQL As String, FileName As String)

    Dim db As DAO.Database, qd As DAO.QueryDef
    Dim i As Integer
    Dim InitialFileName As String
    Set db = CurrentDb
    'Check to see if querydef exists and delete it if it exists  
    For i = 0 To (db.QueryDefs.Count - 1)

        If db.QueryDefs(i).Name = "tmpExport" Then
            db.QueryDefs.Delete ("tmpExport")
            Debug.Print "Deleted"
            Exit For

        End If

    Next i
    Debug.Print "This far"

    Set qd = db.CreateQueryDef("tmpExport", exportSQL)

    'Set intial filename to default if none is chosen
    If (FileName <> "") Then
        InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"
    Else
        InitialFileName = FileName   
    End If

    'Write the query results to a File
    DoCmd.TransferText transferType:=acExportDelim, TableName:="tmpExport", FileName:="Pathtoexport\Export" & InitialFileName, HasFieldNames:=False
    'Cleanup
    db.QueryDefs.Delete "tmpExport"
    db.Close
    Set db = Nothing
    Set qd = Nothing
    Debug.Print "ExportQuery" & vbCrLf
End Sub

Также, пожалуйста, найдите SQL-вопросниже:

Select phone_number FROM Master WHERE list_id IN ('230');
  • Основная таблица существует и не открыта в Access.

  • SQL действителен и выдает результаты, когда вручнуюПрименено.

  • * * * * * * * * * * Запрос к 1023 * не существует до запуска кода.

  • При созданиивопрос.

Если бы кто-нибудь мог пролить свет на то, что вызывает это, я был бы очень признателен.

1 Ответ

1 голос
/ 06 октября 2019

Как правильно указывает Уэйн в комментариях, логика, реализованная в следующем операторе if, присутствующем в вашем коде, перевернута:

'Set intial filename to default if none is chosen
If (FileName <> "") Then
    InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"
Else
    InitialFileName = FileName   
End If

Вышеприведенное подразумевает, что правильное имя файла приведет к выводупуть:

Pathtoexport\Export

Вы также должны опустить здесь круглые скобки:

db.QueryDefs.Delete ("tmpExport")

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

Таким образом, функция имеет единственное назначение:

"Экспортировать результат предоставленного SQL в файл с указанным именем файла."

И вам больше не нужно жестко кодировать родительскую папку в функции.

Например, что-то вроде:

Function ExportQuery(sql As String, fnm As String)
    Dim qry As String: qry = "tmpExport"

    Dim dbs As DAO.Database
    Set dbs = CurrentDb

    On Error Resume Next
    dbs.QueryDefs.Delete qry
    On Error GoTo 0

    dbs.CreateQueryDef qry, sql
    DoCmd.TransferText acExportDelim, , qry, fnm, False
    dbs.QueryDefs.Delete qry

    Set dbs = Nothing
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...