Sei sulla pagina 1di 32

MODULO 2

PROGRAMACION
VISUAL FOX PRO

Programa:

Alumno:

¨Módulo No. 9 PROGRAMACION VISUL FOX PRO


Preparado por:
Jhon Jairo Hernández

Reservados todos los derechos


Prohibida su reproducción total o parcial

Diseño e Impresión:
Comunicamos Ideas Tel 653 6517
Ideas@telesat.com.co

Pag. 1
CONTENIDO

LOS REPORTES Y LAS CONSULTAS EN LAS


APLICACIONES

EL GENERADOR DE REPORTES

EL FORMULARIO PARA SELECCIONAR EL DESTINO DE UN


REPORTE

FORMA DE UTILIZAR EL FORMULARIO REPORTE

LAS CONSULTAS EN LAS APLICACIONES

ANEXO A LA GUÍA DE CLASES – LA INSTRUCCIÓN SELECT –


SQL

EL SISTEMA COMPLETO

EL GENERADOR DE MENUS DEL FOXPRO

MODO DE PROGRAMAR LA ACCIÓN EN LAS OPCIONES DEL


MENÚ

EL PROGRAMA PRINCIPAL DE LA APLICACIÓN

LA PANTALLA DE ACCESO AL SISTEMA

COMPILACIÓN Y DISCOS DE DISTRIBUCIÓN DE UNA


APLICACIÓN

GENERANDO EL ARCHIVO EJECUTABLE DE LA APLICACIÓN

ANTES DE CREAR LOS DISCOS DE INSTALACIÓN DE LA


APLICACIÓN

CREACIÓN DE LOS DISCOS DE INSTALACIÓN O


DISTRIBUCIÓN

Pag. 2
LOS REPORTES Y LAS CONSULTAS EN LAS
APLICACIONES
La potencia
permitan de las
hacer aplicaciones,
sobre vienealmacenada
la información marcada porenlalas
cantidad de informes
tablas que componeny consultas que
a un sistema
de información.
La cantidad de informes queda limitada a la capacidad de cada programador y a los reportes
que solicite la persona que nos ha contratado para desarrollar un proyecto. Lo cual significa,
que un sistema por pequeño que sea puede incluir una serie de reportes que harían que el
proyecto se viese como un “gigante”.
Las consultas pueden ser utilizadas para enviar resultados de búsquedas basadas en criterios
ofrecidos por los usuarios y su resultado se puede enviar a la pantalla o a la impresora.

EL GENERADOR DE REPORTES
pueden incluir texto, campos, imágenes,
El FoxPro incluye un generador de reportes bastante potente. Dentro de un reporte se
líneas, cuadros, campos calculados, unión botón Modificar. Si lo que desea es agregar
de campos, funciones, etc. un reporte que hace falta dentro del proyecto,
Si se domina (como programador) el tema de haga clic en Agregar y seleccione el nombre
las funciones, se pueden ejecutar una serie del reporte desde sus unidades de disco.
de acciones que ahorrarían mucho tiempo a Si lo que se desea es crear un nuevo
la hora de diseñar reportes. Las expresiones formulario, haga clic en nuevo, seleccione
que conjuguen una serie de funciones, capos de la pantalla de diálogo que aparece el
y cadenas de caracteres, permiten ampliar botón Nuevo Informe. Esta acción abrirá
aún más las posibilidades del generador de un formulario en blanco, sobre el cual
reportes del FoxPro. iniciaremos las actividades que definirán el
Tenga presente que el FoxPro “amarra” las nuevo reporte. Recuerde que el reporte no
tablas utilizadas para sacar la información, es funcional en este punto debido a que no
al reporte que las utiliza. Si analizamos la existe ninguna tabla abierta en memoria. Una
forma en que hemos venido trabajando hasta técnica utilizada por muchos programadores,
el momento, en ningún momento debemos consiste en crear una rutina que abre las
permitir que tal cosa pase. Nuestra aplicación tablas necesarias para la funcio-nalidad
utiliza tablas ubicadas en directorios diferentes del reporte, ejecutarla antes de entrara la
dependiendo del campo DIRECTORIO en la creación de mismo, y verificar el correcto
tabla CIAS.DBF. funcionamiento del reporte en el sistema.
Como no podemos dejar que el FoxPro Si no se utiliza ninguna técnica de estas,
amarre las tablas a los reportes, iniciaremos nuestro reporte solo será funcional cuando lo
el generador en blanco y diseñaremos el llamemos desde el formulario que hace uso
reporte teniendo a la mano los campos de las tablas requeridas por el reporte.
requeridos para el informe.
Seleccione la pestaña Docs en el administrador Para este ejemplo, crearemos el reporte
de proyectos y seleccione los objetos Programa.frt para mostrar la información
formularios para que FoxPro nos muestre de la tabla Programas.
los reportes diseñados. Si es un reporte Recuerde que el reporte no funcionará desde
a modificar, haga clic en la lista sobre el el modo diseño, así que no intente ejecutar
nombre del reporte, luego haga clic en el un vista preliminar del reporte.
La barra controles de informes nos facilita el
Pag. 3
manejo de los objetos que pueden aparecer
dentro de un informes. Si no parece, haga
clic en el menú Ver y Barra de herramientas
Controles de informes.
Utilice el siguiente esquema para diseñar el
reporte para la tabla programas:
Como aspecto importante a considerar a la
hora de diseñar reportes, es la inclusión del

Seleccionar objetos
Etiquetas de texto Berifique que
Campos de tablas la barra de
Dibujar lÍneas herramientas
controles de
Dibujar rect«ngulo informe aparerzca
Dibujar CÍrculos para poder trabajar
Im«genes, en el diseÔador de
control OLE dependiente informes.
Bloqueo de botÙn
seleccionado
Barra controles de informe

nombre de la empresa para la cual se diseña la aplicación. En algún sitio del encabezado
del reporte debe aparecer el nombre del reporte. Incluir la fecha del sistema es también
una buena idea para el usuario que tome uno de los reportes en un futuro posterior a la
impresión.

Los objetos 1, 2 y 3 se diseñan con el botón Campos de Tablas. Utilice estos parámetros
para indicarle al generador de reportes de donde proviene la información:
#Objeto Expresión origen de datos Formato
1 «Fecha: « +dtoc( date())
2 programa.codigo @!
Pag. 4
3 Programa.nombre @!
En la pantalla de Propiedades del campo, coloque el parámetro de Posición a Flotante.
E L F O R M U L A R I O PA R A
SELECCIONAR EL
DESTINO DE U N
REPORTE E l

siguiente paso después de diseñar el reporte, es construir un formulario de uso global que
nos permita llamarla desde cualquier formulario, permitirle al usuario seleccionar el destino

de un reporte (pantalla o impresora), recoger la selección hecha por el usuario y ejecutar


el reporte seleccionado.
En cada formulario diseñado hasta el momento, se venia dejando un botón denominado
Reporte. En este botón insertaremos el código necesario para activar el formulario que se
diseñará a continuación. Vea más adelante en esta guía, la serie de ordenes que utilizan
el formulario Reportes. El formulario se diseñará una sola vez, en los demás formularios,
se invocará a este formulario para permitirle al usuario que seleccione el destino de un
reporte.
Construya el siguiente formulario y guárdelo con el nombre de reportes.
1: btnPantalla 2: btnImpresora 3: btnCerrar
CÓDIGO EN LOS OBJETOS DEL FORMULARIO REPORTES

En las propiedades del


formulario, active la pestaña
Otras, busque la propiedad

WindowType y colóquela al valor 1-Modal. Si no hace esto,


