Les arborescences sont encore très courantes dans nos applications, comme les répertoires de fichiers, les BBS, les paramètres d'autorisations, les paramètres de département, etc. Ces informations
de données
adoptent toutes une structure hiérarchique, difficile à exprimer clairement dans notre base de données relationnelle actuelle. Alors,comment gérer
les problèmes d'arborescence dans le programme
?Récemment, l'auteur a facilement résolu ce problème grâce à un programme de gestion des droits ASP, et je vais maintenant le régler pour les lecteurs.
Premièrement, le modèle de données hiérarchique doit être converti en un modèle de données relationnel. En d’autres termes, comment concevoir cette structure de données dans nos bases de données ACCESS, SQL SERVER
, ORACLE et autres bases de données relationnelles.
Prenons un exemple, comme les données suivantes :
Gestion Documentaire 1
|----Nouveau document 2
|----Modification du document 3
|----Archives de documents 4
|----Afficher les informations archivées 5
|----Supprimer les informations archivées 6
|----Supprimer les documents historiques 7
|----Supprimer le document officiel 8
|----Gestion du système 9
|----Gestion des utilisateurs 10
Gestion du personnel 11
Administration 12
Gestion Financière 13
Il s'agit d'une structure hiérarchique très typique des données, alors réfléchissez-y, comment l'exprimer sous la forme d'un tableau bidimensionnel ?
Cela semble difficileau début
, non ? Mais après mûre réflexion, il existe encore un moyen de l’exploiter.
De cette façon, toutes les autorisations ci-dessus peuvent être considérées comme un seul champ d'autorisation, ce champ d'autorisation doit alors avoir une valeur d'ID.
Nous
ajoutons ensuite de force un autre champ à cette table de données relationnelles - le champ ID subordonné, qui indique à quel niveau d'autorisation appartient cette autorisation
, c'est-à-dire à quelle valeur d'ID appartient cette valeur d'ID. Par exemple : la valeur de l'ID d'autorisation « Afficher les informations d'archive » est « 5 » et elle est subordonnée à l'autorisation « Archivage
de documents
», alors la valeur de son champ d'ID subordonné doit être « 4 ».OK, si cela peut être compris, alors
notre
travail de transformation relationnelle est pratiquement terminé.Commençons par concevoir cette table de données relationnelles (en prenant Sql Server 7.0 comme exemple) :
+-----------+---------------+----- --- ---+-----------+----------+
| Nom du champ | Signification du champ | Type de champ | Attributs du champ |
+-----------+-----------+-----------+-----------+- ---------+
| Auto-ID | ID d'autorisation | Int |
| Nom de l'autorisation | Varchar 50 |
| Informations sur les autorisations | Varchar 500 |
| ID d'appartenance | ID d'appartenance |
+-----------+-----------+-----------+-----------+- ---------+
D'accord, une fois la structure conçue, vous pouvez facilement saisir vos données de test.
Ensuite, nous nous concentrerons sur la façon d'imiter la structure hiérarchique dans la page Web pour afficher le programme ASP avec cette fonction. C'est également l'étape la plus critique.
Liste des programmes : powerlist.asp
<%
'Connexion à la base de données
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'Ouvrir toutes les données de la couche parent
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "sélectionner * parmi les pouvoirs où l'identifiant d'appartenance est nul, ordre par powerid", conn,1,3
'Attribuer une valeur initiale à la variable d'expression du numéro de niveau
format_i=1
'Liste la section principale du programme
do while not rs.eof
'Imprimer les informations sur les données de la couche parent
réponse.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /a>"
réponse.write "<br>"
'Appel de sous-programme, traitement des données de sous-couche
Appelez ListSubPower(rs("powerid"))
rs.movenext
loop
'Fermez l'ensemble de données de la couche parent
rs.fermer
définir rs = rien
'Sous-programme de traitement des données de sous-couche
Sub ListSubPower(id)
'Ouvre toutes les informations de données de sous-couche appartenant au powerid supérieur
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers which submitid=" & id & " order by powerid",conn,1,3
'Données de la sous-couche de colonne
do while not rs_sub.eof
'Expression de numéro de niveau variable accumulation progressive
format_i=format_i+1
'Contrôle du format d'indentation en boucle, car les niveaux supérieur et deuxième ne nécessitent pas d'indentation, donc ce segment de programme est référencé à partir du troisième niveau
pour i=format_i à 3 étape -1
réponse.écrire "|"
réponse.écrire " "
next
'Imprimer les informations sur les données de la sous-couche
réponse.écrire " |----"
réponse.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /a>"
réponse.write "<br>"
'Appelle récursivement le sous-programme lui-même pour traiter progressivement les données de la sous-couche
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
loop
'Le nombre de niveaux indique que la variable diminue progressivement
format_i=format_i-1
'Fermer l'ensemble de données de la sous-couche
rs_sub.close
définir rs_sub = rien
Fin du sous-marin
%>
Dans le programme powerlist.asp, nous ouvrons d'abord les données de niveau supérieur et les affichons dans la boucle, puis nous concevons un sous-programme ListSubPower, qui est appelé dans la boucle via un ; algorithme récursif pour ouvrir les informations de données de la couche de sous-programme et s'appelle à plusieurs reprises dans la boucle interne du sous-programme pour étendre les données approfondies couche par couche.
De plus, une variable statique format_i est utilisée dans le programme pour contrôler le format d'affichage de l'indentation.
Cet article fait une simple tentative de conception de données et de contrôle de programme dans la structure arborescente. Le but est d'inspirer les autres. J'espère que les lecteurs pourront s'inspirer davantage de cet article.