Access
 sql >> Base de données >  >> RDS >> Access

Création d'un menu d'accès avec le contrôle de l'arborescence

Le menu du projet Microsoft Access, une fois terminé avec le contrôle de l'arborescence, ressemblera à l'image ci-dessous.

L'image ci-dessus montre la troisième option du groupe de rapports Rapport personnalisé est sélectionné et mis en surbrillance, avec le formulaire de paramètre de filtre de rapport ouvert, chevauchant l'écran de menu, pour l'entrée de l'utilisateur.

Avant d'aborder cela, dans la leçon de la semaine dernière, nous avons appris à organiser les éléments associés dans l'ordre hiérarchique, à l'aide de Microsoft Tree View Control, basé sur l'exemple Tableau de données.

J'ai fait remarquer la semaine dernière que les éléments associés dans les données du contrôle Tree View ne doivent pas nécessairement être côte à côte. Après cela, vous saurez plus clairement comment mettre à jour Relative Clés des nœuds enfants, quelle que soit leur position physique dans les enregistrements de la table, mais en fonction de la relation avec ses ID de nœud parent.

Voici le tableau de données que nous avons utilisé et terminé avec l'exercice de la semaine dernière :

Pouvez-vous ajouter la liste d'éléments suivante à la fin du tableau ci-dessus et mettre à jour leurs valeurs de champ ParentID afin que l'affichage TreeView ressemble à l'exemple d'image ci-dessous :

Nouveaux enregistrements pour Table champ associé à l'enregistrement d'article :

  1. Champ de texte.
  2. Champ numérique.
  3. Champ date/heure.
  4. Champ de lien hypertexte.

Formulaire Commandes associées :

  1. Zone de texte.
  2. Boutons de commande.
  3. Zone de liste déroulante.
  4. Zone de liste.

Signaler Commandes associées :

  1. Zone de texte.
  2. Libellé.
  3. Graphique.

Attribuez des valeurs ParentID à ces éléments afin que l'affichage de l'arborescence ressemble à l'image suivante :

Maintenant, nous allons procéder à la création d'un menu de projet MS-Access et apprendre ce qu'il faut pour en créer un. Une image de menu simple est donnée ci-dessous :


Il s'agit d'un menu simple avec seulement trois groupes d'options :formulaires, vues de rapport et macros.

Sous Formulaires Deux options de groupe sont données, la première affiche l'enregistrement de la table du menu des commandes de l'arborescence. La deuxième option affiche les mêmes enregistrements en mode formulaire continu.

La première option sous Affichage du rapport affiche un Rapport sur les produits Catégorie enregistrements, à partir de la table des catégories de NorthWind.accdb base de données.

La deuxième option affiche le rapport sur les prix catalogue des produits.

Le troisième l'option ouvre un Paramètre Formulaire permettant à l'utilisateur de définir le Min imum et Max imum Plage de valeurs de prix catalogue, pour filtrer les données du rapport de prix catalogue des produits.

Sous les processus de macros Groupe, les deux options exécutent Macro1 et Macro2 respectivement et afficher des messages différents.

Nous avons besoin d'un tableau de menu avec les enregistrements d'option ci-dessus avec quelques champs supplémentaires, en plus des champs de données habituels ID uniques, Description et ParentID de TreeView. L'image du tableau de menu est donnée ci-dessous :

Créez une table avec la structure ci-dessus, ajoutez les enregistrements ci-dessus et enregistrez-la sous le nom Menu . L'identifiant le champ est NuméroAuto, PID, et Type les champs sont des champs numériques, les autres sont des champs de texte.

Nous connaissons les trois premiers champs de données :l'ID unique , Description, et le ParentID Des champs. Ici, j'ai raccourci le nom du champ ParentID en PID .

Nous avons besoin de quatre champs supplémentaires dans le tableau de menu, un champ Type pour le type d'objet Code, et trois champs Formulaire , Signaler, et Macro .

Tapez Le champ contient les codes numériques du type d'objet d'accès pour identifier l'option sur laquelle l'utilisateur a cliqué.

  • Le champ Formulaire est destiné aux noms de formulaire, objet Type code 1,
  • Le champ de rapport contient des noms de rapport, objet Type code 2,
  • Le champ Macro est destiné aux noms de macro, code de type d'objet 3.