el formulario generará un error al tratar de ejecutarlo. Esto
sucede debido a que se retornarán datos que indicarán la selección hecha por el usuario.
EVENTO INIT DEL FORMULARIO REPORTES (REPORTES.INIT)

public _porPantalla, _porImpresora, _btnCerrar

Pag. 5
EVENTO UNLOAD DEL FORMUARIO (REPORTE.UNLOAD)

if _porPantalla
_resultado = 1
endif

if _porImpresora
retornar a la aplicación que llamó al formulario.
_resultado = 2
endif
La instrucción RETURN es la encargada de
devolver el parámetro a la aplicación que llame a
if _btnCerrar
esta rutina.
_resultado = 0
btnPantalla.Click btnImpresora.Click
endif
*botón Pantalla
return( _resultado)
_porPantalla = .t.
Este evento se ejecuta cuando se cierra el formulario. Observe que cada vez que el usuario
_porImpresora = .f.
hace clic en cada botón, se le asignan valores a unas variables lógicas, indicadoras al final
_btnCerrar = .f.
de sobre cual botón se hizo clic.
thisform.release
En esta parte del formulario, se recogen los valores de esas variables y se asigna un valor para

*botón Impresora
_porPantalla = .f.
_porImpresora = .t. _porPantalla = .f.
_btnCerrar = .f. _porImpresora = .f.
_btnCerrar = .t.
thisform.release
BtnCerrar.Click thisform.release
*botón Cerrar Observe que cada botón

libera al formulario y a su vez, asigna el valor de verdadero sobre la variable


unos valores lógicos equivalente al botón pulsado y coloca el
equivalentes a los tres valor de falso a las otras variables. En la
únicos botones en la rutina del evento Unload del formulario,
pantalla. Existe una se chequea el estado de esas tres variables
variable por cada botón y se asigna un nuevo valor al parámetro
y cuando se hace clic en que se debe retornar.
cada botón, este coloca Se ha determinado que la rutina devolverá
0 cuando el usuario no escoja nada o haga
clic en el botón Cerrar. Retorna 1 cuando se hace clic sobre el botón Pantalla y retorna un
2 cuando se hace clic sobre el botón Impresora.

Pag. 6
FORMA DE UTILIZAR EL FORMULARIO REPORTE
Hasta el momento tenemos un reporte diseñado (Programas.frt), un formulario llamado
Reportes que permite seleccionar el destino de un reporte y un formulario, diseñado en
momento no se había utilizado, denominado btnReporte.
clases anteriores llamado Programas. En ese formulario, aparece un botón que hasta el
Cuando el usuario haga clic sobre este botón, el sistema debe mostrar una pantalla
donde el usuario pueda seleccionar el destino del reporte. Eso es lo programaremos a
continuación:

Abra el formulario Programa en modo de diseño, ubique el botón btnReporte y haga doble clic
sobre este. Busque el evento Clic y escriba el código que se especifica a continuación.
BtnReporte.Click
*generar reporte de programas
*consultar el destino para el reporte
do form forms\reportes to mDestino
do case
case mDestino = 1 && pantalla

report form informes\programa preview


case mDestino = 2 && impresora
*verificar estado de la impresora
if printstatus() && verificar el estado de la impresora
report form informes\programa to print noeject noconsole
else
mMens1 = «La impresora no esta lista. Preparela e intente de nuevo...»
+chr(13)
mOpc = messagebox( mMens1, 0+48, «Atención!»)
endif
endcase
*regresar a la pantalla
go top
scatter memvar memo
thisform.refresh
return

Observe que el código incluye la instrucción:


do form forms\reportes to mDestino
Con ésta orden lo que se hace es invocar al formulario Reportes e indicarle al FoxPro que
deseamos almacenar el valor que retorne el formulario en la variable mDestino. El formulario
Reportes se ejecuta, permite que el usuario haga su selección, retorna el valor en la variable
Pag. 7
mDestino, y lo único que resta es verificar el valor retornado. Recuerde que un valor de 1 indica
que seleccionaron Pantalla, un valor de 2, Impresora, y un valor de 0, indica que el usuario
no seleccionó nada.

LAS CONSULTAS EN LAS APLICACIONES


Una de las características potentes en un gestor de bases de datos, lo constituye la capacidad
de generar consultas a la información almacenada en las tablas de un sistema de información
determinado.
La forma en que se puede generar consultas a las tablas son muchas, pero una de las más sencillas
SELECT-SQL.
y que permiten Esta
granorden es verdaderamente
flexibilidad potente y son
durante la ejecución, permite programarpor
las ofrecidas instrucciones de
la instrucción
consultas en forma fácil. Por ejemplo, se puede diseñar un formulario, unos datos en los cuales
se recogen los parámetros de la consulta, y basado en esos datos entrados por el usuario, ejecutar
una consulta en tiempo real.
Abra el diseñador de formulario con un formulario en blanco y diseñe el siguiente formulario.
Cuando termine guárdelo en la carpeta de los formularios con el nombre de SQLProg. El
anteponer SQL a los formularios de consulta, hará que estos se agrupen visualmente en el
administrador de proyectos, permitiéndonos en un futuro, administrar de forma fácil las pantallas
de consultas.
1: mNombreSQL 2: btnEjecutarSQL 3: btnCerrar
El usuario deberá entrar en el campo 1 un texto. Cuando haga clic en el botón Ejecutar
Consulta, el sistema ejecutará una instrucción SELECT-SQL y traerá de la tabla PROGRAMA
los programas que incluyan en su nombre el texto entrado.
FORMULARIO.INIT
*abrir entorno utilizando las variables públicas

close data

mFile1 = _dircia +»programa.dbf»


if !file( mFile1)
do cPrograma in prg\creartbl
endif

sele 1
use &mFile1 order tag codigo alias programa

return
En botón ejecutar lanza la consulta en el sistema. Observe el uso que se hace del
parámetro entrado por el usuario. Si entra algo, se usa como parámetro, si deja el
campo en blanco, simplemente se traen todos los registros. El resultado de la consulta
es mostrado en una ventana examinar, que debe ser cerrada con ctrl.+w.
BtnEjecutarSQL.Click
*ejecutar consulta copn los parámetros entrados
mNombreSQL = alltrim( thisform.mNombreSQL.value)
Pag. 8
if empty( mNombreSQL)
select * from programa
else
select * from programa where
mNombreSQL $ programa.nombre
endif

return
BtnCerrar.Click
thisform.release
Por ejemplo, si introducimos como parámetro la palabra “PROG” obtendremos
como resultado la siguiente pantalla:
Para cerrar
esta pantalla,
pulse Ctrl.+W.
Aunque en este ejemplo se hizo una
búsqueda basado una clase datos, no indica

que siempre se tenga que hacer de tal forma. Las posibilidades de programar parámetros
son muchas y la capacidad de programar tales ordenes dentro de una instrucción SELECT-

SQL hacen de esta


orden lo máximo
para controlar

consultas.
Para mayor información acerca de la orden SELECT-SQL, consulte el manual de comandos
y funciones

ANEXO A LA GUÍA DE CLASES – LA INSTRUCCIÓN SELECT – SQL

El siguiente texto fue tomado de la ayuda del FoxPro.

Recupera datos de una o más tablas.

