Access
 sql >> Baza danych >  >> RDS >> Access

Tworzenie menu dostępu z kontrolą widoku drzewa

Menu projektu Microsoft Access po zakończeniu pracy z Kontrolką widoku drzewa będzie wyglądało jak obrazek przedstawiony poniżej.

Obraz powyżej przedstawia trzecią opcję grupy raportów Raport niestandardowy jest zaznaczona i podświetlona, ​​z otwartym formularzem parametrów filtru raportu, zachodzącym na ekran menu, do wprowadzenia przez użytkownika.

Zanim do tego przejdziemy, w lekcji z zeszłego tygodnia nauczyliśmy się organizować powiązane elementy w kolejności hierarchicznej za pomocą kontrolki widoku drzewa Microsoft na podstawie Próbki Tabela danych.

W zeszłym tygodniu zwróciłem uwagę, że powiązane elementy w danych kontrolki Tree View niekoniecznie muszą znajdować się obok siebie. Po tym stanie się bardziej jasne, jak zaktualizować Względne Klucze węzłów podrzędnych, niezależnie od ich fizycznej pozycji rekordów w tabeli, ale na podstawie relacji z identyfikatorami węzłów nadrzędnych.

To była tabela danych, z której korzystaliśmy i którą zakończyliśmy ćwiczeniem z zeszłego tygodnia:

Czy możesz dodać następującą listę elementów na końcu powyższej tabeli i zaktualizować ich wartości pól ParentID, tak aby wyświetlacz TreeView wyglądał jak przykładowy obraz podany poniżej:

Nowe rekordy dla Tabeli pole związane z rekordem pozycji :

  1. Pole tekstowe.
  2. Pole liczbowe.
  3. Pole daty/godziny.
  4. Pole hiperłącza.

Formularz powiązane Sterowanie:

  1. Pole tekstowe.
  2. Przyciski poleceń.
  3. Pole kombi.
  4. Pole listy.

Zgłoś powiązane Sterowanie:

  1. Pole tekstowe.
  2. Etykieta.
  3. Wykres graficzny.

Przypisz wartości ParentID do tych elementów, aby widok drzewa wyglądał jak następujący obraz:

Teraz przystąpimy do tworzenia menu projektu MS-Access i dowiemy się, co jest potrzebne do jego utworzenia. Poniżej znajduje się prosty obraz menu:


Jest to proste menu z tylko trzema grupami opcji:Formularze, Widoki raportów i Makra.

W Formularzach Podane są dwie opcje grupy, pierwsza z nich wyświetla rekord tabeli menu kontroli drzewa. Druga opcja wyświetla te same rekordy w trybie ciągłym.

Pierwsza opcja w sekcji Widok raportu wyświetla raport o produktach Kategoria rekordy, z tabeli kategorii NorthWind.accdb baza danych.

druga opcja wyświetla raport listy produktów.

Trzeci opcja otwiera Parametr Formularz, aby Użytkownik mógł ustawić Min imum i Maks maksymalny zakres wartości Lista-Cena, aby filtrować dane w raporcie Lista-Cena produktów.

W ramach Procesów makr Grupuj, obie opcje uruchamiają Makro1 i Makro2 odpowiednio i wyświetlaj różne komunikaty.

Potrzebujemy tabeli menu z powyższymi rekordami opcji z kilkoma dodatkowymi polami, oprócz zwykłych pól danych TreeView, unikalnych identyfikatorów, opisu i pól danych ParentID. Obraz tabeli menu znajduje się poniżej:

Utwórz tabelę o powyższej strukturze, dodaj powyższe rekordy i zapisz ją pod nazwą Menu . Identyfikator pole to Autonumerowanie, PID, i Typ pola to pola numeryczne, inne to pola tekstowe.

Znamy pierwsze trzy pola danych:unikalny identyfikator , Opis, i Identyfikator rodzica Pola. Tutaj skróciłem nazwę pola ParentID do PID .

Potrzebujemy jeszcze czterech pól w tabeli menu, jednego pola Typ dla typu obiektu Kod i trzy pola Formularz , Zgłoś, i makro .

