【问题标题】:DAO.QueryDef shows incorrect result in MS Access 2010DAO.QueryDef 在 MS Access 2010 中显示不正确的结果
【发布时间】:2014-11-30 13:18:48
【问题描述】:

我在 MS Access 中有以下存储查询

SELECT 
    tblRegistration.ID, 
    tblRegistration.TypeCode, 
    CDate([tblRegistration].[RegStart]) AS Reg1, 
    CDate([tblRegistration].[RegStop]) AS Reg2
FROM 
    tblRegistration
WHERE 
    (
        (tblRegistration.TypeCode = "T" Or tblRegistration.TypeCode = "S" Or tblRegistration.TypeCode = "F") 
        AND 
        (CDate([tblRegistration].[RegStart]) Between CDate([Forms]![frmRegBilling]![RegStart]) And CDate([Forms]![frmRegBilling]![RegStop]))
    ) 
    OR 
    (
        (tblRegistration.TypeCode = "T" Or tblRegistration.TypeCode = "S" Or tblRegistration.TypeCode = "F") 
        AND 
        (CDate([tblRegistration].[RegStop]) Between CDate([Forms]![frmRegBilling]![RegStart]) And CDate([Forms]![frmRegBilling]![RegStop]))
    );

查询,当单独作为查询执行时(当 frmRegBilling 加载查询使用的参数时)显示正确的结果(8 条记录)。

但是在 VBA 中执行查询时,只显示 2 条记录。在这种情况下,仅验证第一个参数。

Dim qdf As DAO.QueryDef, rst As Recordset, varData As Variant
Dim intFields As Integer, intRecords As Integer, j As Integer, k As Integer
Dim rec As String, fld_type As Integer

Set qdf = CurrentDb.QueryDefs("Query1")
qdf.Parameters(0).Value = Eval(qdf.Parameters(0).Name)
qdf.Parameters(1).Value = Eval(qdf.Parameters(1).Name)
Set rst = qdf.OpenRecordset()

j = rst.RecordCount - 1
k = rst.Fields.Count - 1

切换行 Parameter(0) 或 (1) 没有帮助(如果由于任何原因受到影响)。在 VBA 中执行时,为什么两个参数都没有在查询中验证?

【问题讨论】:

  • VBA 代码运行时 frmRegBilling 是否打开?请edit你的问题解释为什么Eval()语句是必要的。
  • frmRegBilling 已打开。 Eval() 语句是必需的,因为 OpenRecordet 不会取消引用查询中的条件。请参考。到stackoverflow.com/questions/20277231/…了解更多信息。
  • 只是一个问题,但是您是否通过检查 j 的值来确定缺少预期记录?如果您不调用 rst.MoveLast,DAO 记录集很容易出现错误的记录计数。想知道是不是这样。除此之外,您是否尝试过通过取出 Eval 调用并将值硬编码来进行调试?也许这将使您对问题发生的位置有所了解。或者另一种方法,调用之前的 Debug.Print Eval(qdf.Parameters(x).Name) 也会有所帮助。

标签: vba ms-access ms-access-2010 dao


【解决方案1】:

如果您使用 VBA,为什么不将其创建为运行时查询?

Dim strSQL As String, rst As Recordset, varData As Variant
Dim intFields As Integer, intRecords As Integer, j As Integer, k As Integer
Dim rec As String, fld_type As Integer

strSQL = "SELECT tblRegistration.ID, tblRegistration.TypeCode, CDate([tblRegistration].[RegStart]) AS Reg1, " & _
         "CDate([tblRegistration].[RegStop]) AS Reg2 FROM tblRegistration WHERE " & _
         "((tblRegistration.TypeCode = 'T' Or tblRegistration.TypeCode = 'S' Or tblRegistration.TypeCode = 'F') AND " & _
         "(CDate([tblRegistration].[RegStart]) Between " & Format([Forms]![frmRegBilling]![RegStart], "\#mm\/dd\/yyyy\#") & _
         " And " & Format([Forms]![frmRegBilling]![RegStop], "\#mm\/dd\/yyyy\#") & ")) OR " & _
         "((tblRegistration.TypeCode = 'T' Or tblRegistration.TypeCode = 'S' Or tblRegistration.TypeCode = 'F') " & _
         "AND (CDate([tblRegistration].[RegStop]) Between " & Format([Forms]![frmRegBilling]![RegStart], "\#mm\/dd\/yyyy\#") & _
         " And " & Format([Forms]![frmRegBilling]![RegStop], "\#mm\/dd\/yyyy\#") & "));"

Set rst = CurrentDb.OpenRecordset(strSQL)

【讨论】:

  • 嗯,我也应该想到我们自己:-|。我从未在 VBA (\/) 中转义 SQL 字符串中的特殊字符。你看,学习永远不会太晚。不过,这种方法确实起到了作用。谢了!
  • @Art 很高兴你把它整理好了。祝你好运 ! :)
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2021-10-07
  • 2019-05-12
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多