Sintaxis
SELECT [ALL | DISTINCT] [TOP nExpresión [PERCENT]]
[Alias.] Elemento_Selección [AS Nombre_Columna]
[, [Alias.] Elemento_Selección [AS Nombre_Columna] ...]
FROM [FORCE]
Pag. 9
[NombreBaseDatos!]Tabla [Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
NombreBaseDatos!]Tabla [Alias_Local]
[ON CondiciónCombinación …]
[[INTO Destino]
[TO FILE NombreArchivo [ADDITIVE] | TO PRINTER [PROMPT]
TO SCREEN]]
[PREFERENCE NombrePreferencia]
[NOCONSOLE]
[PLAIN]
[NOWAIT]
[WHERE CondiciónCombinación [AND CondiciónCombinación ...]
[AND | OR CondiciónFiltro [AND | OR CondiciónFiltro ...]]]
[GROUP BY ColumnaGrupo [, ColumnaGrupo ...]]
[HAVING CondiciónFiltro]
[UNION [ALL] SELECTCommand]
[ORDER BY Elemento_Orden [ASC | DESC] [, Elemento_Orden [ASC | DESC] ...]]

Argumentos

SELECT Especifica los campos, constantes y expresiones que se mostrarán en el


resultado
de la consulta.
ALL De forma predeterminada, se muestran todas la filas del resultado de la
consulta.
DISTINCT Excluye duplicados de cualquier fila del resultado de la consulta.

Nota Puede utilizar DISTINCT únicamente una vez por cláusula SELECT.

TOP nExpresión [PERCENT] Especifica que el resultado de la consulta contenga un número


determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir
una cláusula ORDER BY si incluye la cláusula TOP. La cláusula ORDER BY especifica las
columnas en las que la cláusula TOP determinará el número de filas que se va a incluir en el
resultado de la consulta.

Puede especificar desde 1 a 32,767 filas. Las filas de valores idénticos para las columnas
especificadas en la cláusula ORDER BY se incluyen en el resultado de la consulta. A partir
de entonces, si especifica 10 para nExpr, el resultado de la consulta podrá obtener más de
10 filas si hay más de 10 filas con valores idénticos para las columnas especificadas en la
cláusula ORDER BY.

Si se incluye la palabra clave PERCENT, se redondeará al número entero más alto el número
de columnas devuelto en el resultado. Los valores permitidos para nExpr cuando se incluye
la palabra clave PERCENT son 0.01 a 99.99.
Alias. Califica nombres de elementos coincidentes. Cada elemento que especifique
con Elemento_Selección genera una columna de los resultados de la consulta. Si dos o más

Pag. 10
elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre
del elemento para impedir la duplicación de las columnas.
Elemento_Selección especifica un elemento a incluir en el resultado de la consulta. Un
elemento puede ser uno de los siguientes:
· El nombre de un campo de una tabla de la cláusula FROM.
· Una constante especificando que el mismo valor constante ha de aparecer en
cada fila del resultado de la consulta.
· Una expresión que puede ser el nombre de una función definida por el usuario
(FDU).
AS Nombre_Columna Especifica el título de una columna en el resultado de la consulta. Esta
opción resulta muy útil cuando Elemen-to_Selección es una expresión o contiene una función
de campo y desea dar un nombre significativo filas de la tabla a la izquierda de la palabra
a la columna. Nombre_Columna puede ser una clave JOIN y sólo las filas que concuerden
expresión pero no puede contener caracteres procedentes de la tabla a la derecha de la
(por ejemplo, espacios) que no estén permitidos palabra clave JOIN. La palabra clave OUTER
para nombres de campos de tablas. es opcional; se puede incluir para resaltar que
FROM Enumera las tablas que contienen los se ha creado una combinación externa.
datos que obtuvo la consulta. Si no hay ninguna
tabla abierta, Visual FoxPro mostrará el cuadro RIGHT [OUTER] JOIN Especifica que el
de diálogo Abrir para permitirle especificar resultado de la consulta contenga todas las filas
la ubicación del archivo. Una vez abierta, la desde la tabla hasta la derecha de la palabra
tabla permanecerá abierta cuando la consulta clave JOIN y sólo las filas que concuerden
se haya terminado. desde la tabla hasta la izquierda de la palabra
FORCE Especifica que las tablas se combinarán clave JOIN. La palabra clave OUTER es
en el orden de aparición en la cláusula FROM. opcional; puede incluirse para resaltar la
Si se omite FORCE, Visual FoxPro intentará creación de una combinación externa.
optimizar la consulta. Sin embargo, es posible FULL [OUTER] JOIN Especifica que el
que la consulta se ejecute más rápido si resultado de la consulta contenga todas las filas,
se incluye la palabra clave FORCE para concuerden o no, de ambas tablas. La palabra
desactivar la optimización de consultas de clave OUTER es opcional; se puede incluir
Visual FoxPro. para resaltar que se ha creado una combinación
NombreBaseDatos! Especifica el nombre de externa.
una base de datos inactiva que contiene la ON CondiciónCombinación Especifica las
tabla. Es necesario incluir el nombre de la columnas según las cuales se combinan las
base de datos que contiene la tabla en caso tablas.
de que no sea la base de datos activa. Incluya INTO Destino Determina donde se almacenan
el delimitador de signo de exclamación (!) los resultados de la consulta. Si incluye una
después del nombre de la base de datos y antes cláusula
del nombre de la tabla. INTO y una cláusula TO en la misma consulta,
Alias_Local Especifica un nombre temporal la cláusula TO se pasará por alto. Si no incluye
para la tabla indicada en Tabla. Si especifica un la cláusula
alias local, debe utilizar el alias local en lugar INTO, los resultados de la consulta se mostrarán
de la tabla a través de todo el SELECT. en la ventana Examinar. Los resultados de
INNER JOIN Especifica que el resultado de la consulta pueden dirigirse también a la
la consulta contenga sólo filas para una tabla impresora o a un archivo mediante la cláusula
con la que coincidan una o varias filas en otra TO.
tabla. Destino puede ser uno de los siguientes:
LEFT [OUTER] JOIN Especifica que el ·
resultado de la consulta contenga todas las ARRAY NombreMatriz, que
almacena los resultados de la consulta en una
Pag. 11
matriz de variable de memoria. Si la consulta pueden utilizarse en lugar de nombres cortos
selecciona 0 registros, la matriz no se creará. en la base de datos.
· CURSOR Nombre Cursor
[NOFILTER], que almacena los resultados TO FILE NombreArchivo Si incluye una
de la consulta en un cursor. Si especifica el cláusula TO pero no una cláusula INTO, podrá
nombre de una tabla abierta, Visual FoxPro dirigir el resultado de la consulta a un archivo
generará un mensaje de error. Después de de texto ASCII llamado NombreArchivo, o a la
que se ejecute SELECT, el cursor temporal impresora además de al escritorio o la ventana
permanecerá abierto y estará activo pero principal de Visual FoxPro.
solamente para lectura. Una vez que cierre
este cursor temporal, se borrará. Los cursores ADDITIVE añade la salida de la consulta
pueden existir como un archivo temporal en la al contenido existente del archivo de texto
unidad SORTWORK. especificado en TO FILE Nom-breArchivo.
Incluya NOFILTER para crear un cursor
que se pueda usar en consultas posteriores. TO PRINTER [PROMPT] Dirige la salida
En versiones anteriores de Visual FoxPro, de la consulta a una impresora. Utilice la
era necesario incluir una expresión o una cláusula PROMPT opcional para que aparezca
constante adicional como un filtro para crear un en pantalla un cuadro de diálogo antes de
cursor utilizable en consultas posteriores. Por que empiece la impresión. En este cuadro
ejemplo, la adición de un Logical verdadero de diálogo podrá modificar la configuración
como una expresión de filtro creaba una de la impresora. Los valores de la impresora
consulta utilizable en consultas posteriores: modificables dependen del controlador de
impresora instalado en este momento. Sitúe
SELECT *, .T. FROM customers INTO la palabra clave PROMPT inmediatamente
CURSOR myquery después de TO PRINTER.

