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

CONTENIDO LOS REPORTES Y LAS CONSULTAS EN LAS APLICACIONES EL GENERADOR DE REPORTES EL FORMULARIO

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

LOS REPORTES Y LAS CONSULTAS EN LAS APLICACIONES

La permitan potencia hacer de las sobre aplicaciones, la información viene almacenada marcada por en la las cantidad tablas que de informes componen y consultas a un sistema que

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.

pueden incluir texto, campos, EL GENERADOR imágenes, DE REPORTES

El FoxPro incluye un generador de reportes bastante potente. Dentro de un reporte se

botón Modificar. Si lo que desea es agregar un reporte que hace falta dentro del proyecto, haga clic en Agregar y seleccione el nombre del reporte desde sus unidades de disco. Si lo que se desea es crear un nuevo formulario, haga clic en nuevo, seleccione de la pantalla de diálogo que aparece el botón Nuevo Informe. Esta acción abrirá un formulario en blanco, sobre el cual iniciaremos las actividades que definirán el nuevo reporte. Recuerde que el reporte no es funcional en este punto debido a que no existe ninguna tabla abierta en memoria. Una técnica utilizada por muchos programadores, consiste en crear una rutina que abre las tablas necesarias para la funcio-nalidad del reporte, ejecutarla antes de entrara la creación de mismo, y verificar el correcto funcionamiento del reporte en el sistema. Si no se utiliza ninguna técnica de estas, nuestro reporte solo será funcional cuando lo llamemos desde el formulario que hace uso de las tablas requeridas por el reporte.

forma en que hemos venido trabajando hasta

el momento, en ningún momento debemos

al reporte que las utiliza. Si analizamos la

Tenga presente que el FoxPro “amarra” las tablas utilizadas para sacar la información,

reportes del FoxPro.

aún más las posibilidades del generador de

y cadenas de caracteres, permiten ampliar

que conjuguen una serie de funciones, capos

la hora de diseñar reportes. Las expresiones

las funciones, se pueden ejecutar una serie de acciones que ahorrarían mucho tiempo a

Si se domina (como programador) el tema de

líneas, cuadros, campos calculados, unión de campos, funciones, etc.

permitir que tal cosa pase. Nuestra aplicación utiliza tablas ubicadas en directorios diferentes dependiendo del campo DIRECTORIO en la tabla CIAS.DBF. Como no podemos dejar que el FoxPro amarre las tablas a los reportes, iniciaremos el generador en blanco y diseñaremos el reporte teniendo a la mano los campos requeridos para el informe. Seleccione la pestaña Docs en el administrador de proyectos y seleccione los objetos formularios para que FoxPro nos muestre los reportes diseñados. Si es un reporte

a modificar, haga clic en la lista sobre el nombre del reporte, luego haga clic en el

Para este ejemplo, crearemos el reporte Programa.frt para mostrar la información de la tabla Programas. Recuerde que el reporte no funcionará desde el modo diseño, así que no intente ejecutar un vista preliminar del reporte. La barra controles de informes nos facilita el

manejo de los objetos que pueden aparecer dentro de un informes. Si no parece, haga
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
Campos de tablas
B
e r i f i q u e
l a
b a r r a
q u e
d e
h
e r r a m i e n t a s
Dibujar lÍneas
c
o n t r o l e s
d e
Dibujar rect«ngulo
Dibujar CÍrculos
Im«genes,
control OLE dependiente
Bloqueo de botÙn
seleccionado
Barra controles de informe
informe aparerzca
para poder trabajar
en el diseÔador de
informes.

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.

uno de los reportes en un futuro posterior a la impresión. Los objetos 1, 2 y

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 @!

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

 
 

S E L E C C I O N A R

E L

 
 

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

formulario, permitirle al usuario seleccionar el destino de un reporte (pantalla o impresora), recoger la selección

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

