设置默认值或忽略 MS-Access 中不存在的追加查询字段

问题描述

我有一系列使用 Access 数据库(实际上是一系列 SharePoint 列表的前端)的 Excel 工具。每个 Excel 工具都有一个导出功能,可以创建一个单独的文件 (CSV),其中包含要导入数据库的数据。在数据库中,CSV 作为本地表出现,并运行追加查询以将本地表的内容添加到 SharePoint 列表。我不喜欢这种架构,但由于我公司的 IT 安全协议的稳健性,这是我必须做的。

CSV 中可能存在一个列列表,但它们是否存在取决于输入到工作簿中的数据。例如,以下是所有可能的列标题

  • 节省千瓦时
  • kw 节省
  • 节省天然气
  • 节水
  • 节省燃油
  • 丙烷节省

根据客户/建筑/最终用途,某些字段可能不存在。例如,如果这是一个照明计算器,则不存在节水量,因此该列将不存在。由于该字段不存在,因此追加查询会抛出一个对话框来询问我的参数值。我试图完成的是它不这样做。我没有偏好它是否只是忽略该字段,或者它是否认为 0。有什么想法吗?以下是我的查询,使整个工作正常进行:

[AppendFilter]
SELECT csv.*
FROM csv LEFT JOIN sharepoint ON (csv.FIM_Unique = sharepoint.FIM_Unique) AND (csv.[Building ID] = sharepoint.Building)
WHERE (((sharepoint.FIM_Unique) Is Null) AND ((sharepoint.Building) Is Null) AND ((csv.FIM_Unique) Is Not Null));
[AppendData]
INSERT INTO sharepoint ( FIM_Unique,FIM_Designation,[FIM Description],Safety_Factor,Building,[kWh Savings],[kW Savings],[Natural Gas Savings],[Water Savings],[Fuel Oil Savings],[Propane Savings] )
SELECT [AppendFilter].FIM_Unique,csv.[FIM Designation],csv.[FIM Description],csv.[Safety Factor],[AppendFilter].[Building ID],[AppendFilter].[kWh Savings],[AppendFilter].[kW Savings],[AppendFilter].[Natural Gas Savings],[AppendFilter].[Water Savings],[AppendFilter].[Fuel Oil Savings],[AppendFilter].[Propane Savings]
FROM [AppendFilter]. INNER JOIN csv ON [AppendFilter].FIM_Unique = csv.FIM_Unique
WHERE ((([AppendFilter].FIM_Unique) Is Not Null) AND (([AppendFilter].[Building ID]) Is Not Null));

我在运行查询时尝试了 DoCmd.SetWarnings False,但这些警告似乎不受此影响!

解决方法

可以使用 VBA 动态构建和执行 SQL 操作。一种方法是使用 DAO TableDefs 遍历表字段并构建字段名称字符串,并使用字符串变量构建 SQL 语句。我认为不需要用 AppendFilter 加入 CSV。一方面,这样做会导致 SELECT 查询具有重复的字段名称,除非字段以表名称为前缀,否则会导致混淆。

但是,如果源表和目标表中的字段名称不同,则会变得复杂。我看到下划线和 Building ID 而不是 Building 的一些变化。由于只有 3 个字段有变化,所以使用条件代码构建字符串变量以检查特定字段名称并进行适当调整。

Dim db As DAO.Database,td As DAO.TableDef,fd As DAO.Field,strD As String,strF As String
Set db = CurrentDb
Set td = db.TableDefs("csv")
For Each fd In td.Fields
    strF = fd.Name
    If strF = "FIM Designation" Or strF = "Safety Factor" Then strF = Replace(strF," ","_")
    If strF = "Building ID" Then strF = "Building"
    strD = strD & "[" & strF & "],"
Next
strD = Left(strD,Len(strD) - 1)

db.Execute "INSERT INTO sharepoint(" & strD & ") " & _
"SELECT * FROM csv " & _
"WHERE FIM_Unique IN(SELECT FIM_Unique FROM AppendFilter)"

我强烈建议不要在命名约定中使用空格或标点符号/特殊字符。下划线只是个例外,但我也从不使用它。