Si se incluye NOFILTER es posible que TO SCREEN Dirige la salida de la consulta


disminuya el rendimiento de la consulta, puesto a la ventana principal de Visual FoxPro o a
que se creará una consulta temporal en el disco. una ventana definida por el usuario que esté
Cuando se cierre el cursor se eliminará del activa.
disco la consulta temporal.
· PREFERENCE NombrePreferencia Guarda
DBF | TABLE NombreTabla los atributos y opciones de la ventana Examinar
para uso posterior, si se envía el resultado de
[DATABASE NombreBaseDatos [NAME la consulta a una ventana Examinar.
NombreLargoTabla]] que almacena el resultado
de la consulta en una tabla. Si especifica una Emitiendo SELECT con un Nombre Preferencia
tabla que ya esté abierta y SET SAFETY está de PREFERENCE, la primera vez se crea
en OFF, Visual FoxPro sobrescribirá la tabla la preferencia. Emitiendo posteriormente
sin previo aviso. Si no ha especificado ninguna SELECT con el mismo nombre de preferencia,
extensión, Visual FoxPro dará una extensión se restaurará la ventana Examinar con el
.DBF a la tabla. La tabla permanecerá abierta mismo estado de preferencia. Cuando se
y activa después de ejecutar SELECT. cierra la ventana Examinar, se actualiza la
preferencia.
Incluya DATABASE NombreBaseDatos
para especificar una base de datos a la Si sale de una ventana Examinar presionando
que se agregará la tabla. Incluya NAME CTRL+Q+W, no se guardarán los cambios
NombreLargoTabla para especificar un nombre de la ventana Examinar en el archivo de
largo para la tabla. Los nombres largos pueden recurso.
contener un máximo de 128 caracteres y
Pag. 12
NOCONSOLE Impide que el resultado de la NombreCampo2
consulta se envíe a un archivo, a la impresora
o a la ventana principal de Visual FoxPro. NombreCampo1 es el nombre de un campo de
una tabla, NombreCampo2 es el nombre de un
PLAIN Impide que aparezcan las cabeceras de campo de otra tabla y Comparación es uno de
las columnas al mostrar la salida de la consulta. los operadores siguientes:
PLAIN puede utilizarse tanto si está presente
una cláusula TO como si no. Si se incluye una Operador Comparación
cláusula TO, se pasará por alto PLAIN. = Igual
== Exactamente igual
NOWAIT Continúa la ejecución del programa LIKE SQL LIKE
después de abrir la ventana Examinar y de <>, !=, # Distinto de
dirigir a ella los resultados de la consulta. > Mayor que
El programa no esperará a que la ventana >= Mayor o igual que
Examinar se cierre, sino que continuará < Menor que
con la ejecución de la línea de programa <= Menor o igual que
inmediatamente siguiente a la instrucción
SELECT. Cuando utiliza el operador = con cadenas,
actúa de forma distinta dependiendo del ajuste
Cuando se incluye TO SCREEN para dirigir de SET ANSI. Cuando SET ANSI está OFF,
la salida hacia la ventana principal de Visual Visual FoxPro trata las comparaciones de
FoxPro o una ventana definida por el usuario, cadenas en la forma habitual en Xbase. Cuando
la salida se detiene cuando la ventana principal SET ANSI está a ON, Visual FoxPro sigue las
de Visual FoxPro se llena con resultados de normas ANSI para comparaciones de cadenas.
la consulta. Presione una tecla para ver el Vea SET ANSI y SET EXACT para obtener
siguiente conjunto de resultados de la consulta. información adicional sobre la forma en que
Si se incluye NOWAIT, los resultados de la Visual FoxPro realiza las comparaciones de
consulta se desplazarán fuera del escritorio, cadenas.
la ventana principal de Visual FoxPro o una
ventana definida por el usuario sin esperar a La cláusula WHERE acepta el operador
que se presione una tecla. NOWAIT se pasa por ESCAPE para la CondiciónCombinación, lo
alto si se incluye con la cláusula INTO. que le permite realizar consultas significativas
sobre datos que contengan caracteres comodín
WHERE Indica a Visual FoxPro que incluya _ y % de SELECT - SQL.
únicamente ciertos registros en el resultado
de la consulta. WHERE es necesario para La cláusula ESCAPE le permite especificar que
recuperar datos de varias tablas. se traten los caracteres comodín de SELECT
- SQL como si fueran caracteres literales. En
CondiciónCombinación especifica los campos la cláusula ESCAPE se especifica un carácter,
que vinculan las tablas de la cláusula FROM. Si el cual, cuando se sitúa inmediatamente antes
incluye más de una tabla en una consulta, deberá del carácter comodín, indica que se tratará al
especificar una condición de combinación para carácter comodín como a un carácter literal.
cada tabla después de la primera. CondiciónFiltro Especifica los criterios
que deben cumplir los registros para que se
Las condiciones de combinación múltiple incluyan en el resultado de la consulta. Una
deben conectarse mediante el operador AND. consulta puede incluir tantas condiciones
Cada condición de combinación tiene la forma de filtro como se deseen, conectadas con el
siguiente: operador AND y OR. También puede utilizar
el operador NOT para invertir el valor de una
NombreCampo1 Comparación expresión lógica o utilizar EMPTY( ) para
Pag. 13
comprobar si un campo está vacío. customer.cust_id = orders.cust_id

CondiciónFiltro puede presentar una de estas Ejemplo 2


formas: En el Ejemplo 2 se muestra CondiciónFiltro en
el formulario de NombreCampo Comparación
Ejemplo 1 Expresión
En el Ejemplo 1 se muestra la CondiciónFiltro
en el formulario de NombreCampo1 payments.amount >= 1000
Comparación
NombreCampo2 Ejemplo 3
En el Ejemplo 3 se muestra CondiciónFiltro
en el formulario de NombreCampo Comparación ALL (Subconsulta)

Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición de comparación
para todos los valores generados por la subconsulta antes de que se incluya el registro en el
resultado de la consulta.

company < ALL ;


(SELECT company FROM customer WHERE country = «Reino Unido»)

Ejemplo 4
En el Ejemplo 4 se muestra CondiciónFiltro en el formulario de NombreCampo Comparación
ANY |SOME (Subconsulta)

Cuando la condición de filtro incluye ANY o SOME, el campo debe cumplir la condición de
comparación en al menos uno de los valores generados por la subconsulta.

company < ANY ;


(SELECT company FROM customer WHERE country = «Reino Unido»)

Ejemplo 5
En el Ejemplo 5 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT]
BETWEEN
Inicio_Rango AND Fin_Rango

Este ejemplo comprueba si los valores del campo están dentro de un intervalo de valores
especificado.

customer.postalcode BETWEEN 90000 AND 99999

Ejemplo 6
En el Ejemplo 6 se muestra CondiciónFiltro en el formulario de [NOT] EXISTS
(Subconsulta)

Este ejemplo comprueba si al menos una línea cumple los criterios de la subconsulta. Cuando
la condición de filtro incluye EXISTS, la condición de filtro se evalúa como verdadera (.T.) a
no ser que la subconsulta sea un conjunto vacío.
EXISTS ;
(SELECT * FROM orders WHERE customer.postalcode = orders.postalcode)

Pag. 14
Ejemplo 7
En el Ejemplo 7 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN
Conjunto_Valor

Cuando una condición de filtro incluye IN, el campo debe contener uno de los valores antes de
que el registro se incluya en los resultados de la consulta.

