Las estructuras de árbol siguen siendo muy comunes en nuestras aplicaciones, como directorios de archivos, BBS, configuración de permisos, configuración de departamento, etc.
Todaesta información
de datos
adopta una estructura jerárquica, que es difícil de expresar claramente en nuestra base de datos relacional actual. Entonces,¿cómo lidiar
con los problemas de estructura de árbol en el programa
?Recientemente, el autor resolvió fácilmente este problema a través de un programa de gestión de derechos ASP, y ahora lo solucionaré para los lectores.
Primero, el modelo de datos jerárquico debe convertirse en un modelo de datos relacional. En otras palabras, cómo diseñar esta estructura de datos en nuestro ACCESS, SQL SERVER
, ORACLE y otras bases de datos relacionales.
Pongamos un ejemplo, como los siguientes datos:
Gestión Documental 1
|----Nuevo documento 2
|----Modificación del documento 3
|----Archivo de documentos 4
|----Ver información archivada 5
|----Eliminar información archivada 6
| |----Eliminar documentos históricos 7
| |----Eliminar documento oficial 8
|----Gestión del sistema 9
|----Gestión de usuarios 10
Gestión de personal 11
Administración 12
Gestión financiera 13
Esta es una estructura de datos jerárquica muy típica, así que piénselo, ¿cómo expresarla en forma de una tabla bidimensional? Al principio
parece difícil, ¿verdad? Pero después de una cuidadosa consideración, todavía hay una manera de explotarlo.
De esta manera, todos los permisos anteriores pueden considerarse como un campo de permiso, entonces este campo de permiso debe tener un valor de ID.
Luego
agregamos
a la fuerza otro campo a esta tabla de datos relacionales: el campo de ID subordinado, que indica a qué nivel de permiso pertenece este permiso, es decir, a qué valor de ID pertenece este valor de ID. Por ejemplo: el valor de ID del permiso "Ver información de archivo" es "5" y está subordinado al permiso "Archivo
de documentos
", entonces el valor de su campo de ID subordinado debe ser "4".Bien, si esto se puede entender, entonces
nuestro
trabajo de transformación de relaciones está básicamente completado.Comencemos a diseñar esta tabla de datos relacionales (tomando Sql Server 7.0 como ejemplo):
+-----------+-----------+----- --- ---+-----------+----------+
| Nombre del campo | Significado del campo | Tipo de campo | Tamaño del campo |
+-----------+-----------+-----------+-----------+- ---------+
| AutoID | ID de permiso | Int | 4 |
| Nombre de energía | Nombre de permiso | Varchar |
| Información de energía | Información de permisos | Varchar |
| Pertenecer ID | Pertenecer ID | Int |
+-----------+-----------+-----------+-----------+- ---------+
Bien, una vez diseñada la estructura, puede ingresar fácilmente los datos de su prueba.
Luego, nos centraremos en cómo imitar la estructura jerárquica en la página web para mostrar el programa ASP con esta función. Este es también el paso más crítico.
Lista de programas: powerlist.asp
<%
'Conexión de base de datos
establecer conexión=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="
'Abrir todos los datos de la capa principal
establecer rs=Server.CreateObject("ADODB.Recordset")
rs.Open "seleccione * de poderes donde el ID de pertenencia es nulo orden por ID de poder",conn,1,3
'Asignar valor inicial a la variable de expresión de número de nivel
format_i=1
'Listar la sección principal del programa
do while not rs.eof
'Imprimir información de datos de la capa principal
respuesta.write "<a href='powerlist.asp?SelfID=" & rs("powerid") & "&BelongID=" & rs("belongid") & "'>" & rs("powername") & "< /a>"
Response.write "<br>"
'Llamada a subrutina, procesamiento de datos de subcapa
Llame a ListSubPower(rs("powerid"))
rs.movenext
loop
'Cerrar el conjunto de datos de la capa principal
rs.cerrar
establecer rs = nada
'Subrutina de procesamiento de datos de subcapa
Sub ListSubPower(id)
'Abre toda la información de datos de la subcapa que pertenece al powerid superior
establecer rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers donde perteneceid=" & id & " ordenar por powerid",conn,1,3
'Datos de subcapa de columna
do while not rs_sub.eof
'Número de nivel expresión variable acumulación progresiva
format_i=format_i+1
'Control de formato de sangría de bucle, debido a que los niveles superior y segundo no requieren sangría, por lo que se hace referencia a este segmento de programa desde el tercer nivel
para i=format_i al 3 paso -1
respuesta.escribir "|"
respuesta.escribir " "
siguiente
'Imprimir información de datos de subcapa
respuesta.escribir " |----"
respuesta.write "<a href='powerlist.asp?SelfID=" & rs_sub("powerid") & "&BelongID=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "< /a>"
Response.write "<br>"
'Llama recursivamente a la subrutina para procesar gradualmente los datos de la subcapa
ListSubPower(rs_sub("powerid"))
rs_sub.movenext
loop
'El número de niveles indica que la variable va disminuyendo progresivamente
format_i=format_i-1
'Cerrar el conjunto de datos de la subcapa
rs_sub.cerrar
establecer rs_sub=nada
Subtítulo final
%>
En el programa powerlist.asp, primero abrimos los datos de nivel superior y los mostramos en el bucle, luego diseñamos una subrutina ListSubPower, que se llama en el bucle a través de un; El algoritmo recursivo abre la información de datos de la capa de subrutina y se llama repetidamente a sí mismo en el bucle interno de la subrutina para expandir los datos profundos capa por capa.
Además, en el programa se utiliza una variable estática format_i para controlar el formato de visualización de sangría.
Este artículo hace un intento simple de diseñar datos y controlar programas en una estructura de árbol. El propósito es inspirar a otros. Espero que los lectores puedan inspirarse más en este artículo.