Sie sind auf Seite 1von 104

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES

COMPENDIO DE GUIAS GUIAS DE VISUAL FOXPRO DOCENTE: MAURICIO CANO CANO

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #1 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO REPASO MANEJO BSICO DE TABLAS a) La empresa Instituto Metropolitano de Educacin, requiere el diseo de una base de datos que le permita almacenar la siguiente informacin:
1. 2. 3. 4. Maestro de Programas: programas de estudio Maestro de asignaturas: asignaturas de estudio. Hojas de vida de los estudiantes: informacin bsica de los estudiantes. Informacin de matrcula: informacin de matrcula semestral.

Se requiere disear la estructura de las 4 tablas tal y como se indica a continuacin: 1. Maestro de Programas 2. Maestro de Asignaturas Nombre Campo Tipo de datos Ancho Nombre Campo Tipo de datos Codigo Carcter 2 Codigo Carcter Nombre Carcter 50 Nombre Carcter Programa Carcter Campo clave ascendente: Codigo Campo clave ascendente: Codigo 3. Hojas de vida Nombre Campo Codigo Nombre Apellidos Programa TelResidencia DirResidencia FechaNacimto Tipo de datos Carcter Carcter Carcter Carcter Carcter Carcter Fecha Ancho 10 50 50 2 20 40 8 4. Matrcula Nombre Campo Codigo Fecha Nivel Jornada Estado Observacin

Ancho 10 50 2

Tipo de datos Carcter Fecha Carcter Carcter Carcter Memo

Ancho 10 8 2 1 1 10

Campo clave ascendente: Codigo

Campo clave ascendente: Codigo

b) Genere los campos claves indicados en cada estructura. c) Introduzca informacin dentro de cada tabal. Mnimo cinco registros por tabla. Trate de que la informacin 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 las tablas y ejecute los comandos. Esto con el objetivo de memorizar rdenes que durante las tareas de programacin, se hace muy comn su uso. Nota: La programacin es un arte que se logra mediante la prctica. La memoria juega un papel importante a la hora de escribir cdigo de programas. Una de las ventajas de los nuevos lenguajes Visuales, es el de esconder un poco el cdigo, pero eso no significa que no sea necesario aprender un poco de las rdenes que caracterizan a cada lenguaje. Instituto Metropolitano de Educacin 512 44 40

Visual FoxPro - Gua de clases #1 REPASO COMANDOS DEL FOXPRO COMANDOS PARA MANIPULAR TABLAS CREATE <Tabla> USE <Tabla> USE <Tabla> ALIAS <Alias> USE MODIFY STRUCTURE CLOSE ALL SELECT <N>

Crear una tabla. Abrir una tabla. Abre una tabla y selecciona el rea de trabajo en la cual se desea trabajar. Cierra cualquier tabla abierta en el rea de trabajo activa Modificar la estructura de la tabla abierta. Cerrar todos los ficheros abiertos en el sistema FoxPro. Selecciona el rea N de trabajo

COMANDOS PARA MANIPULAR REGISTROS APPEND APPEND BLANK SCATTER MEMVAR GATHER MEMVAR DELETE DELETE ALL DELETE ALL FOR <Condicin> RECALL RECALL ALL RECALL ALL FOR <Condicin> Agregar registros a la tabla abierta Agregar un registro en blanco a la tabla abierta Llevar el registro activo a un arreglo de memoria Llevar un arreglo de memoria al registro activo Borrar el registro activo Borrar todos los registros de la tabla abierta Borrar todos los registros que cumplan con la condicin. Recuperar o retirar la marca de borrado lgica de un registro Recuperar todos los registros con la marca de borrado lgica. Recuperar todos los registros que cumplan con la condicin.

COMANDOS PARA MOVERSE ENTRE REGISTROS GO TOP GO BOTTOM SKIP +<N> SKIP -<N> Ir al primer registro de la tabla abierta Ir al ultimo registro de la tabla abierta. Mueve el puntero de los registros +N posiciones (Avanzar) Mueve el puntero de los registros N posiciones (Retroceder)

COMANDOS PARA TRABAJAR NDICES COMPUESTOS USE <Tabla> ORDER TAG <ndice> SET ORDER TO TAG <ndice> SET ORDER TO SEEK <Expresin> FOUND() INDEX ON <Campo Clave> TAG <Nombre Tag> FOR <Condicin> Abre la tabla indicada y selecciona el <ndice> como clasificacin de los registros, lo indicado por ndice. Selecciona el ndice como orden para los registros. Cierra cualquier fichero ndice activado para una tabla. Busca un dato en un campo clave. Funcin utilizada para verificar el xito de una bsqueda. Genera un fichero ndice compuesto basado en el campo clave y utiliza como filtrado de datos la <Condicin> especificada.

Instituto Metropolitano de Educacin 512 44 40

Visual FoxPro - Gua de clases #1 CONSULTAS COMPLEMENTO DE LAS CLASES

Un programador debe consumir y devorar gran cantidad de documentacin. En una clase es imposible darle todas las tcnicas disponibles a un estudiante. El estudiante debe poner mucho de su parte y documentarse acerca de los temas vistos en clase. Se plantean las siguientes consultas para que apoyemos 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? Como se 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 dentro del FoxPro?

Instituto Metropolitano de Educacin 512 44 40

Visual FoxPro - Gua de clases #1 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 las reas 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 de trabajo. El mismo entorno y estilo de programacin del Visual Foxpro ocultan el funcionamiento de las reas 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. El asignar un alias resulta til a la hora de hacer referencia en forma fcil dentro del cdigo de la aplicacin. Sintaxis: USE <Tabla> ORDER TAG <Orden> ALIAS <Id Alias> El Id Alias es un nombre corto para hacer referencia a la tabla en rdenes subsecuentes a su ejecucin. Si no se utiliza la opcin ALIAS, el sistema asignar automticamente como alias el mismo 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 en memoria para la tabla que se abra inmediatamente despus de ejecutada la orden. FoxPro tiene gran capacidad para asignar reas, as que si la aplicacin requiere de muchas tablas simultneamente abiertas en memoria, no vamos a tener ningn problema. Para designar el rea de trabajo podemos utilizar nmero del 1 hasta donde lleguemos en cantidad de tablas. O podemos utilizar letras para hacer referencias a las reas, iniciando por la letra A. Existe un identificador especial para nombrar reas y es el cero (0). Este identificador le indica al FoxPro que utilice el rea mxima disponible para reas de trabajo. Esta referencia es bastante 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.

Instituto Metropolitano de Educacin 512 44 40

Visual FoxPro - Gua de clases #1 Analicemos el siguiente cdigo: 1


SELECT 1
USE PROGRAMAS ORDER TAG CODIGO ALIAS PROG

Activar el rea 1 o A Abrir la tabla programas y utilizar como alias PROG.

2 3 4 5 6

SELECT 2

Activar el rea 2 o B.

USE ASIGNA ORDER TAG Abrir la tabla ASIGNA. El alias automticamente de esta CODIGO tabla es ASIGNA, el mismo nombre de la tabla.
SELECT C USE MATRIC ORDER TAG CODIGO SELECT PROG DELE ALL SELECT B LIST SELECT 3 BROWSE Activar el rea 3 o C. Abrir la tabla MATRIC. El alias automticamente de esta tabla es MATRIC, el mismo nombre de la tabla. Selecciona y activa el rea 1. Se utiliza el mismo alias asignado a la tabla. Borra todos los registros de la tabla PROGRAMAS Selecciona y activa el rea 2. Lista el contenido de la tabla ASIGNA. Selecciona y activa el rea 3. Ejecuta la ventana Examinar en la tabla MATRIC.

Si ejecutamos la orden: SELECT 0 USE PROFESOR ORDER TAG CODIGO ALIAS PROFE Se utilizara como rea de trabajo la 4 o D. Como alias asignado a la tabla, quedara PROFE. El comando SELECT 0 es muy til cuando se desea abrir una tabla de forma temporal, para luego volver a la tabla que estaba abierta cuando se invoco. Por ejemplo, la siguiente seccin de cdigo, guarda en una variable el rea seleccionada, abre una tabla en el rea mxima disponible, examinar la informacin, la cierra y regresa al rea inicial de trabajo. mAlias = alias() mFilter = filter() SELECT 0 USE NOTAS ORDER TAG CODIGO BROWSE USE SELECT mAlias SET FILTER TO FILTER Nota: Para cerrar todas las tablas abiertas, puede utilizar CLOSE ALL. Si solo desea cerrar la tabla de un rea en especial, utilice la orden USE. Por ejemplo, de acuerdo al cdigo mostrado hace unos momentos, si desea cerrar la tabla ASIGNA ejecute las siguientes ordenes: SELE 2 USE

Instituto Metropolitano de Educacin 512 44 40

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #2 DE VISUAL FOXPRO DOCENTE: 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 y Contrasea del Usuario. Es por esta razn, que se plantea como primer tema de clases, el disear una pantalla que permita controlar el acceso de los usuarios e internamente, ensearle al sistema en que lugar del computador reside la informacin. En esta pantalla se maneja internamente variables pblicas que se utilizarn en cuanto formulario se disee dentro de la aplicacin. La variable pblica _CodCia incluye el cdigo de la compaa ingresada, _NomCia el nombre de la empresa (usada en los reportes), _DirCia es el directorio de datos de la compaa, _CodUsua es el cdigo del usuario conectado al sistema. En la gua de clases #3 aparece un tip de programacin que permite agilizar el diseo de aplicaciones que dependan de variables de configuracin tal como las anteriores.

1: mCodigo 2: mUsuario 3: mClave 4: btnAceptar 5: btnCancelar

BtnAceptar.click
*verificar informacin entrada por el usuario select cias _CodCia = alltrim( thisform.mCodigo.value) seek _CodCia if found() *verificar existencia tabla de usuarios mTabla = alltrim( cias.directorio) +"usuarios.dbf" if !file( mtabla) wait window"No existen Usuarios" nowait release thisform cancel endif *abrir tabla de usuarios de la cia entrada sele 2 use &mTabla order tag codigo _CodUsua = alltrim (thisform.mUsuario.value)

seek _CodUsua if found() *verificar clave mclave = alltrim( thisform.mclave.value) if alltrim (usuarios.clave)=mclave *dejar entrar wait window"Puede entrar el Sistema" nowait release thisform else wait window "Clave Incorrecta" nowait endif else *no existe usuario wait window "Usuario no Existe" nowait endif else wait window"Compaia no Existe" nowait endif

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2 Formulario.Init set echo off set talk off set date to mdy *enrutar al directorio base de la aplicacin set default to c: \clasefox public _CodCia, _NomCia, _DirCia, _CodUsua _CodCia = space( 2) _NomCia = space( 50) _DirCia = space( 100) _CodUsua = space( 10) *tabla de las compaas select 1 use cias order tag codigo BtnCancelar.Click close all release 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 da a da, puede que inicialmente diseemos una aplicacin con directorio de almacenamiento local (en el mismo 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 sencilla operacin, 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 de configuracin empresa (cias.dbf), capture el campo directorio y se enrute hacia ese sitio para leer los datos de los usuarios. Observe que en la parte en donde se permite el acceso al sistema, no existe an una instruccin que contine la ejecucin normal de la aplicacin. Esta ser explicado en otra gua de clases. Por el momento lo importante es captar la forma en que se debe disear una aplicacin inteligente, con capacidad de hallar el origen de sus datos, bien sea que estn en el mismo disco duro, o en otro lugar (servidor o estacin) en una red local. RETO DE PROGRAMACIN Trate de mejorar esta rutina colocando controles que le permitan al usuario ejecutar solo tres intentos de acceder al sistema.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2 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. Para poder 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 muchas rdenes suficientes para que nuestras aplicaciones tengan control de la informacin clave de nuestras tablas. USE Tabla ORDER TAG NombreTag Abre la tabla indicada y activa como ndice el especificado por NombreTag. El xito de ejecucin de esta 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 la tabla PROGRAMA en una instruccin aparte, luego ejecuta SET ORDER TO TAG para establecer el campo clave a utilizar para el ordenado de los datos o ejecucin de bsquedas: USE PROGRAMA SET ORDER TO TAG CODIGO En este caso, es mejor utilizar una lnea para abrir la tabla y simultneamente asignar el campo de ordenamiento. Esta orden resulta muy til, cuando se necesita establecer un orden para la tabla, sin necesidad 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 clave CODIGO. LIST Ahora, activaremos otro campo de ordenamiento y ejecutaremos nuevamente LIST. Esta vez se lista la informacin clasificada por el campo NOMBRE. SET ORDER TO TAG NOMBRE LIST

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2 INDEX ON ExpIndice TAG NombreTag FOR !DELETED()

Esta orden permite generar una entrada especial de ndice compuesto, clasificando la informacin por la expresin de ndice ExpIndice. EL nombre de la entrada sera el indicado por NombreTag. La clusula FOR permite establecer un filtro para los datos clasificados. En este caso, se utiliza como filtrado de datos, a todos los registros que no se hallan borrado de la tabla. Acostmbrese a utilizar esta clusula en cuanto indexado construya. Esta instruccin le permitir tener mayor control de los datos existentes en una tabla, y su respectivo manejo a travs de los formularios (recuerde que cuando se retira un registro con la orden DELETE este no se borra fsicamente -borrado lgico- de la tabla hasta no ejecutar PACK borrado fsico-). Si no utiliza esta clusula, los informes, y muchas rdenes de recorrido de registros, incluiran a los borrados de las tablas. Por ejemplo, la siguiente instruccin crea una entrada ndice denominada CODIGO para la tabla PROGRAMA. Adicionalmente, con la clusula FOR se filtran todos los borrados de la tabla. En la tercer orden, se crea una entrada clave denominada NOMBRE. USE PROGRAMA INDEX 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 nombre de la tabla y con la extensin .CDX. Para el ejemplo anterior, si miramos el sitio donde se encuentra almacenada 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 tabla de notas (por diseo del software) contiene solo el campo CODIGO del estudiante y el campo CODASIGNA que incluye el cdigo de las asignaturas. USE NOTAS INDEX ON CODIGO +CODASIGNA TAG CODASIGNA FOR DELETED() La clase de Ingeniera de Software le ensear el momento preciso en que se requieren ndices compuestos para una aplicacin. Esta clase de ndices tambin se requieren a veces para listar informacin referente a una misma clave. Por ejemplo, si se tiene la tabla ESTGRUPO para almacenar los estudiantes en los grupos de clase, 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 ESTGRP INDEX ON CODGRP +CODEST TAG CODEST FOR DELETED() Esta forma especial de definir campos claves involucrando a ms de un campo, debe considerarse al momento de ejecutar las bsquedas de informacin en tales tablas. El sistema FoxPro crea un solo campo clave, donde almacena la expresin resultante para clasificar la informacin de la tabla.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2

Los campos involucrados en una expresin compuesta deben ser del mismo tipo de datos. Por ejemplo, si CODGRP es carcter, entonces CODEST tambin debe serlo. Si el diseo de la tabla indica que se deben involucrar campos con diverso tipo de datos, entonces se requiere la aplicacin de funciones para la conversin de los datos. Funciones para conversin de datos Las funciones ms utilizadas para formar expresiones de campos claves compuestos son las siguientes: STR( ExpresinNumrica) : convierte la expresin numrica a cadena de caracteres. VAL( ExpresinC aracter) : convierte la expresin de caracteres a un valor numrico. La expresin aunque 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 funciones utilizar para armar la expresin, analice los tipos de datos y la estuctura o forma de los campos onvolucrados y aplique las funciones para armar una expesin unificada de datos. Por ejemplo, si analiza los datos de un campo, y detecta uno de tipo carcter y otro de cualquier tipo, la clave es llevarlos a una expresin de tipo carcter. Por ejemplo, si se tiene una tabla de KARDEX y en ella tenemos unos campos CODREF para los cdigos de los artculos y otro campo FECHA para almacenar la fecha en que se registro una referencia 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 conversin a cadena de caracteres. La experiencia le ensear a aplicar en forma adecuada la conversin de datos y 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 (ver la orden SET ORDER TO ). SEEK Expresin_a_buscar Ejecuta una bsqueda Expresin_a_buscar . en el campo clave, utilizando como criterio de bsqueda la

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2

La Expresin_a_buscar debe ser del mismo tipo de datos de la expresin clave generada al momento de indexar. Si ocurre lo contrario, FoxPro generar un error de tipos de datos incompatibles. Esta expresin puede ser una variable. Tenga cuidado al definir variables para buscar informacin, por ejemplo, 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 las variables para identificarlos de los nombres de los campo, por ejemplo, agregue una m a cuanta variable defina: mCODIGO o simplemente utilice el indicador de variable de memoria (.m) del FoxPro m.codigo. En este ejemplo, se busca el dato almacenado en la variable mCodigo, en el campo clave CODIGO de la tabla PROGRAMA. SELECT PROGRAMA SEEK mCodigo La orden Seek mueve automticamente el puntero al registro hallado. Lo que significa que despus de ejecutada 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 para determinar 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 que deseamos hacer si se hall algo o no. IF FOUND() WAIT WINDOW SE HALL ALGO... NOWAIT ELSE WAIT WINDOW NO SE HALL NADA... NOWAIT ENDIF Nota: como caso curioso del FoxPro, muchas veces cuando se coloca algo de por medio entre la orden SEEK y la funcin FOUND() el sistema muestra resultados inesperados, como si se le olvidase el resultado de la bsqueda inmediatamente ejecutado el chequeo. Acostmbrese a colocar el chequeo del resultado -IF FOUND()-, inmediatamente despus del SEEK. SEEK( mExpresion_a_buscar , Alias ) : Funcin que permite buscar un registro y retornar si se hall algo o no (ms o menos, SEEK ms FOUND() combinadas). Esta funcin resulta til para utilizar en sitios 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.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #2 LOCATE FOR Expresin_de_Condicin

Ejecuta una bsqueda secuencial, revisando registro a registro. Esta orden se puede utilizar para buscar informacin en tablas que no estn indexadas. Esta orden permite un rango mayor de bsqueda, al permitir establecer la condicin de bsqueda. Ejemplo 1: LOCATE FOR APELLIDOS = CANO .AND. NOMBRE = MAURICIO CONTINUE Este ejemplo, busca la primer ocurrencia de datos de la condicin apellidos igual a CANO y nombre correspondiente a MAURICIO. La instruccin CONTINUE le indica al FoxPro que contine 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 $ NOMBRE CONTINUE 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.) y EOF( ) devolver falso (.F.). Despus de que LOCATE encuentre un registro coincidente, puede emitir CONTINUE para buscar registros 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 emitir CONTINUE repetidamente 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 ms uno, FOUND( ) devolver falso (.F.) y EOF( ) 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 de trabajo original.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #3 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO Las tcnicas de programacin varan de un programador a otro. Cada programador asume la tcnica que desee para desarrollar sus aplicaciones. Sea cual sea la tcnica empleada, lo ms importante es que sea funcional. Se propone la siguiente tcnica de programacin diseada por nuestra dependencia, muy til para el trabajo en lnea. Permitiendo mayor velocidad al entrar, buscar , retirar y consultar datos. Cada grupo de estudio 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 tcnicas de diseo (algo normal en grandes aplicaciones).

