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.

© 2002 Digi21.net. Todos los derechos reservados.