使用 MS Access,我有一個名為“Locations”的表和一個名為“Routes”的表。我想創建一個表單,基本上將路由表呈現給用戶(即選擇“from”并選擇“to”),并將根據用戶為“from”位置選擇的內容過濾“to”位置,即級聯組合框。完成表單后,相應的“Route.ID”將存盤在結果表中。
位置有以下列 -
| ID | 姓名 | 筆記 |
|---|---|---|
| 1 | 倫敦 | 大不列顛 |
| 2 | 曼徹斯特 | 大不列顛 |
| 3 | 阿拉巴馬州 | 美國 |
路線有以下列 -
| ID | 從_LID | To_LID | 知識管理 | 筆記 |
|---|---|---|---|---|
| 1 | 1 | 2 | 450 | 使用M1路線 |
| 2 | 2 | 1 | 450 | 使用M1路線 |
| 3 | 1 | 2 | 485 | 使用內部路由 |
| 4 | 2 | 1 | 485 | 使用內部路由 |
| 5 | 1 | 3 | 5450 | 考慮太遠 |
| 6 | 3 | 1 | 5450 | 考慮太遠 |
我想創建一個帶有級聯組合框的表單 - “ComboFrom”、“ComboTo”。其中“ComboFrom”將在表中搜索不同 ID 的串列,并使用 JOIN 與 Locations 表,我可以顯示位置名稱。“ComboTo”取決于“ComboFrom”中的 ID 值,因此只會回傳與路由表的 From_LocationID 匹配的位置串列。
我或多或少地完成了第一部分。ComboFrom 有以下查詢:
SELECT DISTINCT Location.Location_ID, Location.[Location Name], Location.Description
FROM Location INNER JOIN Route ON Location.Location_ID = Route.From_LID
ORDER BY Location.[Location Name];
ComboTo 有以下查詢:
SELECT Location.Location_ID, Location.[Location Name], Location.Description, Route.From_LID
FROM Location INNER JOIN Route ON Location.Location_ID = Route.To_LID
WHERE (((Route.From_LID)=[Forms]![fmrRoute1]![From_LID]))
ORDER BY Location.[Location Name];
ComboTo 欄位中“Where”子句中的這段代碼基本上是從 ComboFrom 中獲取 ID 的輸入,并從對應的 To_LID 串列中輸出正確的 ID。然后我針對 ComboFrom 的更新事件添加 vba 以重新查詢 ComboTo 欄位。
我無法弄清楚如何才能正確顯示相應的路線 ID。即,如果我為 ComboFrom 選擇“1”,為 ComboTo 選擇“3”,則路由 ID 應顯示為“5”而不是“7”(其中“7”是路由表中的新記錄)。我是否必須有單獨的查詢來搜索 ComboFrom 和 ComboTo 并回傳結果路由 ID?如果是這樣,我該如何執行此操作并將其附加到表單中的欄位,該表單將在每次 ComboFrom 和 ComboTo 欄位更改時自動更新?
有沒有更好的方法來做我想做的事情?
在此先感謝您的幫助!
uj5u.com熱心網友回復:
這看起來像級聯組合框從這兩個未系結的組合框過濾表單。你可以谷歌這兩個想法。
self join 使這變得棘手。關鍵是忽略了 Location.ID 和 From_LID 之間的關系。該關系在資料庫中,但在查詢中被忽略(洗掉)。

這為我們提供了第二個組合框記錄源所需的 sql。
SELECT Routes.From_LID, Routes.To_LID, First(Locations.LocationName) AS FirstOfLocationName
FROM Locations INNER JOIN Routes ON Locations.ID = Routes.To_LID
GROUP BY Routes.From_LID, Routes.To_LID
HAVING (((Routes.From_LID)=2))
ORDER BY First(Locations.LocationName)
'just need to replace the 2
Private Sub cmbFrom_AfterUpdate()
'cascade combobox
Dim strRowSource As String
strRowSource = "SELECT Routes.From_LID, Routes.To_LID, First(Locations.LocationName) AS FirstOfLocationName" & _
" FROM Locations INNER JOIN Routes ON Locations.ID = Routes.To_LID " & _
"GROUP BY Routes.From_LID, Routes.To_LID " & _
"HAVING (((Routes.From_LID) = " & Me.cmbFrom & "))" & _
"ORDER BY First(Locations.LocationName)"
Debug.Print strRowSource
Me.cmbTo.RowSource = strRowSource
Me.cmbTo.Visible = True
'a look and feel choice
End Sub
[![enter image description here][2]][2]
Private Sub cmbTo_AfterUpdate()
'filter form 'most of the time you want to create a search form where you filter to the records you want
Me.Filter = "From_LID = " & Me.cmbFrom & " AND To_LID = " & Me.cmbTo
Me.FilterOn = True
Me.Detail.Visible = True
End Sub


轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371216.html