1: mCodigo 5: btnPrimero 9: btnAgregar 13: btnExaminar

2: btnCargar 6: btnAnterior 10: btnActual 14: btnCerrar

3: btnLimpiar 7: btnSiguiente 11: btnRetirar

4: mNombre 8: btnUltimo 12: btnReporte

BtnPrimero.click *ir al primero wait window "Primer registro..." nowait sele 1 go top scatter memvar memo thisform.refresh return BtnSiguiente.Click
*ir al siguiente sele 1 if !eof() skip 1 endif if eof() go bottom endif scatter memvar memo thisform.refresh return

BtnAnterior.Click
*ir al anterior sele 1 if !bof() skip -1 endif if bof() go top endif scatter memvar memo thisform.refresh return

BtnUltimo.Click *ir al ultimo wait window "ltimo registro..." nowait sele 1 go bottom scatter memvar memo thisform.refresh return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #3 BtnAgregar.Click


*agregar registro con los datos en pantalla sele 1 *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif *verificar campo clave mCodigo = alltrim( thisform.mCodigo.value) sele 1 seek mCodigo if 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.setfocus return endif *agregar nuevo registro con los datos en pantalla sele 1 insert into programa from memvar *cargar nuevos datos en blanco scatter memvar blank *ir al primer campo thisform.mCodigo.setfocus thisform.refresh

2 BtnActual.Click
*actualizar el contenido de un campo *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif *actualizar datos del campo clave sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() && actualizar registro hallado gather memvar memo wait window "Datos actualizados..." nowait else mMens1 = "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.setfocus return endif return

BtnExaminar.Click
*examinar registros sele 1 browse fields codigo, nombre noedit noappend nodelete *activar el seleccionado scatter memvar memo thisform.refresh return

BtnLimpiar.Click *limpiar el contenido de los campos wait window "Datos en blanco..." nowait scatter memvar memo blank thisform.refresh

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #3


BtnRetirar.Click *retirar el registro clave hallado sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if !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.setfocus return 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 1 delete wait window "Registro retirado del sistema..." nowait *mover puntero al prximo disponible if !eof() skip 1 endif if eof() go bottom endif endif scatter memvar memo thisform.refresh

3 BtnCargar.Click
*cargar el contenido de los campos con la clave entrada *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif *cargar datos del campo clave sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() && actualizar registro hallado scatter memvar memo wait 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 thisform.refresh thisform.mCodigo.setfocus return

return BtnCerrar.Click thisform.release

Form.Init
*abrir entorno utilizando las variables pblicas mFile1 = _dircia +"programa.dbf" if !file( mFile1) do cPrograma in prg\creartbl endif sele 1 use &mFile1 order tag codigo alias programa scatter memvar memo *ir al objeto inicial thisform.mCodigo.setfocus return Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #3 Rutinas adicionales para que este diseo funcione:

Se requiere una rutina que defina las tablas en forma automtica. Esta rutina dar un grado de inteligencia al sistema, al permitirle definir las tablas que no existan, en forma automtica. Un sistema que incluya tal funcionalidad, simplemente, nunca fallar por falta de datos. CREATBL.PRG Esta rutina debe crearse en el generador del proyecto en Codigo/Programas. Defina la carpeta prg para almacenar 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 data wait window "Tabla "+mTabla +" definida..." nowait endif return && cPrograma *<eof> creatbl.prg TIP DE PROGRAMACIN Es muy til el definir una rutina independiente denominada public con todas las variables pblicas a utilizar durante el diseo del sistema. Con esto nos ahorramos tiempo al no tener que hacer todo el recorrido 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" *<eof> public.prg
Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #4 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO Continuando con la tcnica #1, ha llegado el momento de demostrar las habilidades que como programadores, hemos desarrollado hasta el momento. Gran parte del arte de la programacin, se adquiere 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 el modelo base y copiarlo tantas veces lo necesitemos. Ms adelante aprenderemos que cuando se requiere hacer 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 (Men Archivo/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 los formularios (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 que el 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 de la tabla ASIGNA.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 con el numeral 1 (mPrograma). Los objetos que aparecen referenciados con nmeros (del 1 al 4) indican que el 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, en nuestro 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 ( utilizando reas de trabajo).

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #4 BtnAgregar.Clic


*agregar registro con los datos en pantalla sele 1 *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif if empty( thisform.mPrograma.value) wait window "Programaincorrecto..." nowait thisform.mPrograma.setfocus return endif *verificar campo clave mCodigo = alltrim( thisform.mCodigo.value) sele 1 seek mCodigo if 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.setfocus return endif *validar el programa entrado por el usuario mPrograma = alltrim( thisform.mPrograma.value) sele programa seek mPrograma if !found() mMens1 = "El cdigo de Programa " +mPrograma +" no existe!" +chr(13) mMens2 = "Utilice un cdigo vlido e intente de nuevo..." mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!") thisform.mPrograma.setfocus return endif *agregar nuevo registro con los datos en pantalla sele 1 insert into asigna from memvar *cargar nuevos datos en blanco scatter memvar blank *ir al primer campo thisform.mCodigo.setfocus thisform.refresh

2 BtnActual.Click
*actualizar el contenido de un campo *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif if empty( thisform.mPrograma.value) wait window "Programaincorrecto..." nowait thisform.mPrograma.setfocus return endif *validar el programa entrado por el usuario mPrograma = alltrim( thisform.mPrograma.value) sele programa seek mPrograma if !found() mMens1 = "El cdigo de Programa " +mPrograma +" no existe!" +chr(13) mMens2 = "Utilice un cdigo vlido e intente de nuevo..." mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!") thisform.mPrograma.setfocus return endif *actualizar datos del campo clave sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() && actualizar registro hallado gather memvar memo wait window "Datos actualizados..." nowait else mMens1 = "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.setfocus return endif sele 1 return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #4 BtnExaminar.Click


*examinar registros sele 1 browse fields codigo, nombre, programa noedit noappend nodelete *activar el seleccionado scatter memvar memo thisform.refresh return

3 Form.Init *abrir entorno utilizando las variables pblicas *tabla mae stro asignaturas mFile1 = _dircia +"asigna.dbf" if !file( mFile1) do cAsigna in prg \creatbl endif sele 1 use &mFile1 order tag codigo alias asigna *tabla maestro programas mFile2 = _dircia +"programa.dbf" if !file( mFile2) do cPrograma in prg\creatbl endif sele 2 use &mFile2 order tag codigo alias programa sele 1 scatter memvar memo *ir al objeto inicial thisform.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 tienen sobre el formulario. Nota: Para que cada formulario se ejecute independiente de los dems, ajuste la propiedad DataSession del formulario a 2-Sesion Privada de Datos . Esto le indicar al FoxPro que maneje el entorno de datos de cada formulario en porciones diferentes de la memoria. Si no se hace esto (1-Sesin predeterminada de datos), se generaran innumerables errores de El archivo ya est en uso cada vez que se ejecute un formulario, inmediatamente despus de haber ejecutado otro. Esta configuracin especial le permitir al usuario 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).

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #4 Rutinas adicionales para que este diseo funcione: Se requiere modificar la rutina que define las tablas en forma automtica. Se debe agregar una nueva subrutina que permita definir la tabla Asigna.dbf . CREATBL.PRG Agregue este segmento de cdigo a la rutina CREATBL.PRG procedure cAsigna *definir tabla de asignaturas mFile = "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 data return && cAsigna

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #4 RETO DE PROGRAMACIN

Agregue al formulario un control de cuadro combiando que le permita al usuario el seleccionar de una lista de programas un cdigo. Esto agilizar y ayudar al usuario a no tener que memorizar los cdigos de los programas.

Para obtener una pantalla como la anterior, haga el siguiente proceso: 1. Elimine el objeto mPrograma del formulario Asigna. 2. Agregue un control de Cuadro Combinado de la barra de herramientas del formulario. Seleccione la herramienta Cuadro Combinado y demarque el rea en el lugar donde estaba el objeto mPrograma. No exagere con el tamao del nuevo objeto. Haga un diseo proporcional acorde a la cantidad de informacin 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, al permitir que el usuario seleccione los datos de las tablas relacionadas con las tablas maestras. Esto descarga al usuario, la obligacin de tener que aprenderse una serie de cdigos para introducir en los formularios.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #5 DE VISUAL FOXPRO DOCENTE: 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 entonces vienen imitando ese modelo de programacin, que para el viejo sistema DOS y Windows 3.1. era bastante funcional. Muchos gerentes de sistemas prefieren que sus programadores diseen de tal forma por ser un tipo de programacin que controla bastante a las acciones del usuario. Esta tcnica consiste en tener botones para indicarle a la aplicacin cuando se desea Agregar , Modificar y Retirar registros. Tambin posee unos botones para indicar si deseamos Guardar o Deshacer los cambios. Lo interesante de esta tcnica radica en la forma en que activan y se activan elementos en la pantalla. Esto brinda un mayor control de las acciones de los usuarios, al bloquear los campos de datos y aquellos objetos 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 pantalla sin los asistentes. Cuando tengamos los elementos bsicos de la programacin orientada a objetos aprenderemos a jugar con la clase Wystile para 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 botones Agregar y Retirar. Se han agregado los tres botones de Modificar , Guardar y Deshacer. Para esta tcnica, el usuario se ve obligado a utilizar los botones de agregar o modificar para actualizar los datos. Cuando haga clic en el botn Agregar , el sistema debe habilitar los campos de datos y botones Guardar o Deshacer. El resto de los botones, debe deshabilitarse durante los procesos de agregar o modificar los datos. Para empezar, coloque la propiedad Enabled igual a .F. Falso para los botones btnGuardar, btnDeshacer y los campos de datos (mCodigo y mNombre).

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 Evento INIT del Formulario *variables pblicas public pAgregando, pEditando *abrir entorno utilizando las variables pblicas close data mFile1 = _dircia +"programa.dbf" if !file( mFile1) do cPrograma in prg\creartbl endif sele 1 use &mFile1 order tag codigo alias programa scatter memvar memo *ir al objeto inicial thisform.btnCerrar.setfocus return *cargar nuevos datos en blanco sele 1 scatter memvar blank *activar campos de datos thisform.mCodigo.enabled = .t. thisform.mNombre.enabled = .t. BtnAgregar.click

*indicador (flag) de proceso para agregar datos pAgregando = .t. pEditando = .f.

*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 deshacer thisform.btnGuardar.enabled = .t. thisform.btnDeshacer.enabled = .t. *ir al primer campo thisform.mCodigo.setfocus thisform.refresh

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 BtnModificar.Clic *indicador (flag) de proceso para agregar datos pEditando = .t. pAgregando = .f. *cargar datos en memoria sele 1 scatter memvar memo *el campo clave debe permanecer inactivo thisform.mCodigo.enabled = .f. *activar el resto de los campos thisform.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 deshacer thisform.btnGuardar.enabled = .t. thisform.btnDeshacer.enabled = .t. *ir al siguiente campo disponible despus *del campo clave thisform.mNombre.setfocus thisform.refresh

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 BtnRetirar.Clic *retirar el registro activo mCodigo = 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 Aceptar sele 1 delete wait window "Registro retirado del sistema..." nowait *mover puntero al prximo disponible if !eof() skip 1 endif if eof() go bottom endif endif scatter memvar memo thisform.refresh return