customer.postalcode NOT IN («98052»,»98072",»98034")

Ejemplo 8
En el Ejemplo 8 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN
(Subconsulta)

Aquí, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su
registro se incluya en los resultados de la consulta.

customer.cust_id IN ;
(SELECT orders.cust_id FROM orders WHERE orders.city=»Seattle»)

Ejemplo 9
En el Ejemplo 9 se muestra CondiciónFiltro en el formulario de NombreCampo [NOT] LIKE
cExpresión

customer.country NOT LIKE «Reino Unido»

Esta condición de filtro busca cada uno de los campos que coinciden con cExpresión.

Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpresión. El signo
de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El
subrayado representa un solo carácter desconocido en la cadena.

GROUP BY ColumnaGrupo [, ColumnaGrupo ...] Agrupa las filas de la consulta basándose en


los valores de una o más columnas. ColumnaGrupo puede ser el nombre de un campo normal
de una tabla, o un campo que incluya una función de campo SQL, o una expresión numérica
indicando la posición de la columna en la tabla resultado (la columna más a la izquierda tiene
el número 1).
HAVING CondiciónFiltro Especifica una condición de filtro que los grupos deben satisfacer
para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY.
Puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND u
OR. También puede utilizar NOT para invertir el valor de una expresión lógica.

CondiciónFiltro no puede contener una subconsulta.

Una cláusula HAVING sin una cláusula GROUP BY actúa como una cláusula WHERE.
Puede utilizar alias locales y funciones de campo en la cláusula HAVING. Utilice una cláusula
WHERE para acelerar el rendimiento si su cláusula HAVING no contiene funciones de campo.
No olvide que la cláusula HAVING debería de aparecer antes de una cláusula INTO porque,
de lo contrario, se producirá un error de sintaxis.

Pag. 15
[UNION [ALL] ComandoSELECT] Combina combinación externa le permite incluir todos
el resultado final de una SELECT con el los registros de la tabla primaria en la salida,
resultado final de otra SELECT. De forma junto con los registros coincidentes de la
predeterminada, UNION comprueba el tabla secundaria. Para crear una combinación
resultado combinado y elimina las filas
duplicadas. Puede utilizar paréntesis para
externa en Visual FoxPro, necesita utilizar
combinar múltiples cláusulas UNION. un comando SELECT anidado, como en el
siguiente ejemplo:
Utilice la palabra clave opcional ALL para
impedir que UNION elimine filas duplicadas SELECT customer.company, orders.order_
de los resultados combinados. id, orders.emp_id ;
Las cláusulas UNION siguen las reglas FROM customer, orders ;
siguientes:
· No puede utilizar UNION para combinar WHERE customer.cust_id = orders.
subconsultas. cust_id ;
· La salida de ambos SELECT debe tener el UNION ;
mismo número de columnas. SELECT customer.company, « «, «
· Cada columna de los resultados de la consulta «;
de un SELECT debe tener el mismo tipo de FROM customer ;
dato y anchura que su columna correspondiente
WHERE customer.cust_id NOT IN
en el otro SELECT.
· Únicamente el SELECT final puede tener ;
una cláusula ORDER BY, que debe referirse (SELECT orders.cust_id FROM
a las columnas de salida por su número. Si se orders)
incluye otra cláusula ORDER BY, afectará al Nota Asegúrese de incluir el espacio que
resultado completo. aparece justo delante de cada punto y coma.
De lo contrario, recibirá un error.
También puede usar la cláusula UNION para La sección del comando situada antes de la
simular una combinación externa.
cláusula UNION selecciona los registros
de ambas tablas que contienen valores
Cuando combina dos tablas en una consulta,
solamente se incluyen en la salida los registros coincidentes. Las empresas cliente que no
que tengan valores coincidentes en los campos tengan facturas asociadas no se incluyen. La
de combinación. Si un registro de la tabla sección del comando situada tras la cláusula
primaria no tiene un registro correspondiente UNION selecciona los registros de la tabla
en la tabla secundaria, el registro de la tabla customer que no
primaria no se incluye en la salida. Una tienen registros coincidentes en la tabla
orders.
En lo que respecta a la segunda sección del comando, observe lo
siguiente:
· La instrucción SELECT incluida entre paréntesis se procesa en
primer lugar. Esta instrucción da como resultado una selección de todos los
números de clientes de la tabla orders.
· La cláusula WHERE busca todos los números de cliente de la tabla
customer que no están en la tabla orders. Puesto que la primera sección del
comando proporcionó todas las empresas que tenían un número de cliente

