我在一个大型Access数据库中有一个模块,它试图使用Allen Browne编写的ECount(扩展D计数)函数计算表中的唯一记录数(此处为http://allenbrowne.com/ser-66.html)。
正如他在指南中提到的那样:
您无法在参数中嵌入对表单的引用。 例如,这不起作用:
ECount(“*”,“客户”,“城市=表格!客户!城市”)
相反,将值连接到字符串中:
ECount(“*”,“Customers”,“City =”“”& Forms!Customers!City&“”“”)
不幸的是,发送到ECount的查询(“域”参数)本身会调用另一个依赖于输入表单的查询。所以我最终得到的是,间接地,ECount尝试使用表单变量,即使查询字符串本身没有写入表单变量,所以我得到:
运行时错误3061:参数太少。预期1。 在行:“Set rs = db.OpenRecordset(strSql)”
发送到OpenRecordset的查询是:“SELECT Key FROM Report7Query WHERE(Key is not Null)AND(MainCategory =”Source“AND 1 = 1 AND([State] ='AR'))GROUP BY Key;” 。此查询是基于表单的输入生成的,而Report7Query调用另一个名为CustomQuery的查询,我认为它依赖于一个表单(也称为CustomQuery)来输入。
如果我只是尝试运行Report7Query而没有打开表单,则会出现一个对话框,询问“Forms!CustomQuery!ConsolidatedSelection.Value”,它是CustomQuery表单上的变量。如果我只是尝试打开CustomQuery查询,也是如此。有趣的是,如果我在设计视图中打开CustomQuery表单,然后在自己的查询中运行Report7Query或CustomQuery查询,甚至上面的select语句,那么一切正常。
我已经尝试了很多方法来解决这个问题,例如使用QueryDefs,但我似乎无法让ECount工作。有趣的是,DCount在完全相同的查询下工作正常。