Access
 sql >> Base de Dados >  >> RDS >> Access

Criando Menu de Acesso com Controle de Visualização em Árvore


O menu do projeto do Microsoft Access, quando terminar com o controle de exibição de árvore, será semelhante à imagem fornecida abaixo.

A imagem acima mostra a terceira opção do grupo de relatórios Relatório personalizado é selecionado e destacado, com o Formulário de Parâmetro de Filtro de Relatório aberto, sobrepondo a Tela de Menu, para entrada do Usuário.

Antes de entrar nisso, na lição da semana passada, aprendemos como organizar os itens relacionados em ordem hierárquica, usando o Microsoft Tree View Control, com base no Amostra Tabela de dados.

Eu fiz questão na semana passada, que os itens relacionados nos dados do controle Tree View não precisam necessariamente estar próximos um do outro. Depois disso, você ficará mais claro sobre como atualizar Relativo Chaves de Nós Filhos, independentemente de sua posição física dos registros na Tabela, mas com base no relacionamento com seus IDs de Nós Pais.

Esta foi a Tabela de Dados que usamos e finalizamos com o exercício da semana passada:

Você pode adicionar a seguinte lista de itens no final da tabela acima e atualizar seus valores de campo ParentID para que a exibição TreeView se pareça com a imagem de exemplo fornecida abaixo:

Novos registros para Tabela campo relacionado ao registro do item :
  1. Campo de texto.
  2. Campo numérico.
  3. Campo de data/hora.
  4. Campo de hiperlink.

Formulário Controles relacionados:
  1. Caixa de texto.
  2. Botões de comando.
  3. Caixa de combinação.
  4. Caixa de listagem.

Denunciar Controles relacionados:
  1. Caixa de texto.
  2. Etiqueta.
  3. Gráfico gráfico.

Atribua valores de ParentID a esses itens para que a exibição da exibição em árvore se pareça com a seguinte imagem:

Agora, prosseguiremos com a criação de um menu de projeto do MS-Access e aprenderemos o que é necessário para criar um. Uma imagem de menu simples é fornecida abaixo:




É um Menu simples com apenas três grupos de opções:Formulários, Visualizações de Relatórios e Macros.

Em Formulários São fornecidas duas opções do grupo, a primeira exibe o registro da tabela de menus de controles de exibição em árvore. A segunda opção exibe os mesmos registros no modo de formulário contínuo.

A primeira opção em Visualização de relatório exibe um relatório sobre os produtos Categoria registros, da Tabela de categorias de NorthWind.accdb base de dados.

A segunda opção exibe o Relatório de preços de lista de produtos.

O terceiro opção abre um Parâmetro Formulário para que o usuário possa definir o Min imum e Max imum intervalo de valores de Preço de Lista, para Filtrar dados para o Relatório de Preço de Lista de Produtos.

Nos Processos de Macros Grupo, ambas as opções executam Macro1 e Macro2 respectivamente e exibir mensagens diferentes.

Precisamos de uma Tabela de Menu com os registros de opções acima com alguns campos adicionais, além dos campos de dados Unique IDs, Description e ParentID do TreeView. A imagem da tabela de menus é fornecida abaixo:

Crie uma Tabela com a estrutura acima, adicione os registros acima e salve-a com o nome Menu . O ID campo é AutoNumeração, PID, e Tipo campos são campos numéricos, outros são campos de texto.

Estamos familiarizados com os três primeiros campos de dados:o ID exclusivo , Descrição, e o ParentID Campos. Aqui, reduzi o nome do campo ParentID para PID .

Precisamos de mais quatro campos na Tabela de menus, um campo Tipo para o tipo de objeto Código e três campos Formulário , Denunciar, e Macro .

Tipo O campo contém os Códigos Numéricos do Tipo de Objeto de Acesso para identificar a Opção que o Usuário clicou.
  • O campo Formulário é para Nomes de formulários código de tipo de objeto 1,
  • O campo de relatório contém nomes de relatório, código do tipo de objeto 2,
  • Campo de macro é para nomes de macro, código do tipo de objeto 3.

Observação: Todos os nomes de objetos podem ser colocados em uma Coluna. Usamos campos separados apenas para fins de clareza. Se você fizer isso, faça alterações no código VBA, onde quer que ele faça referência a nomes de campo diferentes.

Com base nos números de código, podemos pegar os nomes dos objetos, de seus respectivos campos e chamar o DoCmd.Openform ou Docmd.OpenReport ou Docmd.RunMacro para executar a ação nos cliques do nó filho.

Agora, precisamos armazenar o código do tipo e o nome do objeto nos nós filhos. Abordaremos esse tópico quando começarmos a adicionar os nós ao controle Tree View.

Precisamos de mais duas tabelas de dados para formulários e relatórios de amostra. As categorias Tabela e Produtos Tabelas, do NorthWind.accdb banco de dados de exemplo. Para economizar seu tempo, anexei o banco de dados de demonstração com todos os objetos e programas no final desta página para download e teste.

Crie dois formulários usando a tabela de menus com os nomes Data Entry e outro formulário Visualização de dados em contínuo Modo de formulário.