en la tabla orders, todas las empresas de la tabla customer están incluidas en los resultados de
la consulta.
· Puesto que las estructuras de las tablas incluidas en UNION deben ser idénticas, hay
Pag. 16
dos marcadores de posición en la segunda · En un programa Visual FoxPro (como
instrucción SELECT para representar orders. cualquier otro comando de Visual FoxPro)
order_id y orders.emp_id de la primera · El Diseñador de consultas
instrucción SELECT.
Cuando emite SET TALK ON y ejecuta
Nota Los marcadores de posición deben ser del SELECT, Visual FoxPro muestra la duración
mismo tipo que los campos que representan. de la consulta y el número de registros del
Si el campo es de tipo Date, el marcador de resultado. _TALLY contiene el número de
posición deberá ser { / / }. Si el campo es de registros del resultado de la consulta.
tipo Character, el marcador de posición deberá
ser la cadena vacía («»). SELECT no respeta la condición de filtro
actual especificada con SET FILTER.
ORDER BY Elemento_Orden Ordena el
resultado de la consulta basándose en los datos Una subconsulta, a la que se hace referencia
de una o varias columnas. Cada Elemento_ en los argumentos siguientes, es un comando
Orden debe corresponder a una columna del SELECT dentro de otro SELECT y debe
resultado de la consulta, y puede ser uno de incluirse entre paréntesis. Puede tener múltiples
los siguientes: subconsultas al mismo nivel (no anidadas) en
· Un campo de una tabla FROM que la cláusula WHERE (consulte esta sección de
también es un elemento de selección en los argumentos). Las subconsultas
la cláusula principal SELECT (no en una pueden contener múltiples condiciones de
subconsulta). combinación.
· Una expresión numérica que indica la Cuando se obtiene el resultado de una consulta,
ubicación de la columna en la tabla resultante. las columnas se denominarán según las
(La columna de la izquierda es la número 1.) siguientes reglas:
· Si un elemento seleccionado es un
ASC Especifica un orden ascendente para los campo con un nombre único, el nombre de
resultados de la consulta, de acuerdo con el la columna de resultado es el nombre del
elemento o los elementos de orden, y es el valor campo.
predeterminado para ORDER BY. · Si hay más de un elemento seleccionado
con el mismo nombre, se añadirán un signo de
DESC Especifica un orden descendente para subrayado y una letra al nombre de la columna.
los resultados de la consulta. Por ejemplo, si una tabla llamada Cliente
tiene un campo llamado CALLE, y una tabla
Los resultados de la consulta aparecerán llamada Empleados también tiene un campo
desordenados si no especifica un orden con llamado CALLE, las columnas de resultado
ORDER BY. se llamarán Extensión_A y Extensión_B
(CALLE _A y CALLE _B). En el caso de
Comentarios un elemento seleccionado con un nombre
SELECT es un comando SQL que está de 10 caracteres, se truncará el nombre para
incorporado en Visual FoxPro como cualquier añadir el símbolo de subrayado y la letra. Por
otro comando de Visual FoxPro. Cuando utiliza ejemplo, DEPARTMENT se convertiría en
SELECT para componer una consulta, Visual DEPARTME_A.
FoxPro interpreta la consulta y recupera los · Si un elemento seleccionado es
datos especificados de las tablas. Puede crear una expresión, su columna de resultado se
una consulta SELECT: llamará EXP_A. Cualquier otra expresión
recibirá el nombre de EXP_B, EXP_C, y así
· En la ventana Comandos sucesivamente.
Pag. 17
· Si un elemento seleccionado contiene definidas por el usuario son aceptables en la
una función de campo como, por ejemplo, cláusula SELECT. Sin embargo, recuerde que
COUNT( ), la columna de resultado se llamará la utilización de SELECT puede ralentizar el
CNT_A. Si otro elemento seleccionado rendimiento.
contiene SUM( ), su columna de resultado se Las siguientes funciones de campo están
llamará SUM_B. Funciones definidas por el disponibles para ser utilizadas con un elemento
usuario con SELECT Aunque la utilización seleccionado que sea un campo o una expresión
de funciones definidas por el usuario en que implique a un campo:
la cláusula SELECT ofrece unas ventajas · AVG(Elemento_Selección), que
evidentes, también debería tener en cuenta realiza una media de una columna de datos
las numéricos.
siguientes limitaciones: · COUNT(Elemento_Selección), que
· Es posible que la velocidad de cuenta el número de elementos seleccionados
realización de las operaciones con SELECT en una columna. COUNT(*) cuenta el número
se vea limitada por la velocidad a la que se de filas en el resultado de la consulta.
ejecutan las funciones definidas por el usuario. · MIN(Elemento_Selección) determina
Las manipulaciones de un gran volumen que el menor valor de Elemento_Selección en una
impliquen funciones definidas por el usuario se columna.
pueden realizar mejor utilizando funciones API · MAX(Elemento_Selección) determina
y funciones definidas por el usuario escritas en el mayor valor de Elemento_Selección en una
C o en lenguaje ensamblador. columna.
· No se puede prever nada acerca de · SUM(Elemento_Selección) que
la entrada/salida de Visual FoxPro (E/S) ni proporciona el total de la suma de una columna
del entorno de la tabla en funciones definidas de datos numéricos.
por el usuario invocadas a partir de SELECT. No se pueden probar las funciones de campo.
Generalmente, no se puede saber qué área de
trabajo se ha seleccionado, ni el nombre de Combinaciones Visual FoxPro acepta sintaxis
la tabla actual, ni los nombres de los campos de combinación de 1992 SQL ANSI, lo que le
que se están procesando. El valor de dichas permite crear consultas que vinculen las filas
variables depende del lugar específico, dentro en dos o más tablas mediante la comparación
del proceso de optimización, en el que se de los valores de campos especificados. Por
invoque la función definida por el usuario. ejemplo, una combinación interna selecciona
· En funciones definidas por el usuario filas procedentes de dos tablas sólo cuando
invocadas desde SELECT, no es seguro los valores de los campos combinados son
cambiar la E/S de Visual FoxPro ni el entorno iguales. Visual FoxPro admite combinaciones
de la tabla. Por norma general, los resultados anidadas.
son impredecibles.
· La única forma segura de pasar Dado que SQL se basa en la teoría de conjuntos
valores a funciones definidas por el usuario matemática, se puede representar a cada tabla
invocadas desde SELECT es mediante la lista con un círculo. La cláusula ON que especifica
de argumentos pasada a la función cuando es las condiciones de la combinación determina
invocada. el punto de intersección, el cual representa el
· Si prueba y descubre una manipulación conjunto de filas que coinciden. En el caso de
teóricamente prohibida que funciona una combinación interna, la intersección tendrá
correctamente en una versión determinada de lugar en el interior o en una parte “interna”
FoxPro, eso no significa que también funcione de los dos círculos. Una combinación externa
en versiones posteriores. incluye tanto las filas coincidentes que se han
Salvando dichas limitaciones, las funciones encontrado en la sección de intersección interna
Pag. 18
de las tablas, como las filas de la parte externa
del círculo a la izquierda, o a la derecha, de la
intersección.

Importante Tenga presente la siguiente


información a la hora de crear condiciones de
combinación:
· Si incluye dos tablas en una consulta
y no especifica una condición de combinación,
cada registro de la primera tabla se combinará
con cada registro de la segunda tabla hasta que
surtan efecto las condiciones del filtro. Una
consulta tal puede producir unos resultados
interminables.
· S e a p r u d e n t e a l u t i l i z a r, e n
condiciones de combinación, funciones tales
como DELETED( ), EOF( ), FOUND( ),
RECCOUNT( ), y RECNO( ), que aceptan
un área de trabajo o un alias opcional. La
inclusión de un alias o de un área de trabajo
en dichas funciones puede producir resultados
inesperados. SELECT no utiliza sus áreas
de trabajo; realiza lo equivalente a USE ...
AGAIN. Las consultas de una única tabla que
utilizan estas funciones sin un área de trabajo o
un alias opcional, tendrán resultados correctos.
De todas formas, las consultas de varias tablas
que utilicen dichas funciones (incluso sin un
área de trabajo o un alias opcional) pueden
tener resultados inesperados.

· Sea prudente al combinar tablas


que contengan campos vacíos porque Visual
FoxPro concuerda campos vacíos. Por ejemplo,
si combina CUSTOMER.ZIP e INVOICE.
ZIP, y CUSTOMER contiene 100 códigos
postales vacíos e INVOICE contiene 400
códigos postales vacíos, el resultado de la
consulta contendrá 40.000 registros más, como
resultado de los campos vacíos. Use la funció
n EMPTY( ) para eliminar los registros vacíos
del resultado de la consulta.
Para obtener más información sobre
combinaciones, consulte “Definición y
modificación de condiciones de combinación”
en el capítulo 8, “Creación de vistas”, en el
Manual del programador.

Pag. 19
EL SISTEMA COMPLETO
el formulario de entrada (clave de acceso) y
Hasta el momento hemos generado las utilidades del sistema. Como paso final,
formularios, reportes y consultas, partes aprenderemos a compilar la aplicación,
básicas de un sistema de información generar un programa autoejecutable (.EXE)
automatizado. Para que ese sistema esté y los respectivos discos de instalación del
completo, agregaremos el menú principal, proyecto.
EL GENERADOR DE MENUS
DEL FOXPRO
El FoxPro tiene un generador de menús que permite crear, probar y generar el código
de un menú para agregar a nuestra aplicación. El docente explicará el manejo de este
potente generador de menús.
El menú creado en clase debe llamarse “MENUPPAL” y debe crearse en la pestaña OTROS
del administrador de proyectos en la sección Menús. Cuando modifique las opciones del

Haga clic en esta pestaña para administrar


los menús de su aplicación
Haga clic para generar un menú nuevo

Haga clic para agregar un menú existente


en las unidades de disco
Haga clic para modificar el menú
seleccionado
Haga clic para ejecutar el menú
seleccionado

menú, recuerde siempre ejecutar la opción Menú/Generar. Esta opción genera un archivo
de código con las órdenes suficientes para crear nuestro sistema de menús. El archivo de
código fuente quedará almacenado con el mismo nombre del menú y la extensión .MPR.
Este es el programa que ejecutaremos desde cualquier formulario o programa para cargar
el menú en el sistema (MENUPPAL.MPR).

Por el momento diseñaremos el siguiente menú principal:


Maestros Secretaría Utilidades
Programas
Asignaturas Hojas de vida
Matrícula Copias de soporte Profesor
Indexar Restaurar datos Grupos
Salir
Ventana de Comandos Empresas del
sistema
Usuarios del sistema
Pag. 20
Las opciones Programas, Asignaturas, Profesor, Hojas de vida, Matrícula y Grupos,
tienen respectivamente un submenú con las opciones:

