2015-09-07 81 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) 

末次

「指出,智能感知不會拿起此廣告載體,但它將工作。使用調試器檢查出來。

我希望你能找到這個技巧很有用(因爲它可以是一個巨大的頭疼救星。最基本的面向對象的主體是封裝,一個對象應該擁有所有影響它的性能(和控制)的代碼。