在 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 等过程可能会导致维护问题。
哇,我的第一个堆栈问题尽管使用了多年的答案。很精彩。
我对 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 等过程可能会导致维护问题。