martes, 18 de enero de 2011

PROGRAMACIÓN EN ARCVIEW

Actualización de la Tabla de un Shape a través de un Formulario
(Por Eber Risco Sence)
Requisitos:

  • Un Shape con los campos: Departamento, Provincia, Distrito, Localidad que serán de tipo Cadena.
  • Un Archivo Lista.dbf que contiene la relación de Departamentos, Provincias y Distritos.

Creación del Formulario:

  • Activamos la Extensión Dialog Designer

 


Diseñamos el Formulario:

  • 3 List Box
  • 4 Text Label
  • 1 Text Line
  • 1 Label Button

Fase de Diseño:


En Tiempo de Ejecución:

Cuando ejecutamos nuestro formulario deberá tener esta apariencia con las barras Horizontales de List Box desactivada y el Botón Actualizar apagado.



Tabla Lista.dbf

Se deberá contar una tabla “dbf” llamada Lista la cual contendrá la relación de todos los departamentos, provincias y distritos necesitados como se muestra en la figura, se puede crear la tabla en el programa Microsoft Excel y exportarla como DBF 4, luego se agregará al proyecto en el cual estamos trabajando, esta tabla es muy importante puesto que de esta obtendremos la lista de Departamentos, Provincias, Distritos.



Creamos el Script que muestre el Formulario FActualiza y la lista de Departamentos:

  • En la ventana de Proyecto escogemos Scripts y luego en New.
  • Asignamos el nombre de Rse.Open a nuestro Script
  • En la ventana del Scripts escribimos:

********** Abriendo el Formulario FActualiza **********

_FormActualiza=Av.Getproject.FindDoc("FActualiza").GetDialog
_FormActualiza.Open

'********** Definiendo Tabla y Campos a Usar **********

Tabla=Av.FindDoc("Lista.dbf")
_Tabla=Tabla.GetVTab
_CampoDepartamento=_Tabla.FindField("Departamento")
_CampoProvincia=_Tabla.FindField("Provincia")
_CampoDistrito=_Tabla.FindField("Distrito")

‘*********** Mostrando Departamentos **********

LDepartamento={}
contador=-1
For Each rec in _Tabla
Contador=Contador+1
Valor=_tabla.ReturnValue(_CampoDepartamento,Contador)
LDepartamento.Add(Valor)
End
LDepartamento.RemoveDuplicates
LDepartamento.Sort(True)
_FormDepartamento=_FormActualiza.FindByName("LstDepartamento")
_FormDepartamento.DefineFromList(LDepartamento)

'********** Seteando el Formulario **********

_FormProvincia=_FormActualiza.FindByName("LstProvincia")
_FormDistrito=_FormActualiza.FindByName("LstDistrito")
_CmdActu=_FormActualiza.FindByName("CmdActualiza")
_TxtLocal=_FormActualiza.FindByName("TxtLocalidad")
_FormProvincia.Empty
_FormDistrito.Empty
_TxtLocal.Empty
_CmdActu.SetEnabled(False)

  • Compilamos el Script     
Asignamos un Botón a nuestro Script creado:

  • Doble Clic en la Barra de Herramientas



  • Aparece la Siguiente Ventana donde seleccionamos:


  • Cerramos la ventana de personalización de ArcView.
  • Aparece un nuevo botón con el icono que hemos establecido en la barra de herramientas del entorno Vista.
  • Al hacer Clic en el nuevo botón, deberá cargar el formulario FActualiza creado.

Mostrando nuestro tema en la Vista:

Cargamos nuestro tema, el cual deberá tener en su tabla de atributos los campos que se van a llenar desde el formulario, para nuestro ejemplo los campos son Departamento, Provincia, Distrito y Localidad.

  • Vista con el Tema de Parcelas activo y visible:



  • Tabla de Atributos del Tema Parcelas con los campos necesarios:


 
Mostrando las Provincias en el Formulario:

