DigiNG edición Scripting
DigiNG como herramienta S.I.G.
Nivel: avanzado
Gracias a la incorporación de soporte de Bases de Datos a DigiNG y a las tecnologías de scripting y al módulo de programación DigiNGScript podemos convertir DigiNG en un motor completo de S.I.G. como se demuestra en este artículo:
Disponemos de un archivo Digi sig.bin con entidades asociadas a una base de datos Access sig.mdb.
Haga click aquí para descargar los archivos de ejemplo.
Nuestro ejemplo consistirá en la realización paso a paso de un script de VBScript que nos permitirá ocultar en DigiNG todas las entidades y mostrar sólo aquellas cuyo número de policía y nombre de calle coincidan con un valor que especifique el usuario en un cuadro de diálogo.
El archivo sig.bin contiene la siguiente información (los elementos de color azul son meramente informativos)

El archivo de base de datos contiene tres tablas: la tabla standard de Digi CATDBS, una tabla denominada TAB sobre la cual están asociadas las entidades del archivo sig.bin y una tabla denominada CALLES con los identificadores de las calles.

Además, se ha impuesto una norma de integridad referencial entre el campo CALLE de la tabla CALLES y el campo CALLE de la tabla TAB, de modo que el campo CALLE de la tabla TAB se comporta como una clave externa ó clave foránea que referencia a la clave primaria CALLE de la tabla CALLES.
Paso 1: Determinación del número de tabla correspondiente al nombre de tabla "TAB"
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
' Liberamos memoria
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 2: Obtenemos un recordset con todos los registros que cumplan una condición determinada.
Por ahora, y para simplificar el código, vamos a fijar los parámetros de búsqueda. Vamos a buscar el número de policía 3 para la calle con índice 1 (Francisco Lujan)
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda Dim idRegistro
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM TAB WHERE (NPOLICIA='3' And CALLE=1)", digi.BaseDatos
idRegistro = rsBusqueda(0)
' Liberamos memoria
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 3: Creación de un script básico que enumere todos los elementos de un documento en DigiNG:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM TAB WHERE (NPOLICIA='3' And CALLE=1)", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
' Aquí añadiremos todo el código del programa
End If
Set entidad = digi.SiguienteEntidad
Wend
' Liberamos memoria
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 4: Ocultamos las entidades sin atributos relacionados con la tabla TAB:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Dim sw
Dim i
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM TAB WHERE (NPOLICIA='3' And CALLE=1)", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
If entidad.Atributos = 0 Then
' Esto oculta los textos de calles y los números de policía que aparecen en la imágen en color azul ya que no tienen
' asociado ningún atributo
entidad.Visible = False
Else
' La entidad tiene atributos, por lo que vamos a buscar si alguno de ellos apunta a la tabla TAB
sw = False
For i = 0 to entidad.Atributos - 1
If entidad.Atributo(i).Tabla = idTAB Then
sw = True
i = entidad.Atributos ' forzamos a finalizar el bucle en la siguiente iteración
End If
Next
If Not sw Then
entidad.Visible = False
End If
End If
End If
Set entidad = digi.SiguienteEntidad
Wend
digi.RegeneraVistaOrtogonal
' Liberamos memoria
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 5: Ocultamos las entidades que no apuntan al registro idRegistro:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Dim sw
Dim i
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM TAB WHERE (NPOLICIA='3' And CALLE=1)", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
If entidad.Atributos = 0 Then
' Esto oculta los textos de calles y los números de policía que aparecen en la imagen en color azul ya que no tienen
' asociado ningún atributo
entidad.Visible = False
Else
' La entidad tiene atributos, por lo que vamos a buscar si alguno de ellos apunta a la tabla TAB
sw = False
For i = 0 to entidad.Atributos - 1
If entidad.Atributo(i).Tabla = idTAB And entidad.Atributo(i).Registro = idRegistro Then
sw = True
i = entidad.Atributos ' forzamos a finalizar el bucle en la siguiente iteración
End If
Next
If Not sw Then
entidad.Visible = False
End If
End If
End If
Set entidad = digi.SiguienteEntidad
Wend
digi.RegeneraVistaOrtogonal
' Liberamos memoria
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 6: Hacemos la misma consulta con un INNER JOIN para poder buscar por el nombre de calle:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Dim sw
Dim i
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM TAB WHERE (NPOLICIA='3' And CALLE=1)", digi.BaseDatos
rsBusqueda.Open "SELECT * FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (NPOLICIA='3'And Nombre='Francisco Lujan')", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
If entidad.Atributos = 0 Then
' Esto oculta los textos de calles y los números de policía que aparecen en la imágen en color azul ya que no tienen
' asociado ningún atributo
entidad.Visible = False
Else
' La entidad tiene atributos, por lo que vamos a buscar si alguno de ellos apunta a la tabla TAB
sw = False
For i = 0 to entidad.Atributos - 1
If entidad.Atributo(i).Tabla = idTAB And entidad.Atributo(i).Registro = idRegistro Then
sw = True
i = entidad.Atributos ' forzamos a finalizar el bucle en la siguiente iteración
End If
Next
If Not sw Then
entidad.Visible = False
End If
End If
End If
Set entidad = digi.SiguienteEntidad
Wend
digi.RegeneraVistaOrtogonal
' Liberamos memoria
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 7: Añadimos el interface de usuario para seleccionar el nombre de la calle de entre todas las posibles:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Dim sw
Dim i
Dim listaCalles
Dim calle
Dim rsCalles
Set rsCalles = CreateObject("ADODB.Recordset")
rsCalles.Open "SELECT NOMBRE FROM CALLES", digi.BaseDatos
While NOT rsCalles.EOF
listaCalles = listaCalles + "|"
listaCalles = listaCalles + rsCalles(0)
rsCalles.MoveNext
Wend
calle = digi.ComboOpciones ("Seleccione calle", "Seleccione una calle de entre las mostradas en la siguiente lista", listaCalles)
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (NPOLICIA='3'And Nombre='Francisco Lujan')", digi.BaseDatos
rsBusqueda.Open "SELECT * FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (NPOLICIA='3'And Nombre='" & calle & "')", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
If entidad.Atributos = 0 Then
' Esto oculta los textos de calles y los números de policía que aparecen en la imágen en color azul ya que no tienen
' asociado ningún atributo
entidad.Visible = False
Else
' La entidad tiene atributos, por lo que vamos a buscar si alguno de ellos apunta a la tabla TAB
sw = False
For i = 0 to entidad.Atributos - 1
If entidad.Atributo(i).Tabla = idTAB And entidad.Atributo(i).Registro = idRegistro Then
sw = True
i = entidad.Atributos ' forzamos a finalizar el bucle en la siguiente iteración
End If
Next
If Not sw Then
entidad.Visible = False
End If
End If
End If
Set entidad = digi.SiguienteEntidad
Wend
digi.RegeneraVistaOrtogonal
' Liberamos memoria
Set rsCalles = Nothing
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Paso 8: Añadimos el interface de usuario para seleccionar el número de policía de entre todas las posibles:
Option Explicit
Dim baseDatos
Dim rsCATDBS
Dim idTAB
Dim rsBusqueda
Dim idRegistro
Dim entidad
Dim sw
Dim i
Dim listaCalles
Dim calle
Dim rsCalles
Dim listaPolicias
Dim policia
Dim rsPolicia
Set rsCalles = CreateObject("ADODB.Recordset")
rsCalles.Open "SELECT NOMBRE FROM CALLES", digi.BaseDatos
While NOT rsCalles.EOF
listaCalles = listaCalles + "|"
listaCalles = listaCalles + rsCalles(0)
rsCalles.MoveNext
Wend
calle = digi.ComboOpciones ("Seleccione calle", "Seleccione una calle de entre las mostradas en la siguiente lista", listaCalles)
Set rsPolicia = CreateObject("ADODB.Recordset")
rsPolicia.Open "SELECT NPOLICIA FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (Nombre='" & calle & "')", digi.BaseDatos
While NOT rsPolicia.EOF
listaPolicias = listaPolicias + "|"
listaPolicias = listaPolicias + rsPolicia(0)
rsPolicia.MoveNext
Wend
policia = digi.ComboOpciones ("Seleccione número de policía", "Seleccione un número de policía de entre los mostrados en la siguiente lista", listaPolicias)
Set rsCATDBS = CreateObject("ADODB.Recordset")
rsCATDBS.Open "SELECT ID FROM CATDBS WHERE NOMBRE = 'TAB'", digi.BaseDatos
idTAB = rsCATDBS(0)
Set rsBusqueda = CreateObject("ADODB.Recordset")
rsBusqueda.Open "SELECT * FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (NPOLICIA='3'And Nombre='" & calle & "')", digi.BaseDatos
rsBusqueda.Open "SELECT * FROM Tab INNER JOIN Calles ON Tab.Calle = Calles.Calle WHERE (NPOLICIA='" & policia & "'And Nombre='" & calle & "')", digi.BaseDatos
idRegistro = rsBusqueda(0)
Set entidad = digi.PrimeraEntidad(False)
While Not entidad Is Nothing
If Not entidad.Borrado Then
If entidad.Atributos = 0 Then
' Esto oculta los textos de calles y los números de policía que aparecen en la imagen en color azul ya que no tienen
' asociado ningún atributo
entidad.Visible = False
Else
' La entidad tiene atributos, por lo que vamos a buscar si alguno de ellos apunta a la tabla TAB
sw = False
For i = 0 to entidad.Atributos - 1
If entidad.Atributo(i).Tabla = idTAB And entidad.Atributo(i).Registro = idRegistro Then
sw = True
i = entidad.Atributos ' forzamos a finalizar el bucle en la siguiente iteración
End If
Next
If Not sw Then
entidad.Visible = False
End If
End If
End If
Set entidad = digi.SiguienteEntidad
Wend
digi.RegeneraVistaOrtogonal
' Liberamos memoria
Set rsPolicia = Nothing
Set rsCalles = Nothing
Set rsBusqueda = Nothing
Set baseDatos = Nothing
Set rsCATDBS = Nothing
Referencias:
Deseo aprender más acerca de ADO (ActiveX Data Objects) (en inglés)
Deseo aprender más acerca de SQL
Deseo aprender más acerca de VBScript ó JScript
Fecha de última modificación: martes, 29 de octubre de 2002
© 2002 Dreaming With Objects S.L. Todos los derechos reservados.