2015-09-07 82 views
0

我有一个相当简单的外观问题,但事实证明它比我想像的要复杂。在数据表视图窗体(MS Access)中只需要一条记录

我有一个字段(列)在我的subForm这是一个组合框。 我有一个字段(列)在另一个子窗体中,我想过滤这个组合框。

基本上,过滤之前的comboBox有大约600条记录,太多的数据不能被临时用户滚动。我创建了一个简单的子表单,其字段链接到一个mainForm,并且完美地工作(即所选的记录字段ID显示在mainForm上)。

现在我想要的是,这个组合框被这条记录过滤(即只显示相关的字段)。问题是,如果我用这个给定的过滤器简单地Requery它,其他字段显示空白。

我希望此过滤器仅适用于新记录组合框,而不是整个数据表视图。

我所做的是:

Private Sub Sekacie_Operacie_GotFocus() 
Dim SQL As String 
    SQL = CurrentDb.QueryDefs("qrySekacie_Operacie").SQL 
    Me.Sekacie_Operacie.RowSource = Replace(SQL, ";", "") & " WHERE Sekacie_Operacie.Operacia_ID = " & Me.Parent.Form!txtOP_ID 
    Me.Sekacie_Operacie.Requery 
'works kinda as intended 
End Sub 

Private Sub Form_AfterInsert() 
    Me.Sekacie_Operacie.RowSource = CurrentDb.QueryDefs("qrySekacie_Operacie").SQL 
    Me.Refresh 
End Sub 

当我在我的过滤器窗体中选择记录:

Private Sub Form_Current() 
Dim SQL As String 
    SQL = CurrentDb.QueryDefs("qrySekacie_Operacie").SQL 
With Me.Parent.Form.subSekacie_Operacie_Modelu 
    .Form!Sekacie_Operacie.RowSource = SQL 
    .Form.Refresh 
End With 
End Sub 

然而,这种解决方法仍显示“空白”的记录,有时(我不得不刷新通过点击不同的记录),我觉得很奇怪,我不得不一路去做这件事。有没有简单的方法来完成这一点?

回答

0

一对夫妇的事情眼前:

  1. 无需刷新整个子形式,只刷新控制。

    Private Sub Form_AfterInsert() 
    
    ' Me.Refresh     ' replace this line with the following line 
    Me.Sekacie_Operacie.Refresh ' or is it Requery I can't remember 
    
    End Sub 
    
  2. 下面的代码可以通过使用像这样

    Private Sub Form_Current() 
    
        Dim SQL As String 
        SQL = CurrentDb.QueryDefs("qrySekacie_Operacie").SQL 
    
        me.Sekacie_Operacie.RowSource = SQL 
    
        ' I think the above line will cause the combo to refresh 
        ' anyway (in some version of accees it might not, 
        ' but, if needed add the following line 
    
        ' me.Sekacie_Operacie.refresh 
    
    End Sub 
    
  3. 下面的行代码来改善

    Private Sub Form_Current() 
    
    Dim SQL As String 
    SQL = CurrentDb.QueryDefs("qrySekacie_Operacie").SQL 
    
    With Me.Parent.Form.subSekacie_Operacie_Modelu 
        .Form!Sekacie_Operacie.RowSource = SQL 
        .Form.Refresh 
    End With 
    
    End Sub 
    

“有可能产生和错误 (也许当马在形式上是一个新的记录)

WHERE Sekacie_Operacie.Operacia_ID = " & Me.Parent.Form!txtOP_ID 

WHERE Sekacie_Operacie.Operacia_ID = " & nz(Me.Parent.Form!txtOP_ID,0) 

注意更换,添加这样的代码将会从主要形式的独立工作停止子窗体,并要求它有一个父母形式。

你可以解决这个问题,通过使用:

if not me.parent is nothing then 
     WHERE Sekacie_Operacie.Operacia_ID = " & nz(Me.Parent.Form!txtOP_ID,0) 
    end if 

关于你的方法。

我觉得你有点奇怪你在做什么。考虑这个:

假设查询qrySekacie_Operacie在没有任何WHERE子句的情况下运行时返回100行。当您要通过添加WHERE子句将记录插入到子表单中时,通过添加使用父级formMe.Parent.Form!txtOP_ID中的值的WHERE子句),这可能会将显示的行数限制为10.

值得注意的是,如果子窗体中的任何其他行包含除这10个值之外的值,则组合将显示一个空值。我认为这是你正在经历的。

我的第一个问题是为什么不使用父窗体的当前事件来更改子窗体组合框SQL。看起来这不是你需要的。

似乎其他值可以存在于子窗体的数据集中,并且您只希望某个值可以在此子窗体中输入,但您希望子窗体显示已输入的任何值。

所以这很有趣。这是我会做的:

  1. 创建一个隐藏的组合控件(没有控制源),只有当输入新记录时才可见。当显示这个新组合时,另一个隐藏。

  2. 设置了所需的SQL

  3. 使用这种新组合插入事件之前复制的价值形成新的组合,以他旧的。

  4. 容易peezy?

让我知道你好吗。


的另一件事

我想,以确保它的“私人”的控制操作的子窗体encapsultes代码。

根据我的一般经验法则,在可能的情况下(99%的时间),我喜欢尝试并保留子表单,以便它们能够以自己的形式工作。它们可以作为一个对象,所以如果它们独立工作,则表明它们的代码已被封装在它们自己的代码模块中。

因此,如果表单有me.form.parent =无,那么代码的行为不同,因为它是一个独立的形式。

因此,我不会编写具有设置子表单组合的SQL的代码的父表单代码模块,我会在可以调用的子表单模块(称为SetComboSQL)中编写一个公共子集(使用适当的参数即OPid)设置组合SQL。

要调用父窗体的程序我想补充

私人小组Form_Current()

Me.MySubformControlName.Form.SetComboSQL(OPid:=Me.txtOP_ID) 

末次

“指出,智能感知不会拿起此广告载体,但它将工作。使用调试器检查出来。

我希望你能找到这个技巧很有用(因为它可以是一个巨大的头疼救星。最基本的面向对象的主体是封装,一个对象应该拥有所有影响它的性能(和控制)的代码。