formulario, active la pestaña Otras , busque la propiedad WindowType y colóquela al valor 1-Modal. Si
formulario, active la pestaña Otras , busque la propiedad WindowType y colóquela al valor 1-Modal. Si
formulario, active la pestaña Otras , busque la propiedad WindowType y colóquela al valor 1-Modal. Si
formulario, active la pestaña Otras , busque la propiedad WindowType y colóquela al valor 1-Modal. Si

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

EVENTO UNLOAD DEL FORMUARIO (REPORTE.UNLOAD)

if _porPantalla _resultado = 1

endif

if _porImpresora _resultado = 2

retornar a la aplicación que llamó al formulario.

endif

if _btnCerrar _resultado = 0

endif

La instrucción RETURN es la encargada de devolver el parámetro a la aplicación que llame a

esta rutina. btnPantalla.Click btnImpresora.Click *botón Pantalla

return( _resultado) Este evento se ejecuta cuando se cierra _porPantalla el formulario. = .t. Observe que cada vez que el usuario hace clic en cada botón, se le asignan _btnCerrar _porImpresora valores a = unas .f. = .f. variables lógicas, indicadoras al final de sobre cual botón se hizo clic.

En esta parte del formulario, se recogen thisform.release los valores de esas variables y se asigna un valor para

*botón Impresora

_porPantalla = .f. _porImpresora = .t. _btnCerrar = .f.

thisform.release BtnCerrar.Click *botón Cerrar

_porPantalla = .f. _porImpresora = .f. _btnCerrar = .t.

thisform.release Observe que cada botón

libera al formulario y a su vez, asigna

unos valores lógicos equivalentes a los tres únicos botones en la pantalla. Existe una variable por cada botón y cuando se hace clic en cada botón, este coloca

el valor de verdadero sobre la variable equivalente al botón pulsado y coloca el valor de falso a las otras variables. En la rutina del evento Unload del formulario, se chequea el estado de esas tres variables y se asigna un nuevo valor al parámetro que se debe retornar. 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.

FORMA DE UTILIZAR EL FORMULARIO REPORTE Hasta el momento tenemos un reporte diseñado (Programas.frt), un formulario llamado Reportes momento que no se permite había utilizado, seleccionar denominado el destino btnReporte. de un reporte y un formulario, diseñado en 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
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

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. SELECT-SQL. La forma en que Esta se puede orden generar es verdaderamente consultas a las tablas potente son y muchas, permite pero programar una de instrucciones las más sencillas de consultas y que permiten en forma gran fácil. flexibilidad Por ejemplo, durante se puede la ejecución, diseñar un son formulario, las ofrecidas unos datos por la en instrucción 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

*abrir entorno utilizando las variables públicas close data mFile1 = _dircia +»programa.dbf» if !file( mFile1) do
*abrir entorno utilizando las variables públicas close data mFile1 = _dircia +»programa.dbf» if !file( mFile1) do
*abrir entorno utilizando las variables públicas close data mFile1 = _dircia +»programa.dbf» if !file( mFile1) do

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)

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-

programar tales ordenes dentro de una instrucción SELECT- SQL hacen de esta orden lo máximo para

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]

]

