Access
 sql >> база данни >  >> RDS >> Access

Създаване на меню за достъп с контрол на дървовидния изглед

Менюто на Microsoft Access Project, когато приключите с контрола за изглед на дърво, ще изглежда като изображението, дадено по-долу.

Изображението по-горе показва третата опция Персонализиран отчет на групата отчети е избран и маркиран, с отворен формуляр за параметри на филтъра за отчет, припокриващ екрана на менюто, за въвеждане на потребителя.

Преди да преминем към това, в урока от миналата седмица, научихме как да организираме свързаните елементи в йерархичен ред, използвайки контрола на Microsoft Tree View, въз основа на Проба таблица с данни.

Миналата седмица отбелязах, че свързаните елементи в данните на контролата на Tree View не е задължително да са един до друг. След това ще ви бъде по-ясно как да актуализирате Relative Ключове на дъщерни възли, независимо от неговата физическа позиция на записите в таблицата, но въз основа на връзката с неговите идентификатори на родителски възел.

Това беше таблицата с данни, която използвахме и завършихме с упражнението от миналата седмица:

Можете ли да добавите следния списък с елементи в края на горната таблица и да актуализирате стойностите на техните полета ParentID, така че екранът на TreeView да изглежда като примерното изображение, дадено по-долу:

Нови записи за Таблица поле, свързано със запис на елемент :

  1. Текстово поле.
  2. Поле с номер.
  3. Поле за дата/час.
  4. Поле за хипервръзка.

Формуляр свързани Контроли:

  1. Текстово поле.
  2. Командни бутони.
  3. Комбо поле.
  4. Списъчно поле.

Доклад свързани Контроли:

  1. Текстово поле.
  2. Етикет.
  3. Графика.

Задайте стойности на ParentID на тези елементи, така че екранът на дървовидния изглед да изглежда като следното изображение:

Сега ще продължим със създаването на MS-Access Project Menu и ще научим какво е необходимо, за да създадем такова. По-долу е дадено просто изображение на менюто:


Това е просто меню със само три групи опции:формуляри, изгледи на отчети и макроси.

Под Формуляри Дават се две опции за група, като първата показва записа в таблицата с контроли на дървовидния изглед. Втората опция показва същите записи в режим на непрекъсната форма.

Първата опция под Изглед на отчет показва отчет за Категория продукти записи, от таблицата с категории на NorthWind.accdb база данни.

Втората опция показва отчета за списък с цени на продуктите.

Втретотото опцията отваря Параметър Формуляр, така че Потребителят да може да зададе Мин. макс. имакс максимален диапазон от стойности на каталожна цена, за да филтрирате данни за отчета за каталожна цена на продуктите.

Под Процеси на макроси Група, и двете опции изпълняват Macro1 и Макро2 съответно и показват различни съобщения.

Нуждаем се от таблица с менюта с горните записи с опции с някои допълнителни полета, освен обичайните полета за данни за уникални идентификатори, описание и родителски идентификатор на TreeView. Изображението на таблицата с менюта е дадено по-долу:

Създайте таблица с горната структура, добавете горните записи и я запазете с името Меню . Идентификационният номер полето е AutoNumber, PID, и Тип полетата са числови полета, други са текстови полета.

Запознати сме с първите три полета с данни:уникалният ID , Описание, и ParentID Полета. Тук съкратих името на полето ParentID на PID .

Трябват ни още четири полета в таблицата с менюта, едно поле Тип за типа обект Код и три полета Формуляр , Отчет, и макро .

Тип Полето съдържа цифрови кодове на типа на обект за достъп, за да идентифицира опцията, върху която потребителят е щракнал.

  • Полето за формуляр е за Имена на формуляри, обект Тип код 1,
  • Полето за отчет съдържа Имена на отчети, обект Тип код 2,
  • Полето за макроси е за Имена на макроси, код за тип обект 3.

Забележка: Всички имена на обекти могат да бъдат поставени в една колона. Използвахме отделни полета само за яснота. Ако направите това, направете промени във VBA кода, където и да се позовава на различни имена на полета.

Въз основа на кодовите номера можем да вземем имената на обекти от съответните им полета и да извикаме DoCmd.Openform или Docmd.OpenReport или Docmd.RunMacro за да изпълните действието върху щраквания върху дъщерния възел.

Сега трябва да съхраним кода на типа и името на обекта на дъщерните възли. Ще се заемем с тази тема, когато започнем да добавяме възлите към контролата на дървовидния изглед.

Нуждаем се от още две таблици с данни за примерни формуляри и отчети. Категориите Маса ипродукти Таблици от NorthWind.accdb примерна база данни. За да ви спестя време, прикачих демонстрационната база данни с всички обекти и програми в края на тази страница, за да я изтеглите и изпробвате.

Създайте два формуляра с помощта на таблицата с менюта с имената Въвеждане на данни и друг формуляр Изглед на данни непрекъснато Режим на формуляра.