Crie dois relatórios, um na Tabela de categorias com o nome do relatório:Categorias, outro relatório na Tabela de Produtos com o nome Lista de Produtos . Adicione um Rótulo longo controle abaixo do título principal no relatório de listagem de produtos e altere o valor da propriedade do nome para intervalo .

Crie um pequeno formulário com dois TextBoxes não vinculados e altere seu nome Valor da propriedade para Min &Máx., como o desenho abaixo:

Adicione dois botões de comando como mostrado acima. Altere a Legenda Valor da propriedade do primeiro botão para Abrir relatório te o Nome Valor da propriedade para cmdReport .

Altere a legenda do segundo botão de comando para Cancelar e o Nome Valor da propriedade para cmdCancel .

Exiba o Módulo de Código do Formulário. Copie e cole o seguinte código no módulo de formulário e salve o formulário:
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

Quando o usuário define uma faixa de valores inserindo a faixa de preço de tabela mínimo e máximo em suas respectivas caixas de texto, a string de critérios do filtro de relatório é criada. O Filtro de relatório O valor da string é passado para a Lista de produtos Relatório como parâmetro do comando Abrir relatório. O valor Filter String também é passado como OpenArgs (Argumento Aberto) Parâmetro.

O parâmetro Filter filtra os Dados do Relatório, com base nos Critérios, especificados nos campos Min e Max, e o valor do argumento aberto é copiado para o Intervalo Legenda do rótulo quando o relatório estiver aberto.

Copie e cole o seguinte código na Lista de produtos Módulo VBA do relatório:
Private Sub Report_Open(Cancel As Integer)
    DoCmd.Close acForm, "Parameter"
    Me.Range.Caption = Nz(Me.OpenArgs, "")
End Sub

  1. Crie um novo formulário, com o nome frmMenu, e adicione o Controle TreeView da Microsoft da Lista do Controle Activex. Redimensione o controle conforme mostrado na Visualização de Design abaixo:

  2. Altere o nome do Tree View Control para TreeView0 na Folha de Propriedades normal.

  3. Adicione um botão de comando abaixo do controle Tree View. Altere seu Nome Valor da propriedade para cmdExit e Legenda Valor da propriedade para Sair .

  4. Clique com o botão direito do mouse no controle de exibição em árvore e realce o TreeCtrl_Object opção e selecione Propriedades para exibir a folha de propriedades.

  5. Altere os seguintes valores de propriedade conforme indicado abaixo:
  • Estilo =7 (tvwTreeLinesPlusMinusPictureText)
  • Estilo de linha =1 (tvwRootLines)
  • Editar etiqueta =1 (tvwManual)

Na semana passada, alteramos os dois primeiros valores de propriedade. Quando Edição de rótulo O valor padrão da propriedade é 0 - tvwAutomático, Clicando no Node duas vezes (não clique duas vezes) o Node-Text irá para o Edit Mode e você poderá alterar o Text. Mas não atualizará diretamente o campo da fonte de dados. Alterando para 1 – tvwManual impedirá que ele entre no modo de edição.

Podemos mudar isso através do código adicionando as seguintes linhas no procedimento de evento Form_Load():
With Me.TreeView0.Object
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines	
    .LabelEdit = tvwManual
End With

Na semana passada, usamos o Form_Load() Procedimento de evento para ler os valores do nó de exibição em árvore para criar os nós filho e de nível raiz. Precisamos do mesmo procedimento aqui também com algumas linhas de código adicional.

Além disso, precisamos interceptar o Node_Click() Evento de Nós para verificar qual Opção o Usuário selecionou.

Copie e cole o seguinte código VBA no módulo de formulário e salve o formulário.

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


Na Área de Declaração Global do Módulo, o Objeto Tree View é declarado. Uma variável constante KeyPrfx é declarado com o valor “X”.

O Form_Load() Modificamos o procedimento do evento do artigo da semana passada com código adicional. Eu comentei sobre o novo segmento do Código para dar uma indicação do que ele faz, mas explicarei o que ele faz.

O Procedimento declara Banco de Dados, Conjunto de Registros e quatro Variáveis ​​String. As próximas duas linhas declaram um objeto Node temporário:tmpNod e Tipo Variant Variáveis ​​são declaradas.

Em seguida, o objeto TreeView tv é atribuído com o TreeView0 Objeto no formulário. Os nós existentes do TreeView0, se houver, são limpos com a instrução:tv.Nodes.Clear , em preparação para carregar todos os Nodes novamente.

Implementamos o seguinte código para modificar as propriedades do controle Tree View por meio de código, em vez de por meio da folha de propriedades.
With tv
    .Style = tvwTreelinesPlusMinusPictureText
    .LineStyle = tvwRootLines
    .LabelEdit = tvwManual
    .Font.Name = "Verdana"
End With 

A fonte da visualização em árvore foi alterada para Verdana. Além disso, traremos mais algumas funções, como expandir ou recolher todos os grupos de menus com um clique, em vez de expandir ou recolher manualmente um grupo após o outro.

A nova Cadeia SQL é modificada para adicionar os novos Campos Tipo de Campo, Formulário, Relatório e Campos de Macro da Tabela de Menus.