[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

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 a la columna. Nombre_Columna puede ser una expresión pero no puede contener caracteres (por ejemplo, espacios) que no estén permitidos para nombres de campos de tablas. FROM Enumera las tablas que contienen los datos que obtuvo la consulta. Si no hay ninguna tabla abierta, Visual FoxPro mostrará el cuadro de diálogo Abrir para permitirle especificar la ubicación del archivo. Una vez abierta, la tabla permanecerá abierta cuando la consulta se haya terminado. FORCE Especifica que las tablas se combinarán en el orden de aparición en la cláusula FROM. Si se omite FORCE, Visual FoxPro intentará optimizar la consulta. Sin embargo, es posible que la consulta se ejecute más rápido si se incluye la palabra clave FORCE para desactivar la optimización de consultas de Visual FoxPro. NombreBaseDatos! Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador de signo de exclamación (!) después del nombre de la base de datos y antes del nombre de la tabla. Alias_Local Especifica un nombre temporal para la tabla indicada en Tabla. Si especifica un alias local, debe utilizar el alias local en lugar de la tabla a través de todo el SELECT. INNER JOIN Especifica que el resultado de la consulta contenga sólo filas para una tabla con la que coincidan una o varias filas en otra tabla. LEFT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las

ARRAY NombreMatriz, que almacena los resultados de la consulta en una

filas de la tabla a la izquierda de la palabra clave JOIN y sólo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

RIGHT [OUTER] JOIN Especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y sólo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creación de una combinación externa. FULL [OUTER] JOIN Especifica que el

resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa. ON CondiciónCombinación Especifica las columnas según las cuales se combinan las tablas. INTO Destino Determina donde se almacenan los resultados de la consulta. Si incluye una cláusula INTO y una cláusula TO en la misma consulta, la cláusula TO se pasará por alto. Si no incluye la cláusula INTO, los resultados de la consulta se mostrarán en la ventana Examinar. Los resultados de la consulta pueden dirigirse también a la impresora o a un archivo mediante la cláusula TO. Destino puede ser uno de los siguientes:

·

matriz de variable de memoria. Si la consulta selecciona 0 registros, la matriz no se creará.

· CURSOR N o m b r e C u r s o r

[NOFILTER], que almacena los resultados de la consulta en un cursor. Si especifica el nombre de una tabla abierta, Visual FoxPro generará un mensaje de error. Después de que se ejecute SELECT, el cursor temporal permanecerá abierto y estará activo pero solamente para lectura. Una vez que cierre este cursor temporal, se borrará. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK. Incluya NOFILTER para crear un cursor que se pueda usar en consultas posteriores. En versiones anteriores de Visual FoxPro, era necesario incluir una expresión o una constante adicional como un filtro para crear un cursor utilizable en consultas posteriores. Por ejemplo, la adición de un Logical verdadero como una expresión de filtro creaba una consulta utilizable en consultas posteriores:

SELECT *, .T. FROM customers INTO CURSOR myquery

Si se incluye NOFILTER es posible que disminuya el rendimiento de la consulta, puesto

que se creará una consulta temporal en el disco. Cuando se cierre el cursor se eliminará del disco la consulta temporal.

·

DBF | TABLE NombreTabla

[DATABASE NombreBaseDatos [NAME NombreLargoTabla]] que almacena el resultado de la consulta en una tabla. Si especifica una tabla que ya esté abierta y SET SAFETY está en OFF, Visual FoxPro sobrescribirá la tabla sin previo aviso. Si no ha especificado ninguna extensión, Visual FoxPro dará una extensión .DBF a la tabla. La tabla permanecerá abierta y activa después de ejecutar SELECT.

Incluya DATABASE NombreBaseDatos para especificar una base de datos a la que se agregará la tabla. Incluya NAME NombreLargoTabla para especificar un nombre largo para la tabla. Los nombres largos pueden contener un máximo de 128 caracteres y

pueden utilizarse en lugar de nombres cortos en la base de datos.

TO FILE NombreArchivo Si incluye una cláusula TO pero no una cláusula INTO, podrá dirigir el resultado de la consulta a un archivo de texto ASCII llamado NombreArchivo, o a la impresora además de al escritorio o la ventana principal de Visual FoxPro.

ADDITIVE añade la salida de la consulta al contenido existente del archivo de texto especificado en TO FILE Nom-breArchivo.

TO PRINTER [PROMPT] Dirige la salida de la consulta a una impresora. Utilice la cláusula PROMPT opcional para que aparezca en pantalla un cuadro de diálogo antes de que empiece la impresión. En este cuadro de diálogo podrá modificar la configuración de la impresora. Los valores de la impresora modificables dependen del controlador de impresora instalado en este momento. Sitúe la palabra clave PROMPT inmediatamente después de TO PRINTER.

TO SCREEN Dirige la salida de la consulta

a la ventana principal de Visual FoxPro o a

una ventana definida por el usuario que esté activa.

PREFERENCE NombrePreferencia Guarda los atributos y opciones de la ventana Examinar

para uso posterior, si se envía el resultado de

la consulta a una ventana Examinar.

Emitiendo SELECT con un Nombre Preferencia de PREFERENCE, la primera vez se crea la preferencia. Emitiendo posteriormente SELECT con el mismo nombre de preferencia, se restaurará la ventana Examinar con el mismo estado de preferencia. Cuando se cierra la ventana Examinar, se actualiza la preferencia.

Si sale de una ventana Examinar presionando CTRL+Q+W, no se guardarán los cambios de la ventana Examinar en el archivo de recurso.

NOCONSOLE Impide que el resultado de la consulta se envíe a un archivo, a la impresora

NombreCampo2

o

a la ventana principal de Visual FoxPro.

PLAIN Impide que aparezcan las cabeceras de las columnas al mostrar la salida de la consulta. PLAIN puede utilizarse tanto si está presente

NombreCampo1 es el nombre de un campo de una tabla, NombreCampo2 es el nombre de un campo de otra tabla y Comparación es uno de los operadores siguientes:

una cláusula TO como si no. Si se incluye una

Operador

Comparación

cláusula TO, se pasará por alto PLAIN.

=

==

Igual

NOWAIT Continúa la ejecución del programa

Cuando se incluye TO SCREEN para dirigir

Exactamente igual LIKE SQL LIKE

después de abrir la ventana Examinar y de

<>, !=, #

Distinto de

dirigir a ella los resultados de la consulta.

>

>=

<

<=

Mayor que

Menor que

El programa no esperará a que la ventana

Mayor o igual que

Examinar se cierre, sino que continuará

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 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. Si se incluye NOWAIT, los resultados de la consulta se desplazarán fuera del escritorio,

información adicional sobre la forma en que Visual FoxPro realiza las comparaciones de cadenas.

la

ventana principal de Visual FoxPro o una

ventana definida por el usuario sin esperar a

que se presione una tecla. NOWAIT se pasa por alto si se incluye con la cláusula INTO.

WHERE Indica a Visual FoxPro que incluya únicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas.

CondiciónCombinación especifica los campos que vinculan las tablas de la cláusula FROM. Si incluye más de una tabla en una consulta, deberá especificar una condición de combinación para cada tabla después de la primera.

Las condiciones de combinación múltiple deben conectarse mediante el operador AND. Cada condición de combinación tiene la forma siguiente:

N o m b r e C a m p o 1

C o m p a r a c i ó n

La cláusula WHERE acepta el operador ESCAPE para la CondiciónCombinación, lo que le permite realizar consultas significativas sobre datos que contengan caracteres comodín _ y % de SELECT - SQL.

La cláusula ESCAPE le permite especificar que se traten los caracteres comodín de SELECT - SQL como si fueran caracteres literales. En la cláusula ESCAPE se especifica un carácter, el cual, cuando se sitúa inmediatamente antes del carácter comodín, indica que se tratará al carácter comodín como a un carácter literal. CondiciónFiltro Especifica los criterios que deben cumplir los registros para que se incluyan en el resultado de la consulta. Una consulta puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND y OR. También puede utilizar el operador NOT para invertir el valor de una expresión lógica o utilizar EMPTY( ) para

comprobar si un campo está vacío.

customer.cust_id = orders.cust_id

CondiciónFiltro puede presentar una de estas formas:

Ejemplo 2 En el Ejemplo 2 se muestra CondiciónFiltro en el formulario de NombreCampo Comparación Expresión

Ejemplo 1 En el Ejemplo 1 se muestra la CondiciónFiltro en el formulario de NombreCampo1 Comparación

NombreCampo2

En el Ejemplo 3 se muestra CondiciónFiltro en el formulario de NombreCampo Comparación ALL (Subconsulta)

payments.amount >= 1000

Ejemplo 3

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)

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

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.

] Agrupa las filas de la consulta basándose en

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.

