使用SQL View DataSource在过滤的表单上使用错误的RecordCount

时间:2013-01-29 11:22:52

标签: vba ms-access access-vba record-count

我使用 Access2010项目作为前端,将 MS SQL Server 2008 称为后端。在我的Access项目中,有frmKlientenÜbersicht形式。此表单的视图abfKlientenÜbersicht为dataSource。

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

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

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

  • 我需要更改什么才能显示当前显示的记录数(如果是否已过滤)?
  • 我的代码没有显示正确的记录数的原因是什么?

Access Project Overview

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

不幸的是,当将 filterClause用作DCount的参数值时,似乎 filterClause无效。 (见filter for filterClause)。

正如您所看到的,count(..)不会产生正确的数字 - 而且filterClause(由访问!! 生成)似乎无效,无法由DCount(..)使用

如果有人想自己尝试,只需创建一个ADP,添加一个表单,添加一个视图,表单dataSource是一个视图,设置一个过滤器,并尝试获取记录数量?!!

期待任何评论/答案/提示!

form Screenshot when filtered

2 个答案:

答案 0 :(得分:1)

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

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

如果您想将其放在表单上,​​可以使用更简单的方法。使用未绑定的框,并将其设置为=count([FieldName])

using Count in form proerties

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

答案 1 :(得分:0)

有些注意事项,有十几件事可能会出错,甚至很难被称为测试。但是,它正在为我返回正确的计数。

显然,表单过滤器只隐藏记录,而这将应用一个真正的过滤器。但是,您需要将格式设置为有效过滤器的正确形状。最后,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]))

(删除行中的断点,它是装饰性的)