Al igual que en las rutinas anteriores, se requiere ejecutar la rutina Public.prg para programar el acceso a los datos del sistema y la rutina creadora de la tabla de los programas acadmicos CREATBL.PRG y la rutina (procedure) cPrograma . Ver las guas anteriores para mayor informacin.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 BtnSalvar.clic *guardar los datos *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif *verificar el campo clave si se esta agregando if pAgregando sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() mMens1 = "Imposible guardar, el cdigo " +mCodigo +" existe!" +chr(13) mMens2 = "Utilice otro cdigo e intente Agreg ar de nuevo..." mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!") thisform.mCodigo.setfocus return endif endif *chequear indicador de proceso if pAgregando *agregar registro insert into programa from memvar wait window "Registro agregado..." nowait else *actualizar datos del registro gather memvar memo wait window "Registro modificado..." nowait endif

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5

*colocar indicadores a falso pAgregando = .f. pEditando = .f. *desactivar campos de datos thisform.mCodigo.enabled = .f. thisform.mNombre.enabled = .f. *activar botones necesarios thisform.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 deshacer thisform.btnGuardar.enabled = .f. thisform.btnDeshacer.enabled = .f. return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 BtnDeshacer.clic *deshacer los cambios hechos a los datos sele 1 scatter memvar memo wait window "Proceso de Edicin cancelado..." nowait *colocar indicadores a falso pAgregando = .f. pEditando = .f. *desactivar campos de datos thisform.mCodigo.enabled = .f. thisform.mNombre.enabled = .f. *activar botones necesarios thisform.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 deshacer thisform.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.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5

COMPLEMENTO A LA GUA #5 LA PROGRAMACIN MULTIUSUARIA (PARTE 1)


En esta primer entrega estudiaremos un poco el concepto de la programacin multiusuaria, un tema que pone a temblar a ms de un programador. En realidad, el programar acceso mltiple de usuarios a las mismas tablas es algo sencillo en el FoxPro, basta con tener en cuenta las consideraciones planteadas en este documento, y usted quedar listo para desarrollar aplicaciones en el sistema operativo de red que sea (lgico est, siempre y cuando soporte Visual FoxPro). ACCESO EXCLUSIVO (EXCLUSIVE) Y COMPARTIDO (SHARED) A LAS TABLAS Cuando se desarrolla una aplicacin que se requiere funcionando en redes, el programador debe considerar la posibilidad de muchos usuarios accesando a las mismas tablas. Para esto es importante saber que existe el acceso exclusivo por parte de un usuario a una tabla y el acceso compartido a las mismas. Cuando se ejecuta acceso exclusivo a una tabla, el sistema solo le permite el acceso a la tabla al usuario que hizo la solicitud, cuando otros usuarios traten de acceder a la tabla abierta como de uso exclusivo para otro usuario, se generar un error de acceso a la tabla, lo cual puede paralizar una aplicacin si no se tienen controles adecuados de error. El acceso compartido, FoxPro permite que varios usuarios utilicen la informacin de las mismas tablas simultneamente. BLOQUEO (RECORD LOCK) DE REGISTROS Y ARCHIVOS (FILE LOCK) El bloqueo de un registro consiste en que el sistema asegura el registro solicitado con el objetivo de que otras personas no puedan utilizarlo durante el tiempo en que se halle bloqueado por otro usuario. Muchos procesos requieren que los registros estn bloqueados con el objetivo de mantener la integridad de la informacin de una tabla determinada. Procesos tales como la modificacin de registros, el borrado, etc, requieren ejecutar una orden de bloqueo; una vez el usuario suelte el registro, la aplicacin debe desbloquear el registro (UNLOCK) para dejarlo disponible a los otros usuarios, de lo contrario, el registro seguira bloqueado hasta que se cierre la sesin del usuario en la aplicacin. El bloqueo de archivos (FILE LOCK) consiste en asegurar un archivo completo con el objetivo de utilizar un archivo, ejecutar algn proceso delicado, y estar seguros de que nadie ms manipular la informacin o registros del mismo. Procesos como la generacin de entradas de ndices (INDEX ON), el empaquetamiento (PACK) de los registros marcados para borrar (con la orden DELETE), la modificacin de la estructura de una tabla (MODIFY STRUCTURE), etc, requieren del bloqueo total de una tabla para su ejecucin. Es importante adems, el tener en cuenta que muchas rdenes y funciones del FoxPro requieren el bloqueo de registros o archivos para su ejecucin. Cada vez que el programador requiere utilizar una de estas rdenes, deber ejecutar el respectivo bloqueo, ejecutar la orden, y liberar el registro o la tabla bloqueada para hacerla disponible al resto de los usuarios. Debe consultar el manual del sistema FoxPro con el objetivo de conocer las rdenes que requieren tales bloqueos en los registros y en las tablas. Nota: En la siguiente entrega, mostraremos las rdenes requeridas para la programacin de aplicaciones multiusarias.
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #5 LA RUTINA PARA EL CONTROL DE ERRORES

El FoxPro permite la manipulacin de los errores ocurridos durante la ejecucin de una aplicacin. A estas alturas, el alumno ya habr descubierto que existen varias clases de errores cuando se trabaja en una aplicacin: Errores en tiempo de compilacin (errores de sintaxis): estos errores ocurren cuando se ha escrito mal un 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. Este tipo de errores son causa de una mala programacin, y el programador deber ejecutar y probar sus rutinas 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 la causa del error encontrado durante la ejecucin de sus aplicaciones. Errores en tiempo de ejecucin: Estos errores aparecen cuando, una vez depurado el cdigo de una aplicacin, 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 sucedan tales e rrores. 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 de errores. 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 continuacin o 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 por otro usuario; la rutina de control de errores se encontrara con la ausencia de tal tabla, generando automticamente un error de archivo no existe, esa misma rutina podra determinar el nombre origen de la tabla faltante y por supuesto, crearla automticamente dentro del directorio de datos. Luego de definido el nuevo archivo, puede indicarle al FoxPro que repita la orden que gener el error y que siga la ejecucin de la aplicacin como si nada hubiese pasado. Para adelantar trabajo, busque en el manual del sistema FoxPro, el comando ON ERROR y analice el ejemplo que acompaa a la teora para ir comprendiendo este tema tan importante a la hora de programar aplicaciones.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #5 DE VISUAL FOXPRO DOCENTE: 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 de informacin en documentos tales como la factura. Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detal le. 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 encabezado del documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es de aclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en este curso, un mtodo sencillo y prctico de automatizacin. La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencillo ilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta en esta gua.

En donde reside lo complic ado 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 del documento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente el campo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte del detalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de factura del documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitir manipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas que constituyen 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 reflejar tales cambios en todo el documento.

Instituto Metropolitano de Educacin

Visua l FoxPro - Gua de Clases #6

FORMULARIOS TIPO FACTURA PROPUESTO


Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Como parte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, se colocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejores objetos incluidos en el Visual FoxPro, el Grid (cuadrcula) . Como parmetro de los elementos a mostrar en el grid, utilizaremos una instruccin Select de SQL. El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula, Grupos y Estudiantes por Grupo. 1. Grupos (Grupos) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter Asignatura Carcter Horario Carcter Aula Carcter Profesor Carcter Campo clave ascendente: Codigo 3. Hojas de vida (Hvida) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter Apellidos Carcter Programa Carcter TelResiden Carcter DirResiden Carcter FechaNac Fecha Campo clave ascendente: Codigo Campo clave ascendente: Codigo 5. Maestro de Profesor (Profe) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter TelResiden Carcter TelTrabajo Carcter Asignatura Carcter Campo clave ascendente: Codigo Ancho 15 50 15 15 100 6. Maestro de Programas (Programa) Nombre Campo Tipo de datos Ancho Codigo Carcter 2 Nombre Carcter 50 Campo clave ascendente: Codigo 7. Maestro de Asignaturas (Asigna) Nombre Campo Tipo de datos Ancho Codigo Carcter 10 Nombre Carcter 50 Programa Carcter 2 Campo clave ascendente: Codigo Ancho 10 50 50 2 20 40 8 2. Estudiantes por Grupo (EstGrupo) Nombre Campo Tipo de datos Ancho Codigo Carcter 10 CodEstud Carcter 10 ExParcial Numerico 4,2 Seguim Numerico 4,2 ExFinal Numerico 4,2 Wfinal Numerico 4,2 NotaFinal Numerico 4,2 Estado Carcter 1 Campo clave ascendente: Codigo + CodEstud 4. Matrcula (Matric) Nombre Campo Tipo de datos Codigo Carcter Fecha Fecha Nivel Carcter Jornada Carcter Estado Carcter Observa Memo Ancho 10 8 2 1 1 10

Ancho 10 50 10 50 50 15

Instituto Metropolitano de Educacin

Visua l FoxPro - Gua de Clases #6

Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para su funcionamiento. 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 en tales tablas, el diseo no funcionar debido a los controles de datos que efecta sobre los datos entrados por el usuario.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #6 DE VISUAL FOXPRO DOCENTE: 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 de informacin en documentos tales como la factura. Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detal le. 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 encabezado del documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es de aclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en este curso, un mtodo sencillo y prctico de automatizacin. La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencillo ilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta en esta gua.

En donde reside lo complic ado 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 del documento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente el campo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte del detalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de factura del documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitir manipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas que constituyen 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 reflejar tales cambios en todo el documento.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6

FORMULARIOS TIPO FACTURA PROPUESTO


Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Como parte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, se colocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejores objetos incluidos en el Visual FoxPro, el Grid (cuadrcula) . Como parmetro de los elementos a mostrar en el grid, utilizaremos una instruccin Select de SQL. El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula, Grupos y Estudiantes por Grupo. 1. Grupos (Grupos) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter Asignatura Carcter Horario Carcter Aula Carcter Profesor Carcter Campo clave ascendente: Codigo 3. Hojas de vida (Hvida) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter Apellidos Carcter Programa Carcter TelResiden Carcter DirResiden Carcter FechaNac Fecha Campo clave ascendente: Codigo Campo clave ascendente: Codigo 5. Maestro de Profesor (Profe) Nombre Campo Tipo de datos Codigo Carcter Nombre Carcter TelResiden Carcter TelTrabajo Carcter Asignatura Carcter Campo clave ascendente: Codigo Ancho 15 50 15 15 100 6. Maestro de Programas (Programa) Nombre Campo Tipo de datos Ancho Codigo Carcter 2 Nombre Carcter 50 Campo clave ascendente: Codigo 7. Maestro de Asignaturas (Asigna) Nombre Campo Tipo de datos Ancho Codigo Carcter 10 Nombre Carcter 50 Programa Carcter 2 Campo clave ascendente: Codigo Ancho 10 50 50 2 20 40 8 2. Estudiantes por Grupo (EstGrupo) Nombre Campo Tipo de datos Ancho Codigo Carcter 10 CodEstud Carcter 10 ExParcial Numerico 4,2 Seguim Numerico 4,2 ExFinal Numerico 4,2 Wfinal Numerico 4,2 NotaFinal Numerico 4,2 Estado Carcter 1 Campo clave ascendente: Codigo + CodEstud 4. Matrcula (Matric) Nombre Campo Tipo de datos Codigo Carcter Fecha Fecha Nivel Carcter Jornada Carcter Estado Carcter Observa Memo Ancho 10 8 2 1 1 10

Ancho 10 50 10 50 50 15

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6

Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para su funcionamiento. 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 en tales 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 de programacin en cuestin. Note que para esta clase de formularios, es normal combinar gran cantidad de tablas a la hora de la programacin. Verifique el cdigo visto en rutinas anteriores, debido a que cambia gran cantidad de instrucciones, para dar soporte a la nueva tcnica.

1.mCodigo 5. mHorario 9. btnExaminar 13. btnRetirarDet 17. btnPrimero 21. btnAgregar 25. btnCargar

2. mNombre 6. mNomAsigna 10. btnReporte 14. btnModificarDet 18. btnAnterior 22. btnActual 26. btnLimpiar

3. mAsignatura 7. mNomProfesor 11. mCodEstMaestro 15. DetalleGrupo 19. btnSiguiente 23. btnRetirar

4. mProfesor 8. mAula 12. btnAgregarDet 16. mEstado 20. btnUltimo 24. btnCerrar

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6

Para crear los objetos 3, 4 y 11 utilice la tcnica enseada en clases anteriores para definir listas desplegables basadas en otras tablas. Objeto 3 indica la asignatura para el grupo: ControlSource: m.asignatura RowSource: asigna.codigo, nombre RowSourceType: 2-Alias ColumnCount: 2 ColumnWitdh: 40,300 Objeto 4 indica el profesor asignado al grupo: ControlSource: m.profesor RowSource: profe.codigo,nombre RowSourceType: 2-Alias ColumnCount: 2 ColumnWitdh: 40,300 Objeto 11 sirve para seleccionar estudiantes e integrarlos al grupo activo en el formulario: RowSource: hvida.codigo, apellidos, nombre RowSourceType: 2-Alias ColumnCount: 3 ColumnWitdh: 70,200,200 El objeto 16 es una lista basada en valores entrados a la hora de programar que indica el estado dentro del grupo para el estudiante: ControlSource: m.estado RowSource: A,Activo,S,Suspendido,C,Cancelado,N,No Matriculado RowSourceType: 1-Valor ColumnCount: 2 ColumnWitdh: 40, 100 Desactive los siguientes objetos en el formulario (propiedad enabled igual a .F.-Falso): 6, 7, 12, 13, 14 y 16.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 LA RUTINA QUE INICIA TODO EL PROCESO

Como caso particular de este formulario, es que no se puede ejecutar directamente. Por problemas tcnicos del Visual FoxPro, cuando se inicializan tablas en un formulario y a la vez en este se incluyen elementos 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 la rutina. Como origen de datos para una cuadrcula o combo list, resulta muy til el declarar una instruccin SELECT - SQL. Este es el contenido de la rutina I_GRUPOS.PRG (no olvide almacenarla en el sitio destinado para los programas): I_GRUPOS.PRG * Esta rutina invoca al formulario Grupos *abrir entorno para el formulario grupos utilizando *las variables publicas *tabla de grupos mFile1 = _dircia +"grupos.dbf" if !file( mFile1) do cGrupos in prg\creatbl endif sele 1 use &mFile1 order tag codigo alias grupos *tabla estudiantes por grupo mFile2 = _dircia +"estgrupo.dbf" if !file( mFile2) do cEstGrupo in prg\creatbl endif sele 2 use &mFile2 order tag codigo alias estgrupo *tabla maestro asignaturas mFile3 = _dircia +"asigna.dbf" if !file( mFile3) do cAsigna in prg\creatbl endif sele 3 use &mFile3 order tag codigo alias asigna *tabla maestro programas mFile4 = _dircia +"programa.dbf" if !file( mFile4) do cPrograma in prg\creatbl endif sele 4 use &mFile4 order tag codigo alias programa
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 *tabla maestro profesores mFile5 = _dircia +"profe.dbf" if !file( mFile5) do cProfe in prg\creatbl endif sele 5 use &mFile5 order tag codigo alias profe *tabla hojas de vida mFile6 = _dircia +"hvida.dbf" if !file( mFile6) do cHvida in prg\creatbl endif sele 6 use &mFile6 order tag codigo alias hvida *tabla matricula mFile7 = _dircia +"matric.dbf" if !file( mFile7) do cMatric in prg\creatbl endif sele 7 use &mFile7 order tag codigo alias matric sele 1 *apuntar a la carpeta de los formularios do form forms\grupos return

