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

时间:2015-02-05 02:41:28

标签: sql vba ms-access access-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部分一样。< / p>

当我将以下代码用于其他查询时:

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开始的行上的错误。

我认为这与Mid([EFF DTE],5,2))=""04""和我试过双引号的部分有关,因为在这种情况下,我尝试过单引号并且我已经尝试过了没有引号将表中的记录从Text更改为Number,但总是得到相同的错误。

有更简单的方法吗?或者我的代码可以被修改才能正常工作?

最后注意,选项按钮的原因是删除&#39; WA日期&#39;来自查询的条件,因为该条件从组合框中读取,当我摆弄组合框以允许 ALL 选项时,它实际上没有返回任何结果。

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

1 个答案:

答案 0 :(得分:1)

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

在您的第二个代码示例中,您会遇到&#34;类型不匹配&#34;类似于此缩写版本的行的错误:

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

您可能认为Access抱怨您的SELECT声明无效。但是实际问题类似于立即窗口中的这个例子,它也引发了一个&#34;类型不匹配&#34;错误:

? "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 DTE WA DATE 值的日期为 yyyy / mm /中的文字dd 格式,您希望查询以 dd / mm / yyyy 格式显示它们。如果这是真的,请比较这两个应该返回相同字符串的表达式:

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