动态创建Microsoft Access SQL查询

时间:2015-05-11 14:55:14

标签: sql vba ms-access

我需要链接到大约270(金额可以更改).txt文件并在所有这些文件上创建一个选择查询。我可以立即导入它们没有问题,但是因为Access每个选择查询只能处理32个表我需要一些方法来创建一个变量(动态?),它将保存一个SQL字符串,然后将其用作参数创建查询def函数。有没有人有任何想法。我认为我需要使用课程,但有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

我在类似情况下的方法是将所有输入文件放在一个公共文件夹中,该文件夹中没有其他内容。然后我使用以下vba脚本来处理所有文件。对于每个文件,我将文件名添加到目录表(“.import files”),将数据添加到第二个表(“.import data”)。数据中的“源”字段是指向文件列表“索引”字段的链接,因此我知道哪些数据来自每个源文件。文件夹中有多少文件无关紧要。 (如果你愿意,你可以改变这两个表中的一个,这样如果我一直在考虑更多这两个字段具有相同的名称,我会这样做。)

我的输入文件格式不是很好(我无法控制数据源),但至少它们都是相同的格式不佳。具体而言,数据的第一行中没有字段名称。这就是我将它们导入临时文件的原因,而在“insert into”命令中,源表中的字段如F1,... F9。您需要更改构建SQL“插入到”语句的行以匹配您的文件格式。

您还需要在运行代码之前创建目录和数据文件 - 您可以通过将其中一个源文件导入为模板来创建数据文件,然后对其进行编辑以添加“源”字段。 “.import files”表中的3个字段是Index(这是一个自动编号字段),文件名和更新日期。

完成此操作后,您将有两个表可以加入“source”(来自.import数据)和“index”(来自.import文件)。然后,您可以继续进行所需的任何处理。您可以选择“源”来查看特定的输入文件,或按“源”分组以按输入汇总数据,或者忽略“源”以获取所有数据的摘要。

    Function Import_BTT()

    'On Error Resume Next
    DoCmd.SetWarnings False

    'Get folder & file list
    Source_folder = Get_Folder()
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set flist = fso.GetFolder(Source_folder).Files

    'delete prior data
        Set DB = CurrentDb()
        DB.Execute ("delete * from [book to tax import files];")
        DB.Execute ("delete * from [book to tax import data];")

    'Process each file
    For Each file In flist
        If (Len(Dir(Source_folder & "\" & file.Name)) = 0) Then GoTo NextFile

        'add new data
        DB.Execute "insert into [Book to Tax import files] ([file name],[update date]) values (" & "'" & file.Name & "',#" & file.DateLastModified & "#);"
        Source = DB.OpenRecordset("SELECT @@IDENTITY")(0)
        DoCmd.TransferText , , "Book to Tax import Temp", Source_folder & "\" & file.Name

        SQL = "INSERT INTO [Book to Tax Import data] (source, Account, [Book Balance], [Book Adjustments], [Adjusted Book Balance], [Tax Reclass], [Balance After Tax Reclass], [Tax Adjustments], [Historical tax Adjustments], [Tax Balance] )"
        SQL = SQL & "select '" & Source & "',mid(F1,instr(f1,'(')+1,10),F2,F3,F4,F5,F6,F7,F8,F9 FROM [Book to Tax import temp] where ((trim(f1) like 'BK (*') or (trim(f1) like 'TAX (*'));"

        DoCmd.RunSQL SQL
        DoCmd.DeleteObject acTable, "Book to Tax Import Temp"

    NextFile: Next file

    MsgBox ("data import completed")
    DoCmd.SetWarnings True

    End Function

Public Function Get_Folder()

'Create a FileDialog object as a Folder Picker dialog box.
Const msoFileDialogFolderPicker = 4
Const msoFileDialogFilePicker = 3
Const msoFileDialogViewDetails = 2

Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.AllowMultiSelect = False
fd.ButtonName = "Select"
fd.InitialView = msoFileDialogViewDetails
fd.Title = "Select Folder"
fd.InitialFileName = "MyDocuments\"
fd.Filters.Clear

'Show the dialog box and get the file name
If fd.Show = -1 Then
    Get_Folder = fd.SelectedItems(1)
    Else
    Get_Folder = "MyDocuments\"
    End If

Set fd = Nothing
End Function