我打开一个带有过滤器的表格。当我使用此表单创建新记录时,我希望字段获得与过滤器相同的默认值。(这样新记录将成为当前过滤结果的一部分)。当我打开表单时,我将过滤器值保存在 tempvar 中。
我怎样才能以简单的方式实现这一目标?
我已经尝试了后两种方法从这个问题中获取当前过滤器:Access 2003 VBA Get Active filter?
我不明白前者。
我以前没有编程过 Visual Basic,也没有使用过任何重要程度的 Access。所以我可能需要一个非常详细的解释。
非常感谢
我打开一个带有过滤器的表格。当我使用此表单创建新记录时,我希望字段获得与过滤器相同的默认值。(这样新记录将成为当前过滤结果的一部分)。当我打开表单时,我将过滤器值保存在 tempvar 中。
我怎样才能以简单的方式实现这一目标?
我已经尝试了后两种方法从这个问题中获取当前过滤器:Access 2003 VBA Get Active filter?
我不明白前者。
我以前没有编程过 Visual Basic,也没有使用过任何重要程度的 Access。所以我可能需要一个非常详细的解释。
非常感谢
不幸的是,Access 没有该功能。你必须学习 VBA 才能实现这一点。
我认为分析过滤器会很困难。在我看来,为每个字段设置过滤器和默认值会更容易。需要实现打开表单的功能和一些公共的表单方法来设置值。
打开表单的函数如下所示:
Dim frm as Form_SomeForm
DoCmd.OpenForm "SomeForm", , , , , acHiden
Set frm = Forms("SomeForm")
frm.SetControlFilter("UserName", "=", "Foo")
frm.SetControlFilter("Age", "=", "123")
...
frm.ApplyFilter()
frm.Visible = True
表单模块“SomeForm”看起来像:
Dim m_stFiler as String
Public Sub SetControlFilter(ByVal stCtrl As String, ByVal stExp As String, ByVal stValue as String)
Dim ctl As Control
'-- set default value
set ctl = Me("stCtrl")
ctl.DefaultValue = "=""" & stValue & """"
'-- build filter
If m_stFiler <> "" Then m_stFiler = m_stFiler & " AND "
m_stFiler = m_stFiler & ctl.ControlSource & " " & stExp & " "" & stValue & "" "
End Sub
Public Sub ApplyFilter()
Me.Filter = m_stFiler
Me.FilterOn = True
End Sub
谢尔盖的回答让我走上了正轨。
我不得不做一些 tweeks。
它只适用于一个领域,我不得不这样调用方法:
Call frm.SetControlFilter("Age", "=", "123")
出于某种原因,我还必须将 stCtrl 保存在一个新的内部变量中,如下所示:
Dim stCon As String
stCon = stCtrl
'-- set default value
Set ctl = Me(stCon)
多谢
我有一种感觉,这个问题是关于从表单打开记录以查看过滤了所选主记录的子表单。因此,当您向子表单添加更多记录时,您会将主记录 ID 继承到每个子表单中。
如果是这种情况,有一种更简单的方法可以做到这一点:
1)创建一个子表单“MyChildForm”,其中行源与主表单相同,这就像一种假人,用于存放主ID。
2)在“MyChildForm”中,创建一个包含要编辑的子数据的子表单
3)使用链接主/子字段属性将“MyChildForm”表单与其子表单链接,通过选择子表单的边界框,然后是属性,然后是数据选项卡来找到。
4)在您的主表单上创建一个按钮以打开子表单
DoCmd.OpenForm "MyChildForm", acNormal, , "[ID] = " & Me.ID
就是这样……
抱歉,如果这不是您想要的,并且您实际上出于其他原因想要通过过滤器。