Typ Pole zawiera kody numeryczne typu obiektu dostępu, aby zidentyfikować opcję, na którą kliknął użytkownik.

  • Pole formularza jest przeznaczone na Nazwy formularzy, Kod typu obiektu 1,
  • Pole raportu zawiera Nazwy raportów, Kod typu obiektu 2,
  • Pole makr jest przeznaczone dla nazw makr, kod typu obiektu 3.

Uwaga: Wszystkie nazwy obiektów można umieścić w jednej kolumnie. Wykorzystaliśmy osobne pola tylko dla jasności. Jeśli to zrobisz, wprowadź zmiany w kodzie VBA, gdziekolwiek odwołuje się on do różnych nazw pól.

Na podstawie numerów kodów możemy pobrać nazwy obiektów z odpowiednich pól i wywołać DoCmd.Openform lub Docmd.OpenReport lub Docmd.RunMacro aby wykonać akcję na kliknięciach podrzędnych węzłów.

Teraz musimy przechowywać kod typu i nazwę obiektu w węzłach podrzędnych. Zajmiemy się tym tematem, gdy zaczniemy dodawać węzły do ​​kontrolki widoku drzewa.

Potrzebujemy jeszcze dwóch tabel danych dla przykładowych formularzy i raportów. Kategorie Tabela i Produkty Tabele z NorthWind.accdb przykładowa baza danych. Aby zaoszczędzić Twój czas, załączyłem Demo Bazy Danych ze wszystkimi obiektami i programami na końcu tej strony, aby je pobrać i wypróbować.

Utwórz dwa formularze za pomocą tabeli menu o nazwach Wprowadzanie danych i inny formularz Widok danych w sposób ciągły Tryb formularza.

Utwórz dwa raporty, jeden w tabeli kategorii o nazwie raportu:Kategorie, kolejny raport dotyczący tabeli produktów o nazwie Lista produktów . Dodaj długą etykietę kontrolkę pod głównym nagłówkiem w raporcie Lista produktów i zmień wartość właściwości nazwy na Zakres .

Utwórz mały formularz z dwoma niepowiązanymi polami tekstowymi i zmień ich nazwę Wartość właściwości na Min &Maks, jak projekt podany poniżej:

Dodaj dwa przyciski poleceń, jak pokazano powyżej. Zmień Podpis Wartość właściwości pierwszego przycisku do otwarcia raportu t i Nazwa Wartość właściwości do cmdReport .

Zmień podpis drugiego przycisku polecenia na Anuluj i Nazwa Wartość właściwości do cmdCancel .

Wyświetl moduł kodu formularza. Skopiuj i wklej następujący kod do modułu formularzy i zapisz formularz:

Private Sub cmdOpen_Click()
Dim mn, mx, fltr As String
mn = Nz(Me![Min], 0)
mx = Nz(Me![Max], 9999)
If (mn + mx) > 0 Then
    fltr = "[List Price] > " & mn & " And " & "[List Price] <= " & mx
    DoCmd.OpenReport "Products Listing", acViewReport, , fltr, , fltr
Else
    DoCmd.OpenReport "Products Listing", acViewReport
End If

End Sub

Private Sub cmdCancel_Click()
DoCmd.Close
End Sub

Gdy Użytkownik ustawia zakres wartości, wprowadzając zakres minimalnej i maksymalnej ceny katalogowej w odpowiednich polach tekstowych, tworzony jest ciąg kryteriów filtru raportu. Filtr raportów Wartość ciągu jest przekazywana do Listy produktów Raportuj jako polecenie Otwórz raport Parametr. Wartość Filter String jest również przekazywana jako OpenArgs (Otwarty argument) Parametr.

Parametr Filtr filtruje dane raportu na podstawie kryteriów określonych w polach Min. i Maks., a wartość otwartego argumentu jest kopiowana do Zakresu Oznacz podpis, gdy raport jest otwarty.

Skopiuj i wklej następujący kod do Listy produktów Moduł VBA raportu:

Private Sub Report_Open(Cancel As Integer)
    DoCmd.Close acForm, "Parameter"
    Me.Range.Caption = Nz(Me.OpenArgs, "")
