如何在Access Textbox中显示Distinct Count?

时间:2013-06-12 15:14:47

标签: sql vba

这看起来应该是一个相对简单的任务,但到目前为止,我已经用几种不同的方式解决了这个问题。

我有两个表:人物和地址。我有一个带有记录源的表单,这是一个连接这两个表的查询。我想要做的是让标题显示“数据库目前在[txtAddressCount]地址包含[txtPersonCount]人。”

由于人员密钥和地址密钥在各自的表格中是不同的,我首先想到的只是将文本框的控制源设置为=Count([tblPeople].[PersonID])=Count([tblAddress].[AddressID])

奇怪的是,使用此方法,两个文本框中都会显示地址ID的计数。我假设正在发生的事情不是从各个表中计算ID,而是从表单的记录源后面的查询中计算ID(其中有多个地址而不是人,因此它是有意义的。)

然后我尝试通过将我的SQL查询声明为字符串来完成同样的事情:

Dim sql As String
sql = "SELECT COUNT(tblPeople.[PersonID]) FROM tblPeople;"

Forms![frmBrowse].[txtPersonCount].ControlSource = sql

但这只会使文本框显示查询文本。将字符串更改为"=SELECT COUNT...."没有任何区别。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

您已经创建了SQL字符串,但在执行它或将其绑定到记录集之前,您将无法使用结果。

'Create a connection to your database
Dim db As DAO.Database
Set db = CurrentDb()

'Create a record set that will let you access values from your query
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("SELECT COUNT(tblPeople.[PersonID]) as NumOfPeople FROM tblPeople;")

'You don't want to change the control source because that is the property of where the value will be stored.  You want to change the value of the text box.
Forms![frmReports].[Text144] = rs!NumOfPeople

'Close the connection and recordset
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing

答案 1 :(得分:1)

我只需在People表上使用DCount("*","People")函数,
和地址表上的DCount("*","Addresses")。比试图在JOIN上制作DISTINCT COUNT更快更明智 如果你真的想要一个DISTINCT COUNT,你将不得不使用一个棘手的交叉表查询 我发布了一些here(法语)和Roger的Access博客比较4 ways to do this

答案 2 :(得分:0)

Here's a link根据Select语句中的参数循环选定的记录。它使用.RecordCount关闭记录集,但是踢球者必须首先访问记录器(因此循环)。

相关问题