+ All Categories
Home > Documents > Visual FoxPro - Compendio de Guias de Clases

Visual FoxPro - Compendio de Guias de Clases

Date post: 14-Apr-2018
Category:
Upload: hmvhmv
View: 238 times
Download: 3 times
Share this document with a friend

of 104

Transcript
  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    1/104

    INSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACININSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORESPROGRAMACIN DE COMPUTADORES

    COMPENDIOCOMPENDIOCOMPENDIOCOMPENDIO DEDEDEDE GUIAGUIAGUIAGUIASSSS DE VISUAL FOXPRODE VISUAL FOXPRODE VISUAL FOXPRODE VISUAL FOXPRO

    DOCENTE: MAURICIO CADOCENTE: MAURICIO CADOCENTE: MAURICIO CADOCENTE: MAURICIO CANONONONO

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    2/104

    Instituto Metropolitano de Educacin 512 44 40

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #1 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    REPASO MANEJO BSICO DE TABLAS

    a) La empresa Instituto Metropolitano de Educacin, requiere el diseo de una base de datos que lepermita almacenar la siguiente informacin:

    1. Maestro de Programas: programas de estudio2. Maestro de asignaturas: asignaturas de estudio.3. Hojas de vida de los estudiantes: informacin bsica de los estudiantes.4. Informacin de matrcula: informacin de matrcula semestral.

    Se requiere disear la estructura de las 4 tablas tal y como se indica a continuacin:

    b) Genere los campos claves indicados en cada estructura.c) Introduzca informacin dentro de cada tabal. Mnimo cinco registros por tabla. Trate de que lainformacin sea ceida a la realidad.d) Genere los formularios para automatizar procesos con las 4 tablas.

    e) Genere cuatro consultas. Una para cada tabla.f) Ejecute los comandos de la hoja Resumen de Comandos dados por el docente. Abra manualmente lastablas y ejecute los comandos. Esto con el objetivo de memorizar rdenes que durante las tareas deprogramacin, se hace muy comn su uso.

    Nota:La programacin es un arte que se logra mediante la prctica. La memoria juega un papelimportante a la hora de escribir cdigo de programas. Una de las ventajas de los nuevos lenguajesVisuales, es el de esconder un poco el cdigo, pero eso no significa que no sea necesario aprender unpoco de las rdenes que caracterizan a cada lenguaje.

    2. Maestro de AsignaturasNombre Campo Tipo de datos AnchoCodigo Carcter 10Nombre Carcter 50Programa Carcter 2

    Campo clave ascendente: Codigo

    1. Maestro de ProgramasNombre Campo Tipo de datos AnchoCodigo Carcter 2Nombre Carcter 50

    Campo clave ascendente: Codigo

    4. MatrculaNombre Campo Tipo de datos AnchoCodigo Carcter 10Fecha Fecha 8Nivel Carcter 2

    Jornada Carcter 1Estado Carcter 1Observacin Memo 10

    Campo clave ascendente: Codigo

    3. Hojas de vidaNombre Campo Tipo de datos AnchoCodigo Carcter 10Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResidencia Carcter 20DirResidencia Carcter 40FechaNacimto Fecha 8

    Campo clave ascendente: Codigo

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    3/104

    Visual FoxPro - Gua de clases #1 2

    Instituto Metropolitano de Educacin 512 44 40

    REPASO COMANDOS DEL FOXPRO

    COMANDOS PARA MANIPULAR TABLAS

    CREATE Crear una tabla.USE Abrir una tabla.

    USE ALIAS Abre una tabla y selecciona el rea de trabajo en la cual se deseatrabajar.USE Cierra cualquier tabla abierta en el rea de trabajo activa

    MODIFY STRUCTURE Modificar la estructura de la tabla abierta.CLOSE ALL Cerrar todos los ficheros abiertos en el sistema FoxPro.

    SELECT Selecciona el reaNde trabajo

    COMANDOS PARA MANIPULAR REGISTROS

    APPEND Agregar registros a la tabla abiertaAPPEND BLANK Agregar un registro en blanco a la tabla abierta

    SCATTER MEMVAR Llevar el registro activo a un arreglo de memoria

    GATHER MEMVAR Llevar un arreglo de memoria al registro activoDELETE Borrar el registro activo

    DELETE ALL Borrar todos los registros de la tabla abiertaDELETE ALL FOR

    Borrar todos los registros que cumplan con la condicin.

    RECALL Recuperar o retirar la marca de borrado lgica de un registroRECALL ALL Recuperar todos los registros con la marca de borrado lgica.

    RECALL ALL FOR

    Recuperar todos los registros que cumplan con la condicin.

    COMANDOS PARA MOVERSE ENTRE REGISTROS

    GO TOP Ir al primer registro de la tabla abiertaGO BOTTOM Ir al ultimo registro de la tabla abierta.

    SKIP + Mueve el puntero de los registros +N posiciones (Avanzar)SKIP - Mueve el puntero de los registros N posiciones (Retroceder)

    COMANDOS PARA TRABAJAR NDICES COMPUESTOS

    USE ORDERTAG

    Abre la tabla indicada y selecciona el como clasificacin delos registros, lo indicado porndice.

    SET ORDER TO TAG

    Selecciona el ndice como orden para los registros.

    SET ORDER TO Cierra cualquier fichero ndice activado para una tabla.SEEK Busca un dato en un campo clave.

    FOUND() Funcin utilizada para verificar el xito de una bsqueda.INDEX ON TAG FOR

    Genera un fichero ndice compuesto basado en el campo clave y utilizacomo filtrado de datos la especificada.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    4/104

    Visual FoxPro - Gua de clases #1 3

    Instituto Metropolitano de Educacin 512 44 40

    CONSULTAS COMPLEMENTO DE LAS CLASES

    Un programador debe consumir y devorar gran cantidad de documentacin. En una clase es imposibledarle todas las tcnicas disponibles a un estudiante. El estudiante debe poner mucho de su parte ydocumentarse acerca de los temas vistos en clase. Se plantean las siguientes consultas para queapoyemos como estudiante, una buena labor por parte del docente.

    Investigar los comandos SET

    Investigar las funciones SYS()

    Que son las reas de trabajo? Cuales son las ordenes bsicas para manipular reas de trabajo? Comose aplican dentro de la programacin de Visual FoxPro?

    La Programacin orientada a objetos en el Visual Foxpro. Como funciona? Que son las clases?Como se programan las Clases? Que es la clase wizstyle?

    Que es el lenguaje SQL? Cuales son las ordenes bsicas del lenguaje SQL? Como se aplican dentrodel FoxPro?

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    5/104

    Visual FoxPro - Gua de clases #1 4

    Instituto Metropolitano de Educacin 512 44 40

    COMPLEMENTO GUA DE CLASES #1

    LAS REAS DE TRABAJO

    Cuando una aplicacin requiere ms de una tabla para poder funcionar, se hace necesario el trabajar lasreas de trabajo. Aunque es bien sabido, con las recientes versiones del Visual Foxpro y su maravilloso

    entorno de programacin, se hace innecesaria utilizar las rdenes que permiten controlar las reas detrabajo. El mismo entorno y estilo de programacin del Visual Foxpro ocultan el funcionamiento de lasreas de trabajo y dejan todo el control a la opcin entorno de datos.

    Sin embargo, es muy til el conocer los comandos que permiten el manejo de las reas de trabajo.

    a. USE / ALIAS

    Permite abrir una tabla y asignar un alisa o nombre interno para referencias subsecuentes.Muchos diseos de aplicaciones requieren de largos y complejos nombres en las tablas. Elasignar un alias resulta til a la hora de hacer referencia en forma fcil dentro del cdigo de la

    aplicacin.

    Sintaxis: USE ORDER TAG ALIAS

    El Id Alias es un nombre corto para hacer referencia a la tabla en rdenes subsecuentes a suejecucin. Si no se utiliza la opcin ALIAS, el sistema asignar automticamente como alias elmismo nombre de la tabla.

    Ver el ejemplo siguiente para comprender el uso de esta orden.

    b. SELECT n

    Activa el rea de trabajo indicada por la n. Un rea de trabajo es un espacio asignado enmemoria para la tabla que se abra inmediatamente despus de ejecutada la orden. FoxPro tienegran capacidad para asignar reas, as que si la aplicacin requiere de muchas tablassimultneamente abiertas en memoria, no vamos a tener ningn problema.

    Para designar el rea de trabajo podemos utilizar nmero del 1 hasta donde lleguemos encantidad de tablas. O podemos utilizar letras para hacer referencias a las reas, iniciando por laletra A. Existe un identificador especial para nombrar reas y es el cero (0). Este identificador leindica al FoxPro que utilice el rea mxima disponible para reas de trabajo. Esta referencia esbastante til para utilizar en rutinas subsecuentes y distantes de la rutina inicial cuando se

    abrieron todas las tablas requeridas.

    Una vez se selecciona el rea de trabajo y se abre una tabla, para hacer referencia a la tabla,basta con aplicar la orden SELECT acompaada del rea programada.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    6/104

    Visual FoxPro - Gua de clases #1 5

    Instituto Metropolitano de Educacin 512 44 40

    Analicemos el siguiente cdigo:

    1 SELECT 1USE PROGRAMAS ORDER TAG CODIGO ALIAS PROG

    Activar el rea 1 o AAbrir la tabla programas y utilizarcomo alias PROG.

    2 SELECT 2

    USE ASIGNA ORDER TAGCODIGO

    Activar el rea 2 o B.

    Abrir la tabla ASIGNA. El alias automticamente de estatabla es ASIGNA, el mismo nombre de la tabla.

    3 SELECT CUSE MATRIC ORDER TAG CODIGO

    Activar el rea 3 o C.Abrir la tabla MATRIC. El alias automticamente deesta tabla es MATRIC, el mismo nombre de la tabla.

    4 SELECT PROG

    DELE ALL

    Selecciona y activa el rea 1. Se utiliza el mismo aliasasignado a la tabla.Borra todos los registros de la tabla PROGRAMAS

    5 SELECT BLIST

    Selecciona y activa el rea 2.Lista el contenido de la tabla ASIGNA.

    6 SELECT 3BROWSE

    Selecciona y activa el rea 3.Ejecuta la ventana Examinar en la tabla MATRIC.

    Si ejecutamos la orden:

    SELECT 0USE PROFESOR ORDER TAG CODIGO ALIAS PROFE

    Se utilizara como rea de trabajo la 4 o D. Como alias asignado a la tabla, quedara PROFE. Elcomando SELECT 0 es muy til cuando se desea abrir una tabla de forma temporal, para luegovolver a la tabla que estaba abierta cuando se invoco. Por ejemplo, la siguiente seccin decdigo, guarda en una variable el rea seleccionada, abre una tabla en el rea mximadisponible, examinar la informacin, la cierra y regresa al rea inicial de trabajo.

    mAlias = alias()mFilter = filter()

    SELECT 0USE NOTAS ORDER TAG CODIGOBROWSEUSE

    SELECT mAliasSET FILTER TO FILTER

    Nota: Para cerrar todas las tablas abiertas, puede utilizar CLOSE ALL. Si solo desea cerrar latabla de un rea en especial, utilice la orden USE. Por ejemplo, de acuerdo al cdigo mostradohace unos momentos, si desea cerrar la tabla ASIGNA ejecute las siguientes ordenes:

    SELE 2USE

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    7/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #2 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    EL ACCESO A UNA APLICACIN

    Lo normal en cualquier aplicacin, es que una vez se carguen en el computador, nos reciban con una pantalla de

    acceso, solicitndonos datos de identificacin tales como Cdigo de la Compaa, Nombre de Usuario yContrasea del Usuario. Es por esta razn, que se plantea como primer tema de clases, el disear una pantalla quepermita controlar el acceso de los usuarios e internamente, ensearle al sistema en que lugar del computador residela informacin.

    En esta pantalla se maneja internamente variables pblicas que se utilizarn en cuanto formulario se disee dentrode la aplicacin. La variable pblica _CodCia incluye el cdigo de la compaa ingresada, _NomCia el nombre dela empresa (usada en los reportes), _DirCia es el directorio de datos de la compaa, _CodUsua es el cdigo delusuario conectado al sistema. En la gua de clases #3 aparece un tip de programacin que permite agilizar el diseode aplicaciones que dependan de variables de configuracin tal como las anteriores.

    1: mCodigo2: mUsuario

    3: mClave

    4: btnAceptar5: btnCancelar

    BtnAceptar.click

    *verificar informacin entrada por el usuarioselect cias

    _CodCia = alltrim( thisform.mCodigo.value)

    seek _CodCiaif found()

    *verificar existencia tabla de usuariosmTabla = alltrim( cias.directorio) +"usuarios.dbf"if !file( mtabla)

    wait window"No existen Usuarios" nowaitrelease thisformcancel

    endif

    *abrir tabla de usuarios de la cia entradasele 2use &mTabla order tag codigo

    _CodUsua = alltrim (thisform.mUsuario.value)

    seek _CodUsuaif found()

    *verificar clavemclave = alltrim( thisform.mclave.value)if alltrim (usuarios.clave)=mclave

    *dejar entrarwait window"Puede entrar el Sistema" nowaitrelease thisform

    elsewait window "Clave Incorrecta" nowait

    endifelse

    *no existe usuariowait window "Usuario no Existe" nowait

    endifelse

    wait window"Compaia no Existe" nowaitendif

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    8/104

    Visual FoxPro - Gua de Clases #2 2

    Instituto Metropolitano de Educacin

    Formulario.Initset echo offset talk offset date to mdy*enrutar al directorio base de la aplicacinset default to c:\clasefox

    public _CodCia, _NomCia, _DirCia, _CodUsua_CodCia = space( 2)_NomCia = space( 50)_DirCia = space( 100)_CodUsua = space( 10)

    *tabla de las compaasselect 1use cias order tag codigo

    BtnCancelar.Click

    close allrelease thisform

    NOTA: La tcnica empleada para esta pantalla, es la de disear aplicaciones independientes de los datos.

    Muchos programdores amarran sus aplicaciones a las bases de datos. Los sistemas tienden a crecer daa da, puede que inicialmente diseemos una aplicacin con directorio de almacenamiento local (en elmismo disco duro), y cuando menos lo pensamos, se nos hace la peticin de que se requiere almacenar las

    bases de datos en un servidor (algo normal en una empresa).

    Debemos disear aplicaciones que reconozcan el origen de los datos y que internamente en una sencillaoperacin, se dirijan al sitio de los datos y los utilicen en forma transparente para el usuario.

    La rutina planteada, permite que el sistema tome la informacin de instalacin de los datos de la tabla deconfiguracin empresa (cias.dbf), capture el campo directorio y se enrute hacia ese sitio para leer losdatos de los usuarios.

    Observe que en la parte en donde se permite el acceso al sistema, no existe an una instruccin quecontine la ejecucin normal de la aplicacin. Esta ser explicado en otra gua de clases. Por el momentolo importante es captar la forma en que se debe disear una aplicacin inteligente, con capacidad de hallarel origen de sus datos, bien sea que estn en el mismo disco duro, o en otro lugar (servidor o estacin) enuna red local.

    RETO DE PROGRAMACIN

    Trate de mejorar esta rutina colocando controles que le permitan al usuario ejecutar solo tres intentos deacceder al sistema.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    9/104

    Visual FoxPro - Gua de Clases #2 3

    Instituto Metropolitano de Educacin

    COMPLEMENTO A LA GUA #2

    LA BSQUEDA DE INFORMACIN EN TABLAS INDEXADAS

    La bsqueda de informacin permite tener mayor control sobre los datos almacenados en las tablas. Parapoder buscar informacin, es importante saber manipular las rdenes de indexados, activacin de ndices,ordenes de bsqueda y funciones para el chequeo de la efectividad de las bsquedas. FoxPro trae muchasrdenes suficientes para que nuestras aplicaciones tengan control de la informacin clave de nuestrastablas.

    USE TablaORDER TAG NombreTag

    Abre la tabla indicada y activa como ndice el especificado por NombreTag. El xito de ejecucin deesta orden requiere que la tabla haya sido previamente indexada.

    Por ejemplo, esta instruccin abre la tabla PROGRAMA y activa CODIGO como orden de la tabla.Ahora, podremos listar la informacin de la tabla clasificada por este campo o podremos ejecutar

    bsquedas de datos basado en este campo clave.

    USE PROGRAMA ORDER TAG CODIGO

    SET ORDER TO TAG NombreTag

    Permite activar el campo ndice indicado por NombreTag. Por ejemplo, la siguiente orden abre latabla PROGRAMA en una instruccin aparte, luego ejecuta SET ORDER TO TAG para establecer elcampo clave a utilizar para el ordenado de los datos o ejecucin de bsquedas:

    USE PROGRAMASET ORDER TO TAG CODIGO

    En este caso, es mejor utilizar una lnea para abrir la tabla y simultneamente asignar el campo deordenamiento. Esta orden resulta muy til, cuando se necesita establecer un orden para la tabla, sinnecesidad de volverla a abrir.

    Por ejemplo, abrimos la tabla PROGRAMA e inmediatamente asignamos la clasificacin de los datos.

    USE PROGRAMA ORDER TAG CODIGO

    Si ejecutamos la siguiente orden, se listara la informacin clasificada por el la entrada claveCODIGO.

    LIST

    Ahora, activaremos otro campo de ordenamiento y ejecutaremos nuevamente LIST. Esta vez se listala informacin clasificada por el campo NOMBRE.

    SET ORDER TO TAG NOMBRELIST

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    10/104

    Visual FoxPro - Gua de Clases #2 4

    Instituto Metropolitano de Educacin

    INDEX ON ExpIndiceTAGNombreTagFOR !DELETED()

    Esta orden permite generar una entrada especial de ndice compuesto, clasificando la informacin porla expresin de ndice ExpIndice. EL nombre de la entrada sera el indicado por NombreTag. Laclusula FOR permite establecer un filtro para los datos clasificados. En este caso, se utiliza comofiltrado de datos, a todos los registros que no se hallan borrado de la tabla. Acostmbrese a utilizaresta clusula en cuanto indexado construya. Esta instruccin le permitir tener mayor control de losdatos existentes en una tabla, y su respectivo manejo a travs de los formularios (recuerde que cuandose retira un registro con la orden DELETE este no se borra fsicamente -borrado lgico- de la tablahasta no ejecutar PACK borrado fsico-). Si no utiliza esta clusula, los informes, y muchas rdenesde recorrido de registros, incluiran a los borrados de las tablas.

    Por ejemplo, la siguiente instruccin crea una entrada ndice denominada CODIGO para la tablaPROGRAMA. Adicionalmente, con la clusula FOR se filtran todos los borrados de la tabla. En latercer orden, se crea una entrada clave denominada NOMBRE.

    USE PROGRAMAINDEX ON CODIGO TAG CODIGO FOR DELETED()

    INDEX ON NOMBRE TAG NOMBRE FOR !DELETED()Nota: Tenga en cuenta que esta rden crea inicialmente un fichero compuesto con el mismo nombrede la tabla y con la extensin .CDX. Para el ejemplo anterior, si miramos el sitio donde se encuentraalmacenada la tabla PROGRAMA.DBF aparece un nuevo archivo denominado PROGRAMA.CDX.Las siguientes entradas ndices se agregarn al ndice compuesto.

    Expresiones de ndices compuestos

    Muchas veces una aplicacin requiere la construccin de ndices compuestos para poder funcionar.Por ejemplo, el detalle de las notas de unos estudiantes, podra ser un claro ejemplo de ello. La tablade notas (por diseo del software) contiene solo el campo CODIGO del estudiante y el campo

    CODASIGNA que incluye el cdigo de las asignaturas.

    USE NOTASINDEX ON CODIGO +CODASIGNA TAG CODASIGNA FOR DELETED()

    La clase de Ingeniera de Software le ensear el momento preciso en que se requieren ndicescompuestos para una aplicacin.

    Esta clase de ndices tambin se requieren a veces para listar informacin referente a una mismaclave. Por ejemplo, si se tiene la tabla ESTGRUPO para almacenar los estudiantes en los grupos declase, con un campo de CODGRP para el cdigo de los grupos y otro campo denominado CODEST

    para guardar el cdigo de los estudiantes, la instruccin para crear el campo clave compuesto es la

    siguiente:

    USE ESTGRPINDEX ON CODGRP +CODEST TAG CODEST FOR DELETED()

    Esta forma especial de definir campos claves involucrando a ms de un campo, debe considerarse almomento de ejecutar las bsquedas de informacin en tales tablas. El sistema FoxPro crea un solocampo clave, donde almacena la expresin resultante para clasificar la informacin de la tabla.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    11/104

    Visual FoxPro - Gua de Clases #2 5

    Instituto Metropolitano de Educacin

    Los campos involucrados en una expresin compuesta deben ser del mismo tipo de datos. Porejemplo, si CODGRP es carcter, entonces CODEST tambin debe serlo. Si el diseo de la tablaindica que se deben involucrar campos con diverso tipo de datos, entonces se requiere la aplicacin defunciones para la conversin de los datos.

    Funciones para conversin de datos

    Las funciones ms utilizadas para formar expresiones de campos claves compuestos son lassiguientes:

    STR( ExpresinNumrica) : convierte la expresin numrica a cadena de caracteres.

    VAL( ExpresinCaracter) : convierte la expresin de caracteres a un valor numrico. La expresinaunque sea de tipo carcter, debe tener forma o estructura numrica.

    DTOC( ExpresinFecha): convierte la expresin fecha a una cadena o expresin de tipo carcter.

    CTOD( ExpresinFecha): convierte una expresin tipo fecha a una cadena de caracteres.

    Tenga presente que la expresin de clave debe tener el mismo tipo de datos. Para saber que funcionesutilizar para armar la expresin, analice los tipos de datos y la estuctura o forma de los camposonvolucrados y aplique las funciones para armar una expesin unificada de datos. Por ejemplo, sianaliza los datos de un campo, y detecta uno de tipo carcter y otro de cualquier tipo, la clave esllevarlos a una expresin de tipo carcter.

    Por ejemplo, si se tiene una tabla de KARDEX y en ella tenemos unos campos CODREF para loscdigos de los artculos y otro campo FECHA para almacenar la fecha en que se registro unareferencia en el kardex. La forma de definir el ndice es el siguiente:

    USE KARDEX

    INDEX ON CODREF +DTOC( FECHA) TAG CODFECHA FOR !DELETED()

    Debido a que el campo CODREF es carcter y FECHA es de tipo fecha, mejor se llev la conversina cadena de caracteres. La experiencia le ensear a aplicar en forma adecuada la conversin de datosy la generacin de expresiones para ndices compuestos.

    BUSCAR INFORMACIN EN UNA TABLA INDEXADA

    Una de las aplicaciones de los ndices es la de permitir la bsqueda de informacin en las tablas.Adems, el uso de funciones que permiten analizar si una bsqueda fue exitosa o no.

    Estas son las rdenes y funciones que permiten manipular bsquedas en campos claves activados (verla orden SET ORDER TO).

    SEEK Expresin_a_buscar

    Ejecuta una bsqueda en el campo clave, utilizando como criterio de bsqueda laExpresin_a_buscar.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    12/104

    Visual FoxPro - Gua de Clases #2 6

    Instituto Metropolitano de Educacin

    La Expresin_a_buscar debe ser del mismo tipo de datos de la expresin clave generada al momentode indexar. Si ocurre lo contrario, FoxPro generar un error de tipos de datos incompatibles. Estaexpresin puede ser una variable. Tenga cuidado al definir variables para buscar informacin, porejemplo, si define la variables CODIGO y resulta que en su tabla existe un campo llamado CODIGO,el sistema, simplemente no busca nada. Para evitar esto, agregue identificadores a los nombres de lasvariables para identificarlos de los nombres de los campo, por ejemplo, agregue una m a cuantavariable defina: mCODIGO o simplemente utilice el indicador de variable de memoria ( .m) delFoxPro m.codigo.

    En este ejemplo, se busca el dato almacenado en la variable mCodigo, en el campo clave CODIGOde la tabla PROGRAMA.

    SELECT PROGRAMASEEK mCodigo

    La orden Seek mueve automticamente el puntero al registro hallado. Lo que significa que despus deejecutada tal orden, basta activar el rea de trabajo de la tabla y ejecutar la orden deseada sobre el

    registro activo. FOUND() : Esta funcin retorna el estado de xito de la orden buscar recin ejecutada. Retorna .t. si

    la bsqueda fue exitosa. Retorna .f. en caso contrario. Utilice una estructura de control de flujo paradeterminar las acciones a tomar acorde al estado de la bsqueda.

    Si a la secuencia de ordenes anteriores agregamos la siguiente, se obtiene un control de lo quedeseamos hacer si se hall algo o no.

    IF FOUND()WAIT WINDOW SE HALL ALGO... NOWAIT

    ELSE

    WAIT WINDOW NO SE HALL NADA... NOWAITENDIF

    Nota: como caso curioso del FoxPro, muchas veces cuando se coloca algo de por medio entre laorden SEEK y la funcin FOUND() el sistema muestra resultados inesperados, como si se le olvidaseel resultado de la bsqueda inmediatamente ejecutado el chequeo. Acostmbrese a colocar el chequeodel resultado -IF FOUND()-, inmediatamente despus del SEEK.

    SEEK( mExpresion_a_buscar, Alias) : Funcin que permite buscar un registro y retornar si se hallalgo o no (ms o menos, SEEK ms FOUND() combinadas). Esta funcin resulta til para utilizar ensitios donde no se puede colocar la orden SEEK ms el chequeo con FOUND(), tales como reportes,formularios, etc. Esta funcin no mueve el puntero al registro hallado, simplemente se limita a afirmar

    si el dato est o no en la tabla y campo clave seleccionado.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    13/104

    Visual FoxPro - Gua de Clases #2 7

    Instituto Metropolitano de Educacin

    LOCATE FORExpresin_de_Condicin

    Ejecuta una bsqueda secuencial, revisando registro a registro. Esta orden se puede utilizar parabuscar informacin en tablas que no estn indexadas. Esta orden permite un rango mayor debsqueda, al permitir establecer la condicin de bsqueda.

    Ejemplo 1:LOCATE FOR APELLIDOS = CANO .AND. NOMBRE = MAURICIOCONTINUE

    Este ejemplo, busca la primer ocurrencia de datos de la condicin apellidos igual a CANO ynombre correspondiente a MAURICIO. La instruccin CONTINUE le indica al FoxPro quecontine con la bsqueda recin iniciada.

    Ejemplo 2:

    La posibilidad de aceptar condiciones como parmetro de bsqueda, convierte a esta sencilla

    instruccin en potente comando de programacin, que bien utilizado, puede salvarnos el da.LOCATE FOR MAURICIO $ NOMBRECONTINUE

    En este ejemplo, se buscarn todos los nombres iguales a MAURICIO.

    Comentarios

    La tabla no necesita estar indexada.

    Si LOCATE encuentra un registro coincidente, podr utilizar RECNO( ) para devolver el nmero del

    registro coincidente. Si se encuentra un registro coincidente, FOUND( ) devolver verdadero (.T.) yEOF( ) devolver falso (.F.).

    Despus de que LOCATE encuentre un registro coincidente, puede emitir CONTINUE para buscarregistros coincidentes adicionales en el resto de la tabla. Cuando se ejecuta CONTINUE, se reanuda el

    proceso de bsqueda, empezando por el registro que sigue inmediatamente al registro coincidente.Puede emitirCONTINUErepetidamente hasta llegar al final del alcance o de la tabla.

    Si no se encuentra ninguna coincidencia, RECNO( ) devolver el nmero de registros de la tabla msuno,FOUND( ) devolver falso (.F.) yEOF( ) devolver verdadero (.T.).

    LOCATE y CONTINUE son especficos del rea de trabajo actual. Si se selecciona otro rea de

    trabajo, el proceso de bsqueda original podr continuarse cuando se vuelva a seleccionar el rea detrabajo original.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    14/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #3 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    Las tcnicas de programacin varan de un programador a otro. Cada programador asume la tcnica quedesee para desarrollar sus aplicaciones. Sea cual sea la tcnica empleada, lo ms importante es que seafuncional.

    Se propone la siguiente tcnica de programacin diseada por nuestra dependencia, muy til para eltrabajo en lnea. Permitiendo mayor velocidad al entrar, buscar , retirar y consultar datos. Cada grupo deestudio deber elaborar los diseos de las otras tablas diseadas y propuestas por la gua de clases #1.Cada grupo deber experimentar con el mtodo de trabajo propuesto y hallar las posibles fallas tcnicasde diseo (algo normal en grandes aplicaciones).

    1: mCodigo 2: btnCargar 3: btnLimpiar 4: mNombre5: btnPrimero 6: btnAnterior 7: btnSiguiente 8: btnUltimo9: btnAgregar 10: btnActual 11: btnRetirar 12: btnReporte13: btnExaminar 14: btnCerrar

    BtnPrimero.click

    *ir al primerowait window "Primer registro..." nowaitsele 1go topscatter memvar memothisform.refreshreturn

    BtnAnterior.Click*ir al anteriorsele 1if !bof()

    skip -1endifif bof()

    go topendifscatter memvar memothisform.refreshreturn

    BtnSiguiente.Click*ir al siguiente

    sele 1if !eof()

    skip 1endifif eof()

    go bottomendifscatter memvar memothisform.refreshreturn

    BtnUltimo.Click

    *ir al ultimowait window "ltimo registro..." nowaitsele 1go bottomscatter memvar memothisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    15/104

    Visual FoxPro - Gua de Clases #3 2

    Instituto Metropolitano de Educacin

    BtnAgregar.Click*agregar registro con los datos en pantallasele 1

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocus

    returnendif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    *verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()

    mMens1 = "Imposible agregar, el cdigo " +mCodigo+" ya existe!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2,

    0+64, "Atencin!")thisform.mCodigo.setfocusreturn

    endif

    *agregar nuevo registro con los datos en pantallasele 1insert into programa from memvar

    *cargar nuevos datos en blanco

    scatter memvar blank

    *ir al primer campothisform.mCodigo.setfocus

    thisform.refresh

    BtnActual.Click*actualizar el contenido de un campo

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    *actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado

    gather memvar memo

    wait window "Datos actualizados..." nowaitelse

    mMens1 = "Imposible actualizar, el cdigo "+mCodigo +" no existe!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente actualizar denuevo..."

    mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")

    thisform.mCodigo.setfocusreturn

    endif

    return

    BtnExaminar.Click*examinar registrossele 1browse fields codigo, nombre noedit noappend nodelete

    *activar el seleccionadoscatter memvar memo

    thisform.refreshreturn

    BtnLimpiar.Click

    *limpiar el contenido de los camposwait window "Datos en blanco..." nowaitscatter memvar memo blankthisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    16/104

    Visual FoxPro - Gua de Clases #3 3

    Instituto Metropolitano de Educacin

    BtnRetirar.Click*retirar el registro clave halladosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif !found() && no existe codigo

    mMens1 = "Imposible retirar, el cdigo "

    +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente retirarde nuevo..."

    mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")

    thisform.mCodigo.setfocusreturn

    endif

    mMens1 = "Desea retirar el cdigo " + mCodigo +" delsistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirarregistro!")

    if mOpc = 1 && Clic en botn Aceptarsele 1deletewait window "Registro retirado del sistema..."

    nowait

    *mover puntero al prximo disponibleif !eof()

    skip 1endifif eof()

    go bottom

    endif

    endif

    scatter memvar memothisform.refreshreturn

    BtnCargar.Click*cargar el contenido de los campos con la clave entrada

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocus

    returnendif

    *cargar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado

    scatter memvar memowait window "Datos cargados..." nowait

    elsemMens1 = "Imposible cargar datos, el cdigo "

    +mCodigo +" no existe!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente cargardatos de nuevo..."

    mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")endif

    thisform.refreshthisform.mCodigo.setfocus

    return

    BtnCerrar.Click

    thisform.release

    Form.Init*abrir entorno utilizando las variables pblicas

    mFile1 = _dircia +"programa.dbf"if !file( mFile1)

    do cPrograma in prg\creartblendif

    sele 1use &mFile1 order tag codigo alias programa

    scatter memvar memo

    *ir al objeto inicialthisform.mCodigo.setfocusreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    17/104

    Visual FoxPro - Gua de Clases #3 4

    Instituto Metropolitano de Educacin

    Rutinas adicionales para que este diseo funcione:

    Se requiere una rutina que defina las tablas en forma automtica. Esta rutina dar un grado de inteligenciaal sistema, al permitirle definir las tablas que no existan, en forma automtica. Un sistema que incluya talfuncionalidad, simplemente, nunca fallar por falta de datos.

    CREATBL.PRG

    Esta rutina debe crearse en el generador del proyecto en Codigo/Programas. Defina la carpetaprgparaalmacenar las rutinas que definamos dentro de la carpeta del proyecto.

    *creatbl.prg* Definir las tablas del sistema* invocar: do cPrograma in prg\creatbl

    procedure cPrograma*chequear y definir tabla de asignaturas

    *definir una cadena de tal forma "c:\clasefox\01\programa.dbf"mTabla = _dircia + "programa.dbf"

    if !file( mTabla)create table &mTabla ;

    ( codigo c ( 10), ;nombre c ( 50))

    index on codigo tag codigo for !deleted()index on nombre tag nombre for !deleted()close datawait window "Tabla "+mTabla +" definida..." nowait

    endif

    return && cPrograma

    * creatbl.prg

    TIP DE PROGRAMACIN

    Es muy til el definir una rutina independiente denominada public con todas las variables pblicas autilizar durante el diseo del sistema. Con esto nos ahorramos tiempo al no tener que hacer todo elrecorrido de la aplicacin para verificar el funcionamiento de una aplicacin.

    *public.prg* utilizar solo durante diseo de programas

    * los datos en este programa deben ser inicializados por* la pantalla de entrada al sistema

    public _codcia, _nomcia, _dircia, _codusua_codcia = "01"_nomcia = "COLEGIO 01"_dircia = "c:\clasefox\01\"_codusua = "01"* public.prg

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    18/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #4 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    Continuando con la tcnica #1, ha llegado el momento de demostrar las habilidades que comoprogramadores, hemos desarrollado hasta el momento. Gran parte del arte de la programacin, seadquiere imitando modelos hechos por otros programadores. Si como programadores, desarrollamos

    rutinas que pueden ser perfectamente reutilizables en otras partes de la aplicacin, lo normal es tomar elmodelo base y copiarlo tantas veces lo necesitemos. Ms adelante aprenderemos que cuando se requierehacer esto muy a menudo, lo ms prctico es definir una clase y basar todas nuestras pantallas en ella.

    EL FORMULARIO PARA EL MAESTRO DE ASIGNATURAS

    Para la elaboracin del siguiente formulario abra el formulario de la gua #3 y grbelo (MenArchivo/Salvar Como) con otro nombre (frmasigna) en la carpeta donde residen los formularios(c:\clasefox\documentos). Recuerde agregarlo al proyecto en la ventana donde aparecen listados losformularios (Ventana proyecto, clic en botn Agregar).

    Lo primero que haremos ahora, es abrir el formulario recin agregado, abrirlo en la ventana de diseo y

    modificar el Caption del formulario, para que diga Maestro de Asignaturas. Esto es importante, ya queel tener correctamente identificadas las pantallas, nos puede llegar a ayudar a ubicarnos rpidamente en la

    pantalla de trabajo, y evitar posibles dolores de cabeza al sobrescribir cdigo de pantallas ya terminadas.

    Reorganice la pantalla original de programas (la recin copiada) para que incluya el campo programa dela tablaASIGNA.DBF.

    1: mPrograma 2: btnAgregar 3: btnActual 4: btnExaminar

    Todos los controles continan con los mismos nombres. El nuevo obje to de campo es el referenciado conel numeral 1 (mPrograma). Los objetos que aparecen referenciados con nmeros (del 1 al 4) indican queel cdigo del evento clic presenta variaciones. Los dems objetos, continan con el mismo cdigo

    programado en la leccin anterior.

    Ahora lo que debemos hacer, es personalizar el formulario para que apunte a la tabla en cuestin, ennuestro caso, Asigna.dbf. Debe alterar el cdigo del evento INIT del formulario, y modificar el cdigo

    para que disee automticamente la tabla Asigna y abra simultneamente la tabla de programa (utilizandoreas de trabajo).

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    19/104

    Visual FoxPro - Gua de Clases #4 2

    Instituto Metropolitano de Educacin

    BtnAgregar.Clic*agregar registro con los datos en pantallasele 1

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    if empty( thisform.mPrograma.value)wait window "Programaincorrecto..." nowaitthisform.mPrograma.setfocusreturn

    endif

    *verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()

    mMens1 = "Imposible agregar, el cdigo " +mCodigo+" ya existe!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64,

    "Atencin!")thisform.mCodigo.setfocusreturn

    endif

    *validar el programa entrado por el usuariomPrograma = alltrim( thisform.mPrograma.value)sele programaseek mProgramaif !found()

    mMens1 = "El cdigo de Programa "+mPrograma +" no existe!" +chr(13)

    mMens2 = "Utilice un cdigo vlido e intente denuevo..."

    mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")

    thisform.mPrograma.setfocusreturn

    endif

    *agregar nuevo registro con los datos en pantallasele 1insert into asigna from memvar

    *cargar nuevos datos en blancoscatter memvar blank

    *ir al primer campothisform.mCodigo.setfocus

    thisform.refresh

    BtnActual.Click*actualizar el contenido de un campo

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    if empty( thisform.mPrograma.value)wait window "Programaincorrecto..." nowaitthisform.mPrograma.setfocusreturn

    endif

    *validar el programa entrado por el usuario

    mPrograma = alltrim( thisform.mPrograma.value)sele programaseek mProgramaif !found()

    mMens1 = "El cdigo de Programa " +mPrograma +"no existe!" +chr(13)

    mMens2 = "Utilice un cdigo vlido e intente denuevo..."

    mOpc = messagebox( mMens1 +mMens2, 0+64,"Atencin!")

    thisform.mPrograma.setfocusreturn

    endif

    *actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado

    gather memvar memowait window "Datos actualizados..." nowait

    elsemMens1 = "Imposible actualizar, el cdigo " +mCodigo +"

    no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente actualizar de

    nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64,

    "Atencin!")

    thisform.mCodigo.setfocusreturnendif

    sele 1

    return

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    20/104

    Visual FoxPro - Gua de Clases #4 3

    Instituto Metropolitano de Educacin

    BtnExaminar.Click*examinar registrossele 1browse fields codigo, nombre, programa noeditnoappend nodelete

    *activar el seleccionadoscatter memvar memo

    thisform.refreshreturn

    Form.Init*abrir entorno utilizando las variables pblicas

    *tabla mae stro asignaturasmFile1 = _dircia +"asigna.dbf"if !file( mFile1)

    do cAsigna in prg\creatblendif

    sele 1use &mFile1 order tag codigo alias asigna

    *tabla maestro programasmFile2 = _dircia +"programa.dbf"if !file( mFile2)

    do cPrograma in prg\creatblendif

    sele 2

    use &mFile2 order tag codigo alias programasele 1scatter memvar memo

    *ir al objeto inicialthisform.mCodigo.setfocus

    return

    Observe que las modificaciones hechas al cdigo, aparecen resaltadas en Negrita. Analice que cambios

    se hicieron al cdigo elaborado en la gua #3 y analice el efecto que esas nuevas instrucciones tienensobre el formulario.

    Nota: Para que cada formulario se ejecute independiente de los dems, ajuste la propiedad DataSessiondel formulario a 2-Sesion Privada de Datos. Esto le indicar al FoxPro que maneje el entorno de datos decada formulario en porciones diferentes de la memoria. Si no se hace esto (1-Sesin predeterminada dedatos), se generaran innumerables errores de El archivo ya est en uso cada vez que se ejecute unformulario, inmediatamente despus de haber ejecutado otro. Esta configuracin especial le permitir alusuario abrir varias instancias de un mismo formulario, tantas veces como la memoria se lo permita(existe en la documentacin del FoxPro sobre la programacin utilizando instancias de formularios).

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    21/104

    Visual FoxPro - Gua de Clases #4 4

    Instituto Metropolitano de Educacin

    Rutinas adicionales para que este diseo funcione:

    Se requiere modificar la rutina que define las tablas en forma automtica. Se debe agregar una nuevasubrutina que permita definir la tablaAsigna.dbf.

    CREATBL.PRG

    Agregue este segmento de cdigo a la rutina CREATBL.PRG

    procedure cAsigna*definir tabla de asignaturasmFile = "c:\clasefox\01\asigna.dbf"create table &mFile ;

    ( codigo c ( 10), ;nombre c ( 50), ;programa c ( 2))

    index on codigo tag codigo for !deleted()index on nombre tag nombre for !deleted()

    close datareturn && cAsigna

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    22/104

    Visual FoxPro - Gua de Clases #4 5

    Instituto Metropolitano de Educacin

    RETO DE PROGRAMACIN

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

    Para obtener una pantalla como la anterior, haga el siguiente proceso:

    1. Elimine el objeto mPrograma del formularioAsigna.

    2. Agregue un control de Cuadro Combinado de la barra de herramientas del formulario. Seleccione laherramienta Cuadro Combinado y demarque el rea en el lugar donde estaba el objeto mPrograma. Noexagere con el tamao del nuevo objeto. Haga un diseo proporcional acorde a la cantidad deinformacin a mostrar.

    3. Modifique las siguientes propiedades del objeto recin agregado al formulario: Name: mPrograma ControlSource: m.programa RowSource: programa.codigo, nombre RowSourceType: 2-Alias ColumnWidths: 40,200

    4. Si hizo todo el trabajo bien hecho, al ejecutar el formulario, ver una forma muy efectiva de trabajo, alpermitir que el usuario seleccione los datos de las tablas relacionadas con las tablas maestras. Estodescarga al usuario, la obligacin de tener que aprenderse una serie de cdigos para introducir en los

    formularios.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    23/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #5 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    TCNICA DE PROGRAMACIN #2 DISEO TIPO FOXPRO

    La tcnica de programacin tipo Visual FoxPro es un diseo propuesto desde hace mucho tiempo por los

    fabricantes del producto en los ejemplos y ayudas del producto. Los programadores desde entoncesvienen imitando ese modelo de programacin, que para el viejo sistema DOS y Windows 3.1. era bastantefuncional.

    Muchos gerentes de sistemas prefieren que sus programadores diseen de tal forma por ser un tipo deprogramacin que controla bastante a las acciones del usuario. Esta tcnica consiste en tener botones paraindicarle a la aplicacin cuando se desea Agregar, Modificar y Retirar registros. Tambin posee unos

    botones para indicar si deseamos GuardaroDeshacerlos cambios.

    Lo interesante de esta tcnica radica en la forma en que activan y se activan elementos en la pantalla. Estobrinda un mayor control de las acciones de los usuarios, al bloquear los campos de datos y aquellosobjetos que se desean. El activar y desactivar elementos va reduciendo el modo de operacin del usuario,

    limitndolo a aquello que solo deseamos que el usuario manipule en un momento determinado.

    Recuerde que ahora que estamos en la etapa de principiantes, nos dedicaremos a construir cada pantallasin los asistentes. Cuando tengamos los elementos bsicos de la programacin orientada a objetosaprenderemos a jugar con la clase Wystilepara personalizar las pantallas de un proyecto.

    EL FORMULARIO PARA EL MAESTRO DE ASIGNATURAS

    Para esta pantalla, inicie un formulario en blanco y agregue los siguientes elementos:

    1: mAgregar 2: btnModificar 3: btnRetirar 4: btnGuardar 5: btnDeshacer

    Respecto a la tcnica nmero 1, se han hecho cambios importantes en el funcionamiento de los botonesAgregaryRetirar. Se han agregado los tres botones de Modificar, GuardaryDeshacer.

    Para esta tcnica, el usuario se ve obligado a utilizar los botones de agregar o modificar para actualizar losdatos. Cuando haga clic en el botn Agregar, el sistema debe habilitar los campos de datos y botonesGuardar o Deshacer. El resto de los botones, debe deshabilitarse durante los procesos de agregar omodificar los datos. Para empezar, coloque la propiedad Enabled igual a .F. Falso para los botonesbtnGuardar, btnDeshacer y los campos de datos (mCodigo y mNombre).

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    24/104

    Visual FoxPro - Gua de Clases #5 2

    Instituto Metropolitano de Educacin

    Evento INIT del Formulario BtnAgregar.click

    *variables pblicaspublic pAgregando, pEditando

    *abrir entorno utilizando las variables pblicas

    close data

    mFile1 = _dircia +"programa.dbf"if !file( mFile1)

    do cPrograma in prg\creartblendif

    sele 1use &mFile1 order tag codigo alias programa

    scatter memvar memo

    *ir al objeto inicialthisform.btnCerrar.setfocus

    return

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

    *cargar nuevos datos en blancosele 1scatter memvar blank

    *activar campos de datosthisform.mCodigo.enabled = .t.thisform.mNombre.enabled = .t.

    *desactivar botones innecesarios en el proceso*de agregarthisform.btnPrimero.enabled = .f.thisform.btnAnterior.enabled = .f.

    thisform.btnSiguiente.enabled = .f.thisform.btnUltimo.enabled = .f.

    thisform.btnAgregar.enabled = .f.thisform.btnModificar.enabled = .f.thisform.btnRetirar.enabled = .f.

    thisform.btnReporte.enabled = .f.thisform.btnExaminar.enabled = .f.

    thisform.btnCerrar.enabled = .f.

    *activar botones salvar y deshacerthisform.btnGuardar.enabled = .t.thisform.btnDeshacer.enabled = .t.

    *ir al primer campothisform.mCodigo.setfocus

    thisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    25/104

    Visual FoxPro - Gua de Clases #5 3

    Instituto Metropolitano de Educacin

    BtnModificar.Clic

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

    *cargar datos en memoriasele 1scatter memvar memo

    *el campo clave debe permanecer inactivothisform.mCodigo.enabled = .f.

    *activar el resto de los camposthisform.mNombre.enabled = .t.

    *desactivar botones innecesarios en el proceso*de agregar

    thisform.btnPrimero.enabled = .f.thisform.btnAnterior.enabled = .f.thisform.btnSiguiente.enabled = .f.thisform.btnUltimo.enabled = .f.

    thisform.btnAgregar.enabled = .f.thisform.btnModificar.enabled = .f.thisform.btnRetirar.enabled = .f.

    thisform.btnReporte.enabled = .f.thisform.btnExaminar.enabled = .f.

    thisform.btnCerrar.enabled = .f.

    *activar botones salvar y deshacerthisform.btnGuardar.enabled = .t.thisform.btnDeshacer.enabled = .t.

    *ir al siguiente campo disponible despus*del campo clavethisform.mNombre.setfocus

    thisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    26/104

    Visual FoxPro - Gua de Clases #5 4

    Instituto Metropolitano de Educacin

    BtnRetirar.Clic

    *retirar el registro activomCodigo = alltrim( thisform.mCodigo.value)mMens1 = "Desea retirar el cdigo " + mCodigo +" del sistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirar registro!")

    if mOpc = 1 && Clic en botn Aceptarsele 1deletewait window "Registro retirado del sistema..." nowait

    *mover puntero al prximo disponibleif !eof()

    skip 1endifif eof()

    go bottom

    endifendif

    scatter memvar memothisform.refreshreturn

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

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    27/104

    Visual FoxPro - Gua de Clases #5 5

    Instituto Metropolitano de Educacin

    BtnSalvar.clic

    *guardar los datos

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    *verificar el campo clave si se esta agregando

    if pAgregandosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found()

    mMens1 = "Imposible guardar, el cdigo " +mCodigo +" existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente Agregar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")

    thisform.mCodigo.setfocusreturn

    endifendif

    *chequear indicador de procesoif pAgregando

    *agregar registroinsert into programa from memvarwait window "Registro agregado..." nowait

    else*actualizar datos del registrogather memvar memowait window "Registro modificado..." nowait

    endif

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    28/104

    Visual FoxPro - Gua de Clases #5 6

    Instituto Metropolitano de Educacin

    *colocar indicadores a falsopAgregando = .f.pEditando = .f.

    *desactivar campos de datosthisform.mCodigo.enabled = .f.thisform.mNombre.enabled = .f.

    *activar botones necesariosthisform.btnPrimero.enabled = .t.thisform.btnAnterior.enabled = .t.thisform.btnSiguiente.enabled = .t.thisform.btnUltimo.enabled = .t.

    thisform.btnAgregar.enabled = .t.thisform.btnModificar.enabled = .t.thisform.btnRetirar.enabled = .t.

    thisform.btnReporte.enabled = .t.thisform.btnExaminar.enabled = .t.

    thisform.btnCerrar.enabled = .t.

    *desactivar botones salvar y deshacerthisform.btnGuardar.enabled = .f.thisform.btnDeshacer.enabled = .f.

    return

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    29/104

    Visual FoxPro - Gua de Clases #5 7

    Instituto Metropolitano de Educacin

    BtnDeshacer.clic

    *deshacer los cambios hechos a los datossele 1scatter memvar memo

    wait window "Proceso de Edicin cancelado..." nowait

    *colocar indicadores a falsopAgregando = .f.pEditando = .f.

    *desactivar campos de datosthisform.mCodigo.enabled = .f.thisform.mNombre.enabled = .f.

    *activar botones necesariosthisform.btnPrimero.enabled = .t.

    thisform.btnAnterior.enabled = .t.thisform.btnSiguiente.enabled = .t.thisform.btnUltimo.enabled = .t.

    thisform.btnAgregar.enabled = .t.thisform.btnModificar.enabled = .t.thisform.btnRetirar.enabled = .t.

    thisform.btnReporte.enabled = .t.thisform.btnExaminar.enabled = .t.

    thisform.btnCerrar.enabled = .t.

    *desactivar botones salvar y deshacerthisform.btnGuardar.enabled = .f.thisform.btnDeshacer.enabled = .f.

    thisform.refresh

    return

    Y ahora manos a la obra!

    Aplique esta tcnica de programacin,

    con la tabla maestro de Asignaturas.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    30/104

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    31/104

    Visual FoxPro - Gua de Clases #5 9

    Instituto Metropolitano de Educacin

    LA RUTINA PARA EL CONTROL DE ERRORES

    El FoxPro permite la manipulacin de los errores ocurridos durante la ejecucin de una aplicacin. Aestas alturas, el alumno ya habr descubierto que existen varias clases de errores cuando se trabaja en unaaplicacin:

    Er rores en tiempo de compilacin (errores de sintaxis):estos errores ocurren cuando se ha escrito malun comando o funcin. Cuando se ha escrito mal un comando o se han utilizado parmetros incorrectos,FoxPro paralizar la ejecucin del programa y sacar un mensaje de error en una caja de dilogo. Estetipo de errores son causa de una mala programacin, y el programador deber ejecutar y probar susrutinas para depurar el cdigo de su aplicacin y estar tranquilo de que todo funciona. El mismo

    programador, es el nico responsable de que su aplicacin trabaje sin errores y el solo, debe analizar lacausa del error encontrado durante la ejecucin de sus aplicaciones.

    Errores en tiempo de ejecucin: Estos errores aparecen cuando, una vez depurado el cdigo de unaaplicacin, el FoxPro paraliza la ejecucin por alguna razn que se sale de nuestras manos; sin embargo,con una buena rutina de control de errores, podremos indicarle a la aplicacin que hacer cuando sucedantales errores. Errores tales como disco lleno, Registro o archivo bloqueado por otro usuario, archivo no

    existe, etc, son errores que pueden ser controlados y manipulados por una buena rutina de control deerrores. Ms adelante en las clases, se tratar el tema de el manejo de los errores dentro de los programas.

    Con una rutina de control de errores, el programador controlar la situacin de si permite la continuacino no de la aplicacin, o determinar soluciones para continuar con la rutina iniciada. Un error por ejemplo,se presentara cuando el sistema trate de abrir una tabla que por algn motivo fue retirada del sistema porotro usuario; la rutina de control de errores se encontrara con la ausencia de tal tabla, generandoautomticamente un error de archivo no existe, esa misma rutina podra determinar el nombre origen de latabla faltante y por supuesto, crearla automticamente dentro del directorio de datos. Luego de definido elnuevo archivo, puede indicarle al FoxPro que repita la orden que gener el error y que siga la ejecucinde la aplicacin como si nada hubiese pasado.

    Para adelantar trabajo, busque en el manual del sistema FoxPro, el comando ON ERROR y analice elejemplo que acompaa a la teora para ir comprendiendo este tema tan importante a la hora de programaraplicaciones.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    32/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #5 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    TCNICA DE PROGRAMACIN #3 FORMULARIOS TIPO FACTURA

    Existe una rutina muy popular entre los programadores y la cual se constituye en el quebradero de

    cabeza de ms de un iniciado en la programacin: el diseo de formularios que permitan la captura deinformacin en documentos tales como la factura.

    Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detalle.Tambin tienen esta caracterstica los pedidos, los documentos soporte de inventario, una lista de grupos,un proceso de calificaciones, etc.

    Cualquier documento empleado por una empresa y que tenga una presentacin que incluya encabezadodel documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es deaclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en estecurso, un mtodo sencillo y prctico de automatizacin.

    La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencilloilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta enesta gua.

    En donde reside lo complicado de programar un formulario para este documento? Cuando se efecta el

    diseo de la base de datos, se descubre que es necesario dos tablas para solucionar el requerimiento deldocumento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente elcampo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte deldetalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de facturadel documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitirmanipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas queconstituyen el detalle, y actualizando el total del documento en el pie de pgina del documento. Es decir,cada vez que se actualice la cantidad o el valor unitario de una de las lneas del detalle, se debe reflejartales cambios en todo el documento.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    33/104

    Visua l FoxPro - Gua de Clases #6 2

    Instituto Metropolitano de Educacin

    FORMULARIOS TIPO FACTURA PROPUESTO

    Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Comoparte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, secolocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejoresobjetos incluidos en el Visual FoxPro, el Grid (cuadrcula). Como parmetro de los elementos a mostrar

    en elgrid, utilizaremos una instruccin Select de SQL.El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula,Grupos y Estudiantes por Grupo.

    2. Estudiantes por Grupo (EstGrupo)Nombre Campo Tipo de datos AnchoCodigo Carcter 10CodEstud Carcter 10ExParcial Numerico 4,2Seguim Numerico 4,2

    ExFinal Numerico 4,2Wfinal Numerico 4,2NotaFinal Numerico 4,2Estado Carcter 1Campo clave ascendente:Codigo + CodEstud

    1. Grupos (Grupos)Nombre Campo Tipo de datos AnchoCodigo Carcter 10

    Nombre Carcter 50Asignatura Carcter 10Horario Carcter 50

    Aula Carcter 50Profesor Carcter 15

    Campo clave ascendente: Codigo

    5. Maestro de Profesor (Profe)Nombre Campo Tipo de datos AnchoCodigo Carcter 15

    Nombre Carcter 50TelResiden Carcter 15TelTrabajo Carcter 15Asignatura Carcter 100

    Campo clave ascendente: Codigo

    4. Matrcula (Matric)Nombre Campo Tipo de datos AnchoCodigo Carcter 10Fecha Fecha 8

    Nivel Carcter 2

    Jornada Carcter 1Estado Carcter 1Observa Memo 10

    Campo clave ascendente: Codigo

    3. Hojas de vida (Hvida) Nombre Campo Tipo de datos AnchoCodigo Carcter 10

    Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResiden Carcter 20

    DirResiden Carcter 40FechaNac Fecha 8

    Campo clave ascendente: Codigo

    7. Maestro de Asignaturas (Asigna) Nombre Campo Tipo de datos AnchoCodigo Carcter 10

    Nombre Carcter 50Programa Carcter 2

    Campo clave ascendente: Codigo

    6. Maestro de Programas (Programa) Nombre Campo Tipo de datos AnchoCodigo Carcter 2

    Nombre Carcter 50

    Campo clave ascendente: Codigo

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    34/104

    Visua l FoxPro - Gua de Clases #6 3

    Instituto Metropolitano de Educacin

    Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para sufuncionamiento. Observe que para la rutina de grupos se requiere tener almacenados datos de programas,asignaturas, profesores, hojas de vida y datos de matrcula de los estudiantes. Si no se tienen datos entales tablas, el diseo no funcionar debido a los controles de datos que efecta sobre los datos entrados

    por el usuario.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    35/104

    Instituto Metropolitano de Educacin

    INSTITUTO METROPOLITANO DE EDUCACINPROGRAMACIN DE COMPUTADORES

    GUIA #6 DE VISUAL FOXPRODOCENTE: MAURICIO CANO

    TCNICA DE PROGRAMACIN #3 FORMULARIOS TIPO FACTURA

    Existe una rutina muy popular entre los programadores y la cual se constituye en el quebradero de

    cabeza de ms de un iniciado en la programacin: el diseo de formularios que permitan la captura deinformacin en documentos tales como la factura.

    Un documento como la factura (bien sea de compra o de venta) tiene un encabezado y un detalle.Tambin tienen esta caracterstica los pedidos, los documentos soporte de inventario, una lista de grupos,un proceso de calificaciones, etc.

    Cualquier documento empleado por una empresa y que tenga una presentacin que incluya encabezadodel documento y una descripcin de detalle, debe ser automatizado empleando la tcnica nmero 3. Es deaclarar que tal situacin de programacin se puede solucionar de muchas formas, planteamos en estecurso, un mtodo sencillo y prctico de automatizacin.

    La siguiente grfica muestra un posible documento de factura de compra. Aunque es bastante sencilloilustra la caracterstica de los documentos que requieren aplicar la tcnica de programacin propuesta enesta gua.

    En donde reside lo complicado de programar un formulario para este documento? Cuando se efecta el

    diseo de la base de datos, se descubre que es necesario dos tablas para solucionar el requerimiento deldocumento: la principal y el detalle, relacionando ambas tablas por un campo comn, usualmente elcampo clave de la tabla principal, en este caso Nmero de factura. Lo cual indica, que en la parte deldetalle, el programa deber visualizar solamente a los registros que posean el mismo nmero de facturadel documento visualizado en la parte del encabezado. Otro asunto importante, es el de permitirmanipular en forma gil el detalle, permitiendo agregar, modificar y retirar informacin de las lneas queconstituyen el detalle, y actualizando el total del documento en el pie de pgina del documento. Es decir,cada vez que se actualice la cantidad o el valor unitario de una de las lneas del detalle, se debe reflejartales cambios en todo el documento.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    36/104

    Visual FoxPro - Gua de Clases #6 2

    Instituto Metropolitano de Educacin

    FORMULARIOS TIPO FACTURA PROPUESTO

    Como modelo de programacin utilizaremos el control de los grupos de clase de una institucin. Comoparte principal del documento aparecer la informacin relevante a un grupo de clases y como detalle, secolocarn todos los estudiantes pertenecientes a cada grupo. Utilizaremos adems, uno de los mejoresobjetos incluidos en el Visual FoxPro, el Grid (cuadrcula). Como parmetro de los elementos a mostrar

    en elgrid, utilizaremos una instruccin Select de SQL.El diseo utilizar las siguientes tablas: Programas, Asignaturas, Profesores, Hoja de vida, Matrcula,Grupos y Estudiantes por Grupo.

    2. Estudiantes por Grupo (EstGrupo)Nombre Campo Tipo de datos Ancho

    Codigo Carcter 10CodEstud Carcter 10ExParcial Numerico 4,2Seguim Numerico 4,2

    ExFinal Numerico 4,2Wfinal Numerico 4,2NotaFinal Numerico 4,2Estado Carcter 1Campo clave ascendente:Codigo + CodEstud

    1. Grupos (Grupos)Nombre Campo Tipo de datos Ancho

    Codigo Carcter 10Nombre Carcter 50Asignatura Carcter 10Horario Carcter 50

    Aula Carcter 50Profesor Carcter 15

    Campo clave ascendente: Codigo

    5. Maestro de Profesor (Profe)Nombre Campo Tipo de datos Ancho

    Codigo Carcter 15Nombre Carcter 50TelResiden Carcter 15TelTrabajo Carcter 15Asignatura Carcter 100

    Campo clave ascendente: Codigo

    4. Matrcula (Matric)Nombre Campo Tipo de datos Ancho

    Codigo Carcter 10Fecha Fecha 8

    Nivel Carcter 2

    Jornada Carcter 1Estado Carcter 1Observa Memo 10

    Campo clave ascendente: Codigo

    3. Hojas de vida (Hvida) Nombre Campo Tipo de datos AnchoCodigo Carcter 10

    Nombre Carcter 50Apellidos Carcter 50Programa Carcter 2TelResiden Carcter 20

    DirResiden Carcter 40FechaNac Fecha 8

    Campo clave ascendente: Codigo

    7. Maestro de Asignaturas (Asigna)Nombre Campo Tipo de datos Ancho

    Codigo Carcter 10Nombre Carcter 50Programa Carcter 2

    Campo clave ascendente: Codigo

    6. Maestro de Programas (Programa)Nombre Campo Tipo de datos AnchoCodigo Carcter 2

    Nombre Carcter 50

    Campo clave ascendente: Codigo

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    37/104

    Visual FoxPro - Gua de Clases #6 3

    Instituto Metropolitano de Educacin

    Esta clase de rutina es un poco compleja debido al gran nmero de tablas que se requieren para sufuncionamiento. Observe que para la rutina de grupos se requiere tener almacenados datos de programas,asignaturas, profesores, hojas de vida y datos de matrcula de los estudiantes. Si no se tienen datos entales tablas, el diseo no funcionar debido a los controles de datos que efecta sobre los datos entrados

    por el usuario.

    EL FORMULARIO TIPO FACTURA

    Utilizaremos la tabla de grupos y el detalle de grupos para ilustrar el funcionamiento de la tcnica deprogramacin en cuestin. Note que para esta clase de formularios, es normal combinar gran cantidad detablas a la hora de la programacin. Verifique el cdigo visto en rutinas anteriores, debido a que cambiagran cantidad de instrucciones, para dar soporte a la nueva tcnica.

    1.mCodigo 2. mNombre 3. mAsignatura 4. mProfesor5. mHorario 6. mNomAsigna 7. mNomProfesor 8. mAula9. btnExaminar 10. btnReporte 11. mCodEstMaestro 12. btnAgregarDet13. btnRetirarDet 14. btnModificarDet 15. DetalleGrupo 16. mEstado17. btnPrimero 18. btnAnterior 19. btnSiguiente 20. btnUltimo21. btnAgregar 22. btnActual 23. btnRetirar 24. btnCerrar25. btnCargar 26. btnLimpiar

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    38/104

    Visual FoxPro - Gua de Clases #6 4

    Instituto Metropolitano de Educacin

    Para crear los objetos 3, 4 y 11 utilice la tcnica enseada en clases anteriores para definir listasdesplegables basadas en otras tablas.

    Objeto 3 indica la asignatura para el grupo:

    ControlSource: m.asignaturaRowSource: asigna.codigo, nombre

    RowSourceType: 2-AliasColumnCount: 2ColumnWitdh: 40,300

    Objeto 4 indica el profesor asignado al grupo:

    ControlSource: m.profesorRowSource:profe.codigo,nombreRowSourceType: 2-AliasColumnCount: 2ColumnWitdh: 40,300

    Objeto 11 sirve para seleccionar estudiantes e integrarlos al grupo activo en el formulario:

    RowSource: hvida.codigo, apellidos, nombreRowSourceType: 2-AliasColumnCount: 3ColumnWitdh: 70,200,200

    El objeto 16 es una lista basada en valores entrados a la hora de programar que indica el estado dentro delgrupo para el estudiante:

    ControlSource: m.estado

    RowSource: A,Activo,S,Suspendido,C,Cancelado,N,No MatriculadoRowSourceType: 1-ValorColumnCount: 2ColumnWitdh: 40, 100

    Desactive los siguientes objetos en el formulario (propiedad enabled igual a .F.-Falso): 6, 7, 12, 13, 14 y16.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    39/104

    Visual FoxPro - Gua de Clases #6 5

    Instituto Metropolitano de Educacin

    LA RUTINA QUE INICIA TODO EL PROCESO

    Como caso particular de este formulario, es que no se puede ejecutar directamente. Por problemastcnicos del Visual FoxPro, cuando se inicializan tablas en un formulario y a la vez en este se incluyenelementos de cuadrcula (grid) o cuadro de listas (combo list) simplemente no funcionan. Por tal razn,debemos crear una rutina que abra todas las tablas a usar en el sistema y llamar al formulario al final de larutina.

    Como origen de datos para una cuadrcula o combo list, resulta muy til el declarar una instruccinSELECT - SQL.

    Este es el contenido de la rutina I_GRUPOS.PRG (no olvide almacenarla en el sitio destinado para losprogramas):

    I_GRUPOS.PRG

    * Esta rutina invoca al formulario Grupos

    *abrir entorno para el formulario grupos utilizando*las variables publicas

    *tabla de gruposmFile1 = _dircia +"grupos.dbf"if !file( mFile1)

    do cGrupos in prg\creatblendifsele 1use &mFile1 order tag codigo alias grupos

    *tabla estudiantes por grupo

    mFile2 = _dircia +"estgrupo.dbf"if !file( mFile2)

    do cEstGrupo in prg\creatblendifsele 2use &mFile2 order tag codigo alias estgrupo

    *tabla maestro asignaturasmFile3 = _dircia +"asigna.dbf"if !file( mFile3)

    do cAsigna in prg\creatblendifsele 3use &mFile3 order tag codigo alias asigna

    *tabla maestro programasmFile4 = _dircia +"programa.dbf"if !file( mFile4)

    do cPrograma in prg\creatblendifsele 4use &mFile4 order tag codigo alias programa

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    40/104

    Visual FoxPro - Gua de Clases #6 6

    Instituto Metropolitano de Educacin

    *tabla maestro profesoresmFile5 = _dircia +"profe.dbf"if !file( mFile5)

    do cProfe in prg\creatblendifsele 5use &mFile5 order tag codigo alias profe

    *tabla hojas de vidamFile6 = _dircia +"hvida.dbf"if !file( mFile6)

    do cHvida in prg\creatblendifsele 6use &mFile6 order tag codigo alias hvida

    *tabla matriculamFile7 = _dircia +"matric.dbf"

    if !file( mFile7)do cMatric in prg\creatblendifsele 7use &mFile7 order tag codigo alias matric

    sele 1

    *apuntar a la carpeta de los formulariosdo form forms\grupos

    return

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

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    41/104

    Visual FoxPro - Gua de Clases #6 7

    Instituto Metropolitano de Educacin

    RUTINAS EN LOS OBJETOS DEL FORMULARIO

    Formulario.INIT

    *continuacin del codigo iniciado en i_grupospublic pCodEstudpCodEstud = ""

    set delete on

    sele 1go topscatter memvar memo

    *ir al objeto inicialthisform.mCodigo.setfocus

    *actualizar grid (cuadrcula)

    thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;"hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refreshthisform.refresh

    En esta rutina se hace uso de la instruccin SELECT-SQL y se asigna como parmetro al objetoDetalleGrupo. Cada vez que se requiera actualizar el detalle de cada grupo, simplemente invocaremosesta seccin de cdigo y refrescaremos el objeto en el formulario.

    Observe que la instruccin se arma como una cadena. Esa es la razn del porqu de tantas y ; en lainstruccin. Esta orden podra colocarse en una sola lnea, pero resulta conveniente dividirla en secciones,

    para poderla entender. El docente gua le indicar que hace la orden SQL empleada.

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    42/104

    Visual FoxPro - Gua de Clases #6 8

    Instituto Metropolitano de Educacin

    Objeto BtnPrimero.Click

    *ir al primerowait window "Primer registro..." nowaitsele 1go topscatter memvar memo

    sele asignaseek alltrim( m.asignatura)

    sele profeseek alltrim( m.profesor)

    *actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;

    "from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    *controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.

    thisform.mEstado.enabled = .f.

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    43/104

    Visual FoxPro - Gua de Clases #6 9

    Instituto Metropolitano de Educacin

    Objeto BtnAnterior.Click

    *ir al anteriorsele 1if !bof()

    skip -1endif

    if bof()go top

    endif

    scatter memvar memo

    sele asignaseek alltrim( m.asignatura)

    sele profe

    seek alltrim( m.profesor)

    *actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    *controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.thisform.mEstado.enabled = .f.

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    44/104

    Visual FoxPro - Gua de Clases #6 10

    Instituto Metropolitano de Educacin

    Objeto btnSiguiente.click

    *ir al siguientesele 1if !eof()

    skip 1endif

    if eof()go bottom

    endif

    scatter memvar memo

    sele asignaseek alltrim( m.asignatura)

    sele profe

    seek alltrim( m.profesor)

    *actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    *controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.thisform.mEstado.enabled = .f.

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    45/104

    Visual FoxPro - Gua de Clases #6 11

    Instituto Metropolitano de Educacin

    Objeto btnUltimo.click

    *ir al ultimowait window "ltimo registro..." nowaitsele 1go bottomscatter memvar memo

    sele asignaseek alltrim( m.asignatura)

    sele profeseek alltrim( m.profesor)

    *actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;

    "from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    *controlar botones del detallepCodEstud = ""thisform.btnRetirarDet.enabled = .f.thisform.btnModificarDet.enabled = .f.

    thisform.mEstado.enabled = .f.

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    46/104

    Visual FoxPro - Gua de Clases #6 12

    Instituto Metropolitano de Educacin

    Objeto BtnAgregar.clic

    *agregar registro con los datos en pantallasele 1

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    *verificar campo clavemCodigo = alltrim( thisform.mCodigo.value)sele 1seek mCodigoif found()

    mMens1 = "Imposible agregar, el cdigo " +mCodigo +" ya existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn

    endif

    *validar la asignatura entrada por el usuariomAsignatura = alltrim( thisform.mAsignatura.value)sele asignaseek mAsignaturaif !found()

    mMens1 = "El cdigo de Asignatura " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mAsignatura.setfocusreturn

    endif

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    47/104

    Visual FoxPro - Gua de Clases #6 13

    Instituto Metropolitano de Educacin

    *validar el profesor entrado por el usuariomProfesor = alltrim( thisform.mProfesor.value)sele profeseek mProfesorif !found()

    mMens1 = "El cdigo de Profesor " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mProfesor.setfocusreturn

    endif

    *agregar nuevo registro con los datos en pantallasele 1insert into grupos from memvar

    *cargar nuevos datos en blanco

    scatter memvar blank*ir al primer campothisform.mCodigo.setfocus

    *actualizar nuevo detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;

    ".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    48/104

    Visual FoxPro - Gua de Clases #6 14

    Instituto Metropolitano de Educacin

    Objeto btnActual.click

    *actualizar el contenido de un campo

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    if empty( thisform.mNombre.value)wait window "Nombre incorrecto..." nowaitthisform.mNombre.setfocusreturn

    endif

    if empty( thisform.mAsignatura.value)

    wait window "Cdigo de Asignatura incorrecto..." nowaitthisform.mAsignatura.setfocusreturn

    endif

    if empty( thisform.mProfesor.value)wait window "Cdigo de Profesor incorrecto..." nowaitthisform.mProfesor.setfocusreturn

    endif

    *validar asignatura entrada por el usuario

    mAsignatura = alltrim( thisform.mAsignatura.value)sele asignaseek mAsignaturaif !found()

    mMens1 = "El cdigo de Asignatura " +mAsignatura +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mAsignatura.setfocusreturn

    endif

    *validar profesor entrado por el usuario

    mProfesor = alltrim( thisform.mProfesor.value)sele profeseek mProfesorif !found()

    mMens1 = "El cdigo de Profesor " +mProfesor +" no existe!" +chr(13)mMens2 = "Utilice un cdigo vlido e intente de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mProfesor.setfocusreturn

    endif

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    49/104

    Visual FoxPro - Gua de Clases #6 15

    Instituto Metropolitano de Educacin

    *actualizar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado

    gather memvar memowait window "Datos actualizados..." nowait

    elsemMens1 = "Imposible actualizar, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente actualizar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn

    endif

    *actualizar detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;

    "alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    sele 1

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    50/104

    Visual FoxPro - Gua de Clases #6 16

    Instituto Metropolitano de Educacin

    Objeto btnRetirar.click*retirar el registro clave halladosele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif !found() && no existe codigo

    mMens1 = "Imposible retirar, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente retirar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodigo.setfocusreturn

    endif

    mMens1 = "Desea retirar el cdigo " + mCodigo +" del sistema!" +chr(13)mOpc = messagebox( mMens1 , 1+32, "Retirar registro!")

    if mOpc = 1 && Clic en botn Aceptar

    sele 1deletewait window "Registro retirado del sistema..." nowait

    *mover puntero al prximo disponibleif !eof()

    skip 1endifif eof()

    go bottomendif*retirar estudiantes del grupo eliminado

    sele estGrupodele all for alltrim( estGrupo.codigo) = mCodigosele 1

    endif

    sele 1scatter memvar memo

    *actualizar detallethisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;

    "from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.refreshreturn

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    51/104

    Visual FoxPro - Gua de Clases #6 17

    Instituto Metropolitano de Educacin

    Objeto btnExaminar.click

    *examinar registrossele 1

    browse fields codigo, nombre ;noedit noappend nodelete

    *activar el seleccionadoscatter memvar memo

    *actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;"on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;

    ".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    thisform.refreshreturn

    Objeto btnLimpiar.clic

    *limpiar el contenido de los campos

    wait window "Datos en blanco..." nowait

    sele 1scatter memvar memo blank

    *actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = ""thisform.DetalleGrupo.refresh

    thisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    52/104

    Visual FoxPro - Gua de Clases #6 18

    Instituto Metropolitano de Educacin

    Objeto btnCargar.click

    *cargar el contenido de los campos con la clave entrada

    *verificar si hay datos en blancoif empty( thisform.mCodigo.value)

    wait window "Cdigo incorrecto..." nowaitthisform.mCodigo.setfocusreturn

    endif

    *cargar datos del campo clavesele 1mCodigo = alltrim( thisform.mCodigo.value)seek mCodigoif found() && actualizar registro hallado

    scatter memvar memowait window "Datos cargados..." nowait

    else mMens1 = "Imposible cargar datos, el cdigo " +mCodigo +" no existe!" +chr(13)mMens2 = "Utilice otro cdigo e intente cargar datos de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")

    endif

    *actualizar grid (cuadrcula)sele estGrupothisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;

    "on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " + ;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    thisform.refreshthisform.mCodigo.setfocus

    return

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    53/104

    Visual FoxPro - Gua de Clases #6 19

    Instituto Metropolitano de Educacin

    Objeto mCodEstMaestro.valid

    *activar los otros botones para el detalle

    thisform.btnAgregarDet.enabled = .t.thisform.btnRetirarDet.enabled = .t.thisform.btnModificarDet.enabled = .t.

    mCodEstMaestro.whenreturn !empty( m.codigo)

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    54/104

    Visual FoxPro - Gua de Clases #6 20

    Instituto Metropolitano de Educacin

    Objeto btnAgregarDet.whenreturn !empty( m.codigo) .and. !empty( thisform.mCodEstMaestro.value)BtnAgregarDet.valid*agregar codigo seleccionado al detalle del grupo

    mCodEstud = alltrim( thisform.mCodEstMaestro.value)

    *validar cdigo en maestro estudiantessele hvidaseek mCodEstudif !found()

    mMens1 = "Imposible agregar al detalle, el cdigo " +mCodEstud +" no existe enel maestro!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodEstMaestro.setfocusreturn

    endif

    *verificar estudiante en el gruposele estgrupomGrupo = alltrim( m.codigo)seek mGrupo + mCodEstudif found()

    mMens1 = "Imposible agregar estudiante al grupo, el cdigo " +mCodEstud +" yaexiste!" +chr(13)

    mMens2 = "Utilice otro cdigo e intente agegar al detalle de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")thisform.mCodEstMaestro.setfocusreturn

    endif

    *agregar linea al detalleinsert into estGrupo ;

    ( codigo, codEstud, estado) ;values ;

    ( mGrupo, mCodEstud, "A")

    *actualizar grid (cuadrcula)thisform.DetalleGrupo.rowsource = "select all estgrupo.codEstud, " + ;

    "hvida.programa, estgrupo.estado, " +;"alltrim( hvida.apellidos) +space(1)+alltrim( hvida.nombre) " +;"from estGrupo join hvida " +;

    "on alltr( estGrupo.codEstud) = alltr( hvida.codigo) " + ;"where alltrim( estGrupo.codigo) = alltrim( m.codigo) " +;".and. !deleted() order by codEstud noconsole nowait " + ;"into cursor miconsulta "

    thisform.DetalleGrupo.refresh

    *keyboard "{ctrl+w}"thisform.refresh

  • 7/30/2019 Visual FoxPro - Compendio de Guias de Clases

    55/104

    Visual FoxPro - Gua de Clases #6 21

    Instituto Metropolitano de Educacin

    Objeto BtnRetirarDet.valid

    *retirar el registro seleccionado en el detalle*utilizar pCodEstud como clave de seleccion

    if empty( pCodEstud)mMens1 = "Seleccione un cdigo del detalle e intente retirar de nuevo..."mOpc = messagebox( mMens1, 0+64, "Atencin!")thisform.DetalleGrupo.setfocusreturn

    endif

    sele estGrupomCodigo = alltrim( m.codigo) +alltrim( pCodEstud)seek mCodigoif !found() && no existe codigo

    mMens1 = "Imposible retirar, el cdigo " + pCodEstud +" no existe en el detalle!"+chr(13)

    mMens2 = "Seleccione un cdigo del detalle e intente retirar de nuevo..."mOpc = messagebox( mMens1 +mMens2, 0+64, "Atencin!")pCodEstud = ""thisform.DetalleGrupo.setfocu


Recommended