O primeiro registro da tabela de menus é verificado quanto à presença de qualquer valor no PID campo, se estiver vazio, então é um registro de nó de nível raiz. Ele é adicionado ao objeto Tree View como o nó de nível raiz e sua referência é salva no tmpNod Objeto.

O Node tem várias propriedades como Forecolor, Bold, e vários outros, tiramos o Negrito Propriedade e Verdadeiro atribuído para tornar o nível raiz O nó parece diferente de seus nós filhos.

Se não for uma entrada do Nó Raiz, então ela tem o valor PID, o programa usa o Else cláusula e o registro é adicionado como um nó filho. Aqui, verificamos o Tipo valor do campo. Se contiver um dos três valores 1, 2, ou 3 então devemos pegar o valor do formulário, relatório ou nome da macro junto com o código do tipo e juntá-los (como "1Entrada de dados" , “Listagem de 2 categorias” etc.) e salve-o na Tag Propriedade de nós filhos. Estamos familiarizados com a propriedade Tag em controles de acesso, como TextBoxes, Labels, Command Buttons e outros, mas raramente a usamos.

O cmdExit_Click() O procedimento fecha o Formulário do Menu caso a resposta do Usuário seja afirmativa.

Quando o usuário clica em um nó filho, o valor que salvamos em sua Tag A propriedade deve ser extraída e verificada para determinar o que fazer a seguir. Para isso, precisamos de um TreeView0_NodeClick() Procedimento do evento.

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


O procedimento de evento Click() recebe a Referência do nó clicada como um parâmetro no objeto . No início deste procedimento, declaramos algumas Variáveis.

As próximas linhas verificam se o Nó clicado está em um estado expandido ou recolhido.

Normalmente, para expandir um Node, para mostrar seus Nodes filhos ocultos, ou clicamos no botão + (símbolo de adição) no lado esquerdo de um Node ou clique duas vezes no próprio Node. Clicar duas vezes no nó novamente ou clicar no – (símbolo de menos) ocultará os nós filhos.

Com o seguinte segmento de código, podemos expandir ou recolher nós filho com um único clique:
If Node.Expanded = False Then
    Node.Expanded = True
Else
    Node.Expanded = False
End If 

As próximas seis linhas executáveis ​​garantem que o Nó que recebeu o Clique permaneça destacado.

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


Em seguida, o valor da propriedade da tag é lido no varTag Variável. Se não estiver vazio, o valor será dividido em duas partes. O valor Numérico é extraído e salvo no Typid variável e a parte do nome do objeto é salva na variável objName .

Dependendo do valor na variável Typid, o Docmd é executado para abrir o Formulário, Relatório ou Executa a Macro.

Adicionaremos mais dois botões de comando na parte superior do menu. Um para expandir todos os nós com um clique e o segundo para recolher todos os nós.
  1. Adicione mais dois botões de comando na área superior do controle de exibição em árvore, conforme mostrado no design abaixo.
  2. Alterar o Nome Valor da propriedade do botão de comando esquerdo para cmdExpand e a Legenda para Expandir tudo .
  3. Da mesma forma, altere o Nome do botão de comando do lado direito Propriedade para cmdCollapse e a Legenda para Recolher tudo.
  4. Copie e cole o seguinte código VBA abaixo do código existente no frmMenu Form e salve o formulário.
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

No início do cmdExpand_Click() Evento, declaramos um objeto Tree View Node NodExp. O Para . . . Próximo loop pega um Node de cada vez e verifica se ele está na forma expandida ou não. Se não, então é Expandido O valor da propriedade está definido como True .

Da mesma forma, o cmdCollapse_Click() O evento faz uma verificação semelhante e, se estiver em um estado expandido, o valor da Propriedade Expandida será definido como False.

Todos os nós do Tree View Control podem ser expandidos e tornam todos os seus nós filhos visíveis de uma só vez ou todos os nós filhos mantidos ocultos, exceto os nós de nível raiz.

Espero que tenha gostado de criar o novo Menu para o seu Projeto. Se você executar a tarefa de design passo a passo, seu menu deve se parecer com a imagem do menu final fornecida na parte superior.

Durante o ano de 2007, desenhei um Menu em um dos meus Projetos, para Sistema de Contrato de Serviço de Veículos, utilizando o Tab Control com várias Páginas. Cada página com 10 ou mais opções e fazer com que cada página apareça na mesma área quando o usuário clica nos botões de comando alinhados em ambos os lados do menu. Os botões de comando no lado direito também mudam, com base na seleção de o botão do lado esquerdo.

Clique para ampliar

Você pode encontrar o artigo de design de menu com controle de guia neste link:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html



MÓDULO DE CLASSE

  1. Módulo de classe MS-Access e VBA
  2. Objeto e matrizes de classe VBA do MS-Access
  3. Classe base do MS-Access e objetos derivados
  4. VBA-Base Class e Derived Object-2
  5. Classe base e variantes de objetos derivados
  6. Conjunto de registros e módulo de classe do MS-Access
  7. Módulo de classe de acesso e classes wrapper
  8. Funcionalidade da classe wrapper