【问题标题】:Wrong RecordCount on Filtered Form with SQL View DataSource使用 SQL 视图数据源过滤表单上的错误 RecordCount
【发布时间】:2013-01-12 22:55:28
【问题描述】:

我使用 Access2010 项目 作为前端,将 MS SQL Server 2008 作为后端。在我的 Access 项目中,有一个表单 frmKlientenÜbersicht。此表单有一个视图 abfKlientenÜbersicht 作为数据源。

现在我正在尝试使用以下代码获取当前表单中显示的记录数:

Private Sub Form_Current()
    Debug.Print "Form_Current: " & anzahlDatensätze
    lblAnzahlDatensätze.Caption = anzahlDatensätze & " Klient(en)"
End Sub

Private Function anzahlDatensätze() As Integer
    Dim rs As Recordset
    Set rs = Me.RecordsetClone
    rs.MoveLast
    anzahlDatensätze = rs.RecordCount
End Function

在我使用一些过滤器之前,这可以正常工作。如果我在表单上使用任何过滤器记录数保持不变

  • 我必须进行哪些更改才能显示当前的记录数(无论是否过滤)?
  • 我的代码显示的记录数不正确是什么原因?

编辑:根据给定的 cmets 和答案,我尝试将 Count([pkKlient] 设置到文本框(见新图片)并尝试在 VBA 代码中使用 DCount("*", "abfKlientenÜbersicht", me.Filter)

不幸的是,当使用它作为 DCount 的参数值时,似乎 filterClause 无效。 (有关 filterClause 的图片,请参见图片)。

如您所见,count(..) 不会产生正确的数字 - 并且 filterClause(由访问生成!!)似乎不适用于 DCount(..)

如果有人想自己尝试,自己创建一个ADP,添加一个表单,添加一个视图,表单数据源是一个视图,设置一个过滤器,然后尝试获取记录数?!!

期待任何 cmets/answers/hints!

【问题讨论】:

  • 您也可以向我们展示您的过滤器吗?
  • 过滤器将由用户动态设置,通过点击相应的访问 RibbonBarButtons 并选择要过滤的值!
  • 抱歉没有明确说明。在这里最好的猜测是您正在查看paramterized query。那么为什么不在添加过滤器后查看 SQL 视图 :)
  • 不幸的是,我不太确定您的意思 - 也许您可以添加一个显示/描述如何实施您的解决方案的分析器。此外,我想知道的只是记录的数量 - 底部的导航栏中已经显示了访问权限(例如:4 个中的 1 个 - 已过滤)。 IMO 请求的信息已经在 访问范围内 - 我只是不知道如何获取它??

标签: ms-access vba record-count


【解决方案1】:

一些注意事项,有十几个可能出错的地方,甚至不能称为测试。但是,它为我返回了正确的计数。

显然,表单过滤器只是隐藏记录,而这将应用真正的过滤器。但是,您需要将格式转换为有效过滤器的正确形状。最后,WHERE 语句可能会更容易。

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)

    With Me.Recordset
        ''Filter
        If ApplyType = 1 Then
            ''Very, very roughly. Remove form name, use single quotes
            ''You will need a lot more code for safety
            sfilter = Replace(Me.Filter, "[" & Me.Name & "].", "")
            sfilter = Replace(sfilter, """", "'")

            .Filter = sfilter 

            MsgBox "Recordset : " & Me.Recordset.RecordCount & vbCrLf _
            & "Filtered : " & .RecordCount

        Else
            ''Remove filter - ApplyType 0
            .Filter = ""
        End If

    End With

End Sub

带有类似警告的附加说明

您还可以在这些行中设置文本框:

=IIf([FilterOn]=True,DCount("id","ATable",
 Replace(Replace([Filter],"[" & [Name] & "].",""),"""","'")),Count([id]))

(去掉换行符,是装饰性的)

【讨论】:

  • 感谢您的输入 - 至少这可以解释为什么 count 没有为我返回正确的数字。当您声明时,您确实得到了正确的结果,您使用 SQL Server 作为后端并使用 Access 作为前端?使用 Access 数据库时,我也确实得到了正确的结果
  • 我只是想知道 Access 正在使用什么样的逻辑/功能 - 因为它会立即显示正确的数字?! (见第二个有问题的截图)
  • 我使用 Access 2010 和 SQL Server Express 2012 创建了一个 adp。最初我得到的结果与您概述的相同,即一种看似过滤的数据形式和一个不匹配的计数。我把上面关于这个问题的一些帖子放在一起。这取决于对记录集应用过滤器,而不是表单。
  • 注意这是adps的问题,对于链接表根本不存在,现在推荐使用后端数据库的方式。
  • 我正在使用链接表和一个查询作为表单的数据源。不幸的是我仍然有这个问题。将过滤器分配给记录集可能是一种解决方案,但让用户有可能利用内置过滤器功能......找到了一个解决方案,将表单的高度除以记录的高度以获得正确的号码
【解决方案2】:

使用 VBA,DCount 将为您提供所需的内容

DCount("*", "MyTable", Me.Filter)

如果你想把它放在表单上,​​有一个更简单的方法。使用未绑定的框,并将其设置为=count([FieldName])

无论是否计算过滤记录,此计数都应保持正确。

【讨论】:

  • 不幸的是 Count([primaryKeyColumn]) 不会产生正确数量的记录,并且我的 VBA 代码中的 DCount 不起作用。似乎 FilterClause (由访问生成)无效 - 请参阅已编辑的问题..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多