[UNION [ALL] ComandoSELECT] Combina el resultado final de una SELECT con el resultado final de otra SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar paréntesis para combinar múltiples cláusulas UNION.

combinación externa le permite incluir todos los registros de la tabla primaria en la salida, junto con los registros coincidentes de la tabla secundaria. Para crear una combinación

externa en Visual FoxPro, necesita utilizar un comando SELECT anidado, como en el siguiente ejemplo:

Utilice la palabra clave opcional ALL para

impedir que UNION elimine filas duplicadas de los resultados combinados. Las cláusulas UNION siguen las reglas siguientes:

· No puede utilizar UNION para combinar

subconsultas.

· La salida de ambos SELECT debe tener el

mismo número de columnas.

· Cada columna de los resultados de la consulta

de un SELECT debe tener el mismo tipo de dato y anchura que su columna correspondiente en el otro SELECT. · Únicamente el SELECT final puede tener una cláusula ORDER BY, que debe referirse a las columnas de salida por su número. Si se incluye otra cláusula ORDER BY, afectará al resultado completo.

También puede usar la cláusula UNION para simular una combinación externa.

Cuando combina dos tablas en una consulta, solamente se incluyen en la salida los registros que tengan valores coincidentes en los campos de combinación. Si un registro de la tabla primaria no tiene un registro correspondiente en la tabla secundaria, el registro de la tabla primaria no se incluye en la salida. Una