Създайте два отчета, единият в таблицата с категории с името на отчета:Категории, друг отчет в таблицата с продукти с името Списък с продукти . Добавете дълъг етикет контролирайте под основното заглавие в отчета за продуктовата обява и променете стойността на свойството на името на Обхват .

Създайте малък формуляр с две необвързани текстови полета и променете името им Стойност на свойството на Min &Макс, като дизайна, даден по-долу:

Добавете два командни бутона, както е показано по-горе. Променете Надписа Стойност на свойството на първия бутон за Отваряне на отчет t и Имета Стойност на свойството към cmdReport .

Променете надписа на втория команден бутон на Отказ и Име Стойност на свойството до cmdCancel .

Покажете кодовия модул на формуляра. Копирайте и поставете следния код в модула на формуляра и запазете формуляра:

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

Когато потребителят зададе диапазон на стойността, като въведе диапазона на минималната и максималната каталожна цена в съответните им текстови полета, се създава низ за критерии за филтър за отчет. Филтърът за отчети Стойността на низ се предава на Списък с продукти Докладвайте като параметър на командата Open Report. Стойността на филтърния низ също се предава като OpenArgs (Отворен аргумент) Параметър.

Параметърът Filter филтрира отчетните данни въз основа на критериите, посочени в полетата Min &Max, а стойността на отворения аргумент се копира в Обхват Надпис на етикета, когато отчетът е отворен.

Копирайте и поставете следния код в Списък с продукти VBA модул на отчета:

Private Sub Report_Open(Cancel As Integer)
    DoCmd.Close acForm, "Parameter"
    Me.Range.Caption = Nz(Me.OpenArgs, "")
End Sub
  1. Създайте нов формуляр с името frmMenu, и добавете Microsoft TreeView Control от списъка на Activex Control. Преоразмерете контролата, както е показано в изгледа за проектиране по-долу:

  2. Променете името на контролата Tree View на TreeView0 в нормалния лист за свойства.

  3. Добавете команден бутон под контролата на дървовидния изглед. Променете неговото име Стойност на свойството до cmdExit и Надпис Стойност на свойството за Изход .

  4. Щракнете с десния бутон върху контролата за изглед на дърво и маркирайте TreeCtrl_Object опция и изберете Свойства за да покажете листа със свойства.

  5. Променете следните стойности на свойствата, както е показано по-долу:

  • Стил =7 (tvwTreeLinesPlusMinusPictureText)
  • Стил на линия =1 (tvwRootLines)
  • LabelEdit =1 (tvwManual)

Миналата седмица променихме първите две стойности на свойствата. Когато Редактиране на етикета Стойността по подразбиране на свойството е 0 - tvwAutomatic, Щраквайки върху възела два пъти (а не двукратно), текстът на възела ще премине в режим на редактиране и можете да промените текста. Но няма да актуализира директно полето за източник на данни. Като го промените на 1 – tvwManual ще му попречи да премине в режим на редактиране.

Можем да променим това чрез код, като добавим следните редове в процедурата за събитие Form_Load():

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

Миналата седмица използвахме Form_Load() Събитие Процедура за четене на стойностите на възела на дървовидния изглед, за да създадете възлите на коренно ниво и дъщерните възли. Имаме нужда от същата процедура и тук с няколко реда допълнителен код.

Освен това трябва да хванем Node_Click() Събитие на възли, за да проверите коя опция е избрал потребителят.

Копирайте и поставете следния VBA код в модула на формуляра и запазете формуляра.

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

В областта на глобалната декларация на модула се декларира дървовидният изглед. Постоянна променлива KeyPrfx е деклариран със стойността “X”.

Form_Load() Процедурата за събитие от статията от миналата седмица, която променихме с допълнителен код. Коментирах новия сегмент на кода, за да дам индикация какво прави, но ще обясня какво прави.

Процедурата декларира база данни, набор от записи и четири низови променливи. Следващите два реда декларират временен обект на възел:tmpNod и Тип Вариантните променливи са декларирани.

След това TreeView Object tv е присвоен с TreeView0 Обект във формуляра. Съществуващите възли на TreeView0, ако има такива, се изчистват с изявлението:tv.Nodes.Clear , в подготовка за повторно зареждане на всички възли.

Внедрихме следния код, за да променим свойствата на контролата за дървовиден изглед чрез код, а не чрез листа със свойства.

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

Шрифтът на дървовидния изглед се променя на Verdana. Освен това ще въведем още функции като разширяване или свиване на всички групи менюта с едно щракване, вместо ръчно разширяване или свиване на една група след друга.

Новият SQL низ е променен, за да добавите новите полета тип, формуляр, отчет и макро полета от таблицата на менюто.

Първият запис на таблицата с менюта се проверява за наличието на стойност в PID поле, ако е празно, това е запис на възел на коренно ниво. Той се добавя към обекта на дървовидния изглед като възел на коренно ниво и неговата препратка се записва в tmpNod Обект.

