EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
México, 23 de marzo de 2012
1
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
PREFACIO
El presente manual está siendo elaborado con el propósito de ayudar a los principiantes a entender y conseguir iniciar en la programación con el lenguaje Visual FoxPro. El autor se considera a si mismo un “novato” así que no esperes leer cosas avanzadas en este manual o terminarás muy decepcionado jeje! Quizás te preguntes por qué se llama también “Los 35 trucos ocultos de Visual FoxPro”. Permíteme aclarar que este título es solo una “mentira publicitaria” con el fin de que algunos se puedan animar a leer este manual. Lo lamento jeje! En realidad VFP tiene cientos de trucos y no son solo 35. Este manual contendrá ejemplos sencillos acerca de las cosas que hacen que un usuario novato de Visual FoxPro se desespere un poco en su esfuerzo por aprender. El autor agradece la ayuda que la Comunidad Visual FoxPro en Español le ha brindado en su esfuerzo por aprender a usar esa poderosa herramienta. Aprovecho para difundir el enlace de dicha Comunidad: http://groups.google.com/group/publicesvfoxpro
Por otro lado, el autor posee experiencia en la enseñanza, sobre todo del idioma Inglés y sabe que las clases aburridas hacen que los alumnos deserte n. Así que si usted es una persona muy sería y aburrida, consiga por favor otro manual por que este va a ser divertido jeje!..
Por último, se aclara que la idea es que este manual sea continuamente mejorado con las amables sugerencias que se reciban. Pueden enviarlas al email :
[email protected] Saludos!
NOTA.-Las marcas y nombres comerciales mencionados en este manual pertenecen a sus respectivos propietarios.
México, 23 de marzo de 2012
2
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
INTRODUCCIÓN ¿Por qué nos gusta Visual FoxPro? Muchos que jamás usaron Visual FoxPro tienen la idea de que es un lenguaje que no ofrece muchas prestaciones y que no merece ser aprendido. Nada más lejos de la realidad. Visual FoxPro, ha sido y sigue siendo, quizás la mejor herramienta RAD (Rapid Application Development) para el desarrollo de sistemas o aplicaciones para bases de datos. Aun hasta el día de hoy, es posible, emprender desarrollos sustentables con Visual FoxPro, ya que aunque su arquitectura fue concebida para los 32 bits, aun presenta plena compatibilidad con el Sistema Operativo Windows 7 y ha sido probado con éxito en algunas versiones beta de Windows 8 como la Consumer Preview. Te conviene aprender Fox ya que aun sigue siendo una de las herramientas más productivas para el desarrollo desktop. Posee además una gran conectividad con los motores de bases de datos más populares como Oracle, SQL Server, MySQL, PostgreSql, Firebird y muchos más. Por lo que puedes notar, Visual FoxPro puede trabajar sin problemas con bases de datos relacionales en el modelo Cliente Servidor. Si en algún momento, tu cliente no tiene los recursos económicos para pagar por una estructura Cliente Servidor (Windows Server instalado en un rack de un d ata center, un experto de redes que configure la IP fija y supervise el funcionamiento de la red, los servicios continuos de un DBA(Data Base Administrator), etc), Visual foxPro puede a su vez ofrecer una solución para estas PYMES. Visual FoxPro (VFP) posee un excelente motor de manejo de base de datos nativo, que posibilita el uso compartido de archivos en una red, con una simple arquitectura punto a punto (la red para trabajo en grupo o red normal de Windows). Para quien posee un nivel experto en VFP, las posibilidades en el campo del desarrollo son muy amplias ya que puede explotar la Orientación a Objetos, la interoperabilidad con diferentes motores de datos, la tecnología Rush More (Correr mas aprisa), el uso de vistas y cursores nativos de VFP mediante el lenguaje de consultas SQL nativo que VFP trae embebido, las vistas remotas, la conexión a servicios web y un largo etcétera. En fin, lo mejor será que empieces a comprobarlo por ti mismo, ya que como dijimos, la idea de este manual es que aprendas rápido los fundamentos de la programación con VFP y no “marearte” tanto con cosas avanzadas jeje! Éxito en tu proyecto de aprendizaje con Visual FoxPro!
México, 23 de marzo de 2012
3
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Para Iniciar Visual FoxPro, haga algo como lo siguiente (dependiendo de la versión de Windows): 1. Haga click sobre el botón de Inicio. 2. Elija todos los programas. 3. Microsoft visual FoxPro 9.0 Para empezar, te presentamos la Ventana de Comandos. Dicha ventana es muy útil porque podemos hacer pruebas de código en modo interactivo desde ella. Por ejemplo para imprimir en la pantalla de Fox el mensaje “Bienvenido a Visual FoxPro”, prueba a hacer lo siguiente: 1. Activa la ventana de comandos en el menú Window/Command Window o presionando el metacomando Ctrl+F2 2. Teclea: ? “Bienvenido a Visual FoxPro” y presiona enter. Debiste ver el mensaje en la pantalla principal de VFP. Ahora teclea el comando CLEAR desde la ventana de comandos. ¿Qué tal?.. Ahora, ve directo a la ayuda y prueba los comandos que te interesen: 1. Click en el Menú Help/Microsoft Visual FoxPro Help o presiona F1. NOTA.- A menos que se indique lo contrario, los ejemplos de este manual se basarán en la versión 9 de VFP.
TRUCO 1. LIMPIAR LA VENTANA DE COMANDOS EN VFP 9 Si es molesto para ti ver que los comandos que has tecleado siguen sin borrarse al iniciar VFP 9, teclea lo siguiente en la ventana de comandos: ? ADDBS(JUSTPATH(SET("RESOURCE",1))) Eso nos muestra la ruta donde se encuentra el archivo _command.prg que debemos convertir a “solo lectura” para evitar que guarde los comandos que tecleamos. En mi caso, en una máquina XP, la ruta está oculta en: C:\Documents and Settings\Miusuario\Datos de programa\Microsoft\Visual FoxPro 9
México, 23 de marzo de 2012
4
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Solo hay que dar click derecho sobre el archivo _command.prg, propiedades y activar la casilla "Solo lectura" TRUCO 2. VER EL CÓDIGO DE LA VENTANA DE COMANDOS EN VFP 9 Si lo que quieres es “husmear” el código que Visual FoxPro pone en la ventana de comandos mientras el usuario “se pasea” por VFP haz lo siguiente: MODIFY COMMAND DDBS(JUSTPATH(SET("RESOURCE",1)))+"_command.prg"
Tal vez no entiendas mucho de lo que veas ahí, pero conste que el curioso no fui yo si no tu jeje! Mi primer prg Una de las ventajas de la programación procedural (o por procedimientos) es la de generar módulos o subrutinas que pueden ser llamadas desde cualquier parte del programa, evitando programar código y aprovechando su reutilización. Desde la ventana de comandos, haz lo siguiente: MODI COMM ULTIMA (Enter) Luego copie y pegue el siguiente código en la ventana del .prg y guárdelo. * PROGRAMA QUE DETECTA EL NUMERO ASCII DE LA ULTIMA TECLA. CLEAR R="S" DO WHILE R="S" CLEAR @ 5,35 SAY "PRESIONE UNA TECLA POR FAVOR" INKEY(0) @ 10,35 SAY "EL VALOR DE LA ULTIMA TECLA ES:" @ 10,75 SAY STR(LASTKEY()) @ 15,40 SAY "REPETIR (S/N):" GET R PICT "@!" VALID R$"SN" READ ENDDO CLEAR RETURN
Luego ejecute esa rutina tecleando DO ULTIMA desde la ventana de comandos. Con eso puedes incluso, saber el código ASCII de las teclas de función como F3, F5, F7, etc., las teclas de movimiento de cursor y otras.
México, 23 de marzo de 2012
5
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
ENTENDIENDO LA FORMA VISUAL DE TRABAJAR En visual Fox, si lo que finalmente deseamos es generar un programa ejecutable (que funciona aunque no esté instalado VFP), debemos agregar todo como parte de un proyecto. Así que entra a Visual Fox y crea un nuevo proyecto. Lo primero que creamos en un ambiente visual es la interfaz de usuario o la GUI. Eso equivale a crear las pantallas de captura en los sistemas de modo texto como Fox o clipper. En visual foxpro (y en casi todo lenguaje de OOP) le llamamos formulario. Asi que en la cajita del proyecto agrega un nuevo formulario. Estos archivos tienen extension .scx y el sistema creará otro archivo de respaldo .sct
Agregando y configurando controles en el formulario Ya que tienes tu formulario en pantalla y lo has guardado como parte del proyecto. Ahora tienes que agregar controles a ese formulario. Ejemplo: Nombre del cliente: Raul Lozano Lopez
México, 23 de marzo de 2012
6
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Nombre del cliente, generalmente sera un control tipo etiqueta que se arrastra y pega desde el cuadro de controles de formularios que por lo general aparece a tu lado derecho de la pantalla. Debes hacer click en la etiqueta y cambiar la propiedad "Caption" en la cajita de propiedades del objeto que por lo general veras a tu lado derecho de la pantalla.
El texto "Raul Lozano Lopez" debera ser colocado en un control de tipo text. Si deseas dar valor de inicio a ese control deberás poner ese nombre en la propiedad "Value" del control text1. Si deseas cambiar el nombre desde el código harias esto, generalmente en el evento Init o Activate, del form1 : Thisform.text1.value= "Raul Lozano Lopez"
México, 23 de marzo de 2012
7
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Para hacer referencia a los objetos, en VFP tenemos 3 opciones: THISFORM, sirve para hacer referencia al formulario actual. THIS, sirve para hacer referencia al control u objeto actual. THISFORMSET, sirve para hacer referencia al conjunto de forms actual. También, modificando la propiedad Name del control text1, puedes cambiarle el nom bre del control en el codigo.
Entonces si le cambiaste el nombre al text1 y le pusiste txtnombrecliente, tu referencia al objeto en el código seria: Thisform.txtnombrecliente.value="" El código anterior suele ponerse en el evento Refresh() del objeto formulario y llamarse al evento cuando se convierte en el formulario activo. Como se hace eso?... Dale click derecho sobre alguna parte del form donde no haya objetos y elige codigo. (En VFP9 SP2, no funciona eso. Usa doble click sobre el control en su lugar). Arriba dice: Objeto: Form1, procedimiento: Activate. O sea que estamos en el evento Activate del form1 y ahi ponemos esto: Thisform.Refresh() Significa que cuando el form1 se vuelva el formulario activo (porque el usuario le dio click o recibió el enfoque mediante código), llamará al evento Refresh(). Y ahi en el Refresh del form1 pondremos el código que limpia el control de texto al iniciar el form asignándole una cadena de texto vacía. El método Release() se usa para colocar código que libere el formulario antes de salir como Thisform.Release(). Activate también puede servir para ocultar o deshabilitar controles al arrancar el formulario de forma que el usuario no pueda verlos o alterarlos. Thisform.txtnombrecliente.visible=.F. Thisform.txtciudadcliente.enabled=.T. El evento Init se utiliza para declarar variables locales o publicas o desactivar u ocultar controles desde que arranca el formulario.
México, 23 de marzo de 2012
8
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Tipos de Variables El alcance de las variables locales es el control o la rutina (función o procedimiento) de la que forman parte. Para pasar valores desde una rutina a otra, se puede hacer mediante el traspaso de parámetros. Su sintaxis es la siguiente: Local ln Var1, lc Var2 Donde ln, es una especie de “convención” o costumbre para identificar que se trata de una variable local y numérica y lc, local y tipo carácter. Sin embargo puedes usar cualquier nombre para tus variables, siempre y cuando no sea una palabra que VFP use como instrucción interna (palabras reservadas). El alcance de una variable pública, mejor llamada global, es mucho mas amplio y puede ser llamada desde prácticamente cualquier parte del sistema. Uno de los inconvenientes de estas variables es que conservan su valor a lo largo de la ejecución del programa y pueden originar “colisiones” por arrastre de dichos valores. Para solucionar eso haga lo siguiente al iniciar una variable pública utilice el comando Release : Evento Init Release Gnvar1, Gcvar2 Public Gnvar1, Gcvar2 Una Variable Privada está disponible para el procedimiento que la creó y para cualquier procedimiento que sea llamado por el que la crea o llamado en la cadena de procedimientos inicializada por el que la crea. Cuando finaliza este procedimiento, la variable se libera automáticamente. No es necesario declarar una variable p rivada. Basta con inicializar su valor.
Para hacerlo use el signo igual o el comando STORE. Ejemplos: pn Var1=50 o STORE 0.00 to X pc Var2=space(50) o STORE “Javier Lopez” to pc Var2 pdfechaactual=date() o STORE Date() to pdfechaactual El comando PRIVATE no se utiliza p ara declarar variables privadas, sino para convertir una variable pública en privada , con la ventaja de que su México, 23 de marzo de 2012
9
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
valor será el que tenga de forma privada dentro del módulo, evitando colisiones con el valor que arrastra de forma global. Para mayor información acerca del alcance de las variables puedes consultar los siguientes enlaces: Alcance en Visual FoxPro - Parte 1 http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=79
Alcance en Visual FoxPro - Parte 2 http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=80
Public And Private Variables http://fox.wikis.com/wc.dll?Wiki~PublicAndPrivateVariables
Y recuerda que siempre puedes consultar la ayuda de fox. Puedes descargar los archivos de ayuda aquí: Para VFP 8 en Español: http://www.portalfox.com/press/index8.htm Para VFP 9 SP2 Corregido por la Comunidad Fox mundial http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File La traducción de ayuda para VFP9 no se realizó.
México, 23 de marzo de 2012
10
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
TRABAJANDO CON DATOS El evento Load del formulario resulta muy útil para declarar configuraciones o seteos y para poner en uso datos desde el arranque de formularios. Algunas instrucciones de configuración comunes son: CLOSE DATABASES Cierra la base de datos actual y sus tablas. CLOSE ALL Cierra todas las bases de datos, tablas e índices de la sesión de datos actual. SET DELETED ON Evita que se muestren y tomen en cuenta registros marcados para su eliminación. SET DATE FRENCH Configura la fecha con format DD/MM/AAAA. SET EXCLUSIVE OFF Activa el modo compartido para trabajo en red. SET SAFETY OFF Evita que aparezcan mensajes de confirmación en la pantalla, antes de sobreescribir un archivo existente. El evento unload sirve para poner código sobre limpiar y cerrar bases o tablas antes de abandonar el formulario. Comandos y Funciones Comunes para el manejo de datos Para manejar datos, se recomienda el uso de archivos de índice ya que estos funcionan tal como un índice de un libro, permitiendo buscar sobre unas cuantas páginas y una vez que se tiene el número de página ir directamente a ella, en vez de leer de forma secuencial cada página. En otras palabras, para efectuar búsquedas rápidas en VFP es imprescindible el uso de índices. Los índices también permiten ordenar uno o varios campos en base a un criterio determinado. Por lo general se acostumbra usar índices estructurales CDX que son como contenedores que guardan varios criterios de ordenamiento o etiquetas de orden. Estos índices se crean una sola vez y se abren automáticamente al abrir las tablas . Luego, cuando por alguna razón se corrompen, pueden volver a generarse con la orden REINDEX o bien borrarse y volverse a crear. Cabe aclarar que las operaciones de creación, borrado y regeneración de índices son tareas que se efectúan esporádicamente como parte del mantenimiento y requieren del uso exclusivo, es decir, nadie mas debe estar usando las tablas. México, 23 de marzo de 2012
11
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Para crear un índice hacemos lo siguiente: SET EXCLUSIVE ON USE Mitabla INDEX ON ALLTRIM(CampoNombre) TAG CampoNombre USE Si deseamos crear un índice de clave compuesta que involucre a mas campos, hacemos esto: SET EXCLUSIVE ON USE Mitabla INDEX ON ALLTRIM(Nombre)+DTOS(FechadeIngreso) TAG NOMBRE USE *USE sin parámetros cierra la tabla Esto último significa que se creará un archivo de índice ordenado primeramente por el nombre y luego por la fecha de ingreso. Cuando deseamos utilizar una de las etiquetas de ordenamiento del archivo de índice .CDX, después de poner en uso la tabla, simplemente hacemos esto: SET ORDER TO MiCampoEtiqueta Ej. SET ORDER TO Nombre
Otras órdenes útiles para el manejo de tablas son:
? Select() Muestra el área de trabajo actual. ? Alias() Muestra el nombre alias de la tabla actual. ? used() Determina si hay una tabla abierta en un área de trabajo específica.
México, 23 de marzo de 2012
12
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
USE Mitabla IN 0 (Alias) Abre una tabla en la siguiente área de trabajo libre de menor número. Puede agregar un nombre alias, pero sino lo especifica, el nombre de la tabla será tomado como tal. Select Mitabla(Cursor) Selecciona una tabla en el área de trabajo en que fue abierta. Ejemplo para abrir tablas: SET EXCLUSIVE OFF CLOSE DATABASES OPEN DATABASE (HOME(2) + 'Data\testdata') USE customer IN 0 USE orders IN 0 SELECT customer BROWSE SELECT orders BROWSE Si estás abriendo las tablas por medio de un grid, es probable de que en alguna ocasión te marque un error de que el archivo está en uso. Esto puede deberse a que, como veremos más adelante, Visual FoxPro abre los cursores o tablas en el entorno de datos y al parecer esto se ejecuta antes del evento Load del form. Por ello, cuando intentas poner en uso la tabla, te indica que ya está en uso. Para solucionar esto debes poner algo en el evento Load y Unload que cierre las tablas antes de que se intente poner la misma en uso. Según tus circunstancias puedes usar CLOSE DATABASES y CLOSE ALL. BOF() Determina si el puntero de registro está situado al principio de una tabla. EOF() Determina si el puntero de registro está situado o no más allá del último re gistro de la tabla actual o especificada.
GO TOP Sitúa el puntero de registro en el primer registro de la tabla. Si la tabla tiene en uso un índice ascendente, el primer registro será el registro con el valor clave más bajo.
México, 23 de marzo de 2012
13
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
GO BOTTOM Sitúa el puntero de registro en el último registro de la tabla. Si la tabla tiene activo un índice ascendente, el último registro será aquél con el valor de clave más elevado.
GO NumDeRegistro Sitúa el puntero de registro en el registro indicado. RECNO() Devuelve el número del registro actual de la tabla actual o la especificada. SKIP Mueve el puntero de registro hacia adelante o hacia atrás en una tabla.
MANIPULACIÓN DE REGISTROS
Para poder manipular información es necesario comprender algunos conceptos. BASE DE DATOS. Es un conjunto de tablas, generalmente relacionadas. TABLA. Es una colección de información estructurada por filas y columnas. CAMPO. Vista en renglones y columnas, se referiría a una columna que contiene información sobre un mismo tipo de dato. Ej. El campo dirección, contendría todas las direcciones de los clientes. REGISTRO. Es una fila de información que contiene muchos datos acerca de una misma entidad. Ejemplo: El registro o fila 7, puede contener el Id, nombre, dirección, teléfono, etc. de una persona. Para crear una Base de Datos puede utilizar la ficha Data/Databases y elegir el botón New/New database del administrador de proyectos de VFP 9. O teclear en la ventana de comandos la orden: CREATE DATABASE NombreBasedeDatos Para crear una nueva Tabla puede utilizar la ficha Data/Free Tables y elegir el botón New/New Table También puede crear una tabla mediante código tecleando CREATE en la ventana de comandos. Agregar registros. Para insertar un nuevo registro en la tabla utilice el comando APPEND BLANK.
México, 23 de marzo de 2012
14
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
Ejemplo: CLOSE DATABASES USE Mitabla IN 0 Select Mitabla GO BOTTOM APPEND BLANK USE
Para agregar registros desde otra tabla utilice APPEND FROM. Ejemplo: CLOSE DATABASES USE Mitabla IN 0 SELECT Mitabla GO TOP COPY STRUCTURE TO MinuevaTabla USE MinuevaTabla IN 0 SELECT MinuevaTabla APPEND FROM Mitabla USE
Para marcar registros para su borrado utilice DELETE. Ejemplo: SET DELETED ON USE Mitabla IN 0
México, 23 de marzo de 2012
15
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
GO TOP LOCATE FOR IdCliente=28 IF FOUND() DELETE ELSE WAIT WINDOW ‘No se localizó el ID del cliente’ TIMEOUT 2 ENDIF
Para eliminar un registro del disco duro utilice PACK. Este PACK solo debe usarse cuando se tiene el modo exclusivo, es decir, ningún otro usuario está usando las bases de datos o tablas, y solo con fines de mantenimiento. Para modificar manualmente registros en las tablas utilice EDIT. Para visualizar una tabla utilice BROWSE. Para cerrar una tabla utilice el comando USE sin parámetros.
Controlar el enfoque
El evento LostFocus() le indica a fox que debe hacer cuando el control pierde el enfoque. (o sea que el usuario hizo click en otro objeto o bien, se puso el enfoque en otro control vía código). El método SetFocus(), pone el enfoque en cierto control (como si el usuario hubiera hecho click sobre el). Ejemplo: Thisform.txtcliente.setfocus() El evento GotFocus() le indica a fox que debe hacer cuando un control recibe el enfoque.
México, 23 de marzo de 2012
16
EL HUMILDE MANUAL DE UN APRENDIZ. (O Los 35 trucos ocultos de Visual FoxPro).
El evento click(), le indica a fox que debe hacer cuando el usuario ( o mediante código) hizo un click sobre el objeto. Para provocar un click mediante código sería: Ejemplo: Thisform.txtcliente.click() El evento Keypress(), permite colocar el típico código para que al presionar cierta tecla como F7, se realice una acción como llamar a otro formulario que contiene generalmente un grid para efectuar búsquedas. Ejemplo: Evento Keypress() del form. ON KEY LABEL F7 Wait Window ‘Se ha presionado F7’ TIMEOUT 2
Como regresar el enfoque al mismo control Uno de los métodos que pueden ser de gran utilidad para validar que la información introducida en cierto control cumpla con ciertos criterios necesarios es el método valid(). Cabe aclarar que el método Valid(), se dispara antes del evento LostFocus() en la secuencia de eventos , por lo que debe idear una estrategia para salir de él, pues de otra forma podría obligar al usuario a teclear datos que en ocasiones no son del todo necesarios y pueden provocar molestia al usuario. Para aprender más acerca de la secuencia de eventos, consulte este artículo: http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=26
El formato para utilizar correctamente el método Valid(), es el siguiente: Select Mitabla Locate for CampoaBuscar = This.value If found() * Pon aquí tus instrucciones para hacer lo que necesitas Else * Enviar aviso de no encontrado Return 0 Endif México, 23 de marzo de 2012
17