我修改了一段代码以从一行SQL代码创建一个Query并将其导出到文本文件。
我以前有这项工作,但是尝试在更大的子例程中实现后,现在出现错误,指出表/对象由于是只读而无法更新(错误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有效,并且在手动应用时会产生结果。
tmpExport
查询在运行代码之前不存在。
该代码似乎在创建查询时失败。
如果有人能弄清是什么原因,我将非常感激。
正如韦恩在注释中正确指出的那样,代码中以下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