即时创建 Microsoft Access SQL 查询

问题描述 投票:0回答:2

我需要链接到大约 270 个(数量可以更改).txt 文件,并对所有文件创建选择查询。我可以一次性导入它们,没有问题,但由于 Access 只能处理每个选择查询 32 个表,我需要某种方法来创建一个变量(即时?),该变量将保存一个 SQL 字符串,然后将其用作参数创建查询定义函数。有没有人有什么想法。我想我需要使用一个类,但是有更简单的方法吗?

sql vba ms-access
2个回答
0
投票

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

我的输入文件的格式不是特别好(而且我无法控制数据源),但至少它们都是“相同”的糟糕格式。 具体来说,数据的第一行中没有字段名称。 这就是为什么我将它们导入到临时文件中,并且在“插入”命令中在源表中有字段,例如 F1,... F9。 您需要更改构建 SQL“Insert into”语句的行以匹配您的文件格式。 在运行代码之前,您还需要创建目录和数据文件 - 您可以通过导入源文件之一作为模板来创建数据文件,然后对其进行编辑以添加“源”字段。 “.import files”表中的 3 个字段是索引(自动编号字段)、文件名和更新日期。

完成此操作后,您将拥有两个可以在“源”(来自 .import 数据)和“索引”(来自 .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



0
投票

子createTblOnTheFly() Dim strSQL 作为字符串 strSQL = " CREATE TABLE TimeRecord (IDNo Text(30), DTR_Date 日期时间, TIME_IN 日期时间, TIME_OUT 日期时间, LB_IN 日期时间, LB_OUT 日期时间, CB_IN 日期时间, CB_OUT 日期时间)"

将 myConnection 调暗为 ADODB.Connection 设置 myConnection = 新 ADODB.Connection myConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;数据源= " & "C:\Users fgarcia\Documents\database2.accdb;持久安全信息=False;" myConnection.Open

将 NewTableName 变暗为字符串 'NewTableName = InputBox("你想给表格起什么名字?")

'Check presence of table -------------- Dim rsSchema As ADODB.Recordset Set rsSchema = New ADODB.Recordset Set rsSchema = _ myConnection.OpenSchema(adSchemaColumns, _ Array(Empty, Empty, "TimeRecord", Empty)) If rsSchema.BOF And rsSchema.EOF Then MsgBox "Table does not exist" myConnection.Execute strSQL, dbFailOnError Else MsgBox "Table exists" End If rsSchema.Close Set rsSchema = Nothing '--------------------------------------

'DBEngine(0)(0).执行strSQL,dbFailOnError
'DoCmd.RunSQL strSQL

结束子

© www.soinside.com 2019 - 2024. All rights reserved.