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.