SELECT customer.company, orders.order_ id, orders.emp_id ; FROM customer, orders ; WHERE customer.cust_id = orders. cust_id ; UNION ; SELECT customer.company, « «, «

« ;

FROM customer ; WHERE customer.cust_id NOT IN

;

(SELECT orders.cust_id FROM

orders) Nota Asegúrese de incluir el espacio que aparece justo delante de cada punto y coma. De lo contrario, recibirá un error.

La sección del comando situada antes de la cláusula UNION selecciona los registros de ambas tablas que contienen valores coincidentes. Las empresas cliente que no tengan facturas asociadas no se incluyen. La sección del comando situada tras la cláusula UNION selecciona los registros de la tabla customer que no 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

dos marcadores de posición en la segunda instrucción SELECT para representar orders. order_id y orders.emp_id de la primera instrucción SELECT.

Nota Los marcadores de posición deben ser del mismo tipo que los campos que representan. Si el campo es de tipo Date, el marcador de posición deberá ser { / / }. Si el campo es de tipo Character, el marcador de posición deberá ser la cadena vacía («»).

ORDER BY Elemento_Orden Ordena el resultado de la consulta basándose en los datos de una o varias columnas. Cada Elemento_ Orden debe corresponder a una columna del resultado de la consulta, y puede ser uno de los siguientes:

· Un campo de una tabla FROM que

también es un elemento de selección en la cláusula principal SELECT (no en una subconsulta).

· Una expresión numérica que indica la

ubicación de la columna en la tabla resultante. (La columna de la izquierda es la número 1.)

ASC Especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY.

DESC Especifica un orden descendente para los resultados de la consulta.

Los resultados de la consulta aparecerán desordenados si no especifica un orden con ORDER BY.

Comentarios SELECT es un comando SQL que está incorporado en Visual FoxPro como cualquier otro comando de Visual FoxPro. Cuando utiliza SELECT para componer una consulta, Visual FoxPro interpreta la consulta y recupera los datos especificados de las tablas. Puede crear una consulta SELECT:

· En la ventana Comandos

· En un programa Visual FoxPro (como

cualquier otro comando de Visual FoxPro)

