访问查询 SQL 尝试通过 VBA 更新查询时出现类型不匹配错误

Access Query SQL Type mismatch error when trying to update query via VBA

我有一个查询,它从表单上的组合框中获取多个条件。

为了更改查询的类型以用于报告目的,我使用以下代码:

Dim oDB As Database 
Dim oQuery As QueryDef
Set oDB = CurrentDb
Set oQuery = oDB.QueryDefs("qry_AdjustmentDataSplitGroup")
oQuery.SQL = ("SELECT tbl_AdjustmentData.POLICY, tbl_AdjustmentData.MD, tbl_AdjustmentData.[EFF DTE], tbl_AdjustmentData.NAME, tbl_AdjustmentData.[DEP/PREM], tbl_AdjustmentData.[LST PREM], tbl_AdjustmentData.GROUP, tbl_AdjustmentData.[WA DATE] FROM tbl_AdjustmentData WHERE (((tbl_AdjustmentData.Group) Is Not Null)) ORDER BY tbl_AdjustmentData.[WA DATE];")
Set oQuery = Nothing
Set oDB = Nothing

并根据在表单上按下的按钮更改 ORDER BY。这工作正常。

但是,我认为如果我需要更改查询条件(或 WHERE)也是一样的,我只是更改该行,就像我可以更改代码的 ORDER BY 部分一样.

当我使用下面的代码进行不同的查询时:

Dim oDB As Database
Dim oQuery As QueryDef
Set oDB = CurrentDb
Set oQuery = oDB.QueryDefs("qry_AdjustmentDataSplitNonGroupApr")
oQuery.SQL = ("SELECT qry_AdjustmentDataSplitNonGroup.POLICY, qry_AdjustmentDataSplitNonGroup.MD, qry_AdjustmentDataSplitNonGroup.[EFF DTE], qry_AdjustmentDataSplitNonGroup.NAME, qry_AdjustmentDataSplitNonGroup.[DEP/PREM], qry_AdjustmentDataSplitNonGroup.[LST PREM], qry_AdjustmentDataSplitNonGroup.[WA DATE], Right([EFF DTE],2) & " / " & Mid([EFF DTE],5,2) & " / " & Left([EFF DTE],4) AS EffectiveDate, Right([WA DATE],2) & " / " & Mid([WA DATE],5,2) & " / " & Left([WA DATE],4) AS WADate, Left([EFF DTE],4) AS [Year], Left([WA DATE],4) AS WAYear FROM qry_AdjustmentDataSplitNonGroup WHERE (((Left([EFF DTE],4))=[Forms]![frm_Index]![cbo_YearPicker]) AND ((Left([WA DATE],4))=[Forms]![frm_Index]![cbo_WAPicker]) AND ((Mid([EFF DTE],5,2))=""04""));")
Set oQuery = Nothing
Set oDB = Nothing

我希望能够删除这部分:

AND ((Left([WA DATE],4))=[Forms]![frm_Index]![cbo_WAPicker]) 

使用表单上的选项按钮,其余部分保持不变。

但问题是,当我尝试这样做时,我在 oQuery.SQL.

开头的行中收到 'Type mismatch' 错误

我假设它与 Mid([EFF DTE],5,2))=""04"" 所在的部分有关,我试过在这种情况下使用双引号,我试过单引号,我试过完全不使用引号来更改记录Table 从文本到数字,但总是得到相同的错误。

有更简单的方法吗?还是可以修改我的代码使其正常工作?

最后一点,选项按钮的根本原因是从查询中删除 'WA Date' 标准,因为该标准是从组合框中读取的,当我摆弄组合框以允许 ALL 选项实际上没有返回任何结果。

我听说 UNION ALL 可能是解决这个问题的另一种方法,以避免不得不完全删除标准,但我不确定如何实施。

您面临的情况很容易被误解。

在您的第二个代码示例中,您在类似于此缩写版本的行处遇到 "type mismatch" 错误:

oQuery.SQL = ("SELECT qry_AdjustmentDataSplitN ... ")

您可能认为这是 Access 抱怨您的 SELECT 语句无效。但实际问题类似于 Immediate window 中的这个示例,它也会引发 "type mismatch" 错误:

? "a" / "b"

发生这种情况是因为您不能将一个字符串除以另一个字符串。除法只对数值有意义。

当您带着这个问题检查代码时,您应该会发现这种模式的多个案例:

"some text & " / " & more text"

将其与我的 "a" / "b" 示例进行比较。

你需要用不同的方式引用它。我会尝试一下我认为你想要的东西。我不确定语句逻辑是否正确,但至少这会产生一个有效的 VBA 字符串:

Dim strSelect As String
strSelect = "SELECT q.POLICY, q.MD, q.[EFF DTE], q.NAME, " & _
    "q.[DEP/PREM], q.[LST PREM], q.[WA DATE], " & _
    "(Right([EFF DTE],2) & '/' & Mid([EFF DTE],5,2) & '/' & Left([EFF DTE],4)) AS EffectiveDate, " & _
    "(Right([WA DATE],2) & '/' & Mid([WA DATE],5,2) & '/' & Left([WA DATE],4)) AS WADate, " & _
    "Left([EFF DTE],4) AS [Year], Left([WA DATE],4) AS WAYear" & vbCrLf & _
    "FROM qry_AdjustmentDataSplitNonGroup AS q" & vbCrLf & _
    "WHERE Left([EFF DTE],4)=[Forms]![frm_Index]![cbo_YearPicker]" & vbCrlf & _
    "AND Mid([EFF DTE],5,2)='04';"
Debug.Print strSelect ' <-- view the completed statement text in Immediate window
                      ' Ctrl+g will take you there
oQuery.SQL = strSelect

最后,从字里行间看,我猜你的 EFF DTEWA DATE 值是 yyyy/mm/dd 格式,您希望查询以 dd/mm/yyyy 格式显示它们。如果这是真的,比较这两个表达式,它们应该 return 相同的字符串:

  1. Right([EFF DTE], 2) & '/' & Mid([EFF DTE], 5, 2) & '/' & Left([EFF DTE], 4)
  2. Format([EFF DTE], 'dd/mm/yyyy')