Actualizar
Consultar

El entorno de trabajo del generador de reportes es bastante sencillo de manipular. Para


pasar de un submenú a otro, recuerde hacerlo haciendo clic en la lista desplegable Nivel
de Menú . Para verificar el funcionamiento del sistema de menús diseñado, haga clic en el
botón Vista Previa.
Una tecla caliente (Hot Key) se programa anteponiendo los signos \< antes de la letra
Selecciona el nivel de menú al cual se
desea mover

Insertar una opción en la posición del


cursor
Insertar una opción igual a las que
aparecen en las opciones de FoxPro; por
ejemplo Salir

Eliminar la opción en la línea del

Haga clic para ver una vista previa de su sistema de menús

que uno desea programar como la tecla caliente. Por ejemplo, \<Utilidades programa a
la combinación de teclas ALT+U como la tecla caliente para activar esta opción en el
sistema de menús.

MODO DE PROGRAMAR LA ACCIÓN EN LAS OPCIONES DEL MENÚ


Seleccione para ir a la barra de menú
principal o retroceder en las
opciones programadas

Seleccione para insertar una barra


equivalente a una de las opciones del
menú de FoxPro

Las acciones a programar dentro de las opciones de un menú son: Submenú, Comando
o Procedimiento. Si la acción a tomar es desplegar un submenú, seleccione la acción
Submenú y haga clic en el botón Crear para programar las opciones del submenú.
Si la acción a ejecutar es una orden del FoxPro, por ejemplo, ejecutar un formulario o
un programa, seleccione la acción Comando. Luego, programe la orden en la casilla
correspondiente y acorde al tipo de rutina a ejecutar.

Pag. 21
Si es un formulario, utilice el formato:
Do form formulario
Si es un programa:
Do NombrePrograma
Si la acción a tomar es ejecutar un procedimiento, seleccione Procedimiento, luego haga
clic en el botón Crear. El sistema abre un editor de comandos con el objetivo de que usted
introduzca la secuencia de órdenes que debe ejecutar el FoxPro cuando se seleccione la
opción. De esta pantalla salimos pulsando CTRL.+W.
OPCIÓN SALIR
Programe la acción de esta opción como COMANDO. Entre la orden QUIT en el área
destinada para introducir la orden de la opción.
OPCION VENTANA DE COMANDOS
Programe como acción para esta opción, Procedimiento. Introduzca como código dentro
del procedimiento la secuencia de comandos siguiente:

CLEAR EVENTS
SET SYSMENU TO DEFAULT
RETURN

EL PROGRAMA PRINCIPAL DE LA APLICACIÓN

Para que nuestra aplicación tome forma, debemos crear un programa que junte todo lo creado
hasta el momento. Ese programa deberá cargar el formulario de acceso al sistema, verificar
el usuario conectado, definir la ruta de datos dependiendo de la empresa identificada, cargar
el sistema de menús y permitir la navegación por los diversos módulos componentes del
sistema.
Cree en la pestaña código del proyecto un archivo de programa y guárdelo con el nombre
de “PPAL” en la carpeta destinada para los programas (en el caso de la guía: c:\clasefox\
prg).
El programa incluye el código que permite configurar el entorno de trabajo con el objetivo
de personalizar la ventana de ejecución de la aplicación.
El FoxPro incluye el objeto _screen para configurar las propiedades a nivel de código, de
la ventana principal. Este resulta un muy buen método para personalizar de forma simple
nuestra aplicación.
Muchos programadores utilizan formularios y vistosos botones de comandos para controlar
las opciones del sistema, en nuestro caso particular, utilizaremos el más elemental y simple
de todos: un sistema de barras de menús que ejecutan y juntan las partes componentes del
sistema.

Pag. 22
Este es el código fuente del programa PPAL.PRG:

*
* Ppal.prg
* Módulo principal del Sistema ClaseFox

set echo off


set talk off
set safety off
set color to
set clock status
set century on
set date to dmy

clear all
close all
clear
clear events
close data

mDir = sys(5) +curdir()


mIDir = sys(5) +curdir() + ‘icons\icon.ico’

set defa to &mDir


set path to &mDir

*** configurar entorno de trabajo


_screen.caption = «Clase Fox 1.0»
_screen.icon = mIDir
_screen.windowstate = 2 && maxim
_screen.picture = «»
_screen.backcolor = rgb( 192,192,192)

*** cargar módulo de entrada al sistema


set sysmenu off
do form forms\acceso

read events
close data

return

Pag. 23
LA PANTALLA DE ACCESO AL SISTEMA

La primer sesión de clases nos mostró la forma de generar un formulario de acceso al


sistema. Llegó la hora de utilizar tal formulario con el objetivo de controlar la entrada de
los usuarios a nuestra aplicación.

Ese formulario se llama “ACCESO” y debe estar almacenado en el directorio de la aplicación


destinado para los formularios (en el caso de la guía c:\clasefox\forms\).

Recuerde que nuestra aplicación hace uso de la tabla CIAS.DBF almacenada dentro de la
carpeta de nuestra aplicación (para la guía CLASEFOX). Esta tabla posee un campo destinado
para almacenar la ruta de datos llamado directorio.

Debemos agregar el siguiente código en el botón ACEPTAR (btnAceptar.Click), con el


objetivo de configurar la aplicación para que apunte al directorio de datos dependiendo de
la empresa seleccionada para trabajar.

Busque dentro del código la sección dejada en clases pasadas con el texto de:
*dejar entrar
*wait window»Puede entrar el Sistema» nowait
y reemplace por el código que se muestra en cursiva.
BtnAceptar.Click

if alltrim (usuarios.clave)=mclave
*ruta para los datos
_dircia = alltrim( cias.directorio)
_nomcia = alltrim( cias.nombre)
do menuppal.mpr
release thisform
else
wait window «Clave Incorrecta» nowait
endif
Recuerde que en sesiones pasadas, con el objetivo de verificar la ejecución de nuestros

programas, ejecutábamos la rutina PUBLIC.PRG. Ya no es necesario hacerlos, y la forma


correcta es la ejecutar el programa PPAL.PRG. Este a su vez, llama al formulario ACCESO,
y este dependiendo de los datos entrados, lleva al usuario a la pantalla principal de la
aplicación. Esta pantalla enlaza todos los módulos componentes del sistema.
A continuación se muestra la forma en que se relaciona todo el sistema. En un sistema
automatizado, el menú principal es el que integra los elementos diseñados en forma
modular. La creación de sistema de menús requiere de práctica y es el pro

Pag. 24
gramador el que debe buscar el esquema adecuado para que las partes del sistema se integren.
El programador es el que debe colocar en forma lógica los elementos del menú y hacerlo
de forma tal, que el usuario no tenga que dar tantas vueltas para acceder a opciones que
tienen de cierta forma una relación. Una buena clave para diseñar opciones de menús, es
la de agrupar procesos, donde cada proceso tomará un nombre dentro del menú principal.
Las opciones Maestro y Utilidades se constituyen por el momento como las opciones
claves iniciales.

PPAL.PRG

FORMULARIO ACCESO MENU PRINCIPAL


MENUPPAL.MPR
Empresa: 01
Usuario: 01 Maestro Secretaría
Clava de acceso: ** Programas
Asignaturas

RUTA DE DATOS Formularios


C:clasefox 01

Queda pendiente generar los formularios componentes del menú utilidades. Y por supuesto,
la generación de los discos de instalación y del respectivo programa ejecutable (.EXE).