Възелът има няколко свойства като Forecolor, Bold, и няколко други от това сме взели Удебеления Свойство и присвоено Вярно за да направите Root ниво Възелът изглежда различно от неговите дъщерни възли.

Ако това не е запис на коренен възел, тогава той има стойността на PID, програмата приема Else клауза и записът се добавя като дъщерен възел. Тук проверяваме Тип стойност на полето. Ако съдържа една от трите стойности 1, 2, или 3 след това трябва да вземем стойността от името на формуляр, отчет или макрос заедно с този код на типа и да ги обединим заедно (като ”1Въвеждане на данни” , „2Category List“ и др.) и го запазете в Tag Свойство на дъщерни възли. Запознати сме със свойството на маркера в контролите за достъп, като текстови полета, етикети, командни бутони и други, но рядко го използваме.

cmdExit_Click() Процедурата затваря формуляра на менюто, ако отговорът на потребителя е положителен.

Когато потребителят щракне върху дъщерен възел, стойността, която сме запазили в неговия Маркер Имотът трябва да бъде извлечен и проверен, за да се определи какво да се прави по-нататък. За това се нуждаем от TreeView0_NodeClick() Процедура на събитието.

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

Процедурата за събитие Click() получава щракнатата Справка на възел като параметър в обекта Node . В началото на тази процедура сме декларирали няколко променливи.

Следващите няколко реда проверяват дали щракнатият възел е в разгънато или свито състояние.

Обикновено, за да разширим възел, за да покажем неговите скрити дъщерни възли, или щракваме върху + (символ плюс) от лявата страна на възел или щракнете двукратно върху самия възел. Щракването двукратно върху възела или щракването върху – (символът минус) ще скрие дъщерните възли.

Със следния сегмент на кода можем да разширим или свием дъщерни възли с едно щракване:

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

Следващите шест изпълними реда гарантират, че възелът е получил щракването остава маркиран.

‘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-

След това стойността на свойството на маркера се чете в varTag Променлива. Ако не е празно, тогава стойността се разделя на две части. Числовата стойност се извлича и записва в Typid променлива и частта Име на обекта се записва в променлива objName .

В зависимост от стойността в променливата Typid Docmd се изпълнява, за да отворите формуляра, отчета или стартира макроса.

Ще добавим още два командни бутона в горната част на менюто. Единият за разширяване на всички възли с едно щракване, а вторият за свиване на всички възли.

  1. Добавете още два командни бутона в горната част на контрола за изглед на дърво, както е показано на дизайна по-долу.
  2. Променете Името Стойност на свойството на левия команден бутон за cmdExpand и Надпис за Разгъване на всички .
  3. По същия начин променете Име на десния команден бутон Свойство на cmdCollapse и Надпис за Свиване на всички
  4. Копирайте и поставете следния VBA код под съществуващия код в frmMenu Модул за формуляри и запазете формуляра.
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

В началото на cmdExpand_Click() Събитие, ние сме декларирали обект на възел с изглед на дърво NodExp. Вза . . . Следващата цикълът взема един възел в даден момент и проверява дали е в разширена форма или не. Ако не, тогава той Разширен Стойността на свойството е зададена на True .

По подобен начин cmdCollapse_Click() Събитието прави подобна проверка и ако е в разгънато състояние, тогава стойността на Expanded Property е зададена на False.

Всички възли на пълния Tree View Control могат да се разширят и да направят всичките им дъщерни възли видими наведнъж или всички дъщерни възли да останат скрити с изключение на възлите на коренно ниво.

Надяваме се, че ви е харесало създаването на новото меню за вашия проект. Ако вървите стъпка по стъпка по задачата за проектиране, вашето меню трябва да изглежда като готовото изображение на менюто, дадено в горната част.

През 2007 г. проектирах меню в един от моите проекти, за система за договори за обслужване на превозни средства, използвайки контрола на раздели с няколко страници. Всяка страница има 10 или повече опции и за да накара всяка страница да се показва на свой ред в една и съща област, когато потребителят щракне върху командните бутони, подредени от двете страни на менюто.Командните бутони от дясната страна също се променят въз основа на избора на бутон отляво.

Кликнете, за да увеличите

Можете да намерите статията за дизайн на менюто с контрол на раздели на тази връзка:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html


МОДУЛ КЛАС

  1. Модул за клас MS-Access и VBA
  2. Обект и масиви от клас VBA на MS-Access
  3. Основен клас на MS-Access и производни обекти
  4. VBA-базов клас и производен обект-2
  5. Варианти на основен клас и производен обект
  6. Набор от записи и клас за MS-Access
  7. Достъп до модул за класове и класове за обвивка
  8. Функционалност на класа на обвивката


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Къде да изтеглите Runtime Kit за Microsoft Access 2016

  2. Защо трябва да ограничите потребителския достъп за вашата база данни

  3. Съвети и трикове за Microsoft Access, част 2 – Формуляри

  4. Как да подобрим точността на базата данни

  5. Колко често трябва да архивирате своите бази данни?