【问题标题】:combobox rowsource based on forms record source (distinct) field基于表单记录源(不同)字段的组合框行源
【发布时间】:2013-12-24 08:50:28
【问题描述】:

我将表单记录源设置为详细的 SQL 选择语句。那工作正常。如果有助于了解,表单布局是表格。以下是数据示例:

order carrier billto employee
1     smgd    horm   chrnic
2     axxm    sele   chrnic
3     smgd    horm   redned
4     mcta    cron   greand
5     mcta    cron   greand

它基本上是未开票的订单条目。我想要一个组合框来根据当前显示的记录显示不同的员工姓名(chrnic、redned、greand)。我将对其进行编码以过滤表单。看起来很简单,但我遇到了麻烦

我尝试过的事情:

  • 尝试将 rowsource 设置为 me.recordsource,但得到一个
    • 看来我需要解析和编辑该字符串
  • 我复制了复杂查询并将其作为组合框记录源并用于过滤表单,因此我知道过滤逻辑是正确的。我只是希望它是动态的,所以我们只需要在需要时在一个地方更改 SQL 语句

【问题讨论】:

  • 请看你的sql语句。或添加 Select Distinct employee from table 作为组合框行源。
  • 请记住这是示例数据,保持不变,让我们说它:SELECT orders.order, orderdetail.carrier, orderdetail.billto, orderdetail.employee FROM orders o JOIN orderdetail od ON o.order= od.order WHERE orders.billed=false

标签: ms-access vba


【解决方案1】:

“我有一个表单记录源设置为详细的 SQL 选择语句。”

将该查询另存为命名QueryDef。我会假装你选择了 qryRecordSource 作为名称。

“我想要一个组合框来显示不同的员工姓名……基于当前记录”

对于组合框行源使用...

SELECT DISTINCT employee
FROM qryRecordSource
ORDER BY 1;

然后根据组合选择过滤表单,添加一个命令按钮,cmdApplyFilter,并在其单击事件过程中使用它...

Me.Filter = "[employee] = '" & Me.YourComboName.Value & "'"
Me.FilterOn = True

如果员工姓名可以包含撇号,请将其用于Filter 表达式...

Me.Filter = "[employee] = '" & _
    Replace(Me.YourComboName.Value, "'", "''") & "'"

如果要包含组合行以清除过滤器,请使用UNION 查询作为组合行源...

SELECT "*** ALL ***" AS employee
FROM Dual
UNION
SELECT employee
FROM qryRecordSource
ORDER BY 1;

... 其中 Dual 是任何只返回一行的表或查询。然后在命令按钮点击事件中你可以做...

If Me.YourComboName.Value = "*** ALL ***" Or _
        IsNull(Me.YourComboName.Value) Then
    Me.Filter = vbNullString
    Me.FilterOn = False
Else
    Me.Filter = "[employee] = '" & Me.YourComboName.Value & "'"
    Me.FilterOn = True
End If

实际上你甚至不需要命令按钮。您可以从组合的AfterUpdate 事件中设置Filter

【讨论】:

  • @greggmcfg 我将第二个查询从 UNION ALL 更改为 UNION。仅使用UNION,查询只返回唯一行,因此不再需要DISTINCT
  • 不确定QueryDef 是什么意思,根据您提供的名称,我假设您只是指查询对象。呃,现在看起来很明显。你最后的说法是我要走的方向,但是没有命令按钮怎么关闭过滤器呢?
  • 对,QueryDef 是一个查询对象。如果您对组合行源使用第二个示例这样的查询,则可以使用组合的AfterUpdate 事件来检查其选定行是否="*** ALL ***""。如果相等,FilterOn = False。否则,像Else 块一样构建并应用过滤器。
  • 好的,我现在明白了,非常感谢!顺便说一句,我实际使用: SELECT TOP 1 "*** ALL ***" AS employee FROM qryRecordSource UNION SELECT DISTINCT employee FROM qryRecordSource ORDER BY 1; // 我对 ORDER BY 1 有点困惑,但是在查找它时,它只是第 1 列名称的速记;有人说这是因为练习,但如果你输入 ORDER BY employee 就会出错。那是 ACCESS jet/tsql 或其他什么奇怪的东西吗?
  • ORDER BY <column ordinal number> 不限于访问。我确定我过去曾将它与其他数据库一起使用,但我不记得是哪个。当您想在SELECT 子句中按计算字段表达式排序但避免在ORDER BY 中重新键入该字段表达式时,它特别方便。顺便说一句,您不需要在正在使用的查询中使用DISTINCT。但这也不痛。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2023-03-16
相关资源
最近更新 更多