Remarque : Tous les noms d'objets peuvent être mis dans une colonne. Nous avons utilisé des champs séparés uniquement pour plus de clarté. Si vous faites cela, apportez des modifications au code VBA, partout où il fait référence à différents noms de champs.

Sur la base des numéros de code, nous pouvons récupérer les noms d'objet, à partir de leurs champs respectifs et appeler le DoCmd.Openform ou Docmd.OpenReport ou Docmd.RunMacro pour exécuter l'action sur les clics du nœud enfant.

Maintenant, nous devons stocker le code de type et le nom d'objet sur les nœuds enfants. Nous aborderons ce sujet lorsque nous commencerons à ajouter les nœuds au contrôle Tree View.

Nous avons besoin de deux tableaux de données supplémentaires pour les exemples de formulaires et de rapports. Les Catégories Table et Produits Tableaux, du NorthWind.accdb exemple de base de données. Pour vous faire gagner du temps, j'ai joint la base de données de démonstration avec tous les objets et programmes à la fin de cette page pour la télécharger et l'essayer.

Créez deux formulaires à l'aide du tableau de menu avec les noms Data Entry et un autre Formulaire Vue de données en continu Mode formulaire.

Créez deux rapports, un sur le tableau des catégories avec le nom du rapport :Catégories, un autre rapport sur le tableau des produits avec le nom Liste des produits . Ajouter un long Libellé contrôle sous l'en-tête principal du rapport de liste de produits et remplacez la valeur de la propriété Nom par Plage .

Créez un petit formulaire avec deux zones de texte non liées et changez leur nom Valeur de propriété en Min &Max, comme le dessin ci-dessous :

Ajoutez deux boutons de commande comme indiqué ci-dessus. Modifier la légende Valeur de propriété du premier bouton pour ouvrir le rapport t et le Nom Valeur de la propriété à cmdReport .

Remplacez la légende du deuxième bouton de commande par Annuler et le Nom Valeur de la propriété à cmdCancel .

Affichez le module de code du formulaire. Copiez et collez le code suivant dans le module de formulaire et enregistrez le formulaire :

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

Lorsque l'utilisateur définit une plage de valeurs en entrant la plage de prix catalogue minimum et maximum dans leurs zones de texte respectives, la chaîne de critères de filtre de rapport est créée. Le filtre de rapport La valeur de chaîne est transmise à la liste de produits Rapport en tant que paramètre de la commande Ouvrir le rapport. La valeur de la chaîne de filtre est également transmise en tant que OpenArgs (Open Argument) Paramètre.

Le paramètre Filtre filtre les données du rapport, en fonction des critères, spécifiés dans les champs Min et Max, et la valeur de l'argument ouvert est copiée dans la Plage Légende de l'étiquette lorsque le rapport est ouvert.

Copiez et collez le code suivant dans la liste des produits Module VBA du rapport :

Private Sub Report_Open(Cancel As Integer)
    DoCmd.Close acForm, "Parameter"
    Me.Range.Caption = Nz(Me.OpenArgs, "")
End Sub
  1. Créez un nouveau formulaire, avec le nom frmMenu, et ajoutez le Microsoft TreeView Control de la liste des contrôles Activex. Redimensionnez le contrôle comme indiqué dans la vue de conception ci-dessous :

  2. Changez le nom du contrôle Tree View en TreeView0 dans la feuille de propriétés normale.

  3. Ajoutez un bouton de commande sous le contrôle Tree View. Changer son Nom Valeur de la propriété à cmdExit et Légende Valeur de la propriété pour quitter .

  4. Cliquez avec le bouton droit sur le contrôle de l'arborescence et mettez en surbrillance TreeCtrl_Object et sélectionnez Propriétés pour afficher la feuille de propriétés.

  5. Modifiez les valeurs de propriété suivantes comme indiqué ci-dessous :

  • Style =7 (tvwTreeLinesPlusMinusPictureText)
  • Style de ligne =1 (tvwRootLines)
  • LabelEdit =1 (tvwManual)

