基于表单记录源(不同)字段的组合框行源

时间:2013-12-06 20:57:48

标签: vba ms-access access-vba

我有一个表单记录源设置为精心设计的SQL select语句。这工作正常。如果有帮助知道,表单布局是表格式。以下是数据示例:

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语句

1 个答案:

答案 0 :(得分:1)

“我有一个表单记录源设置为精心设计的SQL select语句。”

将该查询保存为命名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

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