Lo nico que hace esta rutina es abrir las tablas requeridas en diferentes reas de trabajo, asignar los respectivos alias y por supuesto, pasar el control de ejecucin, al formulario tipo factura.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 RUTINAS EN LOS OBJETOS DEL FORMULARIO Formulario.INIT *continuacin del codigo iniciado en i_grupos public pCodEstud pCodEstud = "" set delete on sele 1 go top scatter memvar memo *ir al objeto inicial thisform.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.refresh thisform.refresh

En esta rutina se hace uso de la instruccin SELECT-SQL y se asigna como parmetro al objeto DetalleGrupo. Cada vez que se requiera actualizar el detalle de cada grupo, simplemente invocaremos esta 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 la instruccin. 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.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto BtnPrimero.Click *ir al primero wait window "Primer registro..." nowait sele 1 go top scatter memvar memo sele asigna seek 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 detalle pCodEstud = "" thisform.btnRetirarDet.enabled = .f. thisform.btnModificarDet.enabled = .f. thisform.mEstado.enabled = .f. thisform.refresh return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto BtnAnterior.Click *ir al anterior sele 1 if !bof() skip -1 endif if bof() go top endif scatter memvar memo sele asigna seek 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 detalle pCodEstud = "" thisform.btnRetirarDet.enabled = .f. thisform.btnModificarDet.enabled = .f. thisform.mEstado.enabled = .f. thisform.refresh return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnSiguiente.click *ir al siguiente sele 1 if !eof() skip 1 endif if eof() go bottom endif scatter memvar memo sele asigna seek 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 detalle pCodEstud = "" thisform.btnRetirarDet.enabled = .f. thisform.btnModificarDet.enabled = .f. thisform.mEstado.enabled = .f. thisform.refresh return

10

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnUltimo.click *ir al ultimo wait window "ltimo registro..." nowait sele 1 go bottom scatter memvar memo sele asigna seek 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 detalle pCodEstud = "" thisform.btnRetirarDet.enabled = .f. thisform.btnModificarDet.enabled = .f. thisform.mEstado.enabled = .f. thisform.refresh return

11

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto BtnAgregar.clic *agregar registro con los datos en pantalla sele 1 *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif *verificar campo clave mCodigo = alltrim( thisform.mCodigo.value) sele 1 seek mCodigo if 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.setfocus return endif *validar la asignatura entrada por el usuario mAsignatura = alltrim( thisform.mAsignatura.value) sele asigna seek mAsignatura if !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.setfocus return endif

12

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6

13

*validar el profesor entrado por el usuario mProfesor = alltrim( thisform.mProfesor.value) sele profe seek mProfesor if !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.setfocus return endif *agregar nuevo registro con los datos en pantalla sele 1 insert into grupos from memvar *cargar nuevos datos en blanco scatter memvar blank *ir al primer campo thisform.mCodigo.setfocus *actualizar nuevo detalle 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.refresh

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnActual.click *actualizar el contenido de un campo *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif if empty( thisform.mNombre.value) wait window "Nombre incorrecto..." nowait thisform.mNombre.setfocus return endif if empty( thisform.mAsignatura.value) wait window "Cdigo de Asignatura incorrecto..." nowait thisform.mAsignatura.setfocus return endif if empty( thisform.mProfesor.value) wait window "Cdigo de Profesor incorrecto..." nowait thisform.mProfesor.setfocus return endif *validar asignatura entrada por el usuario mAsignatura = alltrim( thisform.mAsignatura.value) sele asigna seek mAsignatura if !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.setfocus return endif *validar profesor entrado por el usuario mProfesor = alltrim( thisform.mProfesor.value) sele profe seek mProfesor if !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.setfocus return endif
Instituto Metropolitano de Educacin

14

Visual FoxPro - Gua de Clases #6 *actualizar datos del campo clave sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() && actualizar registro hallado gather memvar memo wait window "Datos actualizados..." nowait else mMens1 = "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.setfocus return endif *actualizar detalle 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 " sele 1 thisform.refresh return

15

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnRetirar.click *retirar el registro clave hallado sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if !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.setfocus return 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 1 delete wait window "Registro retirado del sistema..." nowait *mover puntero al prximo disponible if !eof() skip 1 endif if eof() go bottom endif *retirar estudiantes del grupo eliminado sele estGrupo dele all for alltrim( estGrupo.codigo) = mCodigo sele 1 endif sele 1 scatter memvar memo *actualizar detalle 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.refresh return

16

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnExaminar.click *examinar registros sele 1 browse fields codigo, nombre ; noedit noappend nodelete *activar el seleccionado scatter memvar memo *actualizar grid (cuadrcula) sele estGrupo 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 thisform.refresh return

17

Objeto btnLimpiar.clic *limpiar el contenido de los campos wait window "Datos en blanco..." nowait sele 1 scatter memvar memo blank *actualizar grid (cuadrcula) sele estGrupo thisform.DetalleGrupo.rowsource = "" thisform.DetalleGrupo.refresh thisform.refresh

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnCargar.click *cargar el contenido de los campos con la clave entrada *verificar si hay datos en blanco if empty( thisform.mCodigo.value) wait window "Cdigo incorrecto..." nowait thisform.mCodigo.setfocus return endif *cargar datos del campo clave sele 1 mCodigo = alltrim( thisform.mCodigo.value) seek mCodigo if found() && actualizar registro hallado scatter memvar memo wait 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 estGrupo 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 thisform.refresh thisform.mCodigo.setfocus return

18

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto mCodEstMaestro.valid *activar los otros botones para el detalle thisform.btnAgregarDet.enabled = .t. thisform.btnRetirarDet.enabled = .t. thisform.btnModificarDet.enabled = .t. mCodEstMaestro.when return !empty( m.codigo)

19

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnAgregarDet.when return !empty( m.codigo) .and. !empty( thisform.mCodEstMaestro.value) BtnAgregarDet.valid *agregar codigo seleccionado al detalle del grupo mCodEstud = alltrim( thisform.mCodEstMaestro.value)

20

*validar cdigo en maestro estudiantes sele hvida seek mCodEstud if !found() mMens1 = "Imposible agregar al detalle, el cdigo " +mCodEstud +" no existe en el maestro!" +chr(13) mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..." mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!") thisform.mCodEstMaestro.setfocus return endif *verificar estudiante en el grupo sele estgrupo mGrupo = alltrim( m.codigo) seek mGrupo + mCodEstud if found() mMens1 = "Imposible agregar estudiante al grupo, el cdigo " +mCodEstud +" ya existe!" +chr(13) mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..." mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!") thisform.mCodEstMaestro.setfocus return endif *agregar linea al detalle insert 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
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 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.setfocus return endif

21

sele estGrupo mCodigo = alltrim( m.codigo) +alltrim( pCodEstud) seek mCodigo if !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.setfocus return endif mMens1 = "Desea retirar el cdigo " + pCodEstud +" del grupo!" +chr(13) mOpc = messagebox( mMens1 , 1+32, "Retirar estudiante del Grupo!") if mOpc = 1 && Clic en botn Aceptar sele estGrupo delete pCodEstud = "" wait window "Registro retirado del sistema..." nowait endif sele 1 scatter memvar memo

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 *actualizar detalle 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 thisform.refresh return BtnRetirarDet.when *habilitar cuando hagan clic en el detalle del grupo return !empty( pCodEstud)

22

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 Objeto btnModificarDet.valid *actualizar el registro seleccionado en el detalle *utilizar pCodEstud como clave de seleccion if empty( pCodEstud) mMens1 = "Seleccione un cdigo del detalle e intente actualizar de nuevo..." mOpc = messagebox( mMens1, 0+64, "Atencin!") thisform.DetalleGrupo.setfocus return endif

23

sele estGrupo mCodigo = alltrim( m.codigo) +alltrim( pCodEstud) seek mCodigo if !found() && no existe codigo mMens1 = "Imposible actualizar, 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.setfocus return endif mMens1 = "Desea actualizar los datos del cdigo " + pCodEstud +"!" +chr(13) mOpc = messagebox( mMens1 , 1+32, "Actualizar datos del estudiante!") if mOpc = 1 && Clic en botn Aceptar sele estGrupo replace estGrupo.estado with alltrim( thisform.mEstado.value) wait window "Datos actualizados..." nowait endif sele 1 scatter memvar memo *actualizar detalle 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 thisform.refresh return
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 BtnModificarDet.when *habilitar cuando hagan clic en el detalle del grupo return !empty( pCodEstud)

24

Objeto DetalleGrupo.click *codigo seleccionado para borrar o modificar pCodEstud = alltrim( this.value) *buscar codigo en detalle para que funcione *modificacion de datos mCodigo = alltrim( m.codigo) +alltrim( pCodEstud) sele estGrupo seek mCodigo *datos disponibles para actualizar m.estado = estgrupo.estado thisform.mEstado.enabled = .t. thisform.btnRetirarDet.enabled = .t. thisform.btnModificarDet.enabled = .t. thisform.refresh return

Observaciones: El objeto DetalleGrupo debe definirse como un Combo List y debe contemplar los siguientes parmetros: RowSourceType: 3-SQL ColumnCount: 5 ColumnLines:.. F.-Falso El objeto mNomAsigna debe tener la propiedad ControlSource igual a: asigna.nombre El objeto mNomProfesor debe tener la propiedad ControlSource igual a: profe.nombre

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #6 ADICION DE SUBPROGRAMAS A LA RUTINA CREATBL

25

El archivo de procedimientos CREATBL.PRG, debe contener dos subprogramas que permitan crear las tablas de Grupos.dbf y EstGrupo.dbf . Debe insertar el siguiente cdigo en la el archivo de procedimientos CREATBL.PRG:

procedure cGrupos *definir tabla grupos mFile = _dircia + "grupos.dbf" create table &mFile ; ( codigo c ( 10), ; nombre c ( 50), ; asignatura c ( 10), ; profesor c ( 15), ; horario c ( 50), ; aula c ( 50)) index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() close data return procedure cEstGrupo *definir tabla grupos mFile = mFile = _dircia + "estgrupo.dbf" create table &mFile ; ( codigo c ( 10), ; codestud c ( 10), ; exparcial n (4,2), ; seguim n (4,2), ; exfinal n (4,2), ; wfinal n (4,2), ; estado c ( 1)) index on alltrim( codigo) + alltrim( codestud) tag codigo for !deleted() close data return

Nota: Observe que el campo ndice de la tabla Estudiantes por Grupo es de tipo compuesto. Revise la teora ofrecida en las guas de clase anteriores para comprender mejor la situacin y el manejo de campos claves compuestos. Revise en el cdigo de la rutina Grupos para analizar en que puntos se hace el uso de los ndices compuestos y su forma correcta de utilizarlos.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #7 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO

LOS REPORTES Y LAS CONSULTAS EN LAS APLICACIONES


La potencia de las aplicaciones, viene marcada por la cantidad de informes y consultas que permitan hacer sobre la informacin almacenada en las tablas que componen a un sistema de informacin. La cantidad de informes queda limitada a la capacidad de cada programador y a los reportes que solicite la persona que nos ha contratado para desarrollar un proyecto. Lo cual significa, que un sistema por pequeo que sea puede incluir una serie de reportes que haran que el proyecto se viese como un gigante. Las consultas pueden ser utilizadas para enviar resultados de bsquedas basadas en criterios ofrecidos por los usuarios y su resultado se puede enviar a la pantalla o a la impresora. EL GENERADOR DE REPORTES El FoxPro incluye un generador de reportes bastante potente. Dentro de un reporte se pueden incluir texto, campos, imgenes, lneas, cuadros, campos calculados, unin de campos, funciones, etc. Si se domina (como programador) el tema de las funciones, se pueden ejecutar una serie de acciones que ahorraran mucho tiempo a la hora de disear reportes. Las expresiones que conjuguen una serie de funciones, capos y cadenas de caracteres, permiten ampliar an ms las posibilidades del generador de reportes del FoxPro. Tenga presente que el FoxPro amarra las tablas utilizadas para sacar la informacin, al reporte que las utiliza. Si analizamos la forma en que hemos venido trabajando hasta el momento, en ningn momento debemos permitir que tal cosa pase. Nuestra aplicacin utiliza tablas ubicadas en directorios diferentes dependiendo del campo DIRECTORIO en la tabla CIAS.DBF. Como no podemos dejar que el FoxPro amarre las tablas a los reportes, iniciaremos el generador en blanco y disearemos el reporte teniendo a la mano los campos requeridos para el informe. Seleccione la pestaa Docs en el administrador de proyectos y seleccione los objetos formularios para que FoxPro nos muestre los reportes diseados. Si es un reporte a modificar, haga clic en la lista sobre el nombre del reporte, luego haga clic en el botn Modificar . Si lo que desea es agregar un reporte que hace falta dentro del proyecto, haga clic en Agregar y seleccione el nombre del reporte desde sus unidades de disco. Si lo que se desea es crear un nuevo formulario, haga clic en nuevo , seleccione de la pantalla de dilogo que aparece el botn Nuevo Informe . Esta accin abrir un formulario en blanco, sobre el cual iniciaremos las actividades que definirn el nuevo reporte. Recuerde que el reporte no es funcional en este punto debido a que no existe ninguna tabla abierta en memoria. Una tcnica utilizada por muchos programadores, consiste en crear una rutina que abre las tablas necesarias para la funcionalidad del reporte, ejecutarla antes de entrara la creacin de mismo, y verificar el correcto funcionamiento del reporte en el sistema. Si no se utiliza ninguna tcnica de estas, nuestro reporte solo ser funcional cuando lo llamemos desde el formulario que hace uso de las tablas requeridas por el reporte.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

Para este ejemplo, crearemos el reporte Programa.frt para mostrar la informacin de la tabla Programas . Recuerde que el reporte no funcionar desde el modo diseo, as que no intente ejecutar un vista preliminar del reporte.

La barra controles de informes nos facilita el manejo de los objetos que pueden aparecer dentro de un informes. Si no parece, haga clic en el men Ver y Barra de herramientas Controles de informes.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 Utilice el siguiente esquema para disear el reporte para la tabla programas:

Como aspecto importante a considerar a la hora de disear reportes, es la inclusin del nombre de la empresa para la cual se disea la aplicacin. En algn sitio del encabezado del reporte debe aparecer el nombre del reporte. Incluir la fecha del sistema es tambin una buena idea para el usuario que tome uno de los reportes en un futuro posterior a la impresin. Los objetos 1, 2 y 3 se disean con el botn Campos de Tablas. Utilice estos parmetros para indicarle al generador de reportes de donde proviene la informacin: #Objeto 1 2 3 Expresin origen de datos "Fecha: " +dtoc( date()) programa.codigo Programa.nombre Formato @! @!

En la pantalla de Propiedades del campo, coloque el parmetro de Posicin a Flotante .

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 EL FORMULARIO PARA SELECCIONAR EL DESTINO DE UN REPORTE

El siguiente paso despus de disear el reporte, es construir un formulario de uso global que nos permita llamarla desde cualquier formulario, permitirle al usuario seleccionar el destino de un reporte (pantalla o impresora), recoger la seleccin hecha por el usuario y ejecutar el reporte seleccionado. En cada formulario diseado hasta el momento, se venia dejando un botn denominado Reporte . En este botn insertaremos el c digo necesario para activar el formulario que se disear a continuacin. Vea m s adelante en esta gua, la serie de ordenes que utilizan el formulario Reportes. El formulario se disear una sola vez, en los dems formularios, se invocar a este formulario para permitirle al usuario que seleccione el destino de un reporte. Construya el siguiente formulario y gurdelo con el nombre de reportes .

1: btnPantalla

2: btnImpresora

3: btnCerrar

CDIGO EN LOS OBJETOS DEL FORMULARIO REPORTES En las propiedades del formulario, active la pestaa Otras, busque la propiedad WindowType y colquela al valor 1-Modal . Si no hace esto, el formulario generar un error al tratar de ejecutarlo. Esto sucede debido a que se retornarn datos que indicarn la selecci n hecha por el usuario. EVENTO INIT DEL FORMULARIO REPORTES (REPORTES.INIT) public _porPantalla, _porImpresora, _btnCerrar

EVENTO UNLOAD DEL FORMUARIO (REPORTE.UNLOAD) if _porPantalla _resultado = 1 endif if _porImpresora _resultado = 2 endif if _btnCerrar _resultado = 0 endif return( _resultado) Este evento se ejecuta cuando se cierra el formulario. Observe que cada vez que el usuario hace clic en cada botn, se le asignan val ores a unas variables lgicas, indicadoras al final de sobre cual botn se hizo clic. En esta parte del formulario, se recogen los valores de esas variables y se asigna un valor para retornar a la aplicacin que llam al formulario. La instruccin RETURN es la encargada de devolver el parmetro a la aplicacin que llame a esta rutina.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 btnPantalla.Click *botn Pantalla _porPantalla = .t. _porImpresora = .f. _btnCerrar = .f. thisform.release btnImpresora.Click *botn Impresora _porPantalla = .f. _porImpresora = .t. _btnCerrar = .f. thisform.release

BtnCerrar.Click *botn Cerrar _porPantalla = .f. _porImpresora = .f. _btnCerrar = .t. thisform.release

Observe que cada botn libera al formulario y a su vez, asigna unos valores l gicos equivalentes a los tres nicos botones en la pantalla. Existe una variable por cada botn y cuando se hace clic en cada botn, este coloca el valor de verdadero sobre la variable equivalente al botn pulsado y coloca el valor de falso a las otras variables. En la rutina del evento Unload del formulario, se chequea el estado de esas tres variables y se asigna un nuevo valor al parmetro que se debe retornar. Se ha determinado que la rutina devolver 0 cuando el usuario no escoja nada o haga clic en el botn Cerrar. Retorna 1 cuando se hace clic sobre el botn Pantalla y retorna un 2 cuando se hace clic sobre el botn Impresora.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 FORMA DE UTILIZAR EL FORMULARIO REPORTE

Hasta el momento tenemos un reporte diseado (Programas.frt), un formulario llamado Reportes que permite seleccionar el destino de un reporte y un formulario, diseado en clases anteriores llamado Programas . En ese formulario, aparece un botn que hasta el momento no se haba utilizado, denominado btnReporte . Cuando el usuario haga clic sobre este botn, el sistema debe mostrar una pantalla donde el usuario pueda seleccionar el destino del reporte. Eso es lo programaremos a continuacin: Abra el formulario Programa en modo de diseo, ubique el botn btnReporte y haga doble clic sobre este. Busque el evento Clic y escriba el cdigo que se especifica a continuacin .

BtnReporte.Click *generar reporte de programas *consultar el destino para el reporte do form forms\reportes to mDestino do case case mDestino = 1 && pantalla report form informes\programa preview case mDestino = 2 && impresora *verificar estado de la impresora if printstatus() && verificar el estado de la impresora report form informes\programa to print noeject noconsole else mMens1 = "La impresora no esta lista. Preparela e intente de nuevo..." +chr(13) mOpc = messagebox( mMens1, 0+48, "Atencin!") endif endcase *regresar a la pantalla go top scatter memvar memo thisform.refresh return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 Observe que el cdigo incluye la instruccin: do form forms\reportes to mDestino

Con sta orden lo que se hace es invocar al formulario Reportes e indicarle al FoxPro que deseamos almacenar el valor que retorne el formulario en la variable mDestino. El formulario Reportes se ejecuta, permite que el usuario haga su seleccin, retorna el valor en la variable mDestino, y lo nico que resta es verificar el valor retornado. Recuerde que un valor de 1 indica que seleccionaron Pantalla , un valor de 2, Impresora, y un valor de 0, indica que el usuario no seleccion nada.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

LAS CONSULTAS EN LAS APLICACIONES


Una de las caractersticas potentes en un gestor de bases de datos, lo constituye la capacidad de generar consultas a la informacin almacenada en las tablas de un sistema de informacin determinado. La forma en que se puede generar consultas a las tablas son muchas, pero una de las m s sencillas y que permiten gran flexibilidad durante la ejecucin , son las ofrecidas por la instruccin SELECT-SQL. Esta orden es verdaderamente potente y permite programar instrucciones de consultas en forma fcil. Por ejemplo, se puede disear un formulario, unos datos en los cuales se recogen los parmetros de la consulta, y basado en esos datos entrados por el usuario, ejecutar una consulta en tiempo real. Abra el diseador de formulario con un formulario en blanco y disee el siguiente formulario. Cuando termine gurdelo en la carpeta de los formularios con el nombre de SQLProg. El anteponer SQL a los formularios de consulta, har que estos se agrupen visualmente en el administrador de proyectos, permitindonos en un futuro, administrar de forma fcil las pantallas de consultas.

1: mNombreSQL

2: btnEjecutarSQL

3: btnCerrar

El usuario deber entrar en el campo 1 un texto. Cuando haga clic en el botn Ejecutar Consulta, el sistema ejecutar una instruccin SELECT-SQL y traer de la tabla PROGRAMA los programas que incluyan en su nombre el texto entrado. FORMULARIO.INIT *abrir entorno utilizando las variables pblicas close data mFile1 = _dircia +"programa.dbf" if !file( mFile1) do cPrograma in prg\creartbl endif sele 1 use &mFile1 order tag codigo alias programa return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

En botn ejecutar lanza la consulta en el sistema. Observe el uso que se hace del parmetro entrado por el usuario. Si entra algo, se usa como parmetro, si deja el campo en blanco, simplemente se traen todos los registros. El resultado de la consulta es mostrado en una ventana examinar, que debe ser cerrada con ctrl.+w. BtnEjecutarSQL.Click *ejecutar consulta copn los parmetros entrados mNombreSQL = alltrim( thisform.mNombreSQL.value) if empty( mNombreSQL) select * from programa else select * from programa where mNombreSQL $ programa.nombre endif return

BtnCerrar.Click thisform.release

Por ejemplo, si introducimos como parmetro la palabra PROG obtendremos como resultado la siguiente pantalla:

Para cerrar esta pantalla, pulse Ctrl.+W. Aunque en este ejemplo se hizo una bsqueda basado una clase datos, no indica que siempre se tenga que hacer de tal forma. Las posibilidades de programar parmetros son muchas y la capacidad de programar tales ordenes dentro de una instruccin SELECT-SQL hacen de esta orden lo mximo para controlar consultas. Para mayor informacin acerca de la orden SELECT-SQL, consulte el manual de comandos y funciones del Visual FoxPro.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 ANEXO A LA GUA DE CLASES LA INSTRUCCIN SELECT SQL El siguiente texto fue tomado de la ayuda del FoxPro. Recupera datos de una o ms tablas. Sintaxis SELECT [ALL | DISTINCT] [TOP nExpresin [PERCENT]] [Alias.] Elemento_Seleccin [AS Nombre_Columna] [, [Alias.] Elemento_Seleccin [AS Nombre_Columna] ...] FROM [FORCE] [NombreBaseDatos!]Tabla [Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN NombreBaseDatos!]Tabla [Alias_Local] [ON CondicinCombinacin ] [[INTO Destino] | [TO FILE NombreArchivo [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] [PREFERENCE NombrePreferencia] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE CondicinCombinacin [AND CondicinCombinacin ...] [AND | OR CondicinFiltro [AND | OR CondicinFiltro ...]]] [GROUP BY ColumnaGrupo [, ColumnaGrupo ...]] [HAVING CondicinFiltro] [UNION [ALL] SELECTCommand] [ORDER BY Elemento_Orden [ASC | DESC] [, Elemento_Orden [ASC | DESC] ...]] Argumentos SELECT consulta.

10

Especifica los campos, constantes y expresiones que se mostrarn en el resultado de la

ALL De forma predeterminada, se muestran todas la filas del resultado de la consulta. DISTINCT Excluye duplicados de cualquier fila del resultado de la consulta. Nota Puede utilizar DISTINCT nicamente una vez por clusula SELECT. TOP nExpresin [PERCENT] Especifica que el resultado de la consulta contenga un nmero determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir una clusula ORDER BY si incluye la clusula TOP. La clusula ORDER BY especifica las columnas en las que la clusula TOP determinar el nmero de filas que se va a incluir en el resultado de la consulta. Puede especificar desde 1 a 32,767 filas. Las filas de valores idnticos para las columnas especificadas en la clusula ORDER BY se incluyen en el resultado de la consulta. A partir de entonces, si especifica 10 para nExpr, el resultado de la consulta podr obtener ms de 10 filas si hay ms de 10 filas con valores idnticos para las columnas especificadas en la clusula ORDER BY.
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

11

Si se incluye la palabra clave PERCENT, se redondear al nmero entero ms alto el nmero de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son 0.01 a 99.99. Alias. Califica nombres de elementos coincidentes. Cada elemento que especifique con Elemento_Seleccin genera una columna de los resultados de la consulta. Si dos o ms elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre del elemento para impedir la duplicacin de las columnas. Elemento_Seleccin especifica un elemento a incluir en el resultado de la consulta. Un elemento puede ser uno de los siguientes: El nombre de un campo de una tabla de la clusula FROM. Una constante especificando que el mismo valor constante ha de aparecer en cada fila del resultado de la consulta. Una expresin que puede ser el nombre de una funcin definida por el usuario (FDU). AS Nombre_Columna Especifica el ttulo de una columna en el resultado de la consulta. Esta opcin resulta muy til cuando Elemento_Seleccin es una expresin o contiene una funcin de campo y desea dar un nombre significativo a la columna. Nombre_Columna puede ser una expresin pero no puede contener caracteres (por ejemplo, espacios) que no estn permitidos para nombres de campos de tablas. FROM Enumera las tablas que contienen los datos que obtuvo la consulta. Si no hay ninguna tabla abierta, Visual FoxPro mostrar el cuadro de dilogo Abrir para permitirle especificar la ubicacin del archivo. Una vez abierta, la tabla permanecer abierta cuando la consulta se haya terminado. FORCE Especifica que las tablas se combinarn en el orden de aparicin en la clusula FROM. Si se omite FORCE, Visual FoxPro intentar optimizar la consulta. Sin embargo, es posible que la consulta se ejecute ms rpido si se incluye la palabra clave FORCE para desactivar la optimizacin de consultas de Visual FoxPro. NombreBaseDatos! Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador de signo de exclamacin (!) despus del nombre de la base de datos y antes del nombre de la tabla. Alias_Local Especifica un nombre temporal para la tabla indicada en Tabla. Si especifica un alias local, debe utilizar el alias local en lugar de la tabla a travs de todo el SELECT. INNER JOIN Especifica que el resultado de la consulta contenga slo filas para una tabla con la que coincidan una o varias filas en otra tabla. LEFT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y slo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinacin externa.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

12

RIGHT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y slo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creacin de una combinacin externa. FULL [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinacin externa. ON CondicinCombinacin Especifica las columnas segn las cuales se combinan las tablas. INTO Destino Determina donde se almacenan los resultados de la consulta. Si incluye una clusula INTO y una clusula TO en la misma consulta, la clusula TO se pasar por alto. Si no incluye la clusula INTO, los resultados de la consulta se mostrarn en la ventana Examinar. Los resultados de la consulta pueden dirigirse tambin a la impresora o a un archivo mediante la clusula TO. Destino puede ser uno de los siguientes: ARRAY NombreMatriz, que almacena los resultados de la consulta en una matriz de variable de memoria. Si la consulta selecciona 0 registros, la matriz no se crear. CURSOR NombreCursor [NOFILTER], que almacena los resultados de la consulta en un cursor. Si especifica el nombre de una tabla abierta, Visual FoxPro generar un mensaje de error. Despus de que se ejecute SELECT, el cursor temporal permanecer abierto y estar activo pero solamente para lectura. Una vez que cierre este cursor temporal, se borrar. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK. Incluya NOFILTER para crear un cursor que se pueda usar en consultas posteriores. En versiones anteriores de Visual FoxPro, era necesario incluir una expresin o una constante adicional como un filtro para crear un cursor utilizable en consultas posteriores. Por ejemplo, la adicin de un Logical verdadero como una expresin de filtro creaba una consulta utilizable en consultas posteriores: SELECT *, .T. FROM customers INTO CURSOR myquery Si se incluye NOFILTER es posible que disminuya el rendimiento de la consulta, puesto que se crear una consulta temporal en el disco. Cuando se cierre el cursor se eliminar del disco la consulta temporal. DBF | TABLE NombreTabla [DATABASE NombreBaseDatos [NAME NombreLargoTabla]] que almacena el resultado de la consulta en una tabla. Si especifica una tabla que ya est abierta y SET SAFETY est en OFF, Visual FoxPro sobrescribir la tabla sin previo aviso. Si no ha especificado ninguna extensin, Visual FoxPro dar una extensin .DBF a la tabla. La tabla permanecer abierta y activa despus de ejecutar SELECT. Incluya DATABASE NombreBaseDatos para especificar una base de datos a la que se agregar la tabla. Incluya NAME NombreLargoTabla para especificar un nombre largo para la tabla. Los nombres largos pueden contener un mximo de 128 caracteres y pueden utilizarse en lugar de nombres cortos en la base de datos. TO FILE NombreArchivo Si incluye una clusula TO pero no una clusula INTO, podr dirigir el resultado de la consulta a un archivo de texto ASCII llamado NombreArchivo, o a la impresora adems de al escritorio o la ventana principal de Visual FoxPro.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

13

ADDITIVE aade la salida de la consulta al contenido existente del archivo de texto especificado en TO FILE NombreArchivo. TO PRINTER [PROMPT] Dirige la salida de la consulta a una impresora. Utilice la clusula PROMPT opcional para que aparezca en pantalla un cuadro de dilogo antes de que empiece la impresin. En este cuadro de dilogo podr modificar la configuracin de la impresora. Los valores de la impresora modificables dependen del controlador de impresora instalado en este momento. Site la palabra clave PROMPT inmediatamente despus de TO PRINTER. TO SCREEN Dirige la salida de la consulta a la ventana principal de Visual FoxPro o a una ventana definida por el usuario que est activa. PREFERENCE NombrePreferencia Guarda los atributos y opciones de la ventana Examinar para uso posterior, si se enva el resultado de la consulta a una ventana Examinar. Emitiendo SELECT con un NombrePreferencia de PREFERENCE, la primera vez se crea la preferencia. Emitiendo posteriormente SELECT con el mismo nombre de preferencia, se restaurar la ventana Examinar con el mismo estado de preferencia. Cuando se cierra la ventana Examinar, se actualiza la preferencia. Si sale de una ventana Examinar presionando CTRL+Q+W, no se guardarn los cambios de la ventana Examinar en el archivo de recurso. NOCONSOLE Impide que el resultado de la consulta se enve a un archivo, a la impresora o a la ventana principal de Visual FoxPro. PLAIN Impide que aparezcan las cabeceras de las columnas al mostrar la salida de la consulta. PLAIN puede utilizarse tanto si est presente una clusula TO como si no. Si se incluye una clusula TO, se pasar por alto PLAIN. NOWAIT Contina la ejecucin del programa despus de abrir la ventana Examinar y de dirigir a ella los resultados de la consulta. El programa no esperar a que la ventana Examinar se cierre, sino que continuar con la ejecucin de la lnea de programa inmediatamente siguiente a la instruccin SELECT. Cuando se incluye TO SCREEN para dirigir la salida hacia la ventana principal de Visual FoxPro o una ventana definida por el usuario, la salida se detiene cuando la ventana principal de Visual FoxPro se llena con resultados de la consulta. Presione una tecla para ver el siguiente conjunto de resultados de la consulta. Si se incluye NOWAIT, los resultados de la consulta se desplazarn fuera del escritorio, la ventana principal de Visual FoxPro o una ventana definida por el usuario sin esperar a que se presione una tecla. NOWAIT se pasa por alto si se incluye con la clusula INTO. WHERE Indica a Visual FoxPro que incluya nicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas. CondicinCombinacin especi fica los campos que vinculan las tablas de la clusula FROM. Si incluye ms de una tabla en una consulta, deber especificar una condicin de combinacin para cada tabla despus de la primera.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

14

Las condiciones de combinacin mltiple deben conectarse mediante el operador AND. Cada condicin de combinacin tiene la forma siguiente: NombreCampo1 Comparacin NombreCampo2 NombreCampo1 es el nombre de un campo de una tabla, NombreCampo2 es el nombre de un campo de otra tabla y Comparacin es uno de los operadores siguientes: Operador Comparacin = Igual == Exactamente igual LIKE SQL LIKE <>, !=, # Distinto de > Mayor que >= Mayor o igual que < Menor que <= Menor o igual que Cuando utiliza el operador = con cadenas, acta de forma distinta dependiendo del ajuste de SET ANSI. Cuando SET ANSI est OFF, Visual FoxPro trata las comparaciones de cadenas en la forma habitual en Xbase. Cuando SET ANSI est a ON, Visual FoxPro sigue las normas ANSI para comparaciones de cadenas. Vea SET ANSI y SET EXACT para obtener informacin adicional sobre la forma en que Visual FoxPro realiza las comparaciones de cadenas. La clusula WHERE acepta el operador ESCAPE para la CondicinCombinacin, lo que le permite realizar consultas significativas sobre datos que contengan caracteres comodn _ y % de SELECT - SQL. La clusula ESCAPE le permite especificar que se traten los caracteres comodn de SELECT - SQL como si fueran caracteres literales. En la clusula ESCAPE se especifica un carcter, el cual, cuando se sita inmediatamente antes del carcter comodn, indica que se tratar al carcter comodn como a un carcter literal. CondicinFiltro Especifica los criterios que deben cumplir los registros para que se incluyan en el resultado de la consulta. Una consulta puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND y OR. Tambin puede utilizar el operador NOT para invertir el valor de una expresin lgica o utilizar EMPTY( ) para comprobar si un campo est vaco. CondicinFiltro puede presentar una de estas formas: Ejemplo 1 En el Ejemplo 1 se muestra la CondicinFiltro en el formulario de NombreCampo1 Comparacin NombreCampo2 customer.cust_id = orders.cust_id Ejemplo 2 En el Ejemplo 2 se muestra CondicinFiltro en el formulario de NombreCampo Comparacin Expresin payments.amount >= 1000

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 Ejemplo 3

15

En el Ejemplo 3 se muestra CondicinFiltro en el formulario de NombreCampo Comparacin ALL (Subconsulta) Cuando la condicin de filtro incluye ALL, el campo debe cumplir la condicin de comparacin para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta. company < ALL ; (SELECT company FROM customer WHERE country = "Reino Unido") Ejemplo 4 En el Ejemplo 4 se muestra CondicinFiltro en el formulario de NombreCampo Comparacin ANY | SOME (Subconsulta) Cuando la condicin de filtro incluye ANY o SOME, el campo debe cumplir la condicin de comparacin en al menos uno de los valores generados por la subconsulta. company < ANY ; (SELECT company FROM customer WHERE country = "Reino Unido") Ejemplo 5 En el Ejemplo 5 se muestra CondicinFiltro en el formulario de NombreCampo [NOT] BETWEEN Inicio_Rango AND Fin_Rango Este ejemplo comprueba si los valores del campo estn dentro de un intervalo de valores especificado. customer.postalcode BETWEEN 90000 AND 99999 Ejemplo 6 En el Ejemplo 6 se muestra CondicinFiltro en el formulario de [NOT] EXISTS (Subconsulta) Este ejemplo comprueba si al menos una lnea cumple los criterios de la subconsulta. Cuando la condicin de filtro incluye EXISTS, la condicin de filtro se evala como verdadera (.T.) a no ser que la subconsulta sea un conjunto vaco. EXISTS ; (SELECT * FROM orders WHERE customer.postalcode = Ejemplo 7 En el Ejemplo 7 se muestra CondicinFiltro en el formulario de NombreCampo [NOT] IN Conjunto_Valor Cuando una condicin de filtro incluye IN, el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta. customer.postalcode NOT IN ("98052","98072","98034")
Instituto Metropolitano de Educacin

orders.postalcode)

Visual FoxPro - Gua de Clases #7 Ejemplo 8 En el Ejemplo 8 se muestra CondicinFiltro en el formulario de NombreCampo [NOT] IN ( Subconsulta)

16

Aqu, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su registro se incluya en los resultados de la consulta. customer.cust_id IN ; (SELECT orders.cust_id FROM orders WHERE orders.city="Seattle") Ejemplo 9 En el Ejemplo 9 se muestra CondicinFiltro en el formulario de NombreCampo [NOT] LIKE cExpresin customer.country NOT LIKE "Reino Unido" Esta condicin de filtro busca cada uno de los campos que coinciden con cExpresin. Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpresin. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carcter desconocido en la cadena. GROUP BY ColumnaGrupo [, ColumnaGrupo ...] Agrupa las filas de la consulta basndose en los valores de una o ms columnas. ColumnaGrupo puede ser el nombre de un campo normal de una tabla, o un campo que incluya una funcin de campo SQL, o una expresin numrica indicando la posicin de la columna en la tabla resultado (la columna ms a la izquierda tiene el nmero 1). HAVING CondicinFiltro Especifica una condicin de filtro que los grupos deben satisfacer para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY. Puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND u OR. Tambin puede utilizar NOT para invertir el valor de una expresin lgica. CondicinFiltro no puede contener una subconsulta. Una clusula HAVING sin una clusula GROUP BY acta como una clusula WHERE. Puede utilizar alias locales y funciones de campo en la clusula HAVING. Utilice una clusula WHERE para acelerar el rendimiento si su clusula HAVING no contiene funciones de campo. No olvide que la clusula HAVING debera de aparecer antes de una clusula INTO porque, de lo contrario, se producir un error de sintaxis. [UNION [ALL] ComandoSELECT] Combina el resultado final de una SELECT con el resultado final de otra SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar parntesis para combinar mltiples clusulas UNION. Utilice la palabra clave opcional ALL para impedir que UNION elimine filas duplicadas de los resultados combinados.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 Las clusulas UNION siguen las reglas siguientes:

17

No puede utilizar UNION para combinar subconsultas. La salida de ambos SELECT debe tener el mismo nmero de columnas. Cada columna de los resultados de la consulta de un SELECT debe tener el mismo tipo de dato y anchura que su columna correspondiente en el otro SELECT. nicamente el SELECT final puede tener una clusula ORDER BY, que debe referirse a las columnas de salida por su nmero. Si se incluye otra clusula ORDER BY, afectar al resultado completo. Tambin puede usar la clusula UNION para simular una combinacin externa. Cuando combina dos tablas en una consulta, solamente se incluyen en la salida los registros que tengan valores coincidentes en los campos de combinacin. Si un registro de la tabla primaria no tiene un registro correspondiente en la tabla secundaria, el registro de la tabla primaria no se incluye en la salida. Una combinacin externa le permite incluir todos los registros de la tabla primaria en la salida, junto con los registros coincidentes de la tabla secundaria. Para crear una combinacin externa en Visual FoxPro, necesita utilizar un comando SELECT anidado, como en el siguiente ejemplo: SELECT customer.company, orders.order_id, orders.emp_id ; FROM customer, orders ; WHERE customer.cust_id = orders.cust_id ; UNION ; SELECT customer.company, " ", " " ; FROM customer ; WHERE customer.cust_id NOT IN ; (SELECT orders.cust_id FROM orders) Nota Asegrese de incluir el espacio que aparece justo delante de cada punto y coma. De lo contrario, recibir un error. La seccin del comando situada antes de la clusula UNION selecciona los registros de ambas tablas que contienen valores coincidentes. Las empresas cliente que no tengan facturas asociadas no se incluyen. La seccin del comando situada tras la clusula UNION selecciona los registros de la tabla customer que no tienen registros coincidentes en la tabla orders. En lo que respecta a la segunda seccin del comando, observe lo siguiente: La instruccin SELECT incluida entre parntesis se procesa en primer lugar. Esta instruccin da como resultado una seleccin de todos los nmeros de clientes de la tabla orders. La clusula WHERE busca todos los nmeros de cliente de la tabla customer que no estn en la tabla orders. Puesto que la primera seccin del comando proporcion todas las empresas que tenan un nmero de cliente en la tabla orders, todas las empresas de la tabla customer estn incluidas en los resultados de la consulta. Puesto que las estructuras de las tablas incluidas en UNION deben ser idnticas, hay dos marcadores de posicin en la segunda instruccin SELECT para representar orders.order_id y orders.emp_id de la primera instruccin SELECT. Nota Los marcadores de posicin deben ser del mismo tipo que los campos que representan. Si el campo es de tipo Date, el marcador de posicin deber ser { / / }. Si el campo es de tipo Character, el marcador de posicin deber ser la cadena vaca ("").
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

18

ORDER BY Elemento_Orden Ordena el resultado de la consulta basndose en los datos de una o varias columnas. Cada Elemento_Orden debe corresponder a una columna del resultado de la consulta, y puede ser uno de los siguientes: Un campo de una tabla FROM que tambin es un elemento de seleccin en la clusula principal SELECT (no en una subconsulta). Una expresin numrica que indica la ubicacin de la columna en la tabla resultante. (La columna de la izquierda es la nmero 1.) ASC Especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY. DESC Especifica un orden descendente para los resultados de la consulta. Los resultados de la consulta aparecern desordenados si no especifica un orden con ORDER BY. Comentarios SELECT es un comando SQL que est incorporado en Visual FoxPro como cualquier otro comando de Visual FoxPro. Cuando utiliza SELECT para componer una consulta, Visual FoxPro interpreta la consulta y recupera los datos especificados de las tablas. Puede crear una consulta SELECT: En la ventana Comandos En un programa Visual FoxPro (como cualquier otro comando de Visual FoxPro) El Diseador de consultas

Cuando emite SET TALK ON y ejecuta SELECT, Visual FoxPro muestra la duracin de la consulta y el nmero de registros del resultado. _TALLY contiene el nmero de registros del resultado de la consulta. SELECT no respeta la condicin de filtro actual especificada con SET FILTER. Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando SELECT dentro de otro SELECT y debe incluirse entre parntesis. Puede tener mltiples subconsultas al mismo nivel (no anidadas) en la clusula WHERE (consulte esta seccin de los argumentos). Las subconsultas pueden contener mltiples condiciones de combinacin. Cuando se obtiene el resultado de una consulta, las columnas se denominarn segn las siguientes reglas: Si un elemento seleccionado es un campo con un nombre nico, el nombre de la columna de resultado es el nombre del campo. Si hay ms de un elemento seleccionado con el mismo nombre, se aadirn un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Cliente tiene un campo llamado CALLE, y una tabla llamada Empleados tambin tiene un campo llamado CALLE, las columnas de resultado se llamarn Extensin_A y Extensin_B (CALLE _A y CALLE _B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncar el nombre para aadir el smbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertira en DEPARTME_A. Si un elemento seleccionado es una expresin, su columna de resultado se llamar EXP_A. Cualquier otra expresin recibir el nombre de EXP_B, EXP_C, y as sucesivamente. Si un elemento seleccionado contiene una funcin de campo como, por ejemplo, COUNT( ), la columna de resultado se llamar CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamar SUM_B.
Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7

19

Funciones definidas por el usuario con SELECT Aunque la utilizacin de funciones definidas por el usuario en la clusula SELECT ofrece unas ventajas evidentes, tambin debera tener en cuenta las siguientes limitaciones: Es posible que la velocidad de realizacin de las operaciones con SELECT se vea limitada por la velocidad a la que se ejecutan las funciones definidas por el usuario. Las manipulaciones de un gran volumen que impliquen funciones definidas por el usuario se pueden realizar mejor utilizando funciones API y funciones definidas por el usuario escritas en C o en lenguaje ensamblador. No se puede prever nada acerca de la entrada/salida de Visual FoxPro (E/S) ni del entorno de la tabla en funciones definidas por el usuario invocadas a partir de SELECT. Generalmente, no se puede saber qu rea de trabajo se ha seleccionado, ni el nombre de la tabla actual, ni los nombres de los campos que se estn procesando. El valor de dichas variables depende del lugar especfico, dentro del proceso de optimizacin, en el que se invoque la funcin definida por el usuario. En funciones definidas por el usuario invocadas desde SELECT, no es seguro cambiar la E/S de Visual FoxPro ni el entorno de la tabla. Por norma general, los resultados son impredecibles. La nica forma segura de pasar valores a funciones definidas por el usuario invocadas desde SELECT es mediante la lista de argumentos pasada a la funcin cuando es invocada. Si prueba y descubre una manipulacin tericamente prohibida que funciona correctamente en una versin determinada de FoxPro, eso no significa que tambin funcione en versiones posteriores. Salvando dichas limitaciones, las funciones definidas por el usuario son aceptables en la clusula SELECT. Sin embargo, recuerde que la utilizacin de SELECT puede ralentizar el rendimiento. Las siguientes funciones de campo estn disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresin que implique a un campo: AVG(Elemento_Seleccin), que realiza una media de una columna de datos numricos. COUNT(Elemento_Seleccin), que cuenta el nmero de elementos seleccionados en una columna. COUNT(*) cuenta el nmero de filas en el resultado de la consulta. MIN(Elemento_Seleccin) determina el menor valor de Elemento_Seleccin en una columna. MAX(Elemento_Seleccin) determina el mayor valor de Elemento_Seleccin en una columna. SUM(Elemento_Seleccin) que proporciona el total de la suma de una columna de datos numricos. No se pueden probar las funciones de campo. Combinaciones Visual FoxPro acepta sintaxis de combinacin de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o ms tablas mediante la comparacin de los valores de campos especificados. Por ejemplo, una combinacin interna selecciona filas procedentes de dos tablas slo cuando los valores de los campos combinados son iguales. Visual FoxPro admite combinaciones anidadas. Dado que SQL se basa en la teora de conjuntos matemtica, se puede representar a cada tabla con un crculo. La clusula ON que especifica las condiciones de la combinacin determina el punto de interseccin, el cual representa el conjunto de filas que coinciden. En el caso de una combinacin interna, la interseccin tendr lugar en el interior o en una parte interna de los dos crculos. Una combinacin externa incluye tanto las filas coincidentes que se han encontrado en la seccin de interseccin interna de las tablas, como las filas de la parte externa del crculo a la izquierda, o a la derecha, de la interseccin.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #7 Importante Tenga presente la siguiente informacin a la hora de crear condiciones de combinacin:

20

Si incluye dos tablas en una consulta y no especifica una condicin de combinacin, cada registro de la primera tabla se combinar con cada registro de la segunda tabla hasta que surtan efecto las condiciones del filtro. Una consulta tal puede producir unos resultados interminables. Sea prudente al utilizar, en condiciones de combinacin, funciones tales como DELETED( ), EOF( ), FOUND( ), RECCOUNT( ), y RECNO( ), que aceptan un rea de trabajo o un alias opcional. La inclusin de un alias o de un rea de trabajo en dichas funciones puede producir resultados inesperados. SELECT no utiliza sus reas de trabajo; realiza lo equivalente a USE ... AGAIN. Las consultas de una nica tabla que utilizan estas funciones sin un rea de trabajo o un alias opcional, tendrn resultados correctos. De todas formas, las consultas de varias tablas que utilicen dichas funciones (incluso sin un rea de trabajo o un alias opcional) pueden tener resultados inesperados. Sea prudente al combinar tablas que contengan campos vacos porque Visual FoxPro concuerda campos vacos. Por ejemplo, si combina CUSTOMER.ZIP e INVOICE.ZIP, y CUSTOMER contiene 100 cdigos postales vacos e INVOICE contiene 400 cdigos postales vacos, el resultado de la consulta contendr 40.000 registros ms, como resultado de los campos vacos. Use la funci n EMPTY( ) para eliminar los registros vacos del resultado de la consulta. Para obtener ms informacin sobre combinaciones, consulte Definicin y modificacin de condiciones de combinacin en el captulo 8, Creacin de vistas, en el Manual del programador.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #8 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO

EL SISTEMA COMPLETO
Hasta el momento hemos generado formularios, reportes y consultas, partes bsicas de un sistema de informacin automatizado. Para que ese sistema est completo, agregaremos el men principal, el formulario de entrada (clave de acceso) y las utilidades del sistema. Como paso final, aprenderemos a compilar la aplicacin, generar un programa autoejecutable (.EXE) y los respectivos discos de instalacin del proyecto.

EL GENERADOR DE MENUS DEL FOXPRO


El FoxPro tiene un generador de mens que permite crear, probar y generar el cdigo de un men para agregar a nuestra aplicacin. El docente explicar el manejo de este potente generador de mens.

El men creado en clase debe llamarse MENUPPAL y debe crearse en la pestaa OTROS del administrador de proyectos en la seccin Mens. Cuando modifique las opciones del men, recuerde siempre ejecutar la opcin Men/Generar. Esta opcin genera un archivo de cdigo con las rdenes suficientes para crear nuestro sistema de mens. El archivo de cdigo fuente quedar almacenado con el mismo nombre del men y la extensin .MPR. Este es el programa que ejecutaremos desde cualquier formulario o programa para cargar el men en el sistema (MENUPPAL.MPR). Por el momento disearemos el siguiente men principal: Maestros Programas Asignaturas Profesor Salir Ventana de Comandos Secretara Hojas de vida Matrcula Grupos Empresas del sistema Usuarios del sistema Utilidades Indexar Copias de soporte Restaurar datos

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8 Las opciones Programas, Asignaturas, Profesor, respectivamente un submen con las opciones: Actualizar Consultar Hojas de vida, Matrcula y

2 Grupos, tienen

El entorno de trabajo del generador de reportes es bastante sencillo de manipular. Para pasar de un submen a otro, recuerde hacerlo haciendo clic en la lista desplegable Nivel de Men . Para verificar el funcionamiento del sistema de mens diseado, haga clic en el botn Vista Previa .

Una tecla caliente (Hot Key) se programa anteponiendo los signos \< antes de la letra que uno desea programar como la tecla caliente. Por ejemplo, \<Utilidades programa a la combinacin de teclas ALT+U como la tecla caliente para activar esta opcin en el sistema de mens.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8 MODO DE PROGRAMAR LA ACCIN EN LAS OPCIONES DEL MEN

Las acciones a programar dentro de las opciones de un men son: Submen, Comando o Procedimiento . Si la accin a tomar es desplegar un submen, seleccione la accin Submen y haga clic en el botn Crear para programar las opciones del submen. Si la accin a ejecutar es una orden del FoxPro, por ejemplo, ejecutar un formulario o un programa, seleccione la accin Comando. Luego, programe la orden en la casilla correspondiente y acorde al tipo de rutina a ejecutar. Si es un formulario, utilice el formato: Do form formulario Si es un programa: Do NombrePrograma

Si la accin a tomar es ejecutar un procedimiento, seleccione Procedimiento, luego haga clic en el botn Crear . El sistema abre un editor de comandos con el objetivo de que usted introduzca la secuencia de rdenes que debe ejecutar el FoxPro cuando se seleccione la opcin. De esta pantalla salimos pulsando CTRL.+W. OPCIN SALIR Programe la accin de esta opcin como COMANDO . Entre la orden QUIT en el rea destinada para introducir la orden de la opcin. OPCION VENTANA DE COMANDOS Programe como accin para esta opcin, Procedimiento. Introduzca como cdigo dentro del procedimiento la secuencia de comandos siguiente:

CLEAR EVENTS SET SYSMENU TO DEFAULT RETURN

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8 EL PROGRAMA PRINCIPAL DE LA APLICACIN

Para que nuestra aplicacin tome forma, debemos crear un programa que junte todo lo creado hasta el momento. Ese programa deber cargar el formulario de acceso al sistema, verificar el usuario conectado, definir la ruta de datos dependiendo de la empresa identificada, cargar el sistema de mens y permitir la navegacin por los diversos mdulos componentes del sistema. Cree en la pestaa cdigo del proyecto un archivo de programa y gurdelo con el nombre de PPAL en la carpeta destinada para los programas (en el caso de la gua: c:\clasefox\prg ). El programa incluye el cdigo que permite configurar el entorno de trabajo con el objetivo de personalizar la ventana de ejecucin de la aplicacin. El FoxPro incluye el objeto _ screen para configurar las propiedades a nivel de cdigo, de la ventana principal. Este resulta un muy buen mtodo para personalizar de forma simple nuestra aplicacin. Muchos programadores utilizan formularios y vistosos botones de comandos para controlar las opciones del sistema, en nuestro caso particular, utilizaremos el ms elemental y simple de todos: un sistema de barras de mens que ejecutan y juntan las partes componentes del sistema.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8 Este es el cdigo fuente del programa PPAL.PRG: * * Ppal.prg * Mdulo principal del Sistema ClaseFox set echo off set talk off set safety off set color to set clock status set century on set date to dmy clear all close all clear clear events close data mDir = sys(5) +curdir() mIDir = sys(5) +curdir() + 'icons\icon.ico' set defa to &mDir set path to &mDir *** configurar entorno de trabajo _screen.caption = "Clase Fox 1.0" _screen.icon = mIDir _screen.windowstate = 2 && maxim _screen.picture = "" _screen.backcolor = rgb( 192,192,192) *** cargar mdulo de entrada al sistema set sysmenu off do form forms\acceso read events close data return

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8

LA PANTALLA DE ACCESO AL SISTEMA


La primer sesin de clases nos mostr la forma de generar un formulario de acceso al sistema. Lleg la hora de utilizar tal formulario con el objetivo de controlar la entrada de los usuarios a nuestra aplicacin. Ese formulario se llama ACCESO y debe estar almacenado en el directorio de la aplicacin destinado para los formularios (en el caso de la gua c:\clasefox\forms\). Recuerde que nuestra aplicacin hace uso de la tabla CIAS.DBF almacenada dentro de la carpeta de nuestra aplicacin (para la g ua CLASEFOX). Esta tabla posee un campo destinado para almacenar la ruta de datos llamado directorio. Debemos agregar el siguiente cdigo en el botn ACEPTAR (btnAceptar.Click), con el objetivo de configurar la aplicacin para que apunte al directorio de datos dependiendo de la empresa seleccionada para trabajar. Busque dentro del cdigo la seccin dejada en clases pasadas con el texto de: *dejar entrar *wait window"Puede entrar el Sistema" nowait y reemplace por el cdigo que se muestra en cursiva. BtnAceptar.Click if alltrim (usuarios.clave)=mclave *ruta para los datos _dircia = alltrim( cias.directorio) _nomcia = alltrim( cias.nombre) do menuppal.mpr release thisform else wait window "Clave Incorrecta" nowait endif

Recuerde que en sesiones pasadas, con el objetivo de verificar la ejecucin de nuestros programas, ejecutbamos la rutina PUBLIC.PRG. Ya no es necesario hacerlos, y la forma correcta es la ejecutar el programa PPAL.PRG. Este a su vez, llama al formulario ACCESO, y este dependiendo de los datos entrados, lleva al usuario a la pantalla principal de la aplicacin. Esta pantalla enlaza todos los mdulos componentes del sistema. A continuacin se muestra la forma en que se relaciona todo el sistema. En un sistema automatizado, el men principal es el que integra los elementos diseados en forma modular. La creacin de sistema de mens requiere de prctica y es el programador el que debe buscar el esquema adecuado para que las partes del sistema se integren. El programador es el que debe colocar en forma lgica los elementos del men y hacerlo de forma tal, que el usuario no tenga que dar tantas vueltas para acceder a opciones que tienen de cierta forma una relacin. Una buena clave para disear opciones de mens, es la de agrupar procesos, donde cada proceso tomar un nombre dentro del men principal. Las opciones Maestro y Utilidades se constituyen por el momento como las opciones claves iniciales.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #8

Queda pendiente generar los formularios componentes del men utilidades. Y por supuesto, la generacin de los discos de instalacin y del respectivo programa ejecutable (.EXE).

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #9 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO

COMPILACIN Y DISCOS DE DISTRIBUCIN DE UNA APLICACIN


Una vez diseado y programado todos los componentes de la aplicacin, lo nico restante por hacer es generar el programa ejecutable de la aplicacin. Un programa ejecutable ya no requiere del cdigo fuente para su funcionamiento. Realmente este archivo es el que se le entrega al cliente final. Como programadores, debemos proteger el cdigo fuente y no permitir que otras personas manipulen el cdigo fuente de nuestra aplicacin. Si otra persona toma nuestro cdigo fuente, puede generar una nueva versin de nuestro proyecto y distribuirlo a su vez con otro nombre de producto, contribuyendo con esto al delito de robo de derechos de autor. Nuestra tica nos debe forzar a no tomar el cdigo fuente que otros programadores hayan dejado a nuestro alcance. GENERANDO EL ARCHIVO EJECUTABLE DE LA APLICACIN El primer paso para este proceso es indicarle al FoxPro cual es el archivo principal. En nuestro ejemplo, es el programa PPAL.PRG. Para hacer esto haga clic en la pestaa CODIGO, seleccione el archivo PPAL.PRG, haga clic derecho, y del men emergente que aparece seleccione Establecer Principal.

Este archivo ser el utilizado por el FoxPro para enrutar toda la aplicacin dentro del programa ejecutable. Podemos cambiar el programa principal en cualquier momento que lo deseemos.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

El siguiente paso es hacer clic sobre el botn generar. Este evento activa la caja de dilogo Opciones de Generacin, seleccione la opcin Generar ejecutable , marque la casilla Volver a compilar todos los archivos y haga clic en le botn Aceptar .

Ahora FoxPro preguntar por el nombre a dar al archivo ejecutable generado. Entre el nombre y haga clic en el botn Guardar.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

Ahora FoxPro empezar a mostrar el proceso de compilacin de la aplicacin. Cuando encuentre errores responder con mensajes de error. Haga clic en el botn Ignorar de esta caja y FoxPro continuar con el proceso de compilacin. Si existieron errores durante el proceso de compilacin, FoxPro generar un archivo con el mimo nombre de la aplicacin y la extensin .ERR. Una vez terminado el proceso, puede verificar en el disco duro que el programa ejecutable con el nombre que usted defini, existe con la extensin .EXE. Este archivo puede ser ejecutado en la memoria de su computador.

ANTES DE CREAR LOS DISCOS DE INSTALACIN DE LA APLICACIN Una vez definido el archivo ejecutable en la carpeta de su aplicacin, el siguiente paso es crear los discos de instalacin o distribucin. Para hacer esto hagamos primero lo siguiente: Cree una carpeta en el directorio raz del disco duro y denomnela con el mismo nombre de su aplicacin pero con extensin .EXE. Por ejemplo, para la aplicacin gua CLASEFOX, la nueva carpeta se llamara CLASEFOX.EXE. Esta carpeta se utilizar para mantener una copia de la aplicacin sin el cdigo fuente. Si se generan los discos de instalacin con todo el cdigo fuente en la misma carpeta de generacin, se incluiran automticamente todos los archivos en los discos de instalacin. Copie el programa ejecutable a la nueva carpeta (CLASEFOX.EXE) Copie ahora la carpeta de conos s i los hay. Para que FoxPro guarde en los discos de instalacin las imgenes utilizadas en la aplicacin. Cree una nueva carpeta en el directorio raz del disco duro y denomnela con el mismo nombre de la aplicacin pero con extensin .DSK. Esta carpeta ser utilizada durante el proceso de creacin de los discos de instalacin para guardar los archivos resultantes.

Ahora ya estamos listos para ejecutar el proceso de creacin de los discos de instalacin.

CREACIN DE LOS DISCOS DE INSTALACIN O DISTRIBUCIN Haga clic en el men Herramientas , y seleccione Instalacin del submenu.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

FoxPro muestra ahora la ventana para indicarle donde se encuentran los archivos a distribuir Seleccione la carpeta donde reside el archivo ejecutable (CLASEFOX.EXE). Ahora haga clic en el botn Siguiente.

FoxPro muestra la ventana donde se le indican que componentes deseamos inclur en los discos de instalacin. Seleccione Runtime de Visual FoxPro . Al marcar esta casilla, nuestra aplicacin ejecutar en cualquier equipo sin necesidad de tener el Visual FoxPro instalado. Marque las otras opciones si su aplicacin hacen uso de ellas. Ahora haga clic en el botn Siguiente .

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

Ahora FoxPro muestra la caja de dilogo donde se le debe indicar la carpeta donde colocar los discos de instalacin. En nuestro ejemplo, utilizaremos la carpeta CLASEFOX.DSK. El contenido de esta carpeta es que utilizaremos para copiar a los discos de instalacin. FoxPro crear un directorio denominado como DISK144 o con otra estructura dependiendo del tipo de discos especificados en esta pantalla. Dentro de la carpeta resultante, FoxPro crear una carpeta con el contenido de disco por disco (dependiendo del tamao de la aplicacin). Indique la carpeta destino (CLASEFOX.DSK). Marque la casilla 1.44 MB de 3 pulgadas . Luego haga clic en el botn Siguiente.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

Ahora escriba la informacin que aparecer cuando el usuario ejecute el proceso de instalacin. Entre el ttulo de la aplicacin en el cuadro Ttulo del cuadro de dilogo de la instalacin. Entre la informacin de derechos de autor en el cuadro Informacin de copyright. Seleccione ahora el programa que debe ejecutar el sistema una vez finalizada la instalacin (c: \clasefox.exe\clasefox.exe). Ahora haga clic en le botn Siguiente.

La siguiente caja de dilogo permite indicar el directorio de instalacin (CLASEFOX.EXE). Indique el grupo de programas a definir en el sistema de mens del Windows durante la ejecucin de la instalacin. Seleccione la forma en que la instalacin debe crear el directorio y el grupo de programas. Ahora haga clic en el botn Siguiente.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

La siguiente ventana permite definir la forma en que FoxPro debe distribuir ciertos archivos dentro del nuevo sistema instalado. Parta nuestro caso no cambiemos nada y hagamos clic en el botn Siguiente .

FoxPro nos mostrar la pantalla de haber llegado a la meta de los parmetros de instalacin. Hagamos clic en el botn Finalizar para que FoxPro inicie el proceso de creacin de los discos de instalacin.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #9

FoxPro muestra una caja de dilogo donde aparece el progreso del proceso de creacin de los discos de instalacin.

Cuando haya finalizado mostrar una ventana con la informacin sobre el proceso generado. Hagamos clic en el botn Listo. FoxPro regresar a la ventana de comandos a esperar una nueva orden.

Es el momento propicio para dar una mirada a nuestro disco duro y revisar que fue lo que el proceso de creacin de instalacin defini. Miremos el contenido de la carpeta C:\CLASEFOX.DSK. Para probar la eficacia del proceso de instalacin, borre la carpeta CLASEFOX.EXE y ejecute el proceso de instalacin desde la carpeta C:\CLASEFOX.DSK\DISK144\DISK1\INSTALAR.EXE. Una vez ejecutado el proceso de instalacin, verifique el funcionamiento de la aplicacin. Es importante verificar la salida de la aplicacin, lo mismo que el enrutamiento correcto de los datos dentro de la estructura de disco duro.

Instituto Metropolitano de Educacin

INSTITUTO METROPOLITANO DE EDUCACIN PROGRAMACIN DE COMPUTADORES GUIA #10 DE VISUAL FOXPRO DOCENTE: MAURICIO CANO LA UTILIDAD GENERAR INDICES DEL SISTEMA Uno de los problemas bastante comunes en las aplicaciones con Xbase, es el ndices defectuosos. Entre ms se utilice una aplicacin, mayor es el riesgo a que se originen problemas en ellos. Estos problemas hacen que nuestra aplicacin no halle la informacin en procesos de validacin de cdigos, ordenamiento correcto de los datos, o pueden llegar a causar, que en un reporte o consulta, el sistema, simplemente no muestra nada. En realidad, la informacin no ha sido retirada de la tabla, simplemente por algn problema se han destruido las entradas en un fichero clave (.CDX). Por lo anterior, es recomendable que nuestra aplicacin posea en el men utilidades, una rutina que reconstruya el sistema de ficheros ndices de las tablas del sistema. Debe tener en cuenta que para crear ficheros ndices, no puede haber nadie conectado a la aplicacin. La creacin de ficheros ndices requiere acceso exclusivo a los archivos. En captulos anteriores, se explicaba el uso de la sentencia EXCLUSIVE en las instrucciones INDEX ON. Tenga presente que si la aplicacin trabajar en una red, debe programar rutinas ON ERROR para controlar la situacin de un archivo en uso por otro usuario dentro de la red. Esto, con el objetivo de evitar que la aplicacin cancele su ejecucin debido a un error interno. La pantalla de la utilidad es la siguiente:

1. bTabla

2. bProgreso 3. bFondo

4. btnGenerar

5. btnCerrar

Los objetos identificados con los numerales 1, 2 y 3, son textos. Al objeto 3 asigne el color de fondo (backcolor) gris oscuro (128,128,128). Al objeto 2, asgnele un color ms oscuro que al del objeto 2 (por ejemplo 0,0,64). La idea de los objetos 2 y 3, es dibujar una barra de progreso. El objeto 1 servir para visualizar un texto, acorde al progreso del proceso de indexado. El objeto 2, establezca la propiedad visible como false.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10 BtnGenerar.click *abrir entorno utilizando las variables pblicas *tabla maestro asignaturas set safety off close data *deshabilitar botn this.enabled = .f. *ancho maximo: 349 thisform.bProgreso.visible = .t. thisform.bProgreso.width = 50 thisform.bTabla.caption = "Indexando tabla Programa" mTabla = _dircia + "programa.dbf" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() endif thisform.bProgreso.width = 100 thisform.bTabla.caption = "Indexando tabla Asignaturas" mTabla = _dircia + "asigna.dbf" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() endif thisform.bProgreso.width = 150 thisform.bTabla.caption = "Indexando tabla Profesores" mTabla = _dircia + "profe.dbf" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() endif thisform.bProgreso.width = 200 thisform.bTabla.caption = "Indexando tabla Hojas de vida" mTabla = _dircia + "hvida.dbf" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() endif

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

thisform.bProgreso.width = 250 mTabla = _dircia + "matric.dbf" thisform.bTabla.caption = "Indexando tabla Matrcula" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() endif thisform.bProgreso.width = 300 mTabla = _dircia + "grupos.dbf" thisform.bTabla.caption = "Indexando tabla Grupos" if file( mTabla) use &mTabla exclusive index on codigo tag codigo for !deleted() index on nombre tag nombre for !deleted() endif thisform.bProgreso.width = 348 thisform.bTabla.caption = "Indexando tabla Estudiantes por grupo" mTabla = _dircia + "estgrupo.dbf" if file( mTabla) use &mTabla exclusive index on alltrim( codigo) + alltrim( codestud) ; tag codigo for !deleted() endif thisform.bTabla.caption = "Indices creados..." close data return

La siguiente seccin de cdigo aparece repetida veces en las instrucciones. Su nico objetivo es el mantener en funcionamiento la barra de progreso. thisform.bProgreso.visible = .t. thisform.bProgreso.width = 50 thisform.bTabla.caption = "Indexando tabla Programa" BtnCerrar.click thisform.release Nota: el mtodo de barra de progreso utilizado en esta gua es bastante rudimentario, pero funciona. Recuerde que entre los objetos disponibles en los controles instalados por el Visual Studio, existe uno que permite la creacin y control de barras de progreso de forma muy sencilla. Mostrar la barra de progreso. Tamao de la barra de progreso visualizada. Texto avisando el estado del proceso.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10 LA UTILIDAD EMPAQUETAR TABLAS

Esta utilidad ejecuta el proceso de empaquetar las tablas del sistema. Cuando se retiran registros mediante las pantallas de datos, estos realmente siguen almacenados en las tablas. Lo nico que no permiten que sean visualizados en toda la aplicacin, es el parmetro FOR DELETED() expresado en la orden INDEX ON (orden ejecutada automticamente cuando se crea la tabla o cuando se ejecuta la utilidad GENERAR NDICES DEL SISTEMA. Los registros retirados, siguen ah en las tablas, ocupando espacio. Es bueno incluir una rutina, que retire de forma definitiva todos esos registros eliminados. La pantalla de la utilidad es la siguiente:

1. bTabla

2. bProgreso 3. bFondo

4. btnGenerar

5. btnCerrar

Los objetos identificados con los numerales 1, 2 y 3, son textos. Al objeto 3 asigne el color de fondo (backcolor) gris oscuro (128,128,128). Al objeto 2, asgnele un color ms oscuro que al del objeto 2 (por ejemplo 0,0,64). La idea de los objetos 2 y 3, es dibujar una barra de progreso. El objeto 1 servir para visualizar un texto, acorde al progreso del proceso de empaquetado. Para el objeto 2, establezca la propiedad visible como false.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10 BtnGenerar.click set safety off close data *deshabilitar botn this.enabled = .f. *ancho maximo: 349 thisform.bProgreso.visible = .t. thisform.bProgreso.width = 50 thisform.bTabla.caption = "Empaquetando tabla Programa" mTabla = _dircia + "programa.dbf" if file( mTabla) use &mTabla exclusive pack endif thisform.bProgreso.width = 100 thisform.bTabla.caption = "Empaquetando tabla Asignaturas" mTabla = _dircia + "asigna.dbf" if file( mTabla) use &mTabla exclusive pack endif thisform.bProgreso.width = 150 thisform.bTabla.caption = "Empaquetando tabla Profesores" mTabla = _dircia + "profe.dbf" if file( mTabla) use &mTabla exclusive pack endif thisform.bProgreso.width = 200 thisform.bTabla.caption = "Empaquetando tabla Hojas de vida" mTabla = _dircia + "hvida.dbf" if file( mTabla) use &mTabla exclusive pack endif thisform.bProgreso.width = 250 mTabla = _dircia + "matric.dbf" thisform.bTabla.caption = "Empaquetando tabla Matrcula" if file( mTabla) use &mTabla exclusive pack endif

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

thisform.bProgreso.width = 300 mTabla = _dircia + "grupos.dbf" thisform.bTabla.caption = "Empaquetando tabla Grupos" if file( mTabla) use &mTabla exclusive pack endif thisform.bProgreso.width = 348 thisform.bTabla.caption = "Empaquetando tabla Estudiantes por grupo" mTabla = _dircia + "estgrupo.dbf" if file( mTabla) use &mTabla exclusive pack endif thisform.bTabla.caption = "Proceso generado..." close data return

BtnCerrar.click thisform.release

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

LA UTILIDAD COPIA DE SOPORTE (BACKUP)


Toda buena aplicacin debe proveer un esquema de copia de soporte. En esta seccin, se plantea una sencilla forma de establecer un mtodo de copiado de datos de nuestra aplicacin. El usuario debe entender que este esquema es til solo en escenarios donde el volumen de informacin es mnimo. En este caso, la informacin se enva a la unidad de disquete (A:). Sin embargo, las nuevas unidades quemadoras de discos RW, ofrecen una buena y sencilla alternativa de dispositivo de soporte a un precio muy econmico. El esquema planteado utiliza una versin muy antigua de la utilidad PKZIP. Aunque existe una nueva versin denominada WZZIP en la versin 8.x de la popular herramienta WINZIP (puede descargarla del sitio WWW.WINZIP.COM), presenta la pequea molestia de un mensaje antes de iniciar el proceso de copiado. El siguiente es el formulario que permite ejecutar el proceso de copia de soporte.

1. btnEjecutar

2. btnCerrar

El botn Generar Copia de Soporte ejecuta a la utilidad D.O.S. PKZIP (puede utilizar otro tipo de utilidad empaquetadora de archivos que permita generar copias de soporte a partir de un parmetro en la lnea de comandos). La rutina utiliza la orden PKZIP A:\DBF *.* -es -&w donde: -es : utiliza mximo factor de compresin -&w: le indica a la utilidad que genere una copia de soporte, eliminando cualquier archivo existente en la unidad de destino. BtnEjecutar.click mRuta = m.pPath +'\*.*' && o la ruta de sus datos mTipoZip = 'DBF' wait window 'Copiando ' +mRuta+'...' nowait mOrden = 'pkzip a:\' +mTipoZip+ ' '+ mRuta+' -es -&w' -&mOrden wait window 'Proceso ejecutado...' nowait return BtnCerrar.clic Thisform.release

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

Esta rutina hace uso del comando RUN (!). Un comando que con la nueva era de lenguajes visuales, muchos programadores noveles no aprovechan para ejecutar rdenes externas al Visual FoxPro. Cuando ejecute esta utilidad, el sistema automticamente solicitar que se inserte el primer disquete para las copias. El mensaje aparece en una ventana de ejecucin del Windows. Programe esta ventana desde el entorno Windows para que se cierre automticamente al terminar la ejecucin de la utilidad PKZIP. La utilidad PKZIP debe estar instalada en una de las carpetas de bsqueda del Windows (la indicada por la orden PATH en el olvidado AUTOEXEC.BAT). Si no desea tener mayores problemas al ejecutar el comando, copielo a la carpeta de la aplicacin.
RETO DE PROGRAMACIN

Disee un control de lista desplegable que le permita al usuario seleccionar ms de una unidad de destino de copiado de datos. NOTA: Tenga cuidado con el nombre de las rutas en su aplicacin. PKZIP por ser un programa muy antiguo (el utilizado para esta demostracin), no lee nombres de rutas largos, algo caracterstico de las nuevas versiones de Windows.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

LA UTILIDAD RESTAURAR DATOS A PARTIR DE UNA COPIA DE SOPORTE


La aplicacin debe incluir adems, la posibilidad de restaurar (restore) la informacin desaparecida de una aplicacin, a partir de una copia de soporte, generada por la misma aplicacin en la utilidad COPIAS DE SOPORTE. En este caso, la informacin se lee desde la unidad de disquete (A:). El esquema planteado utiliza una versin muy antigua de la utilidad PKUNZIP. Aunque existe una nueva versin denominada WZUNZIP en la versin 8.x de la popular herramienta WINZIP (puede descargarla del sitio WWW.WINZIP.COM), presenta la pequea molestia de un mensaje antes de iniciar el proceso de restauracin. El siguiente es el formulario que permite ejecutar el proceso de restauracin de datos.

1. btnEjecutar

2. btnCerrar

El botn Restaurar datos ejecuta a la utilidad D.O.S. PKUNZIP (puede utilizar otro tipo de utilidad desempaquetadora de archivos que permita restaurar copias de soporte a partir de un parmetro en la lnea de comandos). La rutina utiliza la orden PKUNZIP A:\DBF -o donde: -o : sobrescribir los archivos en la carpeta de destino. BtnEjecutar.click mRuta = m.pPath && o la ruta de sus datos mTipoZip = '*.*' wait window 'Restaurando ' +mRuta+'...' nowait mOrden = 'pkunzip a:\*.zip '+mTipoZip +' ' +mRuta +' -o' !&mOrden wait window 'Proceso ejecutado...' nowait return BtnCerrar.clic Thisform.release

Cuando ejecute esta utilidad, el sistema automticamente solicitar que se inserte el ltimo disquete del juego de copias de soporte. Una vez lo haya ledo, solicitar el primer disquete, y as hasta que termine el proceso de restauracin. El mensaje aparece en una ventana de ejecucin del Windows. Programe esta ventana desde el entorno Windows para que se cierre automticamente al terminar la ejecucin de la utilidad PKUNZIP.

Instituto Metropolitano de Educacin

Visual FoxPro - Gua de Clases #10

10

La utilidad PKUNZIP debe estar instalada en una de las carpetas de bsqueda del Windows (la indicada por la orden PATH en el olvidado AUTOEXEC.BAT). Si no desea tener mayores problemas al ejecutar el comando, copielo a la carpeta de la aplicacin.
RETO DE PROGRAMACIN

Disee un control de lista desplegable que le permita al usuario seleccionar ms de una unidad de origen de las copias de soporte. NOTA: Tenga cuidado con el nombre de las rutas en su aplicacin. PKUNZIP por ser un programa muy antiguo (el utilizado para esta demostracin), no lee nombres de rutas largos, algo caracterstico de las nuevas versiones de Windows.

Instituto Metropolitano de Educacin

Das könnte Ihnen auch gefallen