Visual FoxPro - Compendio de Guias de Clases
Transcript of Visual FoxPro - Compendio de Guias de Clases
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
1/104
INSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORES
COMPENDIOCOMPENDIOCOMPENDIOCOMPENDIO DEDEDEDE GUIAGUIAGUIAGUIASSSS DE VISUAL FOXPRODE VISUAL FOXPRODE VISUAL FOXPRODE VISUAL FOXPRO
DOCENTE: MAURICIO CADOCENTE: MAURICIO CADOCENTE: MAURICIO CADOCENTE: MAURICIO CANONONONO
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
2/104
Instituto Metropolitano de Educacin 512 44 40
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #1 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
REPASO MANEJO BSICO DE TABLAS
a) La empresa Instituto Metropolitano de Educacin, requiere el diseo de una base de datos que lepermita almacenar la siguiente informacin:
1. Maestro de Programas: programas de estudio2. Maestro de asignaturas: asignaturas de estudio.3. Hojas de vida de los estudiantes: informacin bsica de los estudiantes.4. Informacin de matrcula: informacin de matrcula semestral.
Se requiere disear la estructura de las 4 tablas tal y como se indica a continuacin:
b) Genere los campos claves indicados en cada estructura.c) Introduzca informacin dentro de cada tabal. Mnimo cinco registros por tabla. Trate de que lainformacin sea ceida a la realidad.d) Genere los formularios para automatizar procesos con las 4 tablas.
e) Genere cuatro consultas. Una para cada tabla.f) Ejecute los comandos de la hoja Resumen de Comandos dados por el docente. Abra manualmente lastablas y ejecute los comandos. Esto con el objetivo de memorizar rdenes que durante las tareas deprogramacin, se hace muy comn su uso.
Nota:La programacin es un arte que se logra mediante la prctica. La memoria juega un papelimportante a la hora de escribir cdigo de programas. Una de las ventajas de los nuevos lenguajesVisuales, es el de esconder un poco el cdigo, pero eso no significa que no sea necesario aprender unpoco de las rdenes que caracterizan a cada lenguaje.
2. Maestro de AsignaturasNombre Campo Tipo de datos AnchoCodigo Carcter 10Nombre Carcter 50Programa Carcter 2
Campo clave ascendente: Codigo
1. Maestro de ProgramasNombre Campo Tipo de datos AnchoCodigo Carcter 2Nombre Carcter 50
Campo clave ascendente: Codigo
4. MatrculaNombre Campo Tipo de datos AnchoCodigo Carcter 10Fecha Fecha 8Nivel Carcter 2
Jornada Carcter 1Estado Carcter 1Observacin Memo 10
Campo clave ascendente: Codigo
3. Hojas de vidaNombre Campo Tipo de datos AnchoCodigo Carcter 10Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResidencia Carcter 20DirResidencia Carcter 40FechaNacimto Fecha 8
Campo clave ascendente: Codigo
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
3/104
Visual FoxPro - Gua de clases #1 2
Instituto Metropolitano de Educacin 512 44 40
REPASO COMANDOS DEL FOXPRO
COMANDOS PARA MANIPULAR TABLAS
CREATE Crear una tabla.USE Abrir una tabla.
USE ALIAS Abre una tabla y selecciona el rea de trabajo en la cual se deseatrabajar.USE Cierra cualquier tabla abierta en el rea de trabajo activa
MODIFY STRUCTURE Modificar la estructura de la tabla abierta.CLOSE ALL Cerrar todos los ficheros abiertos en el sistema FoxPro.
SELECT Selecciona el reaNde trabajo
COMANDOS PARA MANIPULAR REGISTROS
APPEND Agregar registros a la tabla abiertaAPPEND BLANK Agregar un registro en blanco a la tabla abierta
SCATTER MEMVAR Llevar el registro activo a un arreglo de memoria
GATHER MEMVAR Llevar un arreglo de memoria al registro activoDELETE Borrar el registro activo
DELETE ALL Borrar todos los registros de la tabla abiertaDELETE ALL FOR
Borrar todos los registros que cumplan con la condicin.
RECALL Recuperar o retirar la marca de borrado lgica de un registroRECALL ALL Recuperar todos los registros con la marca de borrado lgica.
RECALL ALL FOR
Recuperar todos los registros que cumplan con la condicin.
COMANDOS PARA MOVERSE ENTRE REGISTROS
GO TOP Ir al primer registro de la tabla abiertaGO BOTTOM Ir al ultimo registro de la tabla abierta.
SKIP + Mueve el puntero de los registros +N posiciones (Avanzar)SKIP - Mueve el puntero de los registros N posiciones (Retroceder)
COMANDOS PARA TRABAJAR NDICES COMPUESTOS
USE ORDERTAG
Abre la tabla indicada y selecciona el como clasificacin delos registros, lo indicado porndice.
SET ORDER TO TAG
Selecciona el ndice como orden para los registros.
SET ORDER TO Cierra cualquier fichero ndice activado para una tabla.SEEK Busca un dato en un campo clave.
FOUND() Funcin utilizada para verificar el xito de una bsqueda.INDEX ON TAG FOR
Genera un fichero ndice compuesto basado en el campo clave y utilizacomo filtrado de datos la especificada.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
4/104
Visual FoxPro - Gua de clases #1 3
Instituto Metropolitano de Educacin 512 44 40
CONSULTAS COMPLEMENTO DE LAS CLASES
Un programador debe consumir y devorar gran cantidad de documentacin. En una clase es imposibledarle todas las tcnicas disponibles a un estudiante. El estudiante debe poner mucho de su parte ydocumentarse acerca de los temas vistos en clase. Se plantean las siguientes consultas para queapoyemos como estudiante, una buena labor por parte del docente.
Investigar los comandos SET
Investigar las funciones SYS()
Que son las reas de trabajo? Cuales son las ordenes bsicas para manipular reas de trabajo? Comose aplican dentro de la programacin de Visual FoxPro?
La Programacin orientada a objetos en el Visual Foxpro. Como funciona? Que son las clases?Como se programan las Clases? Que es la clase wizstyle?
Que es el lenguaje SQL? Cuales son las ordenes bsicas del lenguaje SQL? Como se aplican dentrodel FoxPro?
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
5/104
Visual FoxPro - Gua de clases #1 4
Instituto Metropolitano de Educacin 512 44 40
COMPLEMENTO GUA DE CLASES #1
LAS REAS DE TRABAJO
Cuando una aplicacin requiere ms de una tabla para poder funcionar, se hace necesario el trabajar lasreas de trabajo. Aunque es bien sabido, con las recientes versiones del Visual Foxpro y su maravilloso
entorno de programacin, se hace innecesaria utilizar las rdenes que permiten controlar las reas detrabajo. El mismo entorno y estilo de programacin del Visual Foxpro ocultan el funcionamiento de lasreas de trabajo y dejan todo el control a la opcin entorno de datos.
Sin embargo, es muy til el conocer los comandos que permiten el manejo de las reas de trabajo.
a. USE / ALIAS
Permite abrir una tabla y asignar un alisa o nombre interno para referencias subsecuentes.Muchos diseos de aplicaciones requieren de largos y complejos nombres en las tablas. Elasignar un alias resulta til a la hora de hacer referencia en forma fcil dentro del cdigo de la
aplicacin.
Sintaxis: USE ORDER TAG ALIAS
El Id Alias es un nombre corto para hacer referencia a la tabla en rdenes subsecuentes a suejecucin. Si no se utiliza la opcin ALIAS, el sistema asignar automticamente como alias elmismo nombre de la tabla.
Ver el ejemplo siguiente para comprender el uso de esta orden.
b. SELECT n
Activa el rea de trabajo indicada por la n. Un rea de trabajo es un espacio asignado enmemoria para la tabla que se abra inmediatamente despus de ejecutada la orden. FoxPro tienegran capacidad para asignar reas, as que si la aplicacin requiere de muchas tablassimultneamente abiertas en memoria, no vamos a tener ningn problema.
Para designar el rea de trabajo podemos utilizar nmero del 1 hasta donde lleguemos encantidad de tablas. O podemos utilizar letras para hacer referencias a las reas, iniciando por laletra A. Existe un identificador especial para nombrar reas y es el cero (0). Este identificador leindica al FoxPro que utilice el rea mxima disponible para reas de trabajo. Esta referencia esbastante til para utilizar en rutinas subsecuentes y distantes de la rutina inicial cuando se
abrieron todas las tablas requeridas.
Una vez se selecciona el rea de trabajo y se abre una tabla, para hacer referencia a la tabla,basta con aplicar la orden SELECT acompaada del rea programada.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
6/104
Visual FoxPro - Gua de clases #1 5
Instituto Metropolitano de Educacin 512 44 40
Analicemos el siguiente cdigo:
1 SELECT 1USE PROGRAMAS ORDER TAG CODIGO ALIAS PROG
Activar el rea 1 o AAbrir la tabla programas y utilizarcomo alias PROG.
2 SELECT 2
USE ASIGNA ORDER TAGCODIGO
Activar el rea 2 o B.
Abrir la tabla ASIGNA. El alias automticamente de estatabla es ASIGNA, el mismo nombre de la tabla.
3 SELECT CUSE MATRIC ORDER TAG CODIGO
Activar el rea 3 o C.Abrir la tabla MATRIC. El alias automticamente deesta tabla es MATRIC, el mismo nombre de la tabla.
4 SELECT PROG
DELE ALL
Selecciona y activa el rea 1. Se utiliza el mismo aliasasignado a la tabla.Borra todos los registros de la tabla PROGRAMAS
5 SELECT BLIST
Selecciona y activa el rea 2.Lista el contenido de la tabla ASIGNA.
6 SELECT 3BROWSE
Selecciona y activa el rea 3.Ejecuta la ventana Examinar en la tabla MATRIC.
Si ejecutamos la orden:
SELECT 0USE PROFESOR ORDER TAG CODIGO ALIAS PROFE
Se utilizara como rea de trabajo la 4 o D. Como alias asignado a la tabla, quedara PROFE. Elcomando SELECT 0 es muy til cuando se desea abrir una tabla de forma temporal, para luegovolver a la tabla que estaba abierta cuando se invoco. Por ejemplo, la siguiente seccin decdigo, guarda en una variable el rea seleccionada, abre una tabla en el rea mximadisponible, examinar la informacin, la cierra y regresa al rea inicial de trabajo.
mAlias = alias()mFilter = filter()
SELECT 0USE NOTAS ORDER TAG CODIGOBROWSEUSE
SELECT mAliasSET FILTER TO FILTER
Nota: Para cerrar todas las tablas abiertas, puede utilizar CLOSE ALL. Si solo desea cerrar latabla de un rea en especial, utilice la orden USE. Por ejemplo, de acuerdo al cdigo mostradohace unos momentos, si desea cerrar la tabla ASIGNA ejecute las siguientes ordenes:
SELE 2USE
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
7/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #2 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
EL ACCESO A UNA APLICACIN
Lo normal en cualquier aplicacin, es que una vez se carguen en el computador, nos reciban con una pantalla de
acceso, solicitndonos datos de identificacin tales como Cdigo de la Compaa, Nombre de Usuario yContrasea del Usuario. Es por esta razn, que se plantea como primer tema de clases, el disear una pantalla quepermita controlar el acceso de los usuarios e internamente, ensearle al sistema en que lugar del computador residela informacin.
En esta pantalla se maneja internamente variables pblicas que se utilizarn en cuanto formulario se disee dentrode la aplicacin. La variable pblica _CodCia incluye el cdigo de la compaa ingresada, _NomCia el nombre dela empresa (usada en los reportes), _DirCia es el directorio de datos de la compaa, _CodUsua es el cdigo delusuario conectado al sistema. En la gua de clases #3 aparece un tip de programacin que permite agilizar el diseode aplicaciones que dependan de variables de configuracin tal como las anteriores.
1: mCodigo2: mUsuario
3: mClave
4: btnAceptar5: btnCancelar
BtnAceptar.click
*verificar informacin entrada por el usuarioselect cias
_CodCia = alltrim( thisform.mCodigo.value)
seek _CodCiaif found()
*verificar existencia tabla de usuariosmTabla = alltrim( cias.directorio) +"usuarios.dbf"if !file( mtabla)
wait window"No existen Usuarios" nowaitrelease thisformcancel
endif
*abrir tabla de usuarios de la cia entradasele 2use &mTabla order tag codigo
_CodUsua = alltrim (thisform.mUsuario.value)
seek _CodUsuaif found()
*verificar clavemclave = alltrim( thisform.mclave.value)if alltrim (usuarios.clave)=mclave
*dejar entrarwait window"Puede entrar el Sistema" nowaitrelease thisform
elsewait window "Clave Incorrecta" nowait
endifelse
*no existe usuariowait window "Usuario no Existe" nowait
endifelse
wait window"Compaia no Existe" nowaitendif
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
8/104
Visual FoxPro - Gua de Clases #2 2
Instituto Metropolitano de Educacin
Formulario.Initset echo offset talk offset date to mdy*enrutar al directorio base de la aplicacinset default to c:\clasefox
public _CodCia, _NomCia, _DirCia, _CodUsua_CodCia = space( 2)_NomCia = space( 50)_DirCia = space( 100)_CodUsua = space( 10)
*tabla de las compaasselect 1use cias order tag codigo
BtnCancelar.Click
close allrelease thisform
NOTA: La tcnica empleada para esta pantalla, es la de disear aplicaciones independientes de los datos.
Muchos programdores amarran sus aplicaciones a las bases de datos. Los sistemas tienden a crecer daa da, puede que inicialmente diseemos una aplicacin con directorio de almacenamiento local (en elmismo disco duro), y cuando menos lo pensamos, se nos hace la peticin de que se requiere almacenar las
bases de datos en un servidor (algo normal en una empresa).
Debemos disear aplicaciones que reconozcan el origen de los datos y que internamente en una sencillaoperacin, se dirijan al sitio de los datos y los utilicen en forma transparente para el usuario.
La rutina planteada, permite que el sistema tome la informacin de instalacin de los datos de la tabla deconfiguracin empresa (cias.dbf), capture el campo directorio y se enrute hacia ese sitio para leer losdatos de los usuarios.
Observe que en la parte en donde se permite el acceso al sistema, no existe an una instruccin quecontine la ejecucin normal de la aplicacin. Esta ser explicado en otra gua de clases. Por el momentolo importante es captar la forma en que se debe disear una aplicacin inteligente, con capacidad de hallarel origen de sus datos, bien sea que estn en el mismo disco duro, o en otro lugar (servidor o estacin) enuna red local.
RETO DE PROGRAMACIN
Trate de mejorar esta rutina colocando controles que le permitan al usuario ejecutar solo tres intentos deacceder al sistema.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
9/104
Visual FoxPro - Gua de Clases #2 3
Instituto Metropolitano de Educacin
COMPLEMENTO A LA GUA #2
LA BSQUEDA DE INFORMACIN EN TABLAS INDEXADAS
La bsqueda de informacin permite tener mayor control sobre los datos almacenados en las tablas. Parapoder buscar informacin, es importante saber manipular las rdenes de indexados, activacin de ndices,ordenes de bsqueda y funciones para el chequeo de la efectividad de las bsquedas. FoxPro trae muchasrdenes suficientes para que nuestras aplicaciones tengan control de la informacin clave de nuestrastablas.
USE TablaORDER TAG NombreTag
Abre la tabla indicada y activa como ndice el especificado por NombreTag. El xito de ejecucin deesta orden requiere que la tabla haya sido previamente indexada.
Por ejemplo, esta instruccin abre la tabla PROGRAMA y activa CODIGO como orden de la tabla.Ahora, podremos listar la informacin de la tabla clasificada por este campo o podremos ejecutar
bsquedas de datos basado en este campo clave.
USE PROGRAMA ORDER TAG CODIGO
SET ORDER TO TAG NombreTag
Permite activar el campo ndice indicado por NombreTag. Por ejemplo, la siguiente orden abre latabla PROGRAMA en una instruccin aparte, luego ejecuta SET ORDER TO TAG para establecer elcampo clave a utilizar para el ordenado de los datos o ejecucin de bsquedas:
USE PROGRAMASET ORDER TO TAG CODIGO
En este caso, es mejor utilizar una lnea para abrir la tabla y simultneamente asignar el campo deordenamiento. Esta orden resulta muy til, cuando se necesita establecer un orden para la tabla, sinnecesidad de volverla a abrir.
Por ejemplo, abrimos la tabla PROGRAMA e inmediatamente asignamos la clasificacin de los datos.
USE PROGRAMA ORDER TAG CODIGO
Si ejecutamos la siguiente orden, se listara la informacin clasificada por el la entrada claveCODIGO.
LIST
Ahora, activaremos otro campo de ordenamiento y ejecutaremos nuevamente LIST. Esta vez se listala informacin clasificada por el campo NOMBRE.
SET ORDER TO TAG NOMBRELIST
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
10/104
Visual FoxPro - Gua de Clases #2 4
Instituto Metropolitano de Educacin
INDEX ON ExpIndiceTAGNombreTagFOR !DELETED()
Esta orden permite generar una entrada especial de ndice compuesto, clasificando la informacin porla expresin de ndice ExpIndice. EL nombre de la entrada sera el indicado por NombreTag. Laclusula FOR permite establecer un filtro para los datos clasificados. En este caso, se utiliza comofiltrado de datos, a todos los registros que no se hallan borrado de la tabla. Acostmbrese a utilizaresta clusula en cuanto indexado construya. Esta instruccin le permitir tener mayor control de losdatos existentes en una tabla, y su respectivo manejo a travs de los formularios (recuerde que cuandose retira un registro con la orden DELETE este no se borra fsicamente -borrado lgico- de la tablahasta no ejecutar PACK borrado fsico-). Si no utiliza esta clusula, los informes, y muchas rdenesde recorrido de registros, incluiran a los borrados de las tablas.
Por ejemplo, la siguiente instruccin crea una entrada ndice denominada CODIGO para la tablaPROGRAMA. Adicionalmente, con la clusula FOR se filtran todos los borrados de la tabla. En latercer orden, se crea una entrada clave denominada NOMBRE.
USE PROGRAMAINDEX ON CODIGO TAG CODIGO FOR DELETED()
INDEX ON NOMBRE TAG NOMBRE FOR !DELETED()Nota: Tenga en cuenta que esta rden crea inicialmente un fichero compuesto con el mismo nombrede la tabla y con la extensin .CDX. Para el ejemplo anterior, si miramos el sitio donde se encuentraalmacenada la tabla PROGRAMA.DBF aparece un nuevo archivo denominado PROGRAMA.CDX.Las siguientes entradas ndices se agregarn al ndice compuesto.
Expresiones de ndices compuestos
Muchas veces una aplicacin requiere la construccin de ndices compuestos para poder funcionar.Por ejemplo, el detalle de las notas de unos estudiantes, podra ser un claro ejemplo de ello. La tablade notas (por diseo del software) contiene solo el campo CODIGO del estudiante y el campo
CODASIGNA que incluye el cdigo de las asignaturas.
USE NOTASINDEX ON CODIGO +CODASIGNA TAG CODASIGNA FOR DELETED()
La clase de Ingeniera de Software le ensear el momento preciso en que se requieren ndicescompuestos para una aplicacin.
Esta clase de ndices tambin se requieren a veces para listar informacin referente a una mismaclave. Por ejemplo, si se tiene la tabla ESTGRUPO para almacenar los estudiantes en los grupos declase, con un campo de CODGRP para el cdigo de los grupos y otro campo denominado CODEST
para guardar el cdigo de los estudiantes, la instruccin para crear el campo clave compuesto es la
siguiente:
USE ESTGRPINDEX ON CODGRP +CODEST TAG CODEST FOR DELETED()
Esta forma especial de definir campos claves involucrando a ms de un campo, debe considerarse almomento de ejecutar las bsquedas de informacin en tales tablas. El sistema FoxPro crea un solocampo clave, donde almacena la expresin resultante para clasificar la informacin de la tabla.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
11/104
Visual FoxPro - Gua de Clases #2 5
Instituto Metropolitano de Educacin
Los campos involucrados en una expresin compuesta deben ser del mismo tipo de datos. Porejemplo, si CODGRP es carcter, entonces CODEST tambin debe serlo. Si el diseo de la tablaindica que se deben involucrar campos con diverso tipo de datos, entonces se requiere la aplicacin defunciones para la conversin de los datos.
Funciones para conversin de datos
Las funciones ms utilizadas para formar expresiones de campos claves compuestos son lassiguientes:
STR( ExpresinNumrica) : convierte la expresin numrica a cadena de caracteres.
VAL( ExpresinCaracter) : convierte la expresin de caracteres a un valor numrico. La expresinaunque sea de tipo carcter, debe tener forma o estructura numrica.
DTOC( ExpresinFecha): convierte la expresin fecha a una cadena o expresin de tipo carcter.
CTOD( ExpresinFecha): convierte una expresin tipo fecha a una cadena de caracteres.
Tenga presente que la expresin de clave debe tener el mismo tipo de datos. Para saber que funcionesutilizar para armar la expresin, analice los tipos de datos y la estuctura o forma de los camposonvolucrados y aplique las funciones para armar una expesin unificada de datos. Por ejemplo, sianaliza los datos de un campo, y detecta uno de tipo carcter y otro de cualquier tipo, la clave esllevarlos a una expresin de tipo carcter.
Por ejemplo, si se tiene una tabla de KARDEX y en ella tenemos unos campos CODREF para loscdigos de los artculos y otro campo FECHA para almacenar la fecha en que se registro unareferencia en el kardex. La forma de definir el ndice es el siguiente:
USE KARDEX
INDEX ON CODREF +DTOC( FECHA) TAG CODFECHA FOR !DELETED()
Debido a que el campo CODREF es carcter y FECHA es de tipo fecha, mejor se llev la conversina cadena de caracteres. La experiencia le ensear a aplicar en forma adecuada la conversin de datosy la generacin de expresiones para ndices compuestos.
BUSCAR INFORMACIN EN UNA TABLA INDEXADA
Una de las aplicaciones de los ndices es la de permitir la bsqueda de informacin en las tablas.Adems, el uso de funciones que permiten analizar si una bsqueda fue exitosa o no.
Estas son las rdenes y funciones que permiten manipular bsquedas en campos claves activados (verla orden SET ORDER TO).
SEEK Expresin_a_buscar
Ejecuta una bsqueda en el campo clave, utilizando como criterio de bsqueda laExpresin_a_buscar.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
12/104
Visual FoxPro - Gua de Clases #2 6
Instituto Metropolitano de Educacin
La Expresin_a_buscar debe ser del mismo tipo de datos de la expresin clave generada al momentode indexar. Si ocurre lo contrario, FoxPro generar un error de tipos de datos incompatibles. Estaexpresin puede ser una variable. Tenga cuidado al definir variables para buscar informacin, porejemplo, si define la variables CODIGO y resulta que en su tabla existe un campo llamado CODIGO,el sistema, simplemente no busca nada. Para evitar esto, agregue identificadores a los nombres de lasvariables para identificarlos de los nombres de los campo, por ejemplo, agregue una m a cuantavariable defina: mCODIGO o simplemente utilice el indicador de variable de memoria ( .m) delFoxPro m.codigo.
En este ejemplo, se busca el dato almacenado en la variable mCodigo, en el campo clave CODIGOde la tabla PROGRAMA.
SELECT PROGRAMASEEK mCodigo
La orden Seek mueve automticamente el puntero al registro hallado. Lo que significa que despus deejecutada tal orden, basta activar el rea de trabajo de la tabla y ejecutar la orden deseada sobre el
registro activo. FOUND() : Esta funcin retorna el estado de xito de la orden buscar recin ejecutada. Retorna .t. si
la bsqueda fue exitosa. Retorna .f. en caso contrario. Utilice una estructura de control de flujo paradeterminar las acciones a tomar acorde al estado de la bsqueda.
Si a la secuencia de ordenes anteriores agregamos la siguiente, se obtiene un control de lo quedeseamos hacer si se hall algo o no.
IF FOUND()WAIT WINDOW SE HALL ALGO... NOWAIT
ELSE
WAIT WINDOW NO SE HALL NADA... NOWAITENDIF
Nota: como caso curioso del FoxPro, muchas veces cuando se coloca algo de por medio entre laorden SEEK y la funcin FOUND() el sistema muestra resultados inesperados, como si se le olvidaseel resultado de la bsqueda inmediatamente ejecutado el chequeo. Acostmbrese a colocar el chequeodel resultado -IF FOUND()-, inmediatamente despus del SEEK.
SEEK( mExpresion_a_buscar, Alias) : Funcin que permite buscar un registro y retornar si se hallalgo o no (ms o menos, SEEK ms FOUND() combinadas). Esta funcin resulta til para utilizar ensitios donde no se puede colocar la orden SEEK ms el chequeo con FOUND(), tales como reportes,formularios, etc. Esta funcin no mueve el puntero al registro hallado, simplemente se limita a afirmar
si el dato est o no en la tabla y campo clave seleccionado.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
13/104
Visual FoxPro - Gua de Clases #2 7
Instituto Metropolitano de Educacin
LOCATE FORExpresin_de_Condicin
Ejecuta una bsqueda secuencial, revisando registro a registro. Esta orden se puede utilizar parabuscar informacin en tablas que no estn indexadas. Esta orden permite un rango mayor debsqueda, al permitir establecer la condicin de bsqueda.
Ejemplo 1:LOCATE FOR APELLIDOS = CANO .AND. NOMBRE = MAURICIOCONTINUE
Este ejemplo, busca la primer ocurrencia de datos de la condicin apellidos igual a CANO ynombre correspondiente a MAURICIO. La instruccin CONTINUE le indica al FoxPro quecontine con la bsqueda recin iniciada.
Ejemplo 2:
La posibilidad de aceptar condiciones como parmetro de bsqueda, convierte a esta sencilla
instruccin en potente comando de programacin, que bien utilizado, puede salvarnos el da.LOCATE FOR MAURICIO $ NOMBRECONTINUE
En este ejemplo, se buscarn todos los nombres iguales a MAURICIO.
Comentarios
La tabla no necesita estar indexada.
Si LOCATE encuentra un registro coincidente, podr utilizar RECNO( ) para devolver el nmero del
registro coincidente. Si se encuentra un registro coincidente, FOUND( ) devolver verdadero (.T.) yEOF( ) devolver falso (.F.).
Despus de que LOCATE encuentre un registro coincidente, puede emitir CONTINUE para buscarregistros coincidentes adicionales en el resto de la tabla. Cuando se ejecuta CONTINUE, se reanuda el
proceso de bsqueda, empezando por el registro que sigue inmediatamente al registro coincidente.Puede emitirCONTINUErepetidamente hasta llegar al final del alcance o de la tabla.
Si no se encuentra ninguna coincidencia, RECNO( ) devolver el nmero de registros de la tabla msuno,FOUND( ) devolver falso (.F.) yEOF( ) devolver verdadero (.T.).
LOCATE y CONTINUE son especficos del rea de trabajo actual. Si se selecciona otro rea de
trabajo, el proceso de bsqueda original podr continuarse cuando se vuelva a seleccionar el rea detrabajo original.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
14/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #3 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
Las tcnicas de programacin varan de un programador a otro. Cada programador asume la tcnica quedesee para desarrollar sus aplicaciones. Sea cual sea la tcnica empleada, lo ms importante es que seafuncional.
Se propone la siguiente tcnica de programacin diseada por nuestra dependencia, muy til para eltrabajo en lnea. Permitiendo mayor velocidad al entrar, buscar , retirar y consultar datos. Cada grupo deestudio deber elaborar los diseos de las otras tablas diseadas y propuestas por la gua de clases #1.Cada grupo deber experimentar con el mtodo de trabajo propuesto y hallar las posibles fallas tcnicasde diseo (algo normal en grandes aplicaciones).
1: mCodigo 2: btnCargar 3: btnLimpiar 4: mNombre5: btnPrimero 6: btnAnterior 7: btnSiguiente 8: btnUltimo9: btnAgregar 10: btnActual 11: btnRetirar 12: btnReporte13: btnExaminar 14: btnCerrar
BtnPrimero.click
*ir al primerowait window "Primer registro..." nowaitsele 1go topscatter memvar memothisform.refreshreturn
BtnAnterior.Click*ir al anteriorsele 1if !bof()
skip -1endifif bof()
go topendifscatter memvar memothisform.refreshreturn
BtnSiguiente.Click*ir al siguiente
sele 1if !eof()
skip 1endifif eof()
go bottomendifscatter memvar memothisform.refreshreturn
BtnUltimo.Click
*ir al ultimowait window "ltimo registro..." nowaitsele 1go bottomscatter memvar memothisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
15/104
Visual FoxPro - Gua de Clases #3 2
Instituto Metropolitano de Educacin
BtnAgregar.Click*agregar registro con los datos en pantallasele 1
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocus
returnendif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
*verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()
mMens1 = "Imposible agregar, el cdigo " +mCodigo+" ya existe!" +chr(13)
mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2,
0+64, "Atencin!")thisform.mCodigo.setfocusreturn
endif
*agregar nuevo registro con los datos en pantallasele 1insert into programa from memvar
*cargar nuevos datos en blanco
scatter memvar blank
*ir al primer campothisform.mCodigo.setfocus
thisform.refresh
BtnActual.Click*actualizar el contenido de un campo
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
*actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado
gather memvar memo
wait window "Datos actualizados..." nowaitelse
mMens1 = "Imposible actualizar, el cdigo "+mCodigo +" no existe!" +chr(13)
mMens2 = "Utilice otro cdigo e intente actualizar denuevo..."
mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")
thisform.mCodigo.setfocusreturn
endif
return
BtnExaminar.Click*examinar registrossele 1browse fields codigo, nombre noedit noappend nodelete
*activar el seleccionadoscatter memvar memo
thisform.refreshreturn
BtnLimpiar.Click
*limpiar el contenido de los camposwait window "Datos en blanco..." nowaitscatter memvar memo blankthisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
16/104
Visual FoxPro - Gua de Clases #3 3
Instituto Metropolitano de Educacin
BtnRetirar.Click*retirar el registro clave halladosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif !found() && no existe codigo
mMens1 = "Imposible retirar, el cdigo "
+mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente retirarde nuevo..."
mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")
thisform.mCodigo.setfocusreturn
endif
mMens1 = "Desea retirar el cdigo " + mCodigo +" delsistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirarregistro!")
if mOpc = 1 && Clic en botn Aceptarsele 1deletewait window "Registro retirado del sistema..."
nowait
*mover puntero al prximo disponibleif !eof()
skip 1endifif eof()
go bottom
endif
endif
scatter memvar memothisform.refreshreturn
BtnCargar.Click*cargar el contenido de los campos con la clave entrada
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocus
returnendif
*cargar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado
scatter memvar memowait window "Datos cargados..." nowait
elsemMens1 = "Imposible cargar datos, el cdigo "
+mCodigo +" no existe!" +chr(13)
mMens2 = "Utilice otro cdigo e intente cargardatos de nuevo..."
mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")endif
thisform.refreshthisform.mCodigo.setfocus
return
BtnCerrar.Click
thisform.release
Form.Init*abrir entorno utilizando las variables pblicas
mFile1 = _dircia +"programa.dbf"if !file( mFile1)
do cPrograma in prg\creartblendif
sele 1use &mFile1 order tag codigo alias programa
scatter memvar memo
*ir al objeto inicialthisform.mCodigo.setfocusreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
17/104
Visual FoxPro - Gua de Clases #3 4
Instituto Metropolitano de Educacin
Rutinas adicionales para que este diseo funcione:
Se requiere una rutina que defina las tablas en forma automtica. Esta rutina dar un grado de inteligenciaal sistema, al permitirle definir las tablas que no existan, en forma automtica. Un sistema que incluya talfuncionalidad, simplemente, nunca fallar por falta de datos.
CREATBL.PRG
Esta rutina debe crearse en el generador del proyecto en Codigo/Programas. Defina la carpetaprgparaalmacenar las rutinas que definamos dentro de la carpeta del proyecto.
*creatbl.prg* Definir las tablas del sistema* invocar: do cPrograma in prg\creatbl
procedure cPrograma*chequear y definir tabla de asignaturas
*definir una cadena de tal forma "c:\clasefox\01\programa.dbf"mTabla = _dircia + "programa.dbf"
if !file( mTabla)create table &mTabla ;
( codigo c ( 10), ;nombre c ( 50))
index on codigo tag codigo for !deleted()index on nombre tag nombre for !deleted()close datawait window "Tabla "+mTabla +" definida..." nowait
endif
return && cPrograma
* creatbl.prg
TIP DE PROGRAMACIN
Es muy til el definir una rutina independiente denominada public con todas las variables pblicas autilizar durante el diseo del sistema. Con esto nos ahorramos tiempo al no tener que hacer todo elrecorrido de la aplicacin para verificar el funcionamiento de una aplicacin.
*public.prg* utilizar solo durante diseo de programas
* los datos en este programa deben ser inicializados por* la pantalla de entrada al sistema
public _codcia, _nomcia, _dircia, _codusua_codcia = "01"_nomcia = "COLEGIO 01"_dircia = "c:\clasefox\01\"_codusua = "01"* public.prg
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
18/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #4 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
Continuando con la tcnica #1, ha llegado el momento de demostrar las habilidades que comoprogramadores, hemos desarrollado hasta el momento. Gran parte del arte de la programacin, seadquiere imitando modelos hechos por otros programadores. Si como programadores, desarrollamos
rutinas que pueden ser perfectamente reutilizables en otras partes de la aplicacin, lo normal es tomar elmodelo base y copiarlo tantas veces lo necesitemos. Ms adelante aprenderemos que cuando se requierehacer esto muy a menudo, lo ms prctico es definir una clase y basar todas nuestras pantallas en ella.
EL FORMULARIO PARA EL MAESTRO DE ASIGNATURAS
Para la elaboracin del siguiente formulario abra el formulario de la gua #3 y grbelo (MenArchivo/Salvar Como) con otro nombre (frmasigna) en la carpeta donde residen los formularios(c:\clasefox\documentos). Recuerde agregarlo al proyecto en la ventana donde aparecen listados losformularios (Ventana proyecto, clic en botn Agregar).
Lo primero que haremos ahora, es abrir el formulario recin agregado, abrirlo en la ventana de diseo y
modificar el Caption del formulario, para que diga Maestro de Asignaturas. Esto es importante, ya queel tener correctamente identificadas las pantallas, nos puede llegar a ayudar a ubicarnos rpidamente en la
pantalla de trabajo, y evitar posibles dolores de cabeza al sobrescribir cdigo de pantallas ya terminadas.
Reorganice la pantalla original de programas (la recin copiada) para que incluya el campo programa dela tablaASIGNA.DBF.
1: mPrograma 2: btnAgregar 3: btnActual 4: btnExaminar
Todos los controles continan con los mismos nombres. El nuevo obje to de campo es el referenciado conel numeral 1 (mPrograma). Los objetos que aparecen referenciados con nmeros (del 1 al 4) indican queel cdigo del evento clic presenta variaciones. Los dems objetos, continan con el mismo cdigo
programado en la leccin anterior.
Ahora lo que debemos hacer, es personalizar el formulario para que apunte a la tabla en cuestin, ennuestro caso, Asigna.dbf. Debe alterar el cdigo del evento INIT del formulario, y modificar el cdigo
para que disee automticamente la tabla Asigna y abra simultneamente la tabla de programa (utilizandoreas de trabajo).
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
19/104
Visual FoxPro - Gua de Clases #4 2
Instituto Metropolitano de Educacin
BtnAgregar.Clic*agregar registro con los datos en pantallasele 1
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
if empty( thisform.mPrograma.value)wait window "Programaincorrecto..." nowaitthisform.mPrograma.setfocusreturn
endif
*verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()
mMens1 = "Imposible agregar, el cdigo " +mCodigo+" ya existe!" +chr(13)
mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64,
"Atencin!")thisform.mCodigo.setfocusreturn
endif
*validar el programa entrado por el usuariomPrograma = alltrim( thisform.mPrograma.value)sele programaseek mProgramaif !found()
mMens1 = "El cdigo de Programa "+mPrograma +" no existe!" +chr(13)
mMens2 = "Utilice un cdigo vlido e intente denuevo..."
mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")
thisform.mPrograma.setfocusreturn
endif
*agregar nuevo registro con los datos en pantallasele 1insert into asigna from memvar
*cargar nuevos datos en blancoscatter memvar blank
*ir al primer campothisform.mCodigo.setfocus
thisform.refresh
BtnActual.Click*actualizar el contenido de un campo
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
if empty( thisform.mPrograma.value)wait window "Programaincorrecto..." nowaitthisform.mPrograma.setfocusreturn
endif
*validar el programa entrado por el usuario
mPrograma = alltrim( thisform.mPrograma.value)sele programaseek mProgramaif !found()
mMens1 = "El cdigo de Programa " +mPrograma +"no existe!" +chr(13)
mMens2 = "Utilice un cdigo vlido e intente denuevo..."
mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")
thisform.mPrograma.setfocusreturn
endif
*actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado
gather memvar memowait window "Datos actualizados..." nowait
elsemMens1 = "Imposible actualizar, el cdigo " +mCodigo +"
no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente actualizar de
nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64,
"Atencin!")
thisform.mCodigo.setfocusreturnendif
sele 1
return
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
20/104
Visual FoxPro - Gua de Clases #4 3
Instituto Metropolitano de Educacin
BtnExaminar.Click*examinar registrossele 1browse fields codigo, nombre, programa noeditnoappend nodelete
*activar el seleccionadoscatter memvar memo
thisform.refreshreturn
Form.Init*abrir entorno utilizando las variables pblicas
*tabla mae stro asignaturasmFile1 = _dircia +"asigna.dbf"if !file( mFile1)
do cAsigna in prg\creatblendif
sele 1use &mFile1 order tag codigo alias asigna
*tabla maestro programasmFile2 = _dircia +"programa.dbf"if !file( mFile2)
do cPrograma in prg\creatblendif
sele 2
use &mFile2 order tag codigo alias programasele 1scatter memvar memo
*ir al objeto inicialthisform.mCodigo.setfocus
return
Observe que las modificaciones hechas al cdigo, aparecen resaltadas en Negrita. Analice que cambios
se hicieron al cdigo elaborado en la gua #3 y analice el efecto que esas nuevas instrucciones tienensobre el formulario.
Nota: Para que cada formulario se ejecute independiente de los dems, ajuste la propiedad DataSessiondel formulario a 2-Sesion Privada de Datos. Esto le indicar al FoxPro que maneje el entorno de datos decada formulario en porciones diferentes de la memoria. Si no se hace esto (1-Sesin predeterminada dedatos), se generaran innumerables errores de El archivo ya est en uso cada vez que se ejecute unformulario, inmediatamente despus de haber ejecutado otro. Esta configuracin especial le permitir alusuario abrir varias instancias de un mismo formulario, tantas veces como la memoria se lo permita(existe en la documentacin del FoxPro sobre la programacin utilizando instancias de formularios).
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
21/104
Visual FoxPro - Gua de Clases #4 4
Instituto Metropolitano de Educacin
Rutinas adicionales para que este diseo funcione:
Se requiere modificar la rutina que define las tablas en forma automtica. Se debe agregar una nuevasubrutina que permita definir la tablaAsigna.dbf.
CREATBL.PRG
Agregue este segmento de cdigo a la rutina CREATBL.PRG
procedure cAsigna*definir tabla de asignaturasmFile = "c:\clasefox\01\asigna.dbf"create table &mFile ;
( codigo c ( 10), ;nombre c ( 50), ;programa c ( 2))
index on codigo tag codigo for !deleted()index on nombre tag nombre for !deleted()
close datareturn && cAsigna
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
22/104
Visual FoxPro - Gua de Clases #4 5
Instituto Metropolitano de Educacin
RETO DE PROGRAMACIN
Agregue al formulario un control de cuadro combiando que le permita al usuario el seleccionar de unalista de programas un cdigo. Esto agilizar y ayudar al usuario a no tener que memorizar los cdigos delos programas.
Para obtener una pantalla como la anterior, haga el siguiente proceso:
1. Elimine el objeto mPrograma del formularioAsigna.
2. Agregue un control de Cuadro Combinado de la barra de herramientas del formulario. Seleccione laherramienta Cuadro Combinado y demarque el rea en el lugar donde estaba el objeto mPrograma. Noexagere con el tamao del nuevo objeto. Haga un diseo proporcional acorde a la cantidad deinformacin a mostrar.
3. Modifique las siguientes propiedades del objeto recin agregado al formulario: Name: mPrograma ControlSource: m.programa RowSource: programa.codigo, nombre RowSourceType: 2-Alias ColumnWidths: 40,200
4. Si hizo todo el trabajo bien hecho, al ejecutar el formulario, ver una forma muy efectiva de trabajo, alpermitir que el usuario seleccione los datos de las tablas relacionadas con las tablas maestras. Estodescarga al usuario, la obligacin de tener que aprenderse una serie de cdigos para introducir en los
formularios.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
23/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #5 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
TCNICA DE PROGRAMACIN #2 DISEO TIPO FOXPRO
La tcnica de programacin tipo Visual FoxPro es un diseo propuesto desde hace mucho tiempo por los
fabricantes del producto en los ejemplos y ayudas del producto. Los programadores desde entoncesvienen imitando ese modelo de programacin, que para el viejo sistema DOS y Windows 3.1. era bastantefuncional.
Muchos gerentes de sistemas prefieren que sus programadores diseen de tal forma por ser un tipo deprogramacin que controla bastante a las acciones del usuario. Esta tcnica consiste en tener botones paraindicarle a la aplicacin cuando se desea Agregar, Modificar y Retirar registros. Tambin posee unos
botones para indicar si deseamos GuardaroDeshacerlos cambios.
Lo interesante de esta tcnica radica en la forma en que activan y se activan elementos en la pantalla. Estobrinda un mayor control de las acciones de los usuarios, al bloquear los campos de datos y aquellosobjetos que se desean. El activar y desactivar elementos va reduciendo el modo de operacin del usuario,
limitndolo a aquello que solo deseamos que el usuario manipule en un momento determinado.
Recuerde que ahora que estamos en la etapa de principiantes, nos dedicaremos a construir cada pantallasin los asistentes. Cuando tengamos los elementos bsicos de la programacin orientada a objetosaprenderemos a jugar con la clase Wystilepara personalizar las pantallas de un proyecto.
EL FORMULARIO PARA EL MAESTRO DE ASIGNATURAS
Para esta pantalla, inicie un formulario en blanco y agregue los siguientes elementos:
1: mAgregar 2: btnModificar 3: btnRetirar 4: btnGuardar 5: btnDeshacer
Respecto a la tcnica nmero 1, se han hecho cambios importantes en el funcionamiento de los botonesAgregaryRetirar. Se han agregado los tres botones de Modificar, GuardaryDeshacer.
Para esta tcnica, el usuario se ve obligado a utilizar los botones de agregar o modificar para actualizar losdatos. Cuando haga clic en el botn Agregar, el sistema debe habilitar los campos de datos y botonesGuardar o Deshacer. El resto de los botones, debe deshabilitarse durante los procesos de agregar omodificar los datos. Para empezar, coloque la propiedad Enabled igual a .F. Falso para los botonesbtnGuardar, btnDeshacer y los campos de datos (mCodigo y mNombre).
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
24/104
Visual FoxPro - Gua de Clases #5 2
Instituto Metropolitano de Educacin
Evento INIT del Formulario BtnAgregar.click
*variables pblicaspublic pAgregando, pEditando
*abrir entorno utilizando las variables pblicas
close data
mFile1 = _dircia +"programa.dbf"if !file( mFile1)
do cPrograma in prg\creartblendif
sele 1use &mFile1 order tag codigo alias programa
scatter memvar memo
*ir al objeto inicialthisform.btnCerrar.setfocus
return
*indicador (flag) de proceso para agregar datospAgregando = .t.pEditando = .f.
*cargar nuevos datos en blancosele 1scatter memvar blank
*activar campos de datosthisform.mCodigo.enabled = .t.thisform.mNombre.enabled = .t.
*desactivar botones innecesarios en el proceso*de agregarthisform.btnPrimero.enabled = .f.thisform.btnAnterior.enabled = .f.
thisform.btnSiguiente.enabled = .f.thisform.btnUltimo.enabled = .f.
thisform.btnAgregar.enabled = .f.thisform.btnModificar.enabled = .f.thisform.btnRetirar.enabled = .f.
thisform.btnReporte.enabled = .f.thisform.btnExaminar.enabled = .f.
thisform.btnCerrar.enabled = .f.
*activar botones salvar y deshacerthisform.btnGuardar.enabled = .t.thisform.btnDeshacer.enabled = .t.
*ir al primer campothisform.mCodigo.setfocus
thisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
25/104
Visual FoxPro - Gua de Clases #5 3
Instituto Metropolitano de Educacin
BtnModificar.Clic
*indicador (flag) de proceso para agregar datospEditando = .t.pAgregando = .f.
*cargar datos en memoriasele 1scatter memvar memo
*el campo clave debe permanecer inactivothisform.mCodigo.enabled = .f.
*activar el resto de los camposthisform.mNombre.enabled = .t.
*desactivar botones innecesarios en el proceso*de agregar
thisform.btnPrimero.enabled = .f.thisform.btnAnterior.enabled = .f.thisform.btnSiguiente.enabled = .f.thisform.btnUltimo.enabled = .f.
thisform.btnAgregar.enabled = .f.thisform.btnModificar.enabled = .f.thisform.btnRetirar.enabled = .f.
thisform.btnReporte.enabled = .f.thisform.btnExaminar.enabled = .f.
thisform.btnCerrar.enabled = .f.
*activar botones salvar y deshacerthisform.btnGuardar.enabled = .t.thisform.btnDeshacer.enabled = .t.
*ir al siguiente campo disponible despus*del campo clavethisform.mNombre.setfocus
thisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
26/104
Visual FoxPro - Gua de Clases #5 4
Instituto Metropolitano de Educacin
BtnRetirar.Clic
*retirar el registro activomCodigo = alltrim( thisform.mCodigo.value)mMens1 = "Desea retirar el cdigo " + mCodigo +" del sistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirar registro!")
if mOpc = 1 && Clic en botn Aceptarsele 1deletewait window "Registro retirado del sistema..." nowait
*mover puntero al prximo disponibleif !eof()
skip 1endifif eof()
go bottom
endifendif
scatter memvar memothisform.refreshreturn
Al igual que en las rutinas anteriores, se requiere ejecutar la rutinaPublic.prgpara programar el acceso alos datos del sistema y la rutina creadora de la tabla de los programas acadmicos CREATBL.PRG y larutina (procedure) cPrograma . Ver las guas anteriores para mayor informacin.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
27/104
Visual FoxPro - Gua de Clases #5 5
Instituto Metropolitano de Educacin
BtnSalvar.clic
*guardar los datos
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
*verificar el campo clave si se esta agregando
if pAgregandosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found()
mMens1 = "Imposible guardar, el cdigo " +mCodigo +" existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente Agregar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")
thisform.mCodigo.setfocusreturn
endifendif
*chequear indicador de procesoif pAgregando
*agregar registroinsert into programa from memvarwait window "Registro agregado..." nowait
else*actualizar datos del registrogather memvar memowait window "Registro modificado..." nowait
endif
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
28/104
Visual FoxPro - Gua de Clases #5 6
Instituto Metropolitano de Educacin
*colocar indicadores a falsopAgregando = .f.pEditando = .f.
*desactivar campos de datosthisform.mCodigo.enabled = .f.thisform.mNombre.enabled = .f.
*activar botones necesariosthisform.btnPrimero.enabled = .t.thisform.btnAnterior.enabled = .t.thisform.btnSiguiente.enabled = .t.thisform.btnUltimo.enabled = .t.
thisform.btnAgregar.enabled = .t.thisform.btnModificar.enabled = .t.thisform.btnRetirar.enabled = .t.
thisform.btnReporte.enabled = .t.thisform.btnExaminar.enabled = .t.
thisform.btnCerrar.enabled = .t.
*desactivar botones salvar y deshacerthisform.btnGuardar.enabled = .f.thisform.btnDeshacer.enabled = .f.
return
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
29/104
Visual FoxPro - Gua de Clases #5 7
Instituto Metropolitano de Educacin
BtnDeshacer.clic
*deshacer los cambios hechos a los datossele 1scatter memvar memo
wait window "Proceso de Edicin cancelado..." nowait
*colocar indicadores a falsopAgregando = .f.pEditando = .f.
*desactivar campos de datosthisform.mCodigo.enabled = .f.thisform.mNombre.enabled = .f.
*activar botones necesariosthisform.btnPrimero.enabled = .t.
thisform.btnAnterior.enabled = .t.thisform.btnSiguiente.enabled = .t.thisform.btnUltimo.enabled = .t.
thisform.btnAgregar.enabled = .t.thisform.btnModificar.enabled = .t.thisform.btnRetirar.enabled = .t.
thisform.btnReporte.enabled = .t.thisform.btnExaminar.enabled = .t.
thisform.btnCerrar.enabled = .t.
*desactivar botones salvar y deshacerthisform.btnGuardar.enabled = .f.thisform.btnDeshacer.enabled = .f.
thisform.refresh
return
Y ahora manos a la obra!
Aplique esta tcnica de programacin,
con la tabla maestro de Asignaturas.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
30/104
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
31/104
Visual FoxPro - Gua de Clases #5 9
Instituto Metropolitano de Educacin
LA RUTINA PARA EL CONTROL DE ERRORES
El FoxPro permite la manipulacin de los errores ocurridos durante la ejecucin de una aplicacin. Aestas alturas, el alumno ya habr descubierto que existen varias clases de errores cuando se trabaja en unaaplicacin:
Er rores en tiempo de compilacin (errores de sintaxis):estos errores ocurren cuando se ha escrito malun comando o funcin. Cuando se ha escrito mal un comando o se han utilizado parmetros incorrectos,FoxPro paralizar la ejecucin del programa y sacar un mensaje de error en una caja de dilogo. Estetipo de errores son causa de una mala programacin, y el programador deber ejecutar y probar susrutinas para depurar el cdigo de su aplicacin y estar tranquilo de que todo funciona. El mismo
programador, es el nico responsable de que su aplicacin trabaje sin errores y el solo, debe analizar lacausa del error encontrado durante la ejecucin de sus aplicaciones.
Errores en tiempo de ejecucin: Estos errores aparecen cuando, una vez depurado el cdigo de unaaplicacin, el FoxPro paraliza la ejecucin por alguna razn que se sale de nuestras manos; sin embargo,con una buena rutina de control de errores, podremos indicarle a la aplicacin que hacer cuando sucedantales errores. Errores tales como disco lleno, Registro o archivo bloqueado por otro usuario, archivo no
existe, etc, son errores que pueden ser controlados y manipulados por una buena rutina de control deerrores. Ms adelante en las clases, se tratar el tema de el manejo de los errores dentro de los programas.
Con una rutina de control de errores, el programador controlar la situacin de si permite la continuacino no de la aplicacin, o determinar soluciones para continuar con la rutina iniciada. Un error por ejemplo,se presentara cuando el sistema trate de abrir una tabla que por algn motivo fue retirada del sistema porotro usuario; la rutina de control de errores se encontrara con la ausencia de tal tabla, generandoautomticamente un error de archivo no existe, esa misma rutina podra determinar el nombre origen de latabla faltante y por supuesto, crearla automticamente dentro del directorio de datos. Luego de definido elnuevo archivo, puede indicarle al FoxPro que repita la orden que gener el error y que siga la ejecucinde la aplicacin como si nada hubiese pasado.
Para adelantar trabajo, busque en el manual del sistema FoxPro, el comando ON ERROR y analice elejemplo que acompaa a la teora para ir comprendiendo este tema tan importante a la hora de programaraplicaciones.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
32/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #5 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
TCNICA DE PROGRAMACIN #3 FORMULARIOS TIPO FACTURA
Existe una rutina muy popular entre los programadores y la cual se constituye en el quebradero de
cabeza de ms de un iniciado en la programacin: el diseo de formularios que permitan la captura deinformacin en documentos tales como la factura.
Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detalle.Tambin tienen esta caracterstica los pedidos, los documentos soporte de inventario, una lista de grupos,un proceso de calificaciones, etc.
Cualquier documento empleado por una empresa y que tenga una presentacin que incluya encabezadodel documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es deaclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en estecurso, un mtodo sencillo y prctico de automatizacin.
La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencilloilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta enesta gua.
En donde reside lo complicado de programar un formulario para este documento? Cuando se efecta el
diseo de la base de datos, se descubre que es necesario dos tablas para solucionar el requerimiento deldocumento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente elcampo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte deldetalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de facturadel documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitirmanipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas queconstituyen el detalle, y actualizando el total del documento en el pie de pgina del documento. Es decir,cada vez que se actualice la cantidad o el valor unitario de una de las lneas del detalle, se debe reflejartales cambios en todo el documento.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
33/104
Visua l FoxPro - Gua de Clases #6 2
Instituto Metropolitano de Educacin
FORMULARIOS TIPO FACTURA PROPUESTO
Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Comoparte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, secolocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejoresobjetos incluidos en el Visual FoxPro, el Grid (cuadrcula). Como parmetro de los elementos a mostrar
en elgrid, utilizaremos una instruccin Select de SQL.El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula,Grupos y Estudiantes por Grupo.
2. Estudiantes por Grupo (EstGrupo)Nombre Campo Tipo de datos AnchoCodigo Carcter 10CodEstud Carcter 10ExParcial Numerico 4,2Seguim Numerico 4,2
ExFinal Numerico 4,2Wfinal Numerico 4,2NotaFinal Numerico 4,2Estado Carcter 1Campo clave ascendente:Codigo + CodEstud
1. Grupos (Grupos)Nombre Campo Tipo de datos AnchoCodigo Carcter 10
Nombre Carcter 50Asignatura Carcter 10Horario Carcter 50
Aula Carcter 50Profesor Carcter 15
Campo clave ascendente: Codigo
5. Maestro de Profesor (Profe)Nombre Campo Tipo de datos AnchoCodigo Carcter 15
Nombre Carcter 50TelResiden Carcter 15TelTrabajo Carcter 15Asignatura Carcter 100
Campo clave ascendente: Codigo
4. Matrcula (Matric)Nombre Campo Tipo de datos AnchoCodigo Carcter 10Fecha Fecha 8
Nivel Carcter 2
Jornada Carcter 1Estado Carcter 1Observa Memo 10
Campo clave ascendente: Codigo
3. Hojas de vida (Hvida) Nombre Campo Tipo de datos AnchoCodigo Carcter 10
Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResiden Carcter 20
DirResiden Carcter 40FechaNac Fecha 8
Campo clave ascendente: Codigo
7. Maestro de Asignaturas (Asigna) Nombre Campo Tipo de datos AnchoCodigo Carcter 10
Nombre Carcter 50Programa Carcter 2
Campo clave ascendente: Codigo
6. Maestro de Programas (Programa) Nombre Campo Tipo de datos AnchoCodigo Carcter 2
Nombre Carcter 50
Campo clave ascendente: Codigo
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
34/104
Visua l FoxPro - Gua de Clases #6 3
Instituto Metropolitano de Educacin
Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para sufuncionamiento. Observe que para la rutina de grupos se requiere tener almacenados datos de programas,asignaturas, profesores, hojas de vida y datos de matrcula de los estudiantes. Si no se tienen datos entales tablas, el diseo no funcionar debido a los controles de datos que efecta sobre los datos entrados
por el usuario.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
35/104
Instituto Metropolitano de Educacin
INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES
GUIA #6 DE VISUAL FOXPRODOCENTE: MAURICIO CANO
TCNICA DE PROGRAMACIN #3 FORMULARIOS TIPO FACTURA
Existe una rutina muy popular entre los programadores y la cual se constituye en el quebradero de
cabeza de ms de un iniciado en la programacin: el diseo de formularios que permitan la captura deinformacin en documentos tales como la factura.
Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detalle.Tambin tienen esta caracterstica los pedidos, los documentos soporte de inventario, una lista de grupos,un proceso de calificaciones, etc.
Cualquier documento empleado por una empresa y que tenga una presentacin que incluya encabezadodel documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es deaclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en estecurso, un mtodo sencillo y prctico de automatizacin.
La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencilloilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta enesta gua.
En donde reside lo complicado de programar un formulario para este documento? Cuando se efecta el
diseo de la base de datos, se descubre que es necesario dos tablas para solucionar el requerimiento deldocumento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente elcampo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte deldetalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de facturadel documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitirmanipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas queconstituyen el detalle, y actualizando el total del documento en el pie de pgina del documento. Es decir,cada vez que se actualice la cantidad o el valor unitario de una de las lneas del detalle, se debe reflejartales cambios en todo el documento.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
36/104
Visual FoxPro - Gua de Clases #6 2
Instituto Metropolitano de Educacin
FORMULARIOS TIPO FACTURA PROPUESTO
Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Comoparte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, secolocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejoresobjetos incluidos en el Visual FoxPro, el Grid (cuadrcula). Como parmetro de los elementos a mostrar
en elgrid, utilizaremos una instruccin Select de SQL.El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula,Grupos y Estudiantes por Grupo.
2. Estudiantes por Grupo (EstGrupo)Nombre Campo Tipo de datos Ancho
Codigo Carcter 10CodEstud Carcter 10ExParcial Numerico 4,2Seguim Numerico 4,2
ExFinal Numerico 4,2Wfinal Numerico 4,2NotaFinal Numerico 4,2Estado Carcter 1Campo clave ascendente:Codigo + CodEstud
1. Grupos (Grupos)Nombre Campo Tipo de datos Ancho
Codigo Carcter 10Nombre Carcter 50Asignatura Carcter 10Horario Carcter 50
Aula Carcter 50Profesor Carcter 15
Campo clave ascendente: Codigo
5. Maestro de Profesor (Profe)Nombre Campo Tipo de datos Ancho
Codigo Carcter 15Nombre Carcter 50TelResiden Carcter 15TelTrabajo Carcter 15Asignatura Carcter 100
Campo clave ascendente: Codigo
4. Matrcula (Matric)Nombre Campo Tipo de datos Ancho
Codigo Carcter 10Fecha Fecha 8
Nivel Carcter 2
Jornada Carcter 1Estado Carcter 1Observa Memo 10
Campo clave ascendente: Codigo
3. Hojas de vida (Hvida) Nombre Campo Tipo de datos AnchoCodigo Carcter 10
Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResiden Carcter 20
DirResiden Carcter 40FechaNac Fecha 8
Campo clave ascendente: Codigo
7. Maestro de Asignaturas (Asigna)Nombre Campo Tipo de datos Ancho
Codigo Carcter 10Nombre Carcter 50Programa Carcter 2
Campo clave ascendente: Codigo
6. Maestro de Programas (Programa)Nombre Campo Tipo de datos AnchoCodigo Carcter 2
Nombre Carcter 50
Campo clave ascendente: Codigo
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
37/104
Visual FoxPro - Gua de Clases #6 3
Instituto Metropolitano de Educacin
Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para sufuncionamiento. Observe que para la rutina de grupos se requiere tener almacenados datos de programas,asignaturas, profesores, hojas de vida y datos de matrcula de los estudiantes. Si no se tienen datos entales tablas, el diseo no funcionar debido a los controles de datos que efecta sobre los datos entrados
por el usuario.
EL FORMULARIO TIPO FACTURA
Utilizaremos la tabla de grupos y el detalle de grupos para ilustrar el funcionamiento de la tcnica deprogramacin en cuestin. Note que para esta clase de formularios, es normal combinar gran cantidad detablas a la hora de la programacin. Verifique el cdigo visto en rutinas anteriores, debido a que cambiagran cantidad de instrucciones, para dar soporte a la nueva tcnica.
1.mCodigo 2. mNombre 3. mAsignatura 4. mProfesor5. mHorario 6. mNomAsigna 7. mNomProfesor 8. mAula9. btnExaminar 10. btnReporte 11. mCodEstMaestro 12. btnAgregarDet13. btnRetirarDet 14. btnModificarDet 15. DetalleGrupo 16. mEstado17. btnPrimero 18. btnAnterior 19. btnSiguiente 20. btnUltimo21. btnAgregar 22. btnActual 23. btnRetirar 24. btnCerrar25. btnCargar 26. btnLimpiar
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
38/104
Visual FoxPro - Gua de Clases #6 4
Instituto Metropolitano de Educacin
Para crear los objetos 3, 4 y 11 utilice la tcnica enseada en clases anteriores para definir listasdesplegables basadas en otras tablas.
Objeto 3 indica la asignatura para el grupo:
ControlSource: m.asignaturaRowSource: asigna.codigo, nombre
RowSourceType: 2-AliasColumnCount: 2ColumnWitdh: 40,300
Objeto 4 indica el profesor asignado al grupo:
ControlSource: m.profesorRowSource:profe.codigo,nombreRowSourceType: 2-AliasColumnCount: 2ColumnWitdh: 40,300
Objeto 11 sirve para seleccionar estudiantes e integrarlos al grupo activo en el formulario:
RowSource: hvida.codigo, apellidos, nombreRowSourceType: 2-AliasColumnCount: 3ColumnWitdh: 70,200,200
El objeto 16 es una lista basada en valores entrados a la hora de programar que indica el estado dentro delgrupo para el estudiante:
ControlSource: m.estado
RowSource: A,Activo,S,Suspendido,C,Cancelado,N,No MatriculadoRowSourceType: 1-ValorColumnCount: 2ColumnWitdh: 40, 100
Desactive los siguientes objetos en el formulario (propiedad enabled igual a .F.-Falso): 6, 7, 12, 13, 14 y16.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
39/104
Visual FoxPro - Gua de Clases #6 5
Instituto Metropolitano de Educacin
LA RUTINA QUE INICIA TODO EL PROCESO
Como caso particular de este formulario, es que no se puede ejecutar directamente. Por problemastcnicos del Visual FoxPro, cuando se inicializan tablas en un formulario y a la vez en este se incluyenelementos de cuadrcula (grid) o cuadro de listas (combo list) simplemente no funcionan. Por tal razn,debemos crear una rutina que abra todas las tablas a usar en el sistema y llamar al formulario al final de larutina.
Como origen de datos para una cuadrcula o combo list, resulta muy til el declarar una instruccinSELECT - SQL.
Este es el contenido de la rutina I_GRUPOS.PRG (no olvide almacenarla en el sitio destinado para losprogramas):
I_GRUPOS.PRG
* Esta rutina invoca al formulario Grupos
*abrir entorno para el formulario grupos utilizando*las variables publicas
*tabla de gruposmFile1 = _dircia +"grupos.dbf"if !file( mFile1)
do cGrupos in prg\creatblendifsele 1use &mFile1 order tag codigo alias grupos
*tabla estudiantes por grupo
mFile2 = _dircia +"estgrupo.dbf"if !file( mFile2)
do cEstGrupo in prg\creatblendifsele 2use &mFile2 order tag codigo alias estgrupo
*tabla maestro asignaturasmFile3 = _dircia +"asigna.dbf"if !file( mFile3)
do cAsigna in prg\creatblendifsele 3use &mFile3 order tag codigo alias asigna
*tabla maestro programasmFile4 = _dircia +"programa.dbf"if !file( mFile4)
do cPrograma in prg\creatblendifsele 4use &mFile4 order tag codigo alias programa
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
40/104
Visual FoxPro - Gua de Clases #6 6
Instituto Metropolitano de Educacin
*tabla maestro profesoresmFile5 = _dircia +"profe.dbf"if !file( mFile5)
do cProfe in prg\creatblendifsele 5use &mFile5 order tag codigo alias profe
*tabla hojas de vidamFile6 = _dircia +"hvida.dbf"if !file( mFile6)
do cHvida in prg\creatblendifsele 6use &mFile6 order tag codigo alias hvida
*tabla matriculamFile7 = _dircia +"matric.dbf"
if !file( mFile7)do cMatric in prg\creatblendifsele 7use &mFile7 order tag codigo alias matric
sele 1
*apuntar a la carpeta de los formulariosdo form forms\grupos
return
Lo nico que hace esta rutina es abrir las tablas requeridas en diferentes reas de trabajo, asignar losrespectivos alias y por supuesto, pasar el control de ejecucin, al formulario tipo factura.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
41/104
Visual FoxPro - Gua de Clases #6 7
Instituto Metropolitano de Educacin
RUTINAS EN LOS OBJETOS DEL FORMULARIO
Formulario.INIT
*continuacin del codigo iniciado en i_grupospublic pCodEstudpCodEstud = ""
set delete on
sele 1go topscatter memvar memo
*ir al objeto inicialthisform.mCodigo.setfocus
*actualizar grid (cuadrcula)
thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refreshthisform.refresh
En esta rutina se hace uso de la instruccin SELECT-SQL y se asigna como parmetro al objetoDetalleGrupo. Cada vez que se requiera actualizar el detalle de cada grupo, simplemente invocaremosesta seccin de cdigo y refrescaremos el objeto en el formulario.
Observe que la instruccin se arma como una cadena. Esa es la razn del porqu de tantas y ; en lainstruccin. Esta orden podra colocarse en una sola lnea, pero resulta conveniente dividirla en secciones,
para poderla entender. El docente gua le indicar que hace la orden SQL empleada.
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
42/104
Visual FoxPro - Gua de Clases #6 8
Instituto Metropolitano de Educacin
Objeto BtnPrimero.Click
*ir al primerowait window "Primer registro..." nowaitsele 1go topscatter memvar memo
sele asignaseek alltrim( m.asignatura)
sele profeseek alltrim( m.profesor)
*actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;
"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
*controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.
thisform.mEstado.enabled = .f.
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
43/104
Visual FoxPro - Gua de Clases #6 9
Instituto Metropolitano de Educacin
Objeto BtnAnterior.Click
*ir al anteriorsele 1if !bof()
skip -1endif
if bof()go top
endif
scatter memvar memo
sele asignaseek alltrim( m.asignatura)
sele profe
seek alltrim( m.profesor)
*actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
*controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.thisform.mEstado.enabled = .f.
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
44/104
Visual FoxPro - Gua de Clases #6 10
Instituto Metropolitano de Educacin
Objeto btnSiguiente.click
*ir al siguientesele 1if !eof()
skip 1endif
if eof()go bottom
endif
scatter memvar memo
sele asignaseek alltrim( m.asignatura)
sele profe
seek alltrim( m.profesor)
*actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
*controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.thisform.mEstado.enabled = .f.
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
45/104
Visual FoxPro - Gua de Clases #6 11
Instituto Metropolitano de Educacin
Objeto btnUltimo.click
*ir al ultimowait window "ltimo registro..." nowaitsele 1go bottomscatter memvar memo
sele asignaseek alltrim( m.asignatura)
sele profeseek alltrim( m.profesor)
*actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;
"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
*controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.
thisform.mEstado.enabled = .f.
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
46/104
Visual FoxPro - Gua de Clases #6 12
Instituto Metropolitano de Educacin
Objeto BtnAgregar.clic
*agregar registro con los datos en pantallasele 1
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
*verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()
mMens1 = "Imposible agregar, el cdigo " +mCodigo +" ya existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn
endif
*validar la asignatura entrada por el usuariomAsignatura = alltrim( thisform.mAsignatura.value)sele asignaseek mAsignaturaif !found()
mMens1 = "El cdigo de Asignatura " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mAsignatura.setfocusreturn
endif
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
47/104
Visual FoxPro - Gua de Clases #6 13
Instituto Metropolitano de Educacin
*validar el profesor entrado por el usuariomProfesor = alltrim( thisform.mProfesor.value)sele profeseek mProfesorif !found()
mMens1 = "El cdigo de Profesor " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mProfesor.setfocusreturn
endif
*agregar nuevo registro con los datos en pantallasele 1insert into grupos from memvar
*cargar nuevos datos en blanco
scatter memvar blank*ir al primer campothisform.mCodigo.setfocus
*actualizar nuevo detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;
".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
48/104
Visual FoxPro - Gua de Clases #6 14
Instituto Metropolitano de Educacin
Objeto btnActual.click
*actualizar el contenido de un campo
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn
endif
if empty( thisform.mAsignatura.value)
wait window "Cdigo de Asignatura incorrecto..." nowaitthisform.mAsignatura.setfocusreturn
endif
if empty( thisform.mProfesor.value)wait window "Cdigo de Profesor incorrecto..." nowaitthisform.mProfesor.setfocusreturn
endif
*validar asignatura entrada por el usuario
mAsignatura = alltrim( thisform.mAsignatura.value)sele asignaseek mAsignaturaif !found()
mMens1 = "El cdigo de Asignatura " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mAsignatura.setfocusreturn
endif
*validar profesor entrado por el usuario
mProfesor = alltrim( thisform.mProfesor.value)sele profeseek mProfesorif !found()
mMens1 = "El cdigo de Profesor " +mProfesor +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mProfesor.setfocusreturn
endif
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
49/104
Visual FoxPro - Gua de Clases #6 15
Instituto Metropolitano de Educacin
*actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado
gather memvar memowait window "Datos actualizados..." nowait
elsemMens1 = "Imposible actualizar, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente actualizar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn
endif
*actualizar detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;
"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
sele 1
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
50/104
Visual FoxPro - Gua de Clases #6 16
Instituto Metropolitano de Educacin
Objeto btnRetirar.click*retirar el registro clave halladosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif !found() && no existe codigo
mMens1 = "Imposible retirar, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente retirar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn
endif
mMens1 = "Desea retirar el cdigo " + mCodigo +" del sistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirar registro!")
if mOpc = 1 && Clic en botn Aceptar
sele 1deletewait window "Registro retirado del sistema..." nowait
*mover puntero al prximo disponibleif !eof()
skip 1endifif eof()
go bottomendif*retirar estudiantes del grupo eliminado
sele estGrupodele all for alltrim( estGrupo.codigo) = mCodigosele 1
endif
sele 1scatter memvar memo
*actualizar detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;
"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.refreshreturn
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
51/104
Visual FoxPro - Gua de Clases #6 17
Instituto Metropolitano de Educacin
Objeto btnExaminar.click
*examinar registrossele 1
browse fields codigo, nombre ;noedit noappend nodelete
*activar el seleccionadoscatter memvar memo
*actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;
".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
thisform.refreshreturn
Objeto btnLimpiar.clic
*limpiar el contenido de los campos
wait window "Datos en blanco..." nowait
sele 1scatter memvar memo blank
*actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = ""thisform.DetalleGrupo.refresh
thisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
52/104
Visual FoxPro - Gua de Clases #6 18
Instituto Metropolitano de Educacin
Objeto btnCargar.click
*cargar el contenido de los campos con la clave entrada
*verificar si hay datos en blancoif empty( thisform.mCodigo.value)
wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn
endif
*cargar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado
scatter memvar memowait window "Datos cargados..." nowait
else mMens1 = "Imposible cargar datos, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente cargar datos de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")
endif
*actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;
"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
thisform.refreshthisform.mCodigo.setfocus
return
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
53/104
Visual FoxPro - Gua de Clases #6 19
Instituto Metropolitano de Educacin
Objeto mCodEstMaestro.valid
*activar los otros botones para el detalle
thisform.btnAgregarDet.enabled = .t.thisform.btnRetirarDet.enabled = .t.thisform.btnModificarDet.enabled = .t.
mCodEstMaestro.whenreturn !empty( m.codigo)
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
54/104
Visual FoxPro - Gua de Clases #6 20
Instituto Metropolitano de Educacin
Objeto btnAgregarDet.whenreturn !empty( m.codigo) .and. !empty( thisform.mCodEstMaestro.value)BtnAgregarDet.valid*agregar codigo seleccionado al detalle del grupo
mCodEstud = alltrim( thisform.mCodEstMaestro.value)
*validar cdigo en maestro estudiantessele hvidaseek mCodEstudif !found()
mMens1 = "Imposible agregar al detalle, el cdigo " +mCodEstud +" no existe enel maestro!" +chr(13)
mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodEstMaestro.setfocusreturn
endif
*verificar estudiante en el gruposele estgrupomGrupo = alltrim( m.codigo)seek mGrupo + mCodEstudif found()
mMens1 = "Imposible agregar estudiante al grupo, el cdigo " +mCodEstud +" yaexiste!" +chr(13)
mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodEstMaestro.setfocusreturn
endif
*agregar linea al detalleinsert into estGrupo ;
( codigo, codEstud, estado) ;values ;
( mGrupo, mCodEstud, "A")
*actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;
"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;
"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "
thisform.DetalleGrupo.refresh
*keyboard "{ctrl+w}"thisform.refresh
-
7/30/2019 Visual FoxPro - Compendio de Guias de Clases
55/104
Visual FoxPro - Gua de Clases #6 21
Instituto Metropolitano de Educacin
Objeto BtnRetirarDet.valid
*retirar el registro seleccionado en el detalle*utilizar pCodEstud como clave de seleccion
if empty( pCodEstud)mMens1 = "Seleccione un cdigo del detalle e intente retirar de nuevo..."mOpc = messagebox( mMens1, 0+64, "Atencin!")thisform.DetalleGrupo.setfocusreturn
endif
sele estGrupomCodigo = alltrim( m.codigo) +alltrim( pCodEstud)seek mCodigoif !found() && no existe codigo
mMens1 = "Imposible retirar, el cdigo " + pCodEstud +" no existe en el detalle!"+chr(13)
mMens2 = "Seleccione un cdigo del detalle e intente retirar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")pCodEstud = ""thisform.DetalleGrupo.setfocu