2017-04-19 58 views
0

我有一個SQL Server的Access客戶端,它使用帶有多個子窗體的選項卡式窗體。基本上,在主窗體上選擇了一個產品,然後該標籤可以訪問編輯/插入存儲在不同相關表中的產品的不同屬性(選項,顏色,styes等)。每個子表單使用它自己的記錄源,但是會同步到產品編號上的主窗體。MS Access選項卡式多個OnCurrent發射

所以,我有一個子窗體中的組合框,將其稱爲「選項」,我想填充來自使用「where」子句中的產品編號的查詢的數據。這就是我需要做的。我如何做到這一點是使用Options子窗體的OnCurrent事件來設置RowSource等於一個SQL字符串。這很有效,但是... OnCurrent事件每次在主窗體中選擇新產品時觸發,無論Options子窗體表單是否具有焦點。然後,當選項獲得焦點時,它再次啓動。然後,由於選項使用數據表佈局,因此即使記錄源不需要更改,它也會觸發所選的每個記錄。

雖然這可以工作,但是很多不必要的數據被來回發送到(非常)遠程的SQL Server。那麼,是否有另一個事件可以用於整個子表單,理想情況下只是觸發一次,而不是子表單中的每條記錄?我嘗試了焦點,但從未解僱。當選擇新產品時(當然),Open和Load事件不會觸發。或者,也許有另一個地方,我應該設置選項子表單記錄源?

這裏的事件代碼:

Private Sub Form_Current() 
    Dim sql As String 
    sql = "SELECT O.[OptionID], O.[Caption] FROM ProductOptions AS O WHERE o.[OptionTypeID] in (1,2,8,9) AND o.ProductNumber = " 
    sql = sql & "'" & Nz(Forms![products main form]!ProductNumber, "99test") & "'" 
    oidSelect1.RowSource = sql 
End Sub 

感謝您的幫助。

吉姆

+0

因此,您正在設置組合框的RowSource而非敘述中所述的RecordSource?爲什麼使用代碼來設置組合框的RowSource?爲什麼不在RowSource屬性中使用SQL語句,然後在組合框GotFocus事件中執行代碼就會執行RowSource的Requery? – June7

+0

嗯,過濾器(where子句)必須動態設置,因爲它對於當前正在編輯的每個產品都會發生變化。並且不會使用GotFocus作爲組合框重新選擇的每個記錄? (這是一個網格視圖,所以組合框在每一行都被複制。) – user3091705

+0

組合框RowSource SQL語句WHERE子句將引用ProductNumber,因此它將是動態的。 Seth的回答是沿着這些線,除了我會使用組合框GotFocus事件觸發重新查詢。他確實對主要形式的依賴很好。通常,主要和從屬組合框的形式相同。另外,帶有查詢顯示別名值的組合框在連續數據表或數據表格中不起作用。 – June7

回答

0

我相信這樣做的正確方法是不能動態地改變組合框的行來源。相反,使用查詢設計器將rowsource設置爲查詢,並使查詢從「主窗體」中讀取值,就像示例代碼中所示... Forms![產品主窗體]!ProductNumber。

然後,我會使用MAIN FORMs AfterUpdate事件觸發刷新組合框。它會像MainForm!MySubForm.Form(「mycombobox」).requery。 (我可能沒有完全正確的語法...我的訪問語法是生鏽的。)

順便說一句,我不喜歡我自己的答案。原因在於您正在對子窗體和其父窗體之間的依賴關係進行硬編碼。如果你永遠不會在其他任何地方使用該子表單,這可能會很好。爲了解決這個問題,一些Access開發人員使用一個隱藏窗體,該窗體具有從主窗體的更新事件後設置的文本框。然後,查詢更新爲引用您爲此表單創建的隱藏窗體的文本框。

還有其他方法可以做到這一點(例如公共功能)。但是,對不起,這不是你要求的。我的第一種方法將工作。但是,第一次需要重新使用該子表單時,您需要重構,隱藏表單解決方案運行良好。