2015-08-17 19 views
0

我在與我的MS Access創建數據庫的問題零長度領域目錄記錄2003與子表單

有一個表(姑且稱之爲tblItems)與四個字段:ID,描述,類別,子類別。 sub_category字段是唯一不需要的字段,它允許零長度的數據。

我創建基於該表(frmAddItems),它有兩個組合框(cboCategory & cboSubCategory),文本框(txtDescription)和一個子表單(sbfExistingItems)這是應該列出基於現有項目形式在兩個組合框中選擇了什麼。只要選擇了子類別,此功能就可以完美工作,但如果沒有子類別,則sbfExistingItems爲空。

記錄源爲sbfExistingItems是: 「SELECT tblItems.id,tblItems.description,tblItems.category,tblItems.sub_category FROM tblItems ORDER BY [描述];」

frmAddItems和sbfExistingItems鏈接如下:

  • 子字段:類別; sub_category
  • 主字段:cboCategory; cboSubCategory

的問題可能涉及到Access如何處理零但我不知道如何讓它做我想做的事情。任何幫助將不勝感激。

更新

正如jhTuppeny建議,我已刪除子窗體子/主鏈路,並添加以下代碼:

Private Sub txtDescription_GotFocus() 

Dim sql As String 

sql = "SELECT id, description, category, sub_category FROM tblItems" 

If IsNull(Me!cboCategory) Or Me!cboCategory = "" Then 
    ' leave recordsource unfiltered 
ElseIf IsNull(Me!cboSubCategory) Or Me!cboSubCategory= "" Then 
    sql = sql & " WHERE [category] = '" & Me!cboCategory & "'" 
Else 
    sql = sql & " WHERE [category] = '" & Me!cboCategory & "' AND [sub_category] = '" & Me!cboSubCategory & "'" 
End If 

sql = sql & " ORDER BY [description];" 

Me!sbfExistingItems.Form.RecordSource = sql 

End Sub 

但現在的子窗體的行爲像小孩/主字段在「id」上鍊接,僅列出當前項目。

我猜是什麼讓我需要一種方法來改變子窗體的形式中的子/主字段的值,而沒有主要的形式認爲我要離開它,而所需的txtDescription字段是空。

+0

我只是在想,我的下一步就是開始學習調試。好的,所以我添加了該行並單擊了「運行」按鈕,但我唯一得到的是一個彈出窗口,要求輸入一個宏名稱。我點擊取消,但沒有其他事情發生。我打開「主」表單運行宏。這是我應該輸入的名字嗎? – gr8dane

+0

好吧,明白了。當存在子類別時,查詢返回預期的結果,但當它爲空(我的原始問題)時,返回的結果爲空。從我在其他地方看到的,當比較null = null時,Access失敗。 – gr8dane

+0

這只是讓我意識到,當cboSubCategory爲空(或「」)時,它實際上跳過了「ElseIf ...」並轉到了「Else ...」,這正是我試圖避免的。我究竟做錯了什麼? – gr8dane

回答

0

您的問題是,您已指定子類別和子窗體之間的鏈接。如果沒有子類別,則無論類別如何,均不存在鏈接。

您需要爲您的子表單創建一個查詢,該查詢將根據類別和子類別返回記錄,但不依賴於提供的子類別。然後,您可以使用類似這樣的方式設置子窗體的記錄源;

Dim sql As String 

sql = "SELECT tblItems.id, tblItems.description, tblItems.category, tblItems.sub_category " 
sql = sql & "FROM tblItems " 
If cboSubCategory.Value = "" Then 
    sql = sql & "WHERE (category = cboCategory.Value) " 
Else 
    sql = sql & "WHERE (category = cboCategory.Value) AND (sub_category = cboSubCategory.Value)" 
End If 
sql = sql & "ORDER BY [description];" 

sbfExistingItems.Form.RecordSource = sql 
+0

我已經嘗試過,但沒有奏效。你是說我應該刪除主窗體和子窗體之間的鏈接嗎? – gr8dane

+0

通過直接關聯子表單,您無法按照自己想要的方式控制情況。我建議的方法可以工作,但您需要添加一些代碼以使其以您需要的方式工作 - 該示例只是一個粗略的概述。 – jhTuppeny

+0

我嘗試刪除主/子鏈接並將您的建議代碼放入txtDescription的GotFocus事件中,但我使用IsNull而不是=「」。但那也行不通。事實上,Access似乎並不喜歡沒有鏈接的字段,有時會重置它們,將id鏈接到id,這不是我想要的。 – gr8dane