Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
: Marcos Jara
Introduccin
En este documento se explica como realizar un programa completo de ABM (Altas-Bajas-Modificaciones) en Visual FoxPro para acceder a Bases de Datos externas tipo MS-Access, utilizando la clase [BD] de la librera para ejecucin de SQL . En este ejemplo se utilizar la base de datos de estudio [Biblioteca.mdb] de Microsoft Access y el ABM se realizar sobre la tabla Libros. Este ejemplo desarrolla el ABM de la forma ms bsica, de tal forma que el Alumno pueda comprender el funcionamiento y pueda aplicarlos a otros ejemplos con funcionalidades ms complejas y especficas. Los pasos para la creacin del ABM son los siguientes: 1. 2. 3. Crear una clase botonesABM: Esta clase contendr los botones comunmente utilizados en la mayora de los ABMs de cualquier sistema, estos botones son el Guardar, Incluir, Modificar, Eliminar, Cancelar y Cerrar. Crear una clase botonesNavegador: Esta clase tambin contendr botones, pero dichos botones sern tiles para la navegacin de registros, ej: primero, anterior, siguiente y ltimo. Crear el formulario para el ABM de Libro: Este es el formulario propiamente, donde se debern insertar todos los campos necesarios para insertar o actualizar datos en la Tabla. En este formulario tambin se insertarn la clase botonesABM y la clase botonesNavegador, creados en los pasos anteriores.
Debe cambiar el nombre de cada uno de los botones a: bGuardar, bIncluir, bModificar, bEliminar, bCancelar y bCerrar respectivamente.
Propiedades a crear
Mtodos a crear
Crear las siguientes propiedades en la clase:
ModoEditar(), metodo que controla los 2 estados de la barra de botones, estado edicion y conculta. PostModoEditar(), mtodo que ser implementado posteriormente en el formulario.
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
Mtodos a implementar
Debe implementar en el mtodo CLIC de cada botn las acciones para llamar a mtodos del formulario, por ejemplo, en el mtodo CLIC del botn GUARDAR debe implementar lo siguiente: THISFORM.ACTIONGUARDAR() Esto har que cuando se presione sobre el botn Guardar se ejecute un mtodo del formulario llamado ACTIONGUARDAR(), mtodo que ser creado e implementado posteriormente en el formulario. A continuacin se especifican las dems acciones para cada uno de los botones:
botn GUARDAR boton INCLUIR botn MODIFICAR botn ELIMINAR botn CANCELAR botn CERRAR
A continuacin debe implementarse el mtodo creado a principios en la clase, llamado modoEditar(), para controlar el estado de la barra de botones, a continuacin se detalla las instrucciones que debe hacer en ste mtodo:
MTODO: BotonesABM.MODOEDITAR()
LPARAMETERS valorLogico
THIS.BGuardar.Enabled = valorLogico THIS.BIncluir.Enabled = !valorLogico THIS.BModificar.Enabled = !valorLogico THIS.BEliminar.Enabled = !valorLogico THIS.BCancelar.Enabled = valorLogico
THIS.POSTMODOEDITAR(valorLogico) Esto har posible que el conjunto de botones dentro de la clase botonesABM, est disponible en dos estados: el modo de edicin de registros y el modo de consulta de registros.
Modo de edicion de registros: cuando se llama al mtodo modoEditar(.T.) - pasando el parametro verdadero, en este momento se habilitan los botones Guardar y Cancelar y se deshabilitan los botones Incluir, Modificar y Eliminar. Modo de consulta de registros: cuando se llama al mtodo modoEditar(.F.) - pasando el parametro falso, en este momento se habilitan los botones Incluir, Modificar y Eliminar y se deshabilitan los botones Guardar y Cancelar .
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
Tambin se pueden ubicar los botones de forma horizontal, cambiar su tamao, tipo de letra o utilizar imgenes para representar las acciones de primero, anterior, siguiente y ltimo, esto depender del gusto de cada desarrollador.
Propiedades a crear
Mtodos a crear
Crear la siguiente propiedade en la clase:
Para ello, desde el diseador de clases acceda al men CLASSE/NUEVO MTODO. Visual FoxPro ejecutar este evento cada vez que se cambie el valor la propiedad enabled de la clase, haciendo posible la intercepcin de dicho valor y/la ejecucin de cualquier operacin. Para mayor informacin buscar en la Ayuda de Visual FoxPro: Mtodos ACCESS Y ASSIGN.
Mtodos a implementar
Debe implementar en el mtodo CLIC de cada botn las acciones del formulario, por ejemplo:
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
botn >>
===>
THISFORM.ACTIONULTIMO()
MTODO: BotonesNavegador.ENABLED_ASSIGN()
LPARAMETERS vNewVal *To do: Modify this routine for the Assign method THIS.SetAll("Enabled", m.vNewVal)
THIS.Enabled = m.vNewVal
Inserte tambien la clase BD de la librera de classes negocio_lib, proveida para el desarrollo del abm
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
Propiedades a crear
Mtodos a crear
Se deben crear los mtodos para todas las acciones que sern ejecutadas cuando los botones de la clases creadas anteriormente (botonesABM, botonesNavegador) sean presionados. Para crear los mtodos, desde el diseador de formularios acceda al men FORMULARIO/NUEVO MTODO, aplique tambin la descripcin en cada mtodo, a continuacin se presenta un listado de los mtodos que debern ser creados:
ActionGuardar()
tendr las instrucciones para guardar un registro. Ser ejecutado cuando se presiona el botn Guardar.
ActionIncluir()
tendr las instrucciones que habilitan los campos para digitar nuevos valores. Ser ejecutado cuando se presiona el botn Incluir.
ActionModificar()
tendr las instrucciones que habilitan los campos para editar el registro. Ser ejecutado cuando se presiona el botn Modificar.
ActionEliminar()
tendr las instrucciones para eliminar el registro actual. Ser ejecutado cuando se presiona el botn Eliminar.
ActionCancelar()
tendr las instrucciones para cancelar la operacin y volver al primer registro. Ser ejecutado cuando se presiona el botn Cancelar.
ActionPrimero()
tendr las instrucciones para buscar el primer registro y mostrar en el formulario. Ser ejecutado cuando se presiona el botn Primero.
ActionAnterior()
tendr las instrucciones para buscar el registro anterior al actual. Ser ejecutado cuando se presiona el botn Anterior.
ActionSiguiente()
tendr las instrucciones para buscar el siguiente registro al actual. Ser ejecutado cuando se presiona el botn Siguiente.
ActionUltimo()
tendr las instrucciones para buscar el ltimo registro. Ser ejecutado cuando se presiona el botn Ultimo.
BuscarPorCodigo() Inicializar_Objetos()
tendr las instrucciones para buscar un registro por cdigo. tendr las instrucciones para limpiar los campos del formulario. Ser ejecutado cada vez que se desee insertar un nuevo registro en la Entidad.
TablaAObjeto() ValidarDatos()
volca los campos de la tabla temporal a los campos del formulario. verifica si se digitaron los campos obligatorios del formulario. Ser ejecutado antes de Guardar un Registro.
Mtodos a implementar
METODO: THISFORM.VALIDARDATOS()
IF EMPTY(THISFORM.TNOMBRE.Value)
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
MESSAGEBOX("Debe introducir el campo NOMBRE", 48, "Advertencia") THISFORM.TNOMBRE.SetFocus() RETURN .F. ENDIF IF EMPTY(THISFORM.TAUTOR.VALUE) MESSAGEBOX("Debe introducir el campo AUTOR", 48, "Advertencia") THISFORM.TAUTOR.SetFocus() RETURN .F. ENDIF
RETURN .T. El mtodo validardatos() verifica si los campos obligatorios del formulario se ingresaron correctamente. Si uno de los campos verificados est vacio o no se complet correctamente emite el correspondiente mensaje con MESSAGEBOX y la funcin retorna FALSO (.F.)
METODO: THISFORM.ACTIONGUARDAR()
IF THISFORM.ValidarDatos() nCod = thisform.tcodigo.Value cNom = thisform.tnombre.Value nAut = thisform.tautor.Value nCan = thisform.tcantidad.Value nEdi = thisform.tedicion.Value cObs = thisform.tobservacion.Value
IF !this.buscarPorCodigo(nCod) comandoSQL = "INSERT INTO LIBROS (lib_nombre, lib_autor, lib_cantidad, lib_edicion,; lib_observacion) VALUES (?cNom, ?nAut, ?nCan, ?nEdi, ?cObs)" ELSE comandoSQL = "UPDATE LIBROS SET lib_nombre = ?cNom, lib_autor = ?nAut, ; lib_cantidad = ?nCan, lib_edicion = ?nEdi, lib_observacion = ?cObs WHERE lib_codigo = ?nCod" ENDIF
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
ELSE MESSAGEBOX(THISFORM.controlador.cError, 16, "Error de Base de Datos") ENDIF ENDIF El mtodo actionGuardar() es llamado cuando se presiona el boton guardar de la clase botonesABM, este mtodo se encarga de guardar un registro, ya sea insertando(INSERT) o actualizando(UPDATE), dependiendo de si el cdigo actualmente activo ya existe o no en la base de datos. Tambin es importante recalcar que en la primera lnea del mtodo se hace una verificacin de datos, llamada a validarDatos(), para verificar si todos los campos estn correctamente cargados, slo si se cumple dicha condicin se guarda el Registro.
MTODO: THISFORM.ACTIONINCLUIR()
THISFORM.INICIALIZAR_OBJETOS() *--THISFORM.BotonesAbm1.MODOEDITAR(.T.) THISFORM.TNOMBRE.SetFocus() THISFORM.Refresh() Permite la edicin de los campos para crear un nuevo registro, la habilitacin o deshabilitacin de cada campo en particular , ser centralizada en el mtodo modoEditar().
METODO: THISFORM.ACTIONMODIFICAR()
IF (THISFORM.TCODIGO.Value > 0) THISFORM.BotonesAbm1.MODOEDITAR(.T.) THISFORM.TNOMBRE.SetFocus() THISFORM.Refresh() ENDIF Permite la edicin de los campos para modificar el registro actual.
MTODO: THISFORM.ACTIONELIMINAR()
IF (THISFORM.TCODIGO.Value > 0) IF MESSAGEBOX("Desea Eliminar el libro", 292, "Confirmacin")=6
this.bd.addSql(comandoSQL) this.bd.execute()
Universidad Nacional del Este Facultad Politcnica Facultad Politcnica Sede Caaguaz Carrera de Anlisis de Sistemas Taller III Base de Datos con Foxpro I Prof.: Marcos Jara
MTODO: THISFORM.ACTIONCANCELAR()
THISFORM.ACTIONPRIMERO() THISFORM.BotonesAbm1.MODOEDITAR(.F.) THISFORM.Refresh() Cancela la operacin actual y vuelve al primer registro.
MTODO: THISFORM.INICIALIZAR_DATOS()
WITH THIS .TCODIGO.VALUE = .bd.ultimoCodigo("Libros", "Lib_codigo") + 1 .TNOMBRE.VALUE = "" .TAUTOR.VALUE = 0 .TCANTIDAD.VALUE = 0 .TEDICION.VALUE = 0 .TOBSERVACION.VALUE = "" ENDWITH Este mtodo inicializa todos los campos del formulario.
MTODO: THISFORM.ACTIONPRIMERO()
comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO > 0 ORDER BY LIB_CODIGO"
this.bd.addSql(comandoSQL) this.bd.execute()
SELECT TmpResult GOTO TOP this.tablaAObjeto() Busca el primer registro de la tabla y muestra en el formulario.
MTODO: THISFORM.ACTIONANTERIOR()
nCod = THISFORM.TCODIGO.VALUE
comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO < ?nCod ORDER BY LIB_CODIGO DESC"
this.bd.addSql(comandoSQL) this.bd.execute()
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
this.tablaAObjeto()
IF (THISFORM.TCODIGO.VALUE = 0) thisform.actionPrimero() ENDIF Busca el registro anterior al actualmente activo, y muestra los campos en el formulario.
MTODO: THISFORM.ACTIONSIGUIENTE()
nCod = THISFORM.TCODIGO.VALUE comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO > ?nCod ORDER BY LIB_CODIGO"
this.bd.addSql(comandoSQL) this.bd.execute()
IF (THISFORM.TCODIGO.VALUE = 0) thisform.actionUltimo() ENDIF Busca el siguiente registro al actualmente activo, y muestra los campos en el formulario.
MTODO: THISFORM.ACTIONULTIMO()
ultimoCodigo = thisform.bd.ultimoCodigo("Libros", "Lib_codigo") comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO = ?ultimoCodigo ORDER BY LIB_CODIGO DESC"
this.bd.addSql(comandoSQL) this.bd.execute()
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
MTODO: THISFORM.TABLAAOBJETO()
SELECT TmpResult THISFORM.TCODIGO.Value THISFORM.TNOMBRE.Value THISFORM.TAUTOR.Value THISFORM.TCANTIDAD.Value THISFORM.TEDICION.Value THISFORM.TOBSERVACION.Value = TmpResult.LIB_CODIGO = TmpResult.LIB_NOMBRE = TmpResult.LIB_AUTOR = TmpResult.LIB_CANTIDAD = TmpResult.LIB_EDICION = TmpResult.LIB_OBSERVACION
MTODO: THISFORM.BUSCARPORCODIGO()
LPARAMETERS nCod comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO = ?nCod"
this.bd.addSql(comandoSQL) this.bd.execute()
IF RECCOUNT("TmpResult") <= 0 RETURN .F. ENDIF RETURN .T. Busca un registro por cdigo principal, en la base de datos.
MTODO: THISFORM.INIT()
IF !EMPTY(THISFORM.BD.CError) MESSAGEBOX(THISFORM.BD.CError, 16, "Error de BD") RETURN .F. ENDIF Verifica si no hubo error de conexin, para ejecutar o no el formulario.
MTODO: THISFORM.BOTONESABM1.POSTMODOEDITAR()
LPARAMETERS valorLogico
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
THISFORM.TEDICION.Enabled = valorLogico THISFORM.TOBSERVACION.Enabled = valorLogico THISFORM.Botonesnavegador1.Enabled = !valorLogico Habilita/Deshabilita los campos del formulario, de acuerdo a si los botones estn en modo edicion o consulta.
Se debern realizar algunos cambios en el formulario y en la cdificacin, primeramente deber incluir un nuevo TEXTBOX al lado del campo cdigo del Autor, este TEXTBOX debe llamarse tNombreAutor.
Propiedades a modificar
MTODO: THISFORM.TAUTOR.VALID()
nAutor = THISFORM.TAUTOR.VALUE comandoSQL = "SELECT AUT_NOMBRE FROM AUTORES WHERE AUT_CODIGO = ?nAutor "
this.bd.addSql(comandoSQL)
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
this.bd.execute(TMP_NOMBRE_AUTOR)
THISFORM.TAUTOR.VALUE = TMP_NOMBRE_AUTOR.AUT_NOMBRE
El mtodo VALID se intenta ejecutar cuando el usuario intenta salir de dicho campo, ya sea con Enter, Tabulador o presionando el Click en otro campo. Al salir del campo se busca el nombre del autor cuyo cdigo fue dijitado.
Para que la busqueda funcione tanto en modo de diseo como ejecucin tambin deber ser modificado el mtodo TablaAObjeto del Formulario, agregando 1 lnea ms al final del mtodo:
*Linea a Adicionar THISFORM.TAUTOR.VALID() && Llama al mtodo que busca el nombre del autor.
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara
Se deber incluir un nuevo COMMANDBUTTON al lado del campo cdigo del Libro, este COMMANDBUTTON debe llamarse bBuscar.
MTODO: THISFORM.BBUSCAR.CLICK()
nLibro = INPUTBOX(Ingrese el cdigo del Libro, Buscar, 0) comandoSQL = "SELECT * FROM LIBROS WHERE LIB_CODIGO = ?nLibro"
this.bd.addSql(comandoSQL) this.bd.execute(TmpResult)
THISFORM.TABLAAOBJETO()
Universidad Nacional del Este Facultad Politcnica Carrera de Anlisis de Sistemas Taller III Prof.: Marcos Jara