Se deberá mostrar las provincias del departamento seleccionado en el Formulario en tiempo de ejecución.

  • Crear un Script y asignarle el nombre de Rse.Provincias
  • En la ventana del Scripts escribimos:

********** Obteniendo el valor Actual de Departamento **********

_ValorDepartamento=_FormDepartamento.GetCurrentValue

'********** Creando seleccion por Departamento **********

Seleccion =_Tabla.Getselection
Expr = "[Departamento]"+ "=" + _ValorDepartamento.quote 
_Tabla.query(Expr, Seleccion, #vtab_seltype_new)
_Tabla.UpdateSelection

'********** Creando Summarize por provincia **********

LProvincia={}
Destino = "C:\temp\datos.dbf".AsFileName
FTabla=_Tabla.Summarize(Destino,Dbase,_CampoProvincia,{_CampoDepartamento},{#VTAB_SUMMARY_FIRST})
Campo=FTabla.FindField("Provincia")
********** Agregando los Valores a la Lista **********

Contador=-1
For Each rec in FTabla
Contador=Contador+1
Valor=FTabla.ReturnValue(Campo,Contador)
LProvincia.Add(Valor)
End
LProvincia.RemoveDuplicates
LProvincia.Sort(True)

'********** Definiendo Lista de Provincia **********

_FormProvincia=_FormActualiza.FindByName("LstProvincia")
_FormProvincia.DefineFromList(LProvincia)
Seleccion.ClearAll
_FormDistrito.Empty

 


  • Compilamos el Script

Mostrando las Distritos en el Formulario:

Se deberá mostrar los distritos del departamento y Provincia seleccionados en el Formulario en tiempo de ejecución.

  • Crear un Script y asignarle el nombre de Rse.Distritos
  • En la ventana del Scripts escribimos:

'********** Obteniendo el valor Actual de Provincia **********

_ValorProvincia=_FormProvincia.GetCurrentValue

'********** Creando selcción por Departamento y Provinvia **********

Seleccion=_Tabla.GetSelection
Expr="([Departamento]="+_ValorDepartamento.Quote +")" + " And "+"([Provincia]="+_ValorProvincia.Quote +")"
_Tabla.Query(Expr,seleccion,#Vtab_SelType_Xor)
_Tabla.UpdateSelection
'********** Creando Summarize por Distrito **********

LDistrito={}
Destino = "C:\temp\datos.dbf".AsFileName
FTabla=_Tabla.Summarize(Destino,Dbase,_CampoDistrito,{_CampoDepartamento},{#VTAB_
SUMMARY_FIRST})
Campo=FTabla.FindField("Distrito")

'********** Agregando los Valores a la Lista **********

Contador=-1
For Each rec in FTabla
Contador=Contador+1
Valor=FTabla.ReturnValue(Campo,Contador)
LDistrito.Add(Valor)
End
LDistrito.Sort(True)

'********** Definiendo Lista de Distrito **********

_FormDistrito=_FormActualiza.FindByName("LstDistrito")
_FormDistrito.DefineFromList(LDistrito)
Seleccion.ClearAll

 


Activando el Botón de Actualizar del Formulario:

El Botón de actualizar de nuestro formulario deberá activarse cuando se halla introducido el nombre de la localidad en la caja de texto.

  • Crear un Script y asignarle el nombre de Rse.Activa
  • En la ventana del Scripts escribimos:

 *********** Activando el Boton de Actualizar **********

_CmdActu.SetEnabled(True)



Actualizando la tabla del Shape:

La tabla del Tema se actualizará con los datos que hemos seleccionado e ingresado de nuestro formulario, el tema deberá estar activo en la vista para que se pueda actualizar con los nuevos datos.

  • Crear un Script y asignarle el nombre de Rse.Actualiza
  • En la ventana del Scripts escribimos:
 ********** Pregunta que confirma si son correctos los datos **********

Pregunta=MsgBox.YesNo("Los Datos son Correctos","Actualizando Tabla",True)
If (Pregunta=True) Then
_ValorDistrito=_FormDistrito.GetCurrentValue
_ValorLocalidad=_TxtLocal.GetText
  
    '********** Definimos Tabla y Campos de nuestro Shape **********

Vista = Av.GetActiveDoc
Tema = Vista.GetActiveThemes.Get(0)
FTabla= Tema.GetFTab
Campos = FTabla.GetFields
'Seleccion=FTabla.Getselection
Departamento=FTabla.FindField("Departamento")
Provincia=FTabla.FindField("Provincia")
Distrito=FTabla.FindField("Distrito")
Localidad=FTabla.FindField("Localidad")
Ftabla.SetEditable(True)

  '********** Actualizamos la Tabla **********
For Each rec in FTabla
    If (_ValorDepartamento<>nil) Then
      FTabla.SetValue (Departamento, rec, _ValorDepartamento)
    end
    If (_ValorProvincia<>Nil) Then
      FTabla.SetValue (Provincia, rec, _ValorProvincia)
    end
    If (_ValorDistrito<>Nil) Then
          FTabla.SetValue (Distrito, rec, _ValorDistrito)
        end
    If (_ValorLocalidad<>Nil)  Then
      FTabla.SetValue (Localidad, rec, _ValorLocalidad)
    end
End
FTabla.SetEditable(False)

  '********** Mostramos una Imagen y cerramos formulario **********

Imagen="D:\Practicas\Esri.bmp".AsFileName
MsgBox.Banner(Imagen,4,"Su Tabla se Actualizó con los datos Ingresados")
_FormActualiza.Close

  '********** En caso los datos son erróneos seteamos el formulario **********
Else
_FormProvincia.Empty
_FormDistrito.Empty
_TxtLocal.Empty
_CmdActu.SetEnabled(False)
End



  • Compilamos el Script
Asignamos los Scripts creados a nuestro Formulario:

  •        En la Ventana de Proyecto Clic en Dialogs y doble clic en  FActualiza.
  •       Doble clic en el List Box de nombre  LstDepartamento  en la propiedad Select asignamos el Script Rse.Provincias.
  •       Doble clic en el List Box de nombre  LstProvincia  en la propiedad Select asignamos el Script Rse.Distritos.
  •       Doble clic en el Text Line de nombre  TxtLocalidad  en la propiedad Changed asignamos el Script Rse.Activa.
  •       Doble clic en el Label Button de nombre  CmdActualiza  en la propiedad click asignamos el Script Rse.Actualiza.
  •       Compilamos el Formulario pero no ejecutamos, esto lo haremos desde la vista.

    Ejecutando nuestro Formulario:
    • Debemos tener una vista abierta, con el tema a trabajar activo, deberá tener en su tabla de atributos los campos Departamento, Provincia, Distrito, Localidad.

    • La tabla “Lista.dbf” cargada en la ventana de Proyectos, la cual contiene la relación de departamentos, provincia y Distritos.

    • Clic en el icono creado, cargará el Formulario creado.

    • Seleccionamos el departamento al cual pertenece nuestras parcelas, luego la provincia, el distrito y escribimos la localidad.

    • Clic en el botón actualiza nos aparecerá un mensaje de pregunta al cual respondemos Yes si los datos son correctos, si damos clic en No el formulario se resetea y esta listo para volver a ingresar los datos.



    • Si Optamos por la opcion Yes nos mostrará una imagen como en la figura siguiente, esta imagen dependerá del archivo que Uds. Escriban en  el Script Rse.Actualiza .


    • Nuestra Tabla se Actualiza con los datos ingresados mediante el formulario.


    Video:

    A continuación les muestro un video de la aplicación descrita, desarrollada en ArcView 3.2, además de una aplicación realizada también por mí, la cual es muy parecida, pero usando los ArcObject de ArcGIS.


    Actualización de Tablas
    Cargado por eber23. - Reportajes sobre tecnología y noticias sobre ciencia.

    No hay comentarios:

    Publicar un comentario