End Sub
  1. Utwórz nowy formularz o nazwie frmMenu, i dodaj Kontrolkę Microsoft TreeView z listy kontrolki Activex. Zmień rozmiar kontrolki, jak pokazano w widoku projektu poniżej:

  2. Zmień nazwę kontrolki widoku drzewa na TreeView0 w normalnym arkuszu właściwości.

  3. Dodaj przycisk polecenia poniżej kontrolki widoku drzewa. Zmień jego Nazwę Wartość właściwości do cmdExit i Podpis Wartość właściwości do wyjścia .

  4. Kliknij prawym przyciskiem myszy Kontrolkę widoku drzewa i podświetl TreeCtrl_Object opcję i wybierz Właściwości aby wyświetlić arkusz właściwości.

  5. Zmień następujące wartości właściwości, jak podano poniżej:

  • Styl =7 (tvwTreeLinesPlusMinusPictureText)
  • Styl linii =1 (tvwRootLines)
  • LabelEdit =1 (tvwManual)

W zeszłym tygodniu zmieniliśmy dwie pierwsze wartości właściwości. Gdy LabelEdit Domyślna wartość usługi to 0 - tvwAutomatic, Dwukrotne kliknięcie węzła (nie dwukrotne kliknięcie) spowoduje przejście tekstu węzła do trybu edycji i można zmienić tekst. Ale nie zaktualizuje bezpośrednio pola źródła danych. Zmieniając go na 1 – tvwManual uniemożliwi przejście w tryb edycji.

Możemy to zmienić za pomocą kodu, dodając następujące wiersze w procedurze zdarzenia Form_Load():

With Me.TreeView0.Object
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines	
    .LabelEdit = tvwManual
End With

W zeszłym tygodniu użyliśmy Form_Load() Zdarzenie Procedura odczytu wartości węzłów widoku drzewa w celu utworzenia węzłów poziomu głównego i węzłów podrzędnych. Potrzebujemy tej samej procedury tutaj również z kilkoma linijkami dodatkowego kodu.

Poza tym musimy uwięzić Node_Click() Zdarzenie węzłów, aby sprawdzić, którą opcję wybrał użytkownik.

Skopiuj i wklej następujący kod VBA do modułu formularza i zapisz formularz.

Option Compare Database Option Explicit Dim tv As MSComctlLib.TreeView Const KeyPrfx As String = "X" Private Sub Form_Load() Dim db As Database Dim rst As Recordset Dim nodKey As String Dim PKey As String Dim strText As String Dim strSQL As String Dim tmpNod As MSComctlLib.Node Dim Typ As Variant Set tv = Me.TreeView0.Object tv.Nodes.Clear

‘Change the TreeView Control Properties

With tv
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines
    .LabelEdit = tvwManual
    .Font.Name = "Verdana"
End With

strSQL = "SELECT ID, Desc, PID, Type,Macro,Form,Report FROM Menu;" Set db = CurrentDb Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) Do While Not rst.EOF And Not rst.BOF If Nz(rst!PID, "") = "" Then nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(, , nodKey, strText) 'Root-Level Node Description in Bold letters With tmpNod .Bold = True End With Else PKey = KeyPrfx & CStr(rst!PID) nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(PKey, tvwChild, nodKey, strText) 'Check for the presense of Type Code If Nz(rst!Type, 0) > 0 Then Typ = rst!Type Select Case Typ Case 1 'save type Code & Form Name in Node Tag Property tmpNod.Tag = Typ & rst!Form Case 2 'save type Code & Report Name in Node Tag Property tmpNod.Tag = Typ & rst!Report Case 3 'save type Code & Macro Name in Node Tag Property tmpNod.Tag = Typ & rst!Macro End Select End If End If rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub Private Sub cmdExit_Click() If MsgBox("Close Menu Form? ", vbYesNo, "cmdExit_Click()") = vbYes Then DoCmd.Close End If End Sub Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If

‘Reset the earlier lighlight to normal

For Each nodOn In tv.Nodes
    nodOn.BackColor = vbWhite
    nodOn.ForeColor = vbBlack
Next

‘changes BackColor to light Blue and ForeColor White

tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255)
tv.Nodes.Item(Node.Key).ForeColor = vbWhite

‘—Highlight code ends-

varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub

W obszarze deklaracji globalnej modułu zadeklarowany jest obiekt widoku drzewa. Zmienna stała KeyPrfx jest zadeklarowana z wartością „X”.

Form_Load() Procedurę wydarzenia z artykułu z zeszłego tygodnia zmodyfikowaliśmy dodatkowym Kodeksem. Skomentowałem nowy segment kodu, aby wskazać, co robi, ale wyjaśnię, co robi.

