Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PROGRAMACION
VISUAL FOX PRO
Programa:
Alumno:
Diseño e Impresión:
Comunicamos Ideas Tel 653 6517
Ideas@telesat.com.co
Pag. 1
CONTENIDO
EL GENERADOR DE REPORTES
EL SISTEMA COMPLETO
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
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
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
close data
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-
consultas.
Para mayor información acerca de la orden SELECT-SQL, consulte el manual de comandos
y funciones
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
Nota Puede utilizar DISTINCT únicamente una vez por cláusula SELECT.
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.
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.
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.
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.
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.
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
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.
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.
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
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).
Actualizar
Consultar
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.
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
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
clear all
close all
clear
clear events
close data
read events
close data
return
Pag. 23
LA PANTALLA DE ACCESO AL SISTEMA
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.
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
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
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).
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
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
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
FoxPro muestra ahora la ventana para indicarle donde se encuentran los archivos a distribuir
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
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