COMPILACIÓN Y DISCOS DE DISTRIBUCIÓN


DE UNA APLICACIÓN
Una vez diseñado y programado todos los componentes de la aplicación, lo único restante
por hacer es generar el programa ejecutable de la aplicación. Un programa ejecutable ya
no requiere del código fuente para su funcionamiento. Realmente este archivo es el que
se le entrega al cliente final. Como programadores, debemos proteger el código fuente y
no permitir que otras personas manipulen el código fuente de nuestra aplicación. Si otra
persona toma nuestro código fuente, puede generar una nueva versión de nuestro proyecto
y distribuirlo a su vez con otro nombre de producto, contribuyendo con esto al delito de
robo de derechos de autor. Nuestra ética nos debe forzar a no tomar el código fuente que
otros programadores hayan dejado a nuestro alcance.
GENERANDO EL ARCHIVO EJECUTABLE DE LA APLICACIÓN

Pag. 25
El primer paso para este proceso es indicarle al FoxPro cual es el archivo principal. En
nuestro ejemplo, es el programa PPAL.PRG. Para hacer esto haga clic en la pestaña

CODIGO, seleccione el archivo


PPAL.PRG, haga clic derecho,
y del menú emergente que
aparece seleccione Establecer
Principal.
Este archivo será el utilizado
por el FoxPro para enrutar
toda la aplicación dentro del
programa ejecutable. Podemos
cambiar el programa principal
en cualquier momento que lo
deseemos.

El siguiente paso es hacer clic sobre el botón generar. Este evento activa la caja de diálogo

Opciones de Generación,
seleccione la opción
Generar ejecutable ,
marque la casilla Volver
a compilar todos los
archivos y haga clic en
le botón Aceptar.

Pag. 26
Ahora FoxPro
preguntará por el
nombre a dar al
archivo ejecutable
generado. Entre
el nombre y haga
clic en el botón
Guardar.

Ahora FoxPro

empezará a mostrar el proceso de compilación de la aplicación. Cuando encuentre errores


responderá con mensajes de error. Haga clic en el botón Ignorar de esta caja y FoxPro
continuará con el proceso de compilación. Si existieron errores durante el proceso de
compilación, FoxPro generará un archivo con el mimo nombre de la aplicación y la
extensión .ERR.
Una vez terminado el proceso, puede verificar en el disco duro que el programa ejecutable
con el nombre que usted definió, existe con la extensión .EXE. Este archivo puede ser
ejecutado en la memoria de su computador.

ANTES DE CREAR LOS DISCOS DE INSTALACIÓN DE LA APLICACIÓN

Una vez definido el archivo ejecutable en la carpeta de su aplicación, el siguiente paso es crear
los discos de instalación o distribución. Para hacer esto hagamos primero lo siguiente:
• Cree una carpeta en el directorio raíz del disco duro y denomínela con el mismo
nombre de su aplicación pero con extensión .EXE. Por ejemplo, para la
aplicación guía CLASEFOX, la nueva carpeta se llamaría CLASEFOX.EXE.
Esta carpeta se utilizará para mantener una copia de la aplicación sin el código
fuente. Si se generan los discos de instalación con todo el código fuente en la
misma carpeta de generación, se incluirían automáticamente todos los archivos
en los discos de instalación.
• Copie el programa ejecutable a la nueva carpeta (CLASEFOX.EXE)
• Copie ahora la carpeta de íconos si los hay. Para que FoxPro guarde en los
discos de instalación las imágenes utilizadas en la aplicación.
• Cree una nueva carpeta en el directorio raíz del disco duro y denomínela con el
mismo nombre de la aplicación pero con extensión .DSK. Esta carpeta será
utilizada durante el proceso de creación de los discos de instalación para
guardar los archivos resultantes.
Ahora ya estamos listos para ejecutar el proceso de creación de los discos de instalación.
Pag. 27
CREACIÓN DE LOS DISCOS DE INSTALACIÓN O DISTRIBUCIÓN

Haga clic en el menú Herramientas, y seleccione Instalación del submenu.

FoxPro muestra ahora la ventana para indicarle donde se encuentran los archivos a distribuir

Seleccione la carpeta donde reside el archivo ejecutable (CLASEFOX.EXE). Ahora haga


clic en el botón Siguiente.

Pag. 28
FoxPro muestra la ventana donde se le indican que componentes deseamos incluír en
los discos de instalación. Seleccione Runtime de Visual FoxPro. Al marcar esta casilla,
nuestra aplicación ejecutará en cualquier equipo sin necesidad de tener el Visual FoxPro
instalado. Marque las otras opciones si su aplicación hacen uso de ellas. Ahora haga clic
en el botón Siguiente.

Ahora FoxPro muestra la caja de diálogo donde se le debe indicar la carpeta donde colocará
los discos de instalación. En nuestro ejemplo, utilizaremos la carpeta CLASEFOX.DSK. El
contenido de esta carpeta es que utilizaremos para copiar a los discos de instalación. FoxPro
creará un directorio denominado como DISK144 o con otra estructura dependiendo del tipo
de discos especificados en esta pantalla. Dentro de la carpeta resultante, FoxPro creará una
carpeta con el contenido de disco por disco (dependiendo del tamaño de la aplicación).
Indique la carpeta destino (CLASEFOX.DSK). Marque la casilla 1.44 MB de 3 ½
pulgadas. Luego haga clic en el botón Siguiente.
Ahora escriba la información que aparecerá cuando el usuario ejecute el proceso de

Pag. 29
instalación. Entre el título de la aplicación en el cuadro Título del cuadro de diálogo de la
instalación. Entre la información de derechos de autor en el cuadro Información de copyright.
Seleccione ahora el programa que debe ejecutar el sistema una vez finalizada la instalación
(c:\clasefox.exe\clasefox.exe). Ahora haga clic en le botón Siguiente.
La siguiente caja de diálogo permite indicar el directorio de instalación (CLASEFOX.EXE).
Indique el grupo de programas a definir en el sistema de menús del Windows durante la
ejecución de la instalación. Seleccione la forma en que la instalación debe crear el directorio

y el grupo de programas. Ahora haga clic en el botón Siguiente.

Pag. 30
La siguiente ventana permite definir la forma en que FoxPro debe distribuir ciertos archivos
dentro del nuevo sistema instalado. Parta nuestro caso no cambiemos nada y hagamos clic
en el botón Siguiente.
FoxPro nos mostrará la pantalla de haber llegado a la meta de los parámetros de instalación.

Hagamos clic en el botón Finalizar para que FoxPro inicie el proceso de creación de los
discos de instalación.

Pag. 31
FoxPro muestra una caja de diálogo donde aparece el progreso del proceso de creación de
los discos de instalación.

Cuando haya finalizado mostrará una ventana con la información sobre el proceso generado.
Hagamos clic en el botón Listo. FoxPro regresará a la ventana de comandos a esperar una
nueva orden.

Es el momento propicio
para dar una mirada
a nuestro disco duro
y revisar que fue lo
que el proceso de
creación de instalación
definió. Miremos el
contenido de la carpeta
C:\CLASEFOX.DSK.
Para probar la eficacia del proceso de instalación, borre la carpeta
CLASEFOX.EXE y ejecute el proceso de instalación desde la carpeta
C:\CLASEFOX.DSK\DISK144\DISK1\INSTALAR.EXE. Una vez ejecutado el proceso de
instalación, verifique el funcionamiento de la aplicación. Es importante verificar la salida
de la aplicación, lo mismo que el enrutamiento correcto de los datos dentro de la estructura
de disco duro.

Pag. 32

Potrebbero piacerti anche