Descargar

Introducción a la Programación en Visual Foxpro9

Enviado por lankansi


    Este proyecto esta dirigido a todas aquellas personas que quieran iniciarse en el mundo de la programación estructurada y basada en objetos, en este manual de apuntes trato de obviar la teoría tediosa y por el contrario incentivar a los estudiantes de informática y público en general al estudio de esta poderosa herramienta de programación mediante ejercicios totalmente prácticos; es necesario tener conocimientos básicos de manejo de bases de datos y de lógica de programación. El Autor.

    Antes de comenzar a programas es necesario aprender a declarar variables de memoria, usted se preguntará que es una variable de memoria y para que sirve? Pues bueno una variable es una porción de memoria del computador que sirve para almacenar un valor o un dato concreto. En la vida practica se utilizan variables para poder realizar cálculos matemáticos dentro del programa. En este ejemplo al momento de definir y cargar las variables de memoria cambiaran los valores de las etiquetas que se encuentran en la parte inferior. La instrucción para crear variables de memoria es : ‘STORE’ ó ‘=’, Ej:

    La programación del Botón ‘Definir y encerar variables’ del evento ‘Click’ :

    * – Definición de variables de tipo LOCALES.

    LOCAL DatoFECHA, DatoNUMERO, DatoCADENA

    * – Enceramiento de variables.

    STORE date() to DatoFECHA

    STORE 0 to DatoNUMERO

    STORE space(10) to DatoCADENA

    * – Cargar datos.

    DatoFECHA = Ctod("01/01/2002")

    DatoNUMERO = 100

    DatoCADENA = "Carlos"

    * – Imprimir valores de las variables.

    thisform.label1.caption=dtoc(DatoFECHA)

    thisform.label2.caption=str(DatoNUMERO)

    thisform.label3.caption=DatoCADENA

    * – Actualizar formulario.

    thisform.refresh

    * – Aquí usamos datos fijos y no extraemos datos de ninguna tabla.

    * – fin.

    La programación del Botón ‘Definir y encerar variables’ del evento ‘Click’ :

    * – Definicion de variables de tipo PUBLICAS.

    PUBLIC DatoFECHA, DatoNUMERO, DatoCADENA

    * – Enceramiento de variables.

    STORE date() to DatoFECHA

    STORE 0 to DatoNUMERO

    STORE space(10) to DatoCADENA

    * – Cargar datos de la tabla a las

    * – variables de memoria.

    select TB1

    DatoFECHA = FECHA

    DatoNUMERO = NUMERO

    DatoCADENA = CADENA

    * – Imprimir valores de las variables.

    thisform.label1.caption=dtoc(DatoFECHA)

    thisform.label2.caption=str(DatoNUMERO)

    thisform.label3.caption=DatoCADENA

    * – Actualizar formulario.

    thisform.refresh

    * – Aquí creamos variables de memoria que almacenaran datos de una tabla,

    * – la tabla utilizada tiene que abrirse en el entorno de datos previamente.

    * – fin.

    La programación del Botón ‘Descargar variables de memoria’ del evento ‘Click’ :

    * – Eliminar de memoria las variables.

    release DatoFECHA, DatoNUMERO, DatoCADENA

    * – fin.

    Para realizar cálculos y almacenarlos en variables de memoria es muy útil utilizar la instrucción ‘CALCULATE’. Ejemplo:

    Botón ‘Calculate SUM’ evento ‘Click’ :

    * – OBTENCION DE LA SUMA TOTAL.

    local calculo

    * – selección de la tabla.

    select numeros

    calculate sum(valor) to m.calculo for valor>50

    * – presentacion de resultados.

    thisform.label1.caption = "Suma Total : "+alltrim(str(m.calculo))

    * – actualizar formulario principal.

    thisform.refresh

    * – fin.

    Botón ‘Calculate AVG’ evento ‘Click’ :

    * – OBTENCION DEL PROMEDIO.

    local calculo

    * – seleccion de la tabla.

    select numeros

    calculate avg(valor) to m.calculo for valor<30

    * – presentacion de resultados.

    thisform.label1.caption = "Promedio : "+alltrim(str(m.calculo))

    * – actualizar formulario principal.

    thisform.refresh

    * – fin.

    Botón ‘Calculate MIN’ evento ‘Click’ :

    * – OBTENCION DEL NUMERO MENOR.

    local calculo

    * – selección de la tabla.

    select numeros

    calculate min(valor) to m.calculo for valor>3

    * – presentación de resultados.

    thisform.label1.caption = "Numero Menor : "+alltrim(str(m.calculo))

    * – actualizar formulario principal.

    thisform.refresh

    * – fin.

    Botón ‘Calculate MAX’ evento ‘Click’ :

    * – OBTENCION DEL NUMERO MAYOR.

    local calculo

    * – selección de la tabla.

    select numeros

    calculate max(valor) to m.calculo for valor<100

    * – presentación de resultados.

    thisform.label1.caption = "Numero Mayor : "+alltrim(str(m.calculo))

    * – actualizar formulario principal.

    thisform.refresh

    * – fin

    Aquí presento otro ejemplo de la instrucción ‘Calculate’ utilizada generalmente para generar un código y almacenarlo en una variable especifica, aquí también vemos como se implementa el bucle de control ‘IF… ELSE… ENDIF’ y el bucle de control ‘DO CASE’, el proceso es el siguiente:

    Botón ‘Generar’ evento ‘Click’:

    * – Autor: Juan Carlos Romero Jijón.

    * – definir variables.

    local NROG, CF

    * – encerar variables.

    * – cargar datos.

    select generar

    * – Validación, si hay registros en la tabla.

    if reccount()>0 then

    * – obtener el numero mayor.

    calculate max(val(substr(codigo,4,4))) to NROG

    * – incrementar valor mediante un contador.

    NROG=NROG+1

    * – bucle condicional para controlar los ceros.

    do case

    case NROG<10

    CF="CLI"+"000"+alltrim(str(NROG))

    case nrog>9 and nrog<100

    CF="CLI"+"00"+alltrim(str(NROG))

    case nrog>99 and nrog<1000

    CF="CLI"+"0"+alltrim(str(NROG))

    case nrog>999 and nrog<10000

    CF="CLI"+alltrim(str(NROG))

    endcase

    else

    * – se crea el primer elemento.

    CF="CLI"+"0001"

    endif

    * – devolver valor al text.

    thisform.text1.value = CF

    * – actualizar formulario principal.

    thisform.refresh

    * – fin.

    A Continuación presento la utilización del bucle de repetición ‘DO WHILE’ que por lo general es utilizado para recorrer los registros de una tabla, es necesario abrir la estructura en el entorno de datos. Ejemplo:

    El Botón ‘Calculo de nro. Mayor y su código’ evento ‘Click’:

    * – definir variables.

    local DATOcodigo, DATOtotal

    * – encerar variables.

    DATOcodigo=space(3)

    DATOvalor=0

    DATOtotal=0

    * – RECORRER TODOS LOS REGISTROS DE LA TABLA.

    * – extraer el nro. factura con su respectivo

    * – valor(fact. cuyo total es el mayor).

    select factvta

    go top

    do while not eof()

    DATOvalor=total

    if DATOtotal<DATOvalor then

    DATOcodigo=factura

    DATOtotal=total

    endif

    select factvta

    skip

    enddo

    * – mensaje.

    wait windows "Factura : "+DATOcodigo +" "+"Valor : "+alltrim(str(DATOtotal))

    * – fin.

    En este ejercicio aprenderemos a eliminar los registros lógicamente y físicamente de las estructuras de datos, las instrucciones para eliminar registros son : ‘DELETE’, ‘PACK’ y ‘ZAP’ y ‘RECALL’. ejemplo:

    Botón ‘Borrar Todos’ evento ‘Click’:

    * – seleccionar la tabla especifica.

    select factvta

    * – borrar todos los registros.

    delete all

    wait windows "Registros Eliminados"

    * – fin.

    Botón ‘Recuperar Todos’ evento ‘Click’:

    * – seleccionar la tabla.

    select factvta

    * – recuperar todos los registros eliminados

    * – lógicamente.

    recall all

    wait windows "Registros Recuperados"

    * – fin.

    Botón ‘empaquetar registros’ evento ‘Click’:

    * – seleccionar la tabla.

    select factvta

    * – elimina físicamente los registros

    * – marcados con la marca de borrado lógico.

    pack

    wait windows "Registros Eliminados Físicamente"

    * – fin.

    Botón ‘Zapear registros’ evento ‘Click’:

    * – proceso de eliminación físico de todos los

    * – registros de la tabla.

    select factvta

    zap

    wait windows "Registros Eliminados Físicamente"

    * – fin.

    Nota: Para poder realizar procesos con estas instrucciones es necesario que la tabla este en modo exclusivo.

    En el siguiente ejemplo elimino registros pero PREVIO UNA CONDICION DE FECHA!. Ejemplo:

    Botón ‘Borrar Fechas Coincidentes’ evento ‘Click’:

    local datoFECHA

    datoFECHA=ctod(thisform.text1.text)

    select factvta

    delete all for fecha = datoFECHA

    wait windows "Registros Coincidentes Eliminados"

    Botón ‘Recuperar Fechas Coincidentes’ evento ‘Click’:

    local datoFECHA

    datoFECHA=ctod(thisform.text1.text)

    select factvta

    recall all for fecha = datoFECHA

    wait windows "Registros Coincidentes Recuperados

    Boton ‘Visualizar Registros(browse) evento ‘Click’:

    select factvta

    browse;

    noedit;

    noappend;

    nodelete

    * – fin.

    Aquí vamos a realizar un filtro de datos, se utiliza la instrucción ‘SET FILTER TO’, Ejemplo:

    Botón ‘Filtrar’ evento ‘Click’:

    * – FILTRAR REGISTROS.

    PUBLIC DatoFILTRO

    DatoFILTRO=upper(alltrim(thisform.text1.value))

    select tb1

    set filter to upper(alltrim(facturas))=DatoFILTRO

    * – fin.

    Botón ‘Visualizar Datos’ evento ‘Click’:

    * – VISUALIZAR DATOS.

    select tb1

    browse

    * – fin.

    Botón ‘Romper Filtro’ evento ‘Click’:

    * – ROMPER FILTRO ANTERIOR.

    select tb1

    set filter to

    * – fin.

    En este ejemplo creamos índices de tablas mediante la instrucción ‘INDEX ON’, como referencia debo indicar que ya no se utilizan índices IDX sino CDX porque son mas compactos y estables. Ejemplo:

    Botón ‘Indexar Campos’ evento ‘Click’:

    * – cerrar estructuras.

    close tables

    * – seleccionar área de trabajo y apertura

    * – de tablas.

    select 0

    use clientes

    * – creacion de etiquetas.

    index on codigo tag etiqueta1

    index on nombres tag etiqueta2

    index on apellidos tag etiqueta3

    index on ciudad tag etiqueta4

    * – mensaje de finalización.

    wait windows "Creación de índices FINALIZADA!"

    Botón ‘Etiqueta Código’ evento ‘Click’:

    * – ordenar por el código.

    select clientes

    set order to tag etiqueta1

    * – fin.

    Botón ‘Etiqueta Nombre’ evento ‘Click’:

    * – ordenar por el nombre.

    select clientes

    set order to tag etiqueta2

    * – fin.

    Botón ‘Etiqueta Apellido’ evento ‘Click’:

    * – ordenar por el apellido.

    select clientes

    set order to tag etiqueta3

    * – fin

    Botón ‘Etiqueta Ciudad’ evento ‘Click’:

    * – ordenar por la ciudad.

    select clientes

    set order to tag etiqueta4

    * – fin.

    Botón ‘Mostrar Datos’ evento ‘Click’:

    * – seleccionar la tabla.

    select clientes

    * – visualizar los datos mediante

    * – la ventana EXAMINAR.

    browse;

    noedit;

    nodelete;

    noappend

    * – fin.

    Aquí mediante un parámetro ‘Fecha’ realizamos una totalización de registros, utilizamos la función ‘TOTAL ON’, la estructura de la tabla es la siguiente:

    Y el código del Botón ‘Totalizar Fecha’ evento ‘Click’:

    * – PROCESO DE TOTALIZACION DE DATOS.

    local date1

    * – cargamos los datos del text a la variable.

    date1=ctod(thisform.text1.text)

    * – seleccionamos la tabla a totalizar.

    select fvta

    * – debemos activar un índice, el cual debe

    * – estar indexado por el campo que se va a

    * – realizar el proceso de totalizacion.

    set order to tag date1

    * – procedemos a totalizar los datos

    * – mediante la fecha.

    total on fecha to T-Fecha1 for fecha=date1

    * – abrimos la nueva tabla que contiene

    * – los resumenes.

    use t-fecha1

    * – ventana examinar.

    browse

    * – fin.

    Boton ‘Salir’ evento ‘Click’:

    * – salir.

    close tables

    thisform.release

    Con el siguiente ejemplo vamos a aprender a crear registros en blanco y a grabar datos en ellos, las instrucciones necesarias para este proceso son ‘APPEND BLANK’ y ‘REPLACE’. Ejemplo:

    Botón ‘Definir y cargar variables’ evento ‘Click’:

    * – definir variables de tipo PUBLICAS.

    PUBLIC DATOfactura, DATOfecha, DATOsubtotal, DATOiva, DATOtotal

    * – encerar variables.

    store space(3) to DATOfactura

    store date() to DATOfecha

    store 0 to DATOsubtotal

    store 0 to DATOiva

    store 0 to DATOtotal

    * – cargar datos.

    DATOfactura="006"

    DATOfecha=ctod("12/12/2002")

    DATOsubtotal=500

    DATOiva=50

    DATOtotal=550

    * – fin.

    Botón ‘Añadir y grabar registros’ evento ‘Click’:

    * – añadir y llenar registro.

    select factvta

    append blank

    * – reemplaza los valores de las variables

    * – en los campos respectivos de la tabla.

    replace factura with DATOfactura

    replace fecha with DATOfecha

    replace subtotal with DATOsubtotal

    replace iva with DATOiva

    replace total with DATOtotal

    wait windows "Registro creado satisfactoriamente!"

    * – fin.

    Botón ‘Visualizar Datos’ evento ‘Click’:

    * – visualizar registros.

    select factvta

    browse;

    noedit;

    nodelete;

    noappend

    * – fin.

    Aquí comenzamos a utilizar pequeños controles para manejar los errores producidos por los objetos al no encontrar los parámetros adecuados, el evento de mayor relevancia es el ‘EVENTO ERROR’, Ejemplo:

    Botón ‘Aceptar’ evento ‘Click’:

    * – COPIAR ARCHIVOS.

    CLOSE TABLES && CIERRO TODAS LAS ESTRUCTURAS EN USO.

    IF SUBSTR(THISFORM.TXTUNIDAD.VALUE,1,1)="A" THEN

    COPY FILE *.dbf to A:

    MESSAGEBOX('Se ha realizado con éxito los BACKUPS')

    ELSE

    COPY FILE *.dbf to "C:ONERRORBACKUPS"

    MESSAGEBOX('Se ha realizado con éxito los BACKUPS')

    ENDIF

    * – FIN.

    Botón ‘Aceptar’ evento ‘ERROR’:

    LPARAMETERS nError, cMethod, nLine

    * – MENSAJE DE ERROR.

    MESSAGEBOX("Error. No se pueden respaldar los ARCHIVOS!")

    * – CANCELO EL PROCESO DE RESTAURACION.

    CANCEL

    * – FIN.

    Algo muy importante que un programador debe dominar son las búsquedas de los registros mediante sus códigos, aquí implementamos 2 instrucciones básicas para llevar a cabo este objetivo : ‘LOCATE y SEEK’, ejemplo:

    Botón ‘Buscar’ evento ‘Click’:

    * – definición de la variable de búsqueda.

    local codBUSQUEDA

    * – enceramiento de la variable.

    codBUSQUEDA=SPACE(3)

    * – captura del codigo ingresado en el TEXTBOX.

    codBUSQUEDA=upper(alltrim(thisform.text1.text))

    * – selección de la tabla.

    select articulo

    * – búsqueda del código sin utilización de INDICES.

    locate for upper(alltrim(codigo))=codBUSQUEDA

    * – si encuentra el codigo,

    if found() then

    thisform.label1.caption= articulo.descripcio

    * – caso contrario.

    else

    thisform.label1.caption= "ERROR… Este código no EXISTE."

    endif

    * – actualizar formulario.

    thisform.refresh

    * – fin.

    Botón ‘Buscar’ evento ‘Click’:

    PARA PODER UTILIZAR LA INSTRUCCIÓN ‘SEEK’ PREVIAMENTE SE DEBE HABER CONSTRUIDO UN INDICE POR EL CAMPO POR EL CUAL SE VA A REALIZAR LA BUSQUEDA.

    * – definicion de la variable de búsqueda.

    local codBUSQUEDA

    * – enceramiento de la variable.

    codBUSQUEDA=SPACE(3)

    * – captura del codigo ingresado en el TEXTBOX.

    codBUSQUEDA=upper(alltrim(thisform.text1.text))

    * – seleccion de la tabla.

    select articulo

    * – selección del indice.

    set order to tag cod1

    * – búsqueda del código.

    seek codBUSQUEDA

    * – si encuentra el código,

    if found() then

    thisform.label1.caption= articulo.descripcio

    * – caso contrario.

    else

    thisform.label1.caption= "ERROR… Este codigo no EXISTE."

    endif

    * – actualizar formulario.

    thisform.refresh

    * – fin.

    En este ejemplo combino la versatilidad del ‘GRID’ con la potencia de la instrucción ‘SQL’ para crear vistas temporales de datos; el ‘grid’ es un objeto que por lo general se lo utiliza para presentar datos por pantalla y la instrucción ‘sql’ permite extraer información y combinarla con cálculos para obtener datos procesados.

    A continuación les explicaré a breves rasgos el funcionamiento de la instrucción SQL, Sintaxis:

    Cláusula ‘SELECT’.- Permite seleccionar los campos que participaran en la selección de datos de la vista, aquí también se pueden usar funciones para realizar cálculos.

    Cláusula ‘FROM’.- Permite especificar de que tablas están participando en la selección de datos.

    Cláusula ‘WHERE’.- Es la condición que estable el filtrado de los datos.

    Cláusula ‘INTO’.- Indica el nombre del cursor de memoria donde se almacenan los registros temporalmente.

    Cláusula ‘ORDER BY’.- Indica porque campo se ordenan los datos de la vista.

    Botón ‘Crear Vista’ evento ‘Click’:

    * – variable de tipo local.

    local ssql1

    * – Instrucción SQL.

    ssql1="select codigo as CODIGO, name as NOMBRE, company as COMPAÑIA, address as DIRECCION from PUBLISHER into cursor TB1 order by CODIGO"

    *****************************************************

    * – MANEJO DEL GRID.

    *****************************************************

    * – Nro. de columnas de la cuadricula.

    thisform.grid1.columncount=3

    * – Modificar el encabezado de las columnas del grid.

    thisform.grid1.column1.header1.caption="CODIGO"

    thisform.grid1.column2.header1.caption="NOMBRE"

    thisform.grid1.column3.header1.caption="COMPAÑIA"

    * – Alineación de los títulos de las columnas.

    thisform.grid1.column1.header1.alignment=2

    thisform.grid1.column2.header1.alignment=2

    thisform.grid1.column3.header1.alignment=2

    * – Acceso de solo lectura a los datos del grid.

    thisform.grid1.readonly=.t.

    * – Asignación del origen de los datos del GRID.

    thisform.grid1.recordsource=ssql1

    * – mascara de entrada de los datos en la columna.

    thisform.grid1.column2.inputmask = "@!"

    thisform.grid1.column3.inputmask = "@!"

    * – modificar tamaño de columnas.

    thisform.grid1.column2.width=200

    thisform.grid1.column3.width=200

    * – Actualización del GRID.

    thisform.grid1.refresh

    * – Fin.

    Objeto ‘Form’ evento ‘Load’:

    * – Inicializar el ambiente.

    clear macro

    set talk off

    set echo off

    set notify off

    set safety off

    set delete on

    set century on

    close tables

    * – Abrir tablas.

    select 0

    use publisher

    * – fin.

    EXPORTAR DATOS DE UNA TABLA DE FOX A UN ARCHIVO PLANO *.TXT:

    * – Los registros se graban en el orden que esté especificado en la

    * – etiqueta de índice actual de la tabla.

    CLOSE TABLES

    SET EXCLUSIVE ON

    SET TALK OFF

    SET ECHO OFF

    SET SAFETY OFF

    SET NOTIFY OFF

    * —————————————-

    * – APERTURA DE TABLAS.

    USE PRUEBA

    * – ANEXAR DATOS A LA TABLA(*.DBF) DESDE EL ARCHIVO DE DATOS.

    COPY TO MITXT1.TXT DELIMITED WITH ","

    MESSAGEBOX("Exportación Terminada!","Datos")

    CLOSE TABLES

    * – FIN.

    UTILIZO EL SQL PARA EXPORTAR DATOS A UN FICHERO *.TXT:

    SET TALK OFF

    SET ECHO OFF

    SET SAFETY OFF

    SET NOTIFY OFF

    * ——————————————————————————————

    SELECT * FROM PRUEBA TO FILE SQL1.TXT

    SELECT * FROM PRUEBA TO FILE SQL2.TXT WHERE EDAD>30

    IMPORTAR DATOS DESDE UN ARCHIVO DE TEXTO PLANO A UNA ESTRUCTURA *.DBF.

    * ———————————————————————————————-

    * – La estructura de la tabla debe crearse en el mismo

    * – orden como se encuentran los datos en el *.txt que

    * – se va a anexar.

    CLOSE TABLES

    SET EXCLUSIVE ON

    * – APERTURA DE TABLAS.

    USE PRUEBA

    APPEND FROM MITXT4.TXT DELIMITED WITH '"' WITH CHARACTER ';'

    * – VISUALIZO DATOS ANEXADOS A TRAVES DE LA VENTANA.

    BROWSE

    CLOSE TABLES

    * – FIN.

     

     

     

     

    Autor:

    Tclgo. Juan Carlos Romero Jijón

    Machala – El Oro – Ecuador.