Procedura deklaruje bazę danych, zestaw rekordów i cztery zmienne łańcuchowe. Następne dwie linie deklarują tymczasowy obiekt węzła:tmpNod i Wpisz Zmienne wariantów są deklarowane.

Następnie obiekt TreeView telewizor jest przypisany do TreeView0 Obiekt w formularzu. Istniejące węzły TreeView0, jeśli istnieją, są usuwane za pomocą instrukcji:tv.Nodes.Clear , przygotowując się do ponownego załadowania wszystkich węzłów.

Wdrożyliśmy następujący kod, aby zmodyfikować właściwości kontrolki widoku drzewa za pomocą kodu, a nie za pomocą arkusza właściwości.

With tv
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines
    .LabelEdit = tvwManual
    .Font.Name = "Verdana"
End With 

Czcionka widoku drzewa została zmieniona na Verdana. Poza tym wprowadzimy więcej funkcji, takich jak rozwijanie lub zwijanie wszystkich grup menu jednym kliknięciem, zamiast ręcznego rozwijania lub zwijania jednej grupy po drugiej.

Nowy ciąg SQL został zmodyfikowany w celu dodania nowego typu pól, formularzy, raportów i pól makr z tabeli menu.

Pierwszy rekord tabeli menu jest sprawdzany pod kątem obecności jakiejkolwiek wartości w PID pole, jeśli jest puste, jest to rekord węzła głównego. Jest dodawany do obiektu widoku drzewa jako węzeł na poziomie głównym, a jego odniesienie jest zapisywane w tmpNod Obiekt.

Węzeł ma kilka właściwości, takich jak Precolor, Bold, i kilka innych z tego wzięliśmy Pogrubienie Własność i przypisana Prawda aby utworzyć poziom główny Węzeł wygląda inaczej niż jego węzły podrzędne.

Jeśli nie jest to wpis węzła głównego, to ma wartość PID, program przyjmuje Inne klauzula i rekord zostanie dodany jako węzeł podrzędny. Tutaj sprawdzamy Typ wartość pola. Jeśli zawiera jedną z trzech wartości 1, 2, lub 3 następnie musimy pobrać wartość z nazwy formularza, raportu lub makra wraz z kodem typu i połączyć je razem (np. ”1Wprowadzanie danych” , „Lista 2 kategorii” itp.) i zapisz go w tagu Własność węzłów podrzędnych. Znamy właściwość tagu w kontrolkach dostępu, takich jak pola tekstowe, etykiety, przyciski poleceń i inne, ale rzadko jej używamy.

cmdExit_Click() Procedura zamyka formularz menu, jeśli odpowiedź użytkownika jest pozytywna.

Gdy użytkownik kliknie węzeł podrzędny, wartość, którą zapisaliśmy w jego tagu Właściwość musi zostać wyodrębniona i sprawdzona, aby ustalić, co dalej. W tym celu potrzebujemy TreeView0_NodeClick() Procedura zdarzenia.

Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If

‘Reset the earlier lighlight to normal

For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn

‘changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends- varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub

Procedura zdarzenia Click() odbiera kliknięty Odniesienie do węzła jako parametr w obiekcie Węzeł . Na początku tej procedury zadeklarowaliśmy kilka Zmiennych.

Kilka następnych wierszy sprawdza, czy kliknięty węzeł jest w stanie rozwiniętym czy zwiniętym.

Zwykle, aby rozwinąć węzeł, aby pokazać jego ukryte węzły podrzędne, albo klikamy + (symbol plusa) po lewej stronie węzła lub kliknij dwukrotnie sam węzeł. Ponowne dwukrotne kliknięcie węzła lub kliknięcie – (symbol minusa) spowoduje ukrycie węzłów podrzędnych.

Za pomocą następującego segmentu kodu możemy rozwijać lub zwijać węzły potomne za pomocą jednego kliknięcia:

If Node.Expanded = False Then
    Node.Expanded = True
Else
    Node.Expanded = False
End If 

Następne sześć linii wykonywalnych zapewnia, że ​​węzeł otrzymał kliknięcie pozostaje podświetlone.

‘Reset the earlier Highlight to Normal

For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn

‘Changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends-

Następnie wartość właściwości tagu jest wczytywana do varTag Zmienny. Jeśli nie jest pusty, wartość jest dzielona na dwie części. Wartość liczbowa jest wyodrębniana i zapisywana w Typidzie zmienna, a część Nazwa obiektu jest zapisana w zmiennej objName .

W zależności od wartości w zmiennej Typid Docmd jest wykonywany, aby otworzyć formularz, raport lub uruchamia makro.

Dodamy jeszcze dwa przyciski poleceń na górze menu. Jeden, aby rozwinąć wszystkie węzły jednym kliknięciem, a drugi, aby zwinąć wszystkie węzły.

  1. Dodaj dwa dodatkowe przyciski poleceń w górnym obszarze Kontrolki widoku drzewa, jak pokazano na poniższym projekcie.
  2. Zmień nazwę Wartość właściwości lewego przycisku polecenia do cmdExpand i Podpis do rozwiń wszystko .
  3. Podobnie zmień Nazwę prawego przycisku poleceń Właściwość cmdCollapse i Podpis do Zwiń wszystko.
  4. Skopiuj i wklej następujący kod VBA poniżej istniejącego kodu w frmMenu Moduł formularzy i zapisz formularz.
Private Sub cmdExpand_Click()
Dim Nodexp As MSComctlLib.Node

For Each Nodexp In tv.Nodes
    If Nodexp.Expanded = False Then
        Nodexp.Expanded = True
    End If
Next Nodexp
End Sub


Private Sub cmdCollapse_Click()
Dim Nodexp As MSComctlLib.Node

For Each Nodexp In tv.Nodes
    If Nodexp.Expanded = True Then
        Nodexp.Expanded = False
    End If
Next Nodexp
End Sub

Na początku cmdExpand_Click() Zdarzenie, zadeklarowaliśmy obiekt węzła widoku drzewa NodExp. Dla. . . Dalej pętla zajmuje jeden węzeł na raz i sprawdza, czy jest w rozwiniętej formie, czy nie. Jeśli nie, to Rozszerzony Wartość właściwości jest ustawiona na Prawda .

Podobnie cmdCollapse_Click() Zdarzenie wykonuje podobną kontrolę i jeśli jest w stanie rozwiniętym, wartość Expanded Property jest ustawiana na False.

Wszystkie węzły pełnej kontrolki widoku drzewa można rozwinąć i sprawić, że wszystkie ich węzły podrzędne będą widoczne na raz lub wszystkie węzły podrzędne pozostaną ukryte, z wyjątkiem węzłów na poziomie głównym.

Mam nadzieję, że podobało Ci się tworzenie nowego menu dla Twojego projektu. Jeśli uruchomisz zadanie projektowe krok po kroku, Twoje menu powinno wyglądać jak gotowy obraz menu podany na górze.

W roku 2007 zaprojektowałem menu w jednym z moich projektów, dla systemu umów serwisowych pojazdów, używając kontrolki zakładki z kilkoma stronami. Każda strona ma 10 lub więcej opcji i aby każda strona pojawiała się kolejno w tym samym obszarze, gdy użytkownik kliknie przyciski poleceń ustawione po obu stronach Menu. Przyciski poleceń po prawej stronie również się zmieniają, w zależności od wyboru przycisk po lewej stronie.

Kliknij, aby powiększyć

Artykuł dotyczący projektowania menu z zakładkami można znaleźć pod tym linkiem:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html


MODUŁ KLASY

  1. Moduł klasy MS-Access i VBA
  2. Obiekt i tablice klasy MS-Access VBA
  3. Klasa bazowa MS-Access i obiekty pochodne
  4. Klasa bazowa VBA i obiekt pochodny-2
  5. Warianty klasy bazowej i obiektów pochodnych
  6. MS-Access Recordset and Class Module
  7. Dostęp do modułu klas i klas opakowujących
  8. Funkcjonalność klasy opakowującej


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dostęp ODBC z Windows Server Core

  2. Raportowanie bardziej szczegółowe niż zwykle — Microsoft Access

  3. Jak korzystać z Konstruktora wyrażeń w programie Access 2016?

  4. Excel a Access:kiedy nadszedł czas na zmianę?

  5. Jak stworzyć bazę danych inwentaryzacji w programie Access