在 Access 中引用新导入的 table

Referencing a newly imported table in Access

哇,我的第一个堆栈问题尽管使用了多年的答案。很精彩。

我对 VBA 和 Excel 还很陌生,对 Access 完全陌生,完全公开。所以我试图创建一个实验室报告的核心数据库,并且我有一个用于输入有关新报告的信息的表单,该表单将有关该报告的信息添加到所有报告的主 table 中,包括为其分配一个唯一的标签。输入信息后,我有一个按钮,允许用户 select 报告随附的 Excel .csv 文件并将其作为新的 table 导入数据库。它 returns 一条成功或错误消息。它有效! (代码来自这里的某个地方)

问题是我想向新的 table 添加一个字段,将分配给新报告的标签添加到所有记录,以便查询可以通过使用该标签来引用它.如果可能的话,我还想向新的 table 添加一个索引字段,因为它似乎不像导入 .csv 那样 table 创建索引。我想我会做另一个子,将新报告名称作为新字段的名称传递(这也将是所有记录中该字段的值)和 table 将其附加到。

如果我刚刚导入,如何将这个子传递给新导入的 table?我需要这一切都可以通过按钮来工作,因为它主要是我的经理使用这个 form/button 来导入新文件,他们将无法像现在这样手动进入 tables创建并添加字段(是的,我知道这是显而易见的解决方案,但相信我...这一定是一个按钮)

这是我正在使用的代码(是的,我知道很多代码可以用不同的方式完成,但它有效!)

Public Function ImportDocument() As String
    On Error GoTo ErrProc

    Const msoFileDIalogFilePicker As Long = 3
    Dim fd As Object
    Set fd = Application.FileDialog(msoFileDIalogFilePicker)

    With fd
        .InitialFileName = "Data Folder"
        .Title = "Enthalpy EDD Import"
        With .Filters
            .Clear
            .Add "Excel documents", "*.xlsx; *.csv", 1
        End With
        .ButtonName = " Import Selected "
        .AllowMultiSelect = False   'Manual naming currently requires one file at a time be imported

       'If aborted, the Function will return the default value of Aborted
        If .Show = 0 Then GoTo Leave  'fb.show returns 0 if 'cancel' is pressed
    End With

    Dim selectedItem As Variant
    Dim NewTableName As String
    
    NewTableName = InputBox(Prompt:="Enter the Report Name", _
        Title:="Report Name")
        
    For Each selectedItem In fd.SelectedItems  'could later be adapted for multiple imports
        DoCmd.TransferText acImportDelim, , NewTableName, selectedItem, True  'Imports csv file selected, true is 'has headers'
    Next selectedItem

   'Return Success
   ImportDocument = "Success"
   
   'Append report label and index
   AppendReportLabelField(NewTableName, #What to put here as the table to append to?)

'error handling
Leave:
    Set fd = Nothing
    On Error GoTo 0
    Exit Function

ErrProc:
    MsgBox Err.Description, vbCritical
    ImportDocument = "Failure" 'Return Failure if error
    Resume Leave
End Function

AppendReportLabelField 将传递字段的名称(和值)和(新导入的)table 的名称。我如何将它传递给 table? NewTableName 目前只是一个字符串。如果我能通过新的 sub table 我相信剩下的就很简单了。

在此先感谢您的帮助!

考虑将所有用户输入数据存储在具有所有可能字段的单个主控table中,并使用临时暂存table(主控的副本) 将 CSV table 迁移到此主控 table。在暂存期间,您可以使用需要的字段更新 table。

SQL (另存为存储查询)

(参数化更新查询)

PARAMETERS [ParamReportNameField] TEXT;
UPDATE temptable
SET ReportNameField = [ParamReportNameField]

(明确引用所有列)

INSERT INTO mastertable (Col1, Col2, Col3, ...)
SELECT Col1, Col2, Col3 
FROM temptable

VBA

...

' PROCESS EACH CSV IN SUBSEQUENT SUBROUTINE
For Each selectedItem In fd.SelectedItems 
    Call upload_process(selectedItem, report_name) 
Next selectedItem

Sub upload_process(csv_file, report_name)
    ' CLEAN OUT TEMP TABLE
    CurrentDb.Execute "DELETE FROM myTempStagingTable"

    ' IMPORT CSV INTO TEMP TABLE 
    DoCmd.TransferText acImportDelim, , "myTempStagingTable", csv_file, True 

    ' RUN UPDATES ON TEMP TABLE
    With CurrentDb.QueryDefs("myParameterizedUpdateQuery")
       .Parameters("ParamReportNameField").Value = report_name
       .Execute dbFailOnError
    End With

    ' RUNS APPEND QUERY (TEMP -> MASTER)
    CurrentDb.Execute "myAppendQuery"
End Sub

如果 CSV 上传的数据结构差异很大,则合并 Excel 清理步骤以标准化所有输入。或者,强制用户使用标准化模板。登台可用于验证上传。数据库不应是许多不同 table 的存储库,而应是 pre-designed 设置中关系模型的一部分。 运行 open-ended 用户即时创建新 table 等过程可能会导致维护问题。