【问题标题】:Return records which have unique data in a field返回字段中具有唯一数据的记录
【发布时间】:2016-08-09 03:35:52
【问题描述】:

我想返回一个表中只有一个链接记录在另一个表中的记录。

例如,2 个表 tblClients 和 tblOrders 具有由 tblClients.ID 和 tblOrders.ClientID 链接的 OTM 关系(不完全是我的情况,但更容易解释)。我希望使用过滤器打开 frmClients,其中客户端仅下了一个订单 - 即 tblorders.ClientID 未在 tblOrders 的另一条记录中重复的记录。

通过阅读,SELECT/COUNT 查询似乎是可行的方法,但我似乎无法让语法正常工作。到目前为止,这是我所得到的:

Public Function onlyone()
Dim uWHERE As String
uWHERE = "SELECT tblOrders.Client_ID FROM tblOrders WHERE Count(tblOrders.Client_ID) = 1;"
Debug.Print uWHERE
End Function

我对 SQL 非常有限,对 VBA 并不出色(如果从上面看不出来的话!)如果我在 OpenForm 中运行此代码,使用 uWHERE 作为 WHERE 子句,我会收到语法错误(我有其他更简单的 WHERE 子句在其他子句中工作正常)。如果我将 uWHERE 输出到 msgbox,我会得到 SELECT 字符串作为提示,而 debug.print 行什么也不做。

我认为我完全错误地处理了这个语法,或者没有弄清楚 SELECT 查询实际上在拉什么,但不知道如何解决它。我会很感激一些指导=]

谢谢!

编辑++++++++++++++++++

好的,不同的策略。 tblOrders 有一个未绑定的列表框,其行源是从为该 Client_ID 下订单的日期设置的。如果他们只下了一个订单,那么只有一个条目,那么有没有办法可以打开表单,只显示在这个列表框中有一个条目的记录?我试过了

Dim uWHERE As String
DoCmd.OpenForm "frmworklog", , , , acFormEdit
With frmworklog
Filter = "forms!frmworklog.searchres.listcount = 1"
FilterOn = True
End With
Msgbox Forms!frmworklog.searchres.ListCount

过滤器不起作用,但 msgbox 给出了打开记录的正确计数。 uWHERE 是一个 WHERE 子句,其定义与现在的 'Filter' 相同 - 我只是忘了取出声明。

非常感谢 =]

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。

标签: mysql ms-access select count vba


【解决方案1】:

对于聚合值的条件,使用having,而不是where

SELECT o.Client_ID
FROM tblOrders o
HAVING Count(*) = 1;

【讨论】:

  • 感谢您的回复 - 这仍然会在 OpenForm 命令中引发语法错误。我应该以不同的方式使用结果 - 使用 RecordSet 还是其他东西?
【解决方案2】:

这不是我的问题的直接答案,但它是我的目的可接受的解决方法,因此也许它也可以为其他人实施。

我在 tblOrders 中添加了一个额外的字段“Orders”,使用未绑定的框“searchres”保留了归属于该 ClientID 的订单总数,其中包含在该 ClientID 下放置的每个订单的日期列表:

Private Sub btnsave_Click()

Me.Orders = Me.searchres.ListCount
DoCmd.RunCommand acCmdSaveRecord
Me.searchres.Requery

End Sub

然后我可以使用 Orders = 1 的简单 OpenForm 命令。

工作完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多