· El Diseñador de consultas

Cuando emite SET TALK ON y ejecuta

SELECT, Visual FoxPro muestra la duración de la consulta y el número de registros del

resultado.

registros del resultado de la consulta.

_TALLY contiene el número de

SELECT no respeta la condición de filtro actual especificada con SET FILTER.

Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando

SELECT dentro de otro SELECT y debe incluirse entre paréntesis. Puede tener múltiples subconsultas al mismo nivel (no anidadas) en la cláusula WHERE (consulte esta sección de los argumentos). Las subconsultas pueden contener múltiples condiciones de combinación. Cuando se obtiene el resultado de una consulta, las columnas se denominarán según las siguientes reglas:

· Si un elemento seleccionado es un

campo con un nombre único, el nombre de la columna de resultado es el nombre del campo.

· Si hay más de un elemento seleccionado

con el mismo nombre, se añadirán un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Cliente tiene un campo llamado CALLE, y una tabla llamada Empleados también tiene un campo llamado CALLE, las columnas de resultado se llamarán Extensión_A y Extensión_B (CALLE _A y CALLE _B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncará el nombre para

añadir el símbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertiría en DEPARTME_A.

· Si un elemento seleccionado es

una expresión, su columna de resultado se llamará EXP_A. Cualquier otra expresión recibirá el nombre de EXP_B, EXP_C, y así sucesivamente.

· Si un elemento seleccionado contiene

una función de campo como, por ejemplo,

COUNT( ), la columna de resultado se llamará CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamará SUM_B. Funciones definidas por el usuario con SELECT Aunque la utilización de funciones definidas por el usuario en la cláusula SELECT ofrece unas ventajas evidentes, también debería tener en cuenta las siguientes limitaciones:

· Es posible que la velocidad de

realización de las operaciones con SELECT se vea limitada por la velocidad a la que se

ejecutan las funciones definidas por el usuario. Las manipulaciones de un gran volumen que impliquen funciones definidas por el usuario se pueden realizar mejor utilizando funciones API y funciones definidas por el usuario escritas en

C o en lenguaje ensamblador.

· No se puede prever nada acerca de

la entrada/salida de Visual FoxPro (E/S) ni

del entorno de la tabla en funciones definidas por el usuario invocadas a partir de SELECT. Generalmente, no se puede saber qué área de trabajo se ha seleccionado, ni el nombre de

la tabla actual, ni los nombres de los campos

que se están procesando. El valor de dichas

variables depende del lugar específico, dentro del proceso de optimización, en el que se invoque la función definida por el usuario.

· En funciones definidas por el usuario

invocadas desde SELECT, no es seguro cambiar la E/S de Visual FoxPro ni el entorno

de la tabla. Por norma general, los resultados son impredecibles.

· La única forma segura de pasar

valores a funciones definidas por el usuario

invocadas desde SELECT es mediante la lista de argumentos pasada a la función cuando es invocada.

· Si prueba y descubre una manipulación

teóricamente prohibida que funciona correctamente en una versión determinada de FoxPro, eso no significa que también funcione en versiones posteriores. Salvando dichas limitaciones, las funciones

definidas por el usuario son aceptables en la cláusula SELECT. Sin embargo, recuerde que la utilización de SELECT puede ralentizar el rendimiento. Las siguientes funciones de campo están

disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresión que implique a un campo:

· AVG(Elemento_Selección), que

realiza una media de una columna de datos numéricos.

· COUNT(Elemento_Selección), que

cuenta el número de elementos seleccionados en una columna. COUNT(*) cuenta el número de filas en el resultado de la consulta.

· MIN(Elemento_Selección) determina

el menor valor de Elemento_Selección en una columna.

· MAX(Elemento_Selección) determina

el mayor valor de Elemento_Selección en una columna.

· SUM(Elemento_Selección) que

proporciona el total de la suma de una columna

de datos numéricos. No se pueden probar las funciones de campo.

Combinaciones Visual FoxPro acepta sintaxis de combinación de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o más tablas mediante la comparación de los valores de campos especificados. Por ejemplo, una combinación interna selecciona filas procedentes de dos tablas sólo cuando los valores de los campos combinados son iguales. Visual FoxPro admite combinaciones anidadas.

Dado que SQL se basa en la teoría de conjuntos matemática, se puede representar a cada tabla con un círculo. La cláusula ON que especifica las condiciones de la combinación determina el punto de intersección, el cual representa el conjunto de filas que coinciden. En el caso de una combinación interna, la intersección tendrá lugar en el interior o en una parte “interna” de los dos círculos. Una combinación externa incluye tanto las filas coincidentes que se han encontrado en la sección de intersección interna

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.

· Sea prudente al utilizar, en

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.

EL SISTEMA COMPLETO

Hasta el momento hemos generado formularios, reportes y consultas, partes básicas de un sistema de información automatizado. Para que ese sistema esté completo, agregaremos el menú principal,

el formulario de entrada (clave de acceso) y

las utilidades del sistema. Como paso final, aprenderemos a compilar la aplicación,

generar un programa autoejecutable (.EXE)

y los respectivos discos de instalación del proyecto.

DEL FOXPRO EL GENERADOR DE MENUS

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

en la sección Menús . Cuando modifique las opciones del Haga clic en esta pestaña para

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 Restaurar datos

Profesor

Indexar

Grupos

 

Salir

Ventana de Comandos

Empresas del

sistema Usuarios del sistema

 

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

se programa anteponiendo los signos \< antes de la letra Selecciona el nivel de menú al

Selecciona el nivel de menú al cual se

desea moverantes de la letra Selecciona el nivel de menú al cual se Insertar una opción en

Insertar una opción en la posición del

cursorcual se desea mover Insertar una opción en la posición del Insertar una opción igual a

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

que aparecen en las opciones de FoxPro; por ejemplo Salir Eliminar la opción en la línea

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Ú

MODO DE PROGRAMAR LA ACCIÓN EN LAS OPCIONES DEL MENÚ Seleccione para ir a la barra

Seleccione para ir a la barra de menú

principal o retroceder en las opciones programadasOPCIONES DEL MENÚ Seleccione para ir a la barra de menú Seleccione para insertar una barra

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.

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.

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

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

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 Clava de acceso: ** Maestro
PPAL.PRG
FORMULARIO ACCESO
MENU PRINCIPAL
MENUPPAL.MPR
Empresa: 01
Usuario: 01
Clava de acceso: **
Maestro Secretaría
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

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

PPAL.PRG . Para hacer esto haga clic en la pestaña CODIGO , seleccione el archivo PPAL.PRG,

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.

Generar ejecutable , marque la casilla Volver a compilar todos los archivos y haga clic en
Ahora FoxPro preguntará por el nombre a dar al archivo ejecutable generado. Entre el nombre

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

para indicarle donde se encuentran los archivos a distribuir Seleccione la carpeta donde reside el archivo

Seleccione la carpeta donde reside el archivo ejecutable (CLASEFOX.EXE). Ahora haga clic en el botón Siguiente.

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.

uso de ellas. Ahora haga clic en el botón Siguiente . Ahora FoxPro muestra la caja

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

en el botón Siguiente . Ahora escriba la información que aparecerá cuando el usuario ejecute el

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

la forma en que la instalación debe crear el directorio y el grupo de programas. Ahora

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

en que la instalación debe crear el directorio y el grupo de programas. Ahora haga clic

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.

haber llegado a la meta de los parámetros de instalación. Hagamos clic en el botón Finalizar

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

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

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

del proceso de creación de los discos de instalación. Cuando haya finalizado mostrará una ventana con

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.

a la ventana de comandos a esperar una nueva orden. Es el momento propicio para dar

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.