La semaine dernière, nous avons modifié les deux premières valeurs de propriété. Lorsque LabelEdit La valeur par défaut de la propriété est 0 - tvwAutomatique, En cliquant deux fois sur le nœud (et non en double-cliquant), le texte du nœud passera en mode édition et vous pourrez modifier le texte. Mais cela ne mettra pas directement à jour le champ de la source de données. En le changeant en 1 – tvwManual l'empêchera de passer en mode édition.

Nous pouvons changer cela via le code en ajoutant les lignes suivantes dans la procédure d'événement Form_Load() :

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

La semaine dernière, nous avons utilisé le Form_Load() Procédure d'événement pour lire les valeurs du nœud d'affichage de l'arborescence afin de créer les nœuds de niveau racine et enfant. Nous avons besoin de la même procédure ici aussi avec quelques lignes de code supplémentaires.

En plus de cela, nous devons piéger le Node_Click() Événement de nœuds pour vérifier quelle option l'utilisateur a sélectionnée.

Copiez et collez le code VBA suivant dans le module de formulaire et enregistrez le formulaire.

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

Dans la zone de déclaration globale du module, l'objet Tree View est déclaré. Une variable constante KeyPrfx est déclaré avec la valeur "X".

Le Form_Load() Procédure d'événement de l'article de la semaine dernière que nous avons modifiée avec un code supplémentaire. J'ai commenté le nouveau segment de code pour donner une indication de ce qu'il fait, mais j'expliquerai ce qu'il fait.

La procédure déclare la base de données, le jeu d'enregistrements et quatre variables de chaîne. Les deux lignes suivantes déclarent un Node Object temporaire :tmpNod et Tapez Les variables variantes sont déclarées.

Ensuite, l'objet TreeView tv est attribué avec TreeView0 Objet sur le formulaire. Les nœuds existants de TreeView0, le cas échéant, sont effacés avec l'instruction :tv.Nodes.Clear , en préparation du chargement de tous les nœuds.

Nous avons implémenté le code suivant pour modifier les propriétés du contrôle Tree View via le code, plutôt que via la feuille de propriétés.

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

La police de l'arborescence est remplacée par Verdana. En plus de cela, nous apporterons quelques fonctions supplémentaires comme développer ou réduire tous les groupes de menus en un seul clic, plutôt que de développer ou de réduire manuellement un groupe après l'autre.

La nouvelle chaîne SQL est modifiée pour ajouter les nouveaux champs de type de champ, de formulaire, de rapport et de macro du tableau de menu.

Le premier enregistrement du tableau de menu est vérifié pour la présence de toute valeur dans le PID champ, s'il est vide, il s'agit d'un enregistrement de nœud de niveau racine. Il est ajouté à l'objet Tree View en tant que nœud de niveau racine et sa référence est enregistrée dans le tmpNod Objet.

Le nœud a plusieurs propriétés comme Forecolor, Bold, et plusieurs autres dont nous avons retiré le gras Propriété et Vrai attribué pour rendre le niveau racine Le nœud est différent de ses nœuds enfants.

S'il ne s'agit pas d'une entrée de nœud racine, il a la valeur PID, le programme prend le Else clause et l'enregistrement est ajouté en tant que nœud enfant. Ici, nous vérifions le Type valeur du champ. S'il contient l'une des trois valeurs 1, 2, ou 3 alors nous devons prendre la valeur du formulaire, du rapport ou du nom de la macro avec le code de type et les joindre ensemble (comme "1Data Entry" , « Liste des 2 catégories » etc.) et enregistrez-le dans le Tag Propriété des nœuds enfants. Nous connaissons bien la propriété Tag dans les contrôles Access, comme les zones de texte, les étiquettes, les boutons de commande, etc., mais nous l'utilisons rarement.

Le cmdExit_Click() La procédure ferme le formulaire de menu si la réponse de l'utilisateur est affirmative.

Lorsque l'utilisateur clique sur un nœud enfant, la valeur que nous avons enregistrée dans son Tag La propriété doit être extraite et vérifiée pour déterminer ce qu'il faut faire ensuite. Pour cela, nous avons besoin d'un TreeView0_NodeClick() Procédure d'événement.

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

La procédure événementielle Click() reçoit la référence du nœud cliqué en tant que Paramètre dans l'objet Node . Au début de cette procédure, nous avons déclaré quelques Variables.

Les quelques lignes suivantes vérifient si le nœud cliqué est dans un état développé ou réduit.

Normalement, pour développer un nœud, pour afficher ses nœuds enfants cachés, soit on clique sur le + (symbole plus) sur le côté gauche d'un nœud ou double-cliquez sur le nœud lui-même. Double-cliquez à nouveau sur le nœud ou cliquez sur le – (symbole moins) pour masquer les nœuds enfants.

Avec le segment de code suivant, nous pouvons développer ou réduire les nœuds enfants en un seul clic :

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

Les six lignes exécutables suivantes garantissent que le nœud ayant reçu le clic reste en surbrillance.

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

Ensuite, la valeur de la propriété de balise est lue dans le varTag Variable. S'il n'est pas vide, la valeur est divisée en deux parties. La valeur numérique est extraite et enregistrée dans le Typid variable et la partie Nom de l'objet est enregistrée dans la variable objName .

En fonction de la valeur de la variable Typid, le Docmd est exécuté pour ouvrir le formulaire, le rapport ou exécuter la macro.

Nous ajouterons deux autres boutons de commande en haut du menu. Un pour développer tous les nœuds en un seul clic et le second pour réduire tous les nœuds.

  1. Ajoutez deux boutons de commande supplémentaires dans la partie supérieure du contrôle de l'arborescence, comme indiqué sur le dessin ci-dessous.
  2. Modifier le nom Valeur de la propriété du bouton de commande gauche sur cmdExpand et la Légende pour Tout développer .
  3. De même, modifiez le nom du bouton de commande de droite Propriété à cmdCollapse et la Légende pour Tout réduire.
  4. Copiez et collez le code VBA suivant sous le code existant dans le frmMenu Module de formulaire et enregistrez le formulaire.
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

Au début de la cmdExpand_Click() Event, nous avons déclaré un objet Tree View Node NodExp. Le Pour . . . Suivant loop prend un nœud à la fois et vérifie s'il est sous forme développée ou non. Si ce n'est pas le cas, il est développé La valeur de la propriété est définie sur True .

De même, le cmdCollapse_Click() L'événement effectue une vérification similaire et s'il est dans un état développé, la valeur de la propriété développée est définie sur False.

Tous les nœuds du contrôle d'arborescence complet peuvent être développés et rendre tous leurs nœuds enfants visibles à la fois ou tous les nœuds enfants restent masqués, à l'exception des nœuds de niveau racine.

J'espère que vous avez aimé créer le nouveau menu pour votre projet. Si vous exécutez la tâche de conception étape par étape, votre menu devrait ressembler à l'image de menu finie donnée en haut.

Au cours de l'année 2007, j'ai conçu un menu dans l'un de mes projets, pour le système de contrat de service de véhicules, en utilisant le contrôle des onglets avec plusieurs pages. Chaque page ayant 10 options ou plus et pour faire apparaître chaque page à tour de rôle dans la même zone lorsque l'utilisateur clique sur les boutons de commande alignés de chaque côté du menu. Les boutons de commande sur le côté droit changent également, en fonction de la sélection de le bouton de gauche.

Cliquez pour agrandir

Vous pouvez trouver l'article sur la conception de menus avec contrôle des onglets sur ce lien :https://www.msaccesstips.com/2007/06/control-screen-menu-design.html


MODULE DE COURS

  1. Module de classe MS-Access et VBA
  2. Objet et tableaux de classe MS-Access VBA
  3. Classe de base MS-Access et objets dérivés
  4. Classe VBA-Base et Objet dérivé-2
  5. Classe de base et variantes d'objets dérivés
  6. Jeu d'enregistrements et module de classe MS-Access
  7. Accéder au module de classe et aux classes wrapper
  8. Fonctionnalité de la classe wrapper