Trzy kaskadowe pola kombi oparte na kwerendach.
Utwórzmy formularz frmCombo_Kwerendy na którym umieścimy trzy niezwiązane pola kombi o nazwach cboWojewodztwo, cboPowiat, cboGminy oraz trzy opisowe etykiety lblWojewodztwo, lblPowiat, lblGminy, które będą zawierały dane dotyczące aktualnie wybranego wiersza z odpowiadających im pól kombi.
Pole kombi cboWojewodztwo.
- Dwukolumnowe pole kombi którego właściwość
RowSource (ŹródłoWierszy)ustawiona jest na kwerendą źródłową qryWojewodztwa. - • Pierwsza ukryta kolumna jest kolumną związaną. Zawiera identyfikator województwa ID_Woj
- • Druga widoczna kolumna zawiera nazwę województwa tWojewodztwo

Arkusz właściwości pola kombi cboWojewodztwa i projekt źródłowej kwerendy qryWojewodztwa
Pole kombi cboPowiaty.
- Trzykolumnowe pole kombi którego właściwość
RowSource (ŹródłoWierszy)ustawiona jest na kwerendą źródłową qryPowiaty. - • Pierwsza ukryta kolumna jest kolumną związaną. Zawiera identyfikator powiatu ID_Pow
- • Druga widoczna kolumna zawiera nazwę Powiatu tPowiat
- • Trzecia widoczna kolumna zawiera dodatkową nazwę opisową powiatu tNazwa_Dod
Kwerenda qryPowiaty pobiera dane do kryterium wyboru wierszy z kolumny związanej ID_Woj pola kombi cboWojewodztwo przechowującej identyfikator województwa.
WHERE Powiaty.Id_Woj=[Forms]![frmCombo_Kwerendy]![cboWojewodztwo]

Arkusz właściwości pola kombi cboPowiaty

Projekt źródłowej kwerendy qryPowiaty
Pole kombi cboGminy.
- Trzykolumnowe pole kombi oparte o kwerendą źródłową qryPowiaty.
- • Pierwsza ukryta kolumna jest kolumną związaną. Zawiera identyfikator powiatu ID_Pow
- • Druga widoczna kolumna zawiera nazwę Powiatu tPowiat
- • Trzecia widoczna kolumna zawiera dodatkową nazwę opisową powiatu tNazwa_Dod
Trzykolumnowe pole kombi którego właściwość RowSource (ŹródłoWierszy) ustawiona jest na kwerendą źródłową qryGminy,
z ukrytą pierwszą kolumną. Kwerenda qryGminy pobiera dane do kryterium wyboru wierszy:
WHERE Gminy.Id_Pow=[Forms]![frmCombo_Kwerendy]![cboPowiat]
z ukrytej kolumny związanej pola kombi cboPowiaty przechowującej identyfikator powiatu ID_Pow.

Arkusz właściwości pola kombi cboGminy

Projekt źródłowej kwerendy qryGminy
Procedury zdarzeń pól kombi.
Private Sub PoleKombi_Enter()
Zdarzenie Enter występuje zanim formant faktycznie otrzymuje fokus od innego formantu (przed zdarzeniem GotFocus) na tym samym formularzu.
Zdarzenie Enter występuje tylko dla formantów na formularzu, a nie dla formantów raportu.

Widok formularza frmCombo_Kwerendy
Ponieważ pola kombi są ze sobą powiązane tzn. źródło listy pola kombi zależy od wartości poprzedniego w hierarchii pola kombi, powinniśmy uniemożliwić edycję pola kombi, które ma otrzymać fokus, jeżeli wcześniejsze pole jest puste. Przykładowo: jeżeli pole kombi cboWojewództwo jest niewypełnione, edycja pól kombi cboPowiaty i cboGminy nie powinna być możliwa. Przy próbie wejścia (edycji) jednego z tych pól kombi fokus powinien zostać przeniesiony na puste pole kombi. W tym celu skorzystamy ze zdarzenia pól kombi Enter i właściwości OnEnter (PrzyWejściu) której przypiszemy wartość [Event Procedure] ([Procedura zdarzenia]), a w edytorze VBA wprowadzimy odpowiedni kod źródłowy procedury przekierowujący fokus do pustego pola kombi.
Private Sub cboPowiat_Enter() ' jeżeli pole kombi cboWojewództwo jest puste ' ustaw na nim fokus i rozwiń listę With Me.cboWojewodztwo If Len(Nz(.Value, "")) = 0 Then .SetFocus .Dropdown End If End With End Sub Private Sub cboGmina_Enter() ' jeżeli pole kombi cboWojewództwo jest puste ' ustaw na nim fokus, rozwiń listę i wyjdź With Me.cboWojewodztwo If Len(Nz(.Value, "")) = 0 Then .SetFocus .Dropdown Exit Sub End If End With ' jeżeli pole kombi cboPowiat jest puste ' ustaw na nim fokus i rozwiń listę With Me.cboPowiat If Len(Nz(.Value, "")) = 0 Then .SetFocus .Dropdown End If End With End Sub
Private Sub PoleKombi_AfterUpdate()
Zdarzenie AfterUpdate występuje po zmianie danych w formancie lub po aktualizacji rekordu. Aby po aktualizacji pierwszego pola kombi cboWojewództwa, ograniczyć możliwości wyboru w drugim polu kombi cboPowiaty tylko do powiatów należących do wybranego Województwa, a po aktualizacji drugiego pola kombi cboPowiaty, ograniczyć listę pozycji w trzecim polu kombi cboGminy do Gmin należących do wybranego Powiatu, skorzystamy ze zdarzenia pól kombi AfterUpdate i właściwości AfterUpdate (PoAktualizacji). Właściwości tej przypiszemy wartość [Event Procedure] ([Procedura zdarzenia]), a w edytorze VBA wprowadzimy odpowiedni kod źródłowy procedury.
Ponieważ kwerenda qryPowiaty będąca Źródłem Wierszy (RowSource) pola kombi cboPowiaty pobiera dane
do kryterium wyboru wierszy z ukrytej kolumny związanej ID_Woj pola kombi cboWojewodztwo przechowującej identyfikator województwa,
a kwerenda qryGminy będąca Źródłem Wierszy (RowSource) pola kombi cboGminy pobiera dane do kryterium wyboru wierszy
z ukrytej kolumny związanej pola kombi cboPowiaty przechowującej identyfikator powiatu ID_Pow, to w procedurach
Private Sub PoleKombi_AfterUpdate() wystarczy wykorzystać metodę Requery aktualizującą dane określonego pola kombi,
przez ponowienie kwerendy źródła danych dla pola kombi. W procedurach tych wykorzystamy dane zawarte w kolumnach poszczególnych pól kombi
by zaktualizować opisowe etykiety lblWojewodztwo, lblPowiat, lblGminy, o dane dotyczące aktualnie wybranego wiersza z odpowiadających im pól kombi.
Private Sub cboWojewodztwo_AfterUpdate()
' aktualizuj etykietę Województwo
With Me.cboWojewodztwo
If Len(Nz(.Value, "")) = 0 Then
Me.lblWojewodztwo.Caption = "Województwo"
Else
' aktualizuj etykietę Województwo
Me.lblWojewodztwo.Caption = "(" & .Column(0) & ") " & .Column(1)
' odśwież źródło wierszy pola kombi cboPowiat
Me.cboPowiat.Requery
End If
End With
' ustaw domyślne wartości etykiet
Me.lblPowiat.Caption = "Powiat"
Me.lblGmina.Caption = "Gmina"
' wyczyść pola kombi cboPowiat i cboGmina
Me.cboPowiat = ""
Me.cboGmina = ""
End Sub
Private Sub cboPowiat_AfterUpdate()
' aktualizuj etykietę Powiat
With Me.cboPowiat
' aktualizuj etykietę Powiat
If Len(Nz(.Value, "")) = 0 Then
Me.lblPowiat.Caption = "Powiat"
Else
Me.lblPowiat.Caption = "(" & .Column(0) & ") " & _
.Column(1) & " (" & .Column(2) & ")"
' odśwież źródło wierszy pola kombi cboGmina
Me.cboGmina.Requery
End If
End With
' ustaw domyślną wartość etykiety Gmina
Me.lblGmina.Caption = "Gmina"
' wyczyść pole kombi cboGmina
Me.cboGmina = ""
End Sub
Private Sub cboGmina_AfterUpdate()
' aktualizuj etykietę Gmina
With Me.cboGmina
If Len(Nz(.Value, "")) = 0 Then
Me.lblGmina.Caption = "Gmina"
Else
Me.lblGmina.Caption = "(" & .Column(0) & ") " & _
.Column(1) & " (" & .Column(2) & ")"
End If
End With
End Sub

Hierarchiczne pola kombi oparte na kwerendach
Trzy kaskadowe pola kombi oparte na instrukcjach SQL.
Jeżeli nie chcemy tworzyć kwerend i odwoływać się w tych kwerendach do pól kombi w formularzu roboczym, możemy stworzyć
dynamiczne, 3 poziomowe, rozwijane powiązane listy kombi, których źródłem wierszy będą instrukcje SQL
z dostosowanym warunkiem WHERE do wybranej wartości w polu kombi będącego w hierarchii o jeden stopień wyżej.
Poniżej przykład przedstawiający zmianę właściwość RowSource (ŹródłoWierszy)
pola kombi cboPowiat po aktualizacji pola kombi cboWojewództwa.
Me.cboPowiat.RowSource = & _
"SELECT ID_Pow, tPowiat, tNazwa_Dod FROM Powiaty" & _
" WHERE [Id_Woj] = " & "'" & Me.cboWojewodztwo.Column(0) & "'" & _
" ORDER BY ID_Pow;"
Procedury zdarzeń pól kombi.
Private Sub PoleKombi_Enter()
Procedury zdarzeń OnEnter pozostają takie same jak w opisywanym powyżej przykładzie Trzy kaskadowe pola kombi oparte na kwerendach
Private Sub PoleKombi_AfterUpdate()
Poniżej przedstawiam zmienione procedury zdarzeń AfterUpdate pól kombi opartych na instrukcjach SQL.
Źródłem wierszy poszczególnych pól kombi są instrukcje SQL
z dostosowanym warunkiem WHERE do wybranej wartości w polu kombi będącego w hierarchii o jeden stopień wyżej.
Private Sub cboWojewodztwo_AfterUpdate()
Dim sRowSource As String
' po aktualizacji ustaw źródło pola kombi cboPowiat
With Me.cboWojewodztwo
sRowSource = "SELECT ID_Pow, tPowiat, tNazwa_Dod FROM Powiaty" & _
" WHERE [Id_Woj] = " & "'" & .Column(0) & "'" & _
" ORDER BY ID_Pow;"
'
Me.cboPowiat.RowSource = sRowSource
' aktualizuj etykietę Województwo
If Len(Nz(.Value, "")) = 0 Then
Me.lblWojewodztwo.Caption = "Województwo"
Else
Me.lblWojewodztwo.Caption = "(" & .Column(0) & ") " & .Column(1)
End If
End With
' ustaw domyślne wartości etykiet
Me.lblPowiat.Caption = "Powiat"
Me.lblGmina.Caption = "Gmina"
' wyczyść pola kombi cboPowiaty i cboGmina
Me.cboPowiat = ""
Me.cboGmina = ""
End Sub
Private Sub cboPowiat_AfterUpdate()
Dim sRowSource As String
' po aktualizacji ustaw źródło pola kombi cboGmina
With Me.cboPowiat
sRowSource = "SELECT ID_Gmi, tNazwa, tNazwa_Dod FROM Gminy" & _
" WHERE ([Id_Pow] = " & "'" & .Column(0) & "')" & _
" AND (CLng(Right([ID_Gmi],1)) < CLng('4'))" & _
" ORDER BY Gminy.tNazwa;"
Me.cboGmina.RowSource = sRowSource
' aktualizuj etykietę Powiat
If Len(Nz(.Value, "")) = 0 Then
Me.lblPowiat.Caption = "Powiat"
Else
Me.lblPowiat.Caption = "(" & .Column(0) & ") " & _
.Column(1) & " (" & .Column(2) & ")"
End If
End With
' ustaw domyślną wartości etykiety Gmina
Me.lblGmina.Caption = "Gmina"
' wyczyść pole kombi cboGmina
Me.cboGmina = ""
End Sub
Private Sub cboGmina_AfterUpdate()
' aktualizuj etykietę Gmina
With Me.cboGmina
If Len(Nz(.Value, "")) = 0 Then
Me.lblGmina.Caption = "Gmina"
Else
Me.lblGmina.Caption = "(" & .Column(0) & ") " & _
.Column(1) & " (" & .Column(2) & ")"
End If
End With
End Sub

Hierarchiczne pola kombi oparte na instrukcjach SQL
Pięciopoziomowe pole kombi w widoku TreeView
Bardziej rozbudowany przykład pole kombi w widoku TreeView (z pięciom poziomami zagłębienia)

Rozbudowane pole kombi w widoku TrreView
znajduje się na stronie www.gps.accdb.pl w przykładowej bazie Zapis danych Rejestru TERYT do tabel MS Access

Do pobrania:
•