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.