Академический Документы
Профессиональный Документы
Культура Документы
Despus de crear datos y una interfaz para su aplicacin, puede aumentar su eficacia con consultas e
informes que proporcionen informacin importante para sus usuarios .
Cree sus aplicaciones paso a paso y compruebe cada componente. Cuando haya incluido todos los
componentes, ser fcil compilarlos en una aplicacin.
Cuando programe una aplicacin, necesitar comprobar si existen errores en los componentes. Visual
FoxPro ofrece herramientas de depuracin para ayudarle a buscar y corregir cualquier error que
descubra en sus aplicaciones.
Cuando disponga de una aplicacin estable y en funcionamiento, considere las formas en que puede
optimizar su rendimiento y convertirla en ms pequea y rpida.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 2 de 87
Cuando utiliza una consulta o una vista en su aplicacin, en realidad utiliza una instruccin
SELECT - SQL. Este captulo describe cmo puede utilizar en su aplicacin una instruccin
SELECT - SQL si la crea mediante una consulta definida en el Diseador de consultas, una vista
definida en el Diseador de vistas o cdigo introducido para un evento o procedimiento. Para obtener
informacin detallada sobre las vistas, vea la parte 2, Buscar informacin, del Manual del usuario.
l Agregar consultas
l Agregar informes y etiquetas
l Integrar consultas e informes
Agregar consultas
Cuando agrega consultas a su aplicacin, puede combinar varios orgenes de datos, filtrar registros,
manipular datos y ordenar los resultados, todo ello con la instruccin SELECT - SQL. Al utilizar
instrucciones SQL, dispone de un control completo sobre los resultados obtenidos en sus consultas y
sobre dnde se almacenan estos resultados.
Puede agregar instrucciones SELECT - SQL a procedimientos o cdigo de eventos. Para ver ms
informacin acerca de los eventos, consulte el captulo 4, Descripcin del modelo de eventos.
O bien
Por ejemplo, puede seleccionar todos los registros de la tabla Customer de la base de datos TasTrade
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 3 de 87
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad"
Si slo necesita un cierto nmero o porcentaje de registros del conjunto de resultados que su consulta
devolvera, puede usar la propiedad Registros incluidos de la ficha Varios de los Diseadores de
consultas o de vistas o puede agregar una clusula TOP a su instruccin SELECT - SQL. El nmero
que proporcione en una clusula TOP puede variar entre 1 y 32767. Para un porcentaje, puede usar un
valor entre 0.001 y 99.99.
Por ejemplo, si quiere seleccionar los diez clientes principales con las cantidades de pedidos ms
altas, puede especificar un GROUP BY en CUST_ID para mostrar un registro agregado para cada
cliente y ordenar por ORDER_AMT en la clusula ORDER BY. Para obtener un TOP 10 verdadero,
debe especificar una ordenacin descendente en ORDER_AMT de forma que los registros con las
cantidades de pedidos ms altas aparezcan en primer lugar en el resultado. Si usa un orden
ascendente, los registros de resultados se ordenan desde la menor cantidad de pedidos a la mayor. Los
registros incluidos que seleccione del conjunto de resultados tendran en realidad los valores ms
bajos.
SELECT TOP 10 *;
FROM testdata!customer INNER JOIN testdata!orders ;
ON Customer.cust_id = Orders.cust_id;
GROUP BY Customer.cust_id;
ORDER BY Orders.order_amt DESC
Al utilizar clusulas de la instruccin SELECT - SQL, puede especificar varios destinos para
almacenar el resultado de sus consultas.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 4 de 87
Una vez que los resultados estn almacenados, puede utilizar comandos para controlar cmo se
integran los resultados almacenados para su presentacin o impresin.
Puede almacenar los resultados de sus consultas en una tabla, una matriz o un cursor para otros usos,
tales como completar formularios e imprimir informes y etiquetas. Si desea almacenar los resultados
slo temporalmente, envelos a una matriz o a un cursor. Si lo que desea es almacenar los resultados
definitivamente, envelos a una tabla.
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad" ;
INTO TABLE mitabla
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad" ;
INTO ARRAY aMiMatriz
Este ejemplo muestra una clusula INTO para un cursor llamado micursor.
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad" ;
INTO CURSOR micursor
Si crea una tabla o una matriz, puede utilizarla como cualquier otra tabla o matriz en Visual FoxPro.
Si crea un cursor, puede examinar o anexar su contenido. El cursor se abre en el menor rea de
trabajo disponible. Puede tener acceso al mismo con el nombre que le ha dado en la instruccin
SELECT - SQL.
Los dos procedimientos siguientes describen dos formas comunes para incluir en una aplicacin los
resultados de consultas almacenados en tablas y cursores.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 5 de 87
Si desea mostrar los resultados de sus consultas en un formulario, puede utilizar una tabla, una matriz
o un cursor para colocarlos en una cuadrcula, un cuadro de lista o un cuadro combinado.
Para rellenar un control cuadro de lista o cuadro combinado con una tabla o cursor
3. En la propiedad RowSource del control, escriba una instruccin SELECT - SQL que incluya
una clusula INTO TABLE o INTO CURSOR.
1. En el Diseador de formularios, modifique el formulario que tiene el control que desea llenar.
2. En el evento Load del formulario, escriba una instruccin SELECT - SQL que incluya una
clusula INTO TABLE o INTO CURSOR.
Si su informe o etiqueta incluye grupos, o si necesita ordenar los datos de alguna otra manera, puede
utilizar las distintas clusulas de la instruccin SELECT - SQL para obtener el resultado exacto que
necesita.
El ejemplo siguiente utiliza las clusulas GROUP BY y ORDER BY, as como el comando
REPORT FORM:
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad" ;
GROUP BY customer.region ;
ORDER BY customer.postal_code, customer.company_name ;
INTO CURSOR MiCursor
REPORT FORM MYREPORT.FRX
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 6 de 87
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canad" ;
GROUP BY customer.region ;
ORDER BY customer.postal_code, customer.company_name ;
INTO CURSOR micursor
LABEL FORM MYLABEL.LBX
Aunque la instruccin SELECT - SQL es el mtodo ms flexible para rellenar sus informes o
etiquetas, no es el nico mtodo. Para obtener ms informacin acerca de cmo establecer orgenes
de datos para informes, consulte la seccin Controlar los orgenes de datos de un informe, ms
adelante en este mismo captulo. Para ver ms informacin acerca de la integracin de los destinos de
informes en sus aplicaciones, consulte la seccin Integrar consultas e informes, ms adelante en este
mismo captulo.
Si desea mostrar el resultado de su instruccin SELECT - SQL, puede enviarlo a una ventana. La
ventana Examinar es el destino predeterminado para los resultados de las consultas y no necesita
incluir una clusula de destino. Puede enviar tambin el resultado a la ventana principal de Visual
FoxPro o a otra ventana activa.
l Defina una ventana, mustrela para activarla y, a continuacin, ejecute una consulta SQL u otro
comando que muestre resultados en una ventana.
Este programa de ejemplo muestra la definicin para una ventana temporal titulada Principales
clientes, que muestra los nombres de las compaas con una facturacin anual superior a los $50.000.
Cdigo Comentario
frmMyForm=createobj("form") Crea e inicia un objeto ventana
frmMyForm.Left = 1
frmMyForm.Top = 1 temporal.
frmMyForm.Width = 130
frmMyForm.Height = 25
frmMyForm.Caption = "Principales clientes"
frmMyForm.Show
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 7 de 87
tastrade!orders ;
WHERE customer.customer_id =
orders.customer_id ;
GROUP BY customer.company_name ;
HAVING SUM(orders.freight) > 5000 ;
ORDER BY 2 DESC
Para controlar los orgenes de datos de un informe puede definir un entorno de datos que se
almacenan con el informe o bien puede, mediante cdigo, activar orgenes de datos especficos cada
vez que ejecute un informe. Para ver ms informacin acerca del uso del Diseador de entornos de
datos, consulte el captulo 9, Crear formularios.
Para Agregue
Utilizar siempre los mismos orgenes Tablas o tiles al entorno de datos del informe.
de datos.
DO consulta o SELECT - SQL al cdigo de evento Init del
entorno de datos del informe.
Utilizar conjuntos diferentes de USE tabla, USE vista, DO consulta o SELECT - SQL para
orgenes de datos. el evento Click u otro cdigo que preceda a un comando
REPORT o LABEL.
Si utiliza una tabla como origen de datos, los registros se procesarn e imprimirn en el orden en que
aparecen en la tabla. Utilice alias slo si no piensa usar el informe con ningn otro origen de datos
que no sea la propia tabla. Si utiliza una vista o una consulta como origen de datos y los alias estn
incluidos en los controles del informe, ste podra mostrar de forma repetida el mismo registro en la
pgina.
Puede usar los orgenes de datos usados por el informe para controlar el orden en que se imprimen los
registros en su informe. Los registros se imprimen en el orden en que aparecen en la tabla, vista o
consulta. Para ordenar los registros de una tabla, puede establecer un ndice en el cdigo o como parte
del entorno de datos de un informe. Para una consulta, vista o cdigo SELECT - SQL, puede usar la
clusula ORDER BY. Si no ordena los registros mediante los orgenes de datos, la nica forma de
usar nicamente el informe para ordenar los registros es a travs de la propiedad ORDER de un
cursor del entorno de datos.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 8 de 87
Adems del orden en que los registros aparecen en el informe, puede seleccionar qu registros se
imprimen con el origen de datos, las opciones de impresin de informes o una combinacin de ambas
cosas.
Para evitar que la sesin de datos de su informe se vea afectada por la sesin de datos global como
resultado de las modificaciones realizadas por otros diseadores, puede establecer la sesin de datos
del informe como privada.
Para obtener ms informacin sobre el uso del Diseador de entornos de datos, consulte el captulo 9,
Crear formularios. Para obtener ms informacin acerca de las sesiones de datos, consulte el captulo
17, Programar para acceso compartido.
Si desea mostrar el resultado de una consulta en un grfico, puede usar el Asistente para grficos, el
Diseador de consultas o un comando SELECT - SQL. Para usar el Diseador de consultas o un
comando SELECT - SQL, siga los pasos que se indican a continuacin. Debe incluir por lo menos un
campo numrico en el conjunto de resultados para crear un grfico. Despus de terminar la consulta,
puede elegir entre seis tipos de grficos, cada uno con dos variantes.
3. Haga doble clic en el grfico para abrir Microsoft Graph y mostrar la barra de herramientas de
Microsoft Graph.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 9 de 87
Puede refinar el diseo de las pginas de su informe; para ello, defina mltiples columnas y cambie el
rea de pgina reservada para una banda cambiando el alto de cada banda.
Para crear listas de telfonos, etiquetas postales u otros tipos de listas, puede definir varias columnas
por pgina.
4. En el cuadro Espacio, escriba un valor para el espacio que desea que aparezca entre cada
columna.
Sugerencia Si imprime grupos que empiecen en una nueva pgina, no use la opcin Orden al
imprimir.
5. Elija Aceptar.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 10 de 87
Si el diseo ya contiene controles de informe en la banda Detalle, es posible que tenga que moverlos
o cambiar su tamao para que se ajusten a los lmites de la nueva columna.
Al disear el informe, puede cambiar el alto de una banda de informe. El alto de una banda de
informe determina la cantidad de espacio que cada banda de informe usa en la pgina dentro de los
mrgenes de pgina. Por ejemplo, si la banda Ttulo se establece a media pulgada (1,27 cm), el Ttulo
aparecer en la primera media pulgada de espacio despus del margen superior. La banda de detalle
muestra la cantidad de espacio asignada para cada registro impreso. La siguiente informacin se
aplica a todas las bandas del informe. Puede establecer parmetros adicionales para las bandas
Encabezado de grupo y Pie. Para obtener informacin sobre las Bandas de grupo, consulte la seccin
"Agrupar datos en el diseo" en el captulo 7, Diseo de informes y etiquetas, ms adelante en este
captulo.
3. Elija Aceptar.
Puede incluir controles de campo en su informe o etiqueta para mostrar valores de varias expresiones,
incluyendo campos de tablas y vistas, variables y clculos. Las siguientes secciones describen algunas
expresiones y funciones usadas normalmente como campos mltiples, fechas o nmeros de pgina.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 11 de 87
2. En el cuadro de dilogo Expresin de informe, elija el botn del cuadro de dilogo situado
despus del cuadro Expresin.
3. En el cuadro Campos, haga doble clic en el nombre del campo que desee.
El nombre de tabla y el nombre de campo aparecen en el cuadro Expresin para campo del
informe.
Nota Si el cuadro Campos est vaco, agregue una tabla o vista al entorno de datos.
No tiene que guardar el alias del nombre de tabla en la expresin. Puede eliminarlo o borrar las
opciones del Generador de expresiones.
4. Elija Aceptar.
Despus de agregar los campos de tabla, se dar cuenta de que no se imprimen de la forma deseada
en la pgina. Por ejemplo, al imprimir los controles de campo para Ciudad, Regin y Cdigo postal
de forma independiente aparecen espacios no deseados entre cada valor. Puede recortar o concatenar
los campos de tabla en una expresin de campo. El espacio requerido por cada valor para este control
variar. Puede establecer que el control se ajuste para cada valor.
Sugerencia Ajuste el tamao del campo a la menor cantidad de espacio requerido por la
expresin. Si se necesita ms espacio, puede establecer el control para que se alargue para
valores grandes, pero no puede reducirlo si necesita ms espacio.
4. Haga doble clic en el nombre del primer campo que desea que aparezca en el control.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 12 de 87
5. Escriba un signo ms despus del nombre de campo, seleccione un signo ms despus del
nombre de campo o seleccione + en el cuadro de funciones Cadena.
6. Escriba o seleccione Texto en la lista Funciones de cadena y, a continuacin, escriba una coma.
7. Repita los pasos 3 y 4 para agregar campos adicionales que completen la expresin y escriba
Aceptar.
Cuando el control est lleno, el espacio asignado al control se ajusta hacia abajo para alojar el
valor de la expresin. Para obtener ms informacin sobre Ajustar al contenido del texto,
consulte Imprimir controles con valores de longitud variable, ms adelante en este mismo
captulo.
Para combinar varios campos en una expresin, coloque una funcin ALLTRIM( ) antes de cada
nombre de campo, coloque la puntuacin entre comillas y coloque un signo menos entre cada
elemento de la expresin. Si las longitudes de valores de campo no varan, como cdigos postales o
abreviaturas, puede insertar slo el nombre de campo, como en este ejemplo:
Observe que se utilizan espacios entre comillas, en lugar de una coma, para separar la regin y el
cdigo postal.
Si usa estos mtodos, asegrese de que el campo tiene establecido Ajustar al contenido del texto. Para
obtener ms informacin, consulte Imprimir controles con valores de longitud variable ms adelante
en este mismo captulo.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 13 de 87
4. Elija Aceptar.
Las bandas Encabezado de pgina o Pie de pgina contienen normalmente un nmero de pgina. Si
usa un asistente o Informe rpido, se inserta un nmero de pgina en la banda Pie de pgina.
4. Elija Aceptar.
Sugerencia Puede usar este procedimiento para insertar cualquiera de las variables de sistema
de la lista Variables en el informe.
Para manipular datos y mostrar el resultado de los clculos en un informe, puede utilizar variables de
informe. Puede calcular valores con variables de informe y usarlos despus para calcular valores
posteriores.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 14 de 87
6. Si es necesario, en el cuadro Valor inicial, escriba una expresin que establezca el valor
inicial.
7. Elija Aceptar.
Para contar todas las entradas Canad en la tabla Company, utilice esta expresin y seleccione
"Recuento" como opcin de clculo.
IIF(country="Canad",1,0)
El siguiente ejemplo muestra tres variables para una hoja de tiempos sencilla:
Para almacenar este valor Cree esta variable Mediante esta expresin
Hora de llegada del tArrive hour_in + (min_in / 60)
empleado
Hora de salida del empleado tLeave hour_out + (min_out / 60)
Puede utilizar la variable tDayTotal en una gran variedad de clculos, tales como el nmero de horas
trabajadas en una semana, un mes, o un ao; el promedio de nmero de horas trabajadas cada da, etc.
Para ver ejemplos de variables de informe, vea los informes Percent.frx e Invoice.frx en el directorio
...\Samples\Vfp98\Solution\Reports de Visual Studio.
Las variables de informe se evalan en el orden en que aparecen en la lista y pueden afectar a los
valores de las expresiones que las utilizan. Por ejemplo, si la variable 1 se utiliza para definir el valor
de la variable 2, debe aparecer antes que la variable 2. En el ejemplo anterior de la hoja de tiempos,
tArrive y tLeave deben preceder a tDayTotal.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 15 de 87
3. Elija Aceptar.
Si utiliza una variable en clculos, asegrese de que inicializa dicha variable con un valor diferente de
cero para no producir un error de divisin por cero. Si no especifica un valor, Visual FoxPro asignar
un valor predeterminado.
4. Elija Aceptar.
Si reordena los grupos en su informe, sus variables de informe podran no restablecerse en el campo
correcto. Por ejemplo, si su informe contiene dos grupos, el primero agrupado por pas y el segundo
agrupado por fecha, y cambia el orden de los grupos, las variables continuarn ajustadas de acuerdo a
las posiciones originales de los grupos.
Para restablecer una variable al final de un informe, una pgina o una columna
3. Elija Aceptar.
3. En el rea Ejecutar expresin del cuadro de dilogo de la banda, elija uno de los botones al
final del cuadro Al entrar o Al salir.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 16 de 87
4. Escriba una expresin para restablecer la variable cada vez que se entre o se salga de esa banda.
Despus de insertar un control de campo, puede cambiar el tipo de datos del control y el formato de
impresin. Los tipos de datos pueden ser Character, Numeric o Date. Cada uno de estos tipos de
datos tiene sus propias opciones de formato, incluyendo la opcin de crear su propia plantilla de
formato. El formato determina cmo se muestra el campo cuando se imprime el informe o la etiqueta.
Puede escribir funciones de formato directamente en el cuadro Expresiones del cuadro de dilogo
Expresin de informe o seleccionar opciones en el cuadro de dilogo Formato.
Normalmente, puede convertir toda la salida alfabtica a maysculas, insertar comas o comas
decimales en salidas numricas, mostrar salidas numricas en formato de moneda o convertir un
formato de fecha en otro.
Para controles de campo, puede establecer varias opciones de formato para cada tipo de datos.
2. En el cuadro de dilogo Expresin de informe, elija el botn de dilogo situado junto al cuadro
Formato.
El rea Opciones de edicin muestra las opciones de formato disponibles para ese tipo de
datos.
Nota Este tipo de datos slo se aplica al control del informe. Refleja el tipo de datos de la
expresin y no cambia el tipo de datos del campo en la tabla.
El cuadro de dilogo Formato muestra opciones diferentes en funcin del tipo de datos que elija.
Tambin puede crear una plantilla de formato si escribe caracteres en el cuadro Formato.
Puede alinear el contenido de campos en controles de dos formas. Esta configuracin no cambia la
posicin del control del informe, slo el contenido en el espacio del control.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 17 de 87
2. En el cuadro de dilogo Expresin de informe, elija el botn de dilogo situado junto al cuadro
Formato.
Una plantilla de formato le permite personalizar el formato del campo. Si escribe una combinacin de
caracteres y cdigos en el cuadro Formato del cuadro de dilogo Expresin de informe o el cuadro de
dilogo Formato, puede crear una amplia variedad de formatos de impresin. Los caracteres que
escriba aparecen como texto junto con el valor del campo. Los cdigos que escriba determinan la
apariencia de la salida de campos. Por ejemplo, si usa la siguiente plantilla de formato para un campo
numrico de 10 dgitos, los caracteres (parntesis, espacios y guiones) se imprimen junto con los
datos numricos.
Cambio de fuentes
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 18 de 87
Puede cambiar el tamao de fuente y el tamao del texto para cada control campo o etiqueta, o puede
cambiar la fuente predeterminada para el informe.
1. Seleccione el control.
Slo los controles insertados despus de haber cambiado la fuente predeterminada reflejarn la
nueva configuracin de fuente. Para cambiar objetos existentes, seleccinelos a todos y cambie
la fuente con la opcin Fuente en el men Formato.
Es posible que la imagen o el objeto OLE que haya insertado no se ajuste al marco dibujado al crear
el control. De forma predeterminada, la imagen o el objeto conservan su tamao original. Puede
recortarlo o reducirlo para que se ajuste a su marco.
Si la imagen u objeto OLE es mayor que el marco creado en el Diseador de informes, slo aparecer
en el marco una porcin de la imagen o el objeto. La imagen o el objeto estn acoplados a la parte
superior izquierda del marco. No puede ver la parte inferior derecha que se extiende ms all del
marco.
Aparece la imagen completa, que llenar la mayor parte del marco y conservar las posiciones
relativas. Esto protege a la imagen de la distorsin vertical u horizontal.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 19 de 87
La imagen cambia para llenar el marco que ha cambiado de tamao. Si es necesario, la imagen se
ampla verticalmente u horizontalmente para ajustarse al marco.
Para ver un ejemplo de un informe con imgenes, vea el informe Wrapping.frx en el directorio ...
\Samples\Vfp98\Solution de Visual Studio.
Los objetos OLE incluidos en un campo General pueden variar en forma y tamao. Si el objeto de un
campo General es ms pequeo que el marco, aparece en la esquina superior izquierda del marco.
Puede centrarlo para asegurar que todos los objetos ms pequeos que el marco estn centrados en el
marco del informe o de la etiqueta. Las imgenes de archivo no estn centradas porque no varan.
Los objetos OLE impresos se centran en el rea en una vista previa del informe o al imprimirlo.
2. En la barra de herramientas Paleta de colores, elija Color de primer plano o Color de fondo.
Puede usar la opcin Guardar como HTML del men Archivo cuando cree un informe para guardar
el contenido de un formulario como un archivo HTML (Lenguaje de marcado de hipertexto).
1. Abra el informe.
2. Elija Guardar como HTML en el men Archivo. (Se le pedir que guarde el informe si lo ha
modificado).
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 20 de 87
El diseo general y la posicin de bandas de los controles determinan el momento y el lugar en que se
imprimen. Tambin puede establecer opciones de impresin especficas para cada control. Cada
control puede tener un tamao predeterminado en base a su valor (campos y tablas) o el tamao
creado (lneas, rectngulos e imgenes). La longitud del control en el diseo define el ancho de
presentacin del control. Como el valor de algunos valores vara de registro a registro, puede
establecer el alto del control para alargar hacia abajo y mostrar as el valor completo. Si no establece
que se ample, el valor se truncar en el ancho de presentacin. No puede cambiar el tamao de
controles Etiqueta, pero puede cambiar el tamao de los dems controles.
Si quiere que un control slo use el espacio necesario, puede establecer que se alargue. Por ejemplo,
los valores de una expresin pueden variar de registro a registro. En lugar de asignar una cantidad fija
de espacio en el informe que aloje el valor ms largo, puede establecer que el control se alargue hacia
abajo para mostrar todo el valor. Puede establecer que los controles situados por debajo del control
que se ampla floten por debajo de la pgina con respecto al control que se ajusta.
La opcin de alargar est disponible para campos, lneas verticales, rectngulos y rectngulos
redondeados.
Para ver un ejemplo de controles que se amplan y flotan, vea el informe Wrapping.frx en el
directorio ...\Samples\Vfp98\Solution de Visual Studio.
Hay que establecer que los controles que se colocan con respecto a controles que se amplan floten, o
se sobrescribirn.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 21 de 87
Precaucin Algunos de los datos no se han podido sobrescribir durante la impresin si: (1)
coloca un campo respecto al fondo de la banda e incluye por debajo de este campo otro campo
que est colocado respecto a la parte superior de la banda y se puede alargar; o (2) coloca un
campo respecto a la parte superior de la banda e incluye por encima de este campo otro campo
colocado respecto a la parte superior de la banda y que se puede alargar.
Tambin puede establecer que se alarguen lneas, rectngulos y rectngulos redondeados. Se pueden
alargar con respecto a la banda o, si forman parte de un grupo de controles, se pueden alargar con
respecto al control ms grande del grupo.
3. En el rea Alargar hacia abajo, seleccione Alargar con relacin al objeto ms alto del
grupo.
4. Elija Aceptar.
Los controladores de seleccin aparecen en las esquinas del rectngulo. A partir de este
momento puede tratar todos los controles como uno slo. El rectngulo se alargar con el
campo de tamao ajustable. Independientemente de cunto se alargue el valor del campo, el
rectngulo mantendr su borde alrededor del campo. Puede colocar dos de estos grupos lado a
lado y uno no se ver afectado por el alargamiento del otro.
2. Haga doble clic en la parte superior del control para mostrar el cuadro de dilogo del control.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 22 de 87
4. Haga doble clic en la parte inferior del control para mostrar el cuadro de dilogo del control.
Puede controlar cundo y cmo se imprime cada control de informe en el informe. Para obtener ms
informacin sobre las opciones de impresin, consulte cuadro de dilogo Imprimir-Condiciones.
Para controles de campo, puede suprimir los valores repetidos para registros consecutivos de forma
que el valor se imprima una vez para el primer registro pero no aparezca en los siguientes registros
hasta que cambie. Por ejemplo, si va a imprimir una factura y uno de los campos contiene la fecha de
la transaccin, la fecha slo se imprime una vez para transacciones que tuvieron lugar en esa fecha.
1. Haga doble clic en el control para mostrar el cuadro de dilogo del control.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 23 de 87
2. Elija Imprimir-Condiciones.
Para repetir cuando se desborda una banda de detalle a una nueva pgina o columna
2. Elija Imprimir-Condiciones.
Para ver ejemplos de condiciones Imprimir-Condiciones, vea los informes Colors.frx y Ledger.frx del
ejemplo Soluciones.
2. Elija Imprimir-Condiciones.
3. En el cuadro Imprimir slo cuando la expresin sea verdadera, escriba una expresin.
O bien
Haga clic en el botn del dilogo para crear una expresin con el Generador de expresiones.
El informe puede contener registros que no contengan valores para cada control de campo. De forma
predeterminada, Visual FoxPro deja en blanco el rea para ese campo. Puede quitar estas reas en
blanco para crear una presentacin de la informacin ms agradable y continua.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 24 de 87
1. Haga doble clic en el control que produce las lneas en blanco en el informe.
2. Elija Imprimir-Condiciones.
Visual FoxPro quitar la lnea del informe si se evala como lnea en blanco. Si el campo no se
imprime o si el campo de tabla est vaco, Visual FoxPro comprueba si hay otros controles en la
lnea. Si no se encuentra ninguno, se quita la lnea. Si no selecciona esta opcin y no hay otros
controles en la misma lnea, se imprime una lnea en blanco.
Puede controlar cmo se imprimen grupos en el informe. A veces querr que cada grupo empiece en
una pgina distinta, o controlar cundo se imprime el encabezado de grupo.
Adems de seleccionar el campo o expresin que hay que agrupar, el cuadro de dilogo Agrupar
datos le permite especificar opciones de salto de pgina para grupos.
Puede que quiera que los grupos aparezcan en la siguiente columna para informes con varias
columnas, en una nueva pgina para formularios o con una nueva pgina numerada como 1. El
cuadro de dilogo Agrupar datos ofrece cuatro opciones para llevar a cabo estas tareas. Puede:
Despus de escribir una expresin, puede seleccionar estas opciones en el rea Propiedades de grupo.
A veces un grupo puede imprimirse parcialmente en una pgina y terminar en la siguiente. Para evitar
que un encabezado de grupo se imprima cerca del final de la pgina con la mayor parte de los
registros en la pgina siguiente, puede establecer la distancia mnima de la parte inferior a la que se
va a imprimir un encabezado de grupo. Si el encabezado se coloca ms cerca de la parte inferior de la
pgina que el nmero de pulgadas o centmetros que haya escrito, Visual FoxPro imprime el
encabezado en una nueva pgina.
2. En el cuadro de dilogo Agrupar datos, elija o escriba un valor en el cuadro Comenzar cada
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 25 de 87
Sugerencia Para determinar un valor para un control hurfano, agregue el alto del
Encabezado de grupo de una a tres veces al alto de Detalle.
Si se suprimen valores repetidos, es posible que desee imprimir cuando cambie un grupo concreto.
1. Haga doble clic en el control para mostrar el cuadro de dilogo del control.
Cuando un grupo contina en la pgina siguiente, es posible que quiera que el encabezado de grupo
se repita en la parte superior del grupo para ver informacin continuada. Si tiene varios grupos de
datos en el informe, el encabezado de las pginas subsiguientes ser el del ltimo grupo de la lista de
grupos. Coloque todos los controles que desee imprimir para el encabezado de grupo en la banda de
encabezado del ltimo grupo de la lista.
l En el cuadro de dilogo Agrupar datos, seleccione el grupo que desea repetir y, a continuacin,
elija Volver a imprimir el encabezado de grupo en cada pgina.
Puede controlar dnde se enva el resultado de un informe o una etiqueta si utiliza alguna de las
siguientes palabras clave con el comando REPORT o LABEL:
l PRINT
l PREVIEW
l FILE
Si no utiliza una de estas palabra clave, el informe se enviar a la pantalla o a la ventana activa.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 26 de 87
Cuando imprima un informe, es posible que desee limitar el nmero de registros que aparecen en el
informe mediante criterios de seleccin. Puede:
Puede usar cualquier combinacin de estas opciones. La expresin WHILE pasa por alto los otros
criterios.
Puede limitar el nmero de registros si especifica una cantidad o un intervalo de registros. Con la
opcin Alcance, puede seleccionar un nico registro o un grupo de registros colocados
secuencialmente en el archivo.
Nota El ndice activo y el puntero de registro activo afecta a los resultados de las opciones de
alcance Siguiente y Resto. Por ejemplo, el siguiente registro de una tabla indexada por el ltimo
nombre es probablemente diferente que el de una tabla indexada por estado. Esto no afecta a la
opcin Registro porque el nmero para un registro no cambia cuando se indexa la tabla.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 27 de 87
Visual FoxPro imprime el informe con datos de los registros que tengan el alcance que haya
seleccionado.
Si los registros que desea seleccionar no estn ordenados secuencialmente en la tabla, puede generar
una expresin lgica que especifique criterios de seleccin que debe cumplir un registro para que se
imprima. Por ejemplo, puede elegir imprimir todos los registros con un valor concreto en un campo.
O bien
Asegrese de que los orgenes de registros usados por el informe estn abiertos y, a
continuacin, elija el botn FOR para usar el Generador de expresiones.
Nota No tiene que incluir el comando FOR en la expresin. Por ejemplo, escriba country =
"Canad" para ver nicamente los datos canadienses.
Visual FoxPro evala todos los registros e imprime el informe con los registros que cumplen la
condicin de la expresin.
Al imprimir, puede especificar una condicin que se tiene que cumplir para seguir la evaluacin y
seleccin de registros. Esta condicin se escribe en una expresin WHILE. Mientras la expresin
WHILE sea verdadera, Visual FoxPro procesa el origen de datos. Despus de buscar un registro que
no cumpla la condicin, Visual FoxPro termina el proceso de evaluacin e imprime los registros
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 28 de 87
seleccionados. Esta opcin le permite seleccionar registros en base a informacin externa a los
valores contenidos en los campos.
O bien
Nota No tiene que incluir el comando WHILE en la instruccin. Por ejemplo, escriba sales >
1000 para ver slo las ventas por encima de 1000 pesetas.
Visual FoxPro imprime el informe con los registros que evala mientras la expresin sea
verdadera.
Si desea enviar el informe a la impresora, puede enviarlo directamente o mostrar el cuadro de dilogo
Especificar impresora.
Por ejemplo, el cdigo siguiente enva el informe MiInforme a la impresora predeterminada y hace
que no se muestre en la pantalla:
l Utilice las palabras clave TO PRINTER PROMPT del comando REPORT o LABEL.
Por ejemplo, el cdigo siguiente muestra el cuadro de dilogo Especificar impresora, luego enva el
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 29 de 87
Si desea mostrar una vista preliminar del informe, puede enviarlo a la ventana Vista preliminar en el
Diseador de informes.
De forma predeterminada, la ventana Vista preliminar es modal, pero permite tener acceso a la barra
de herramientas. Si desea realizar la vista preliminar de forma no modal, puede agregar la palabra
clave NOWAIT al comando REPORT.
Si desea ver los resultados en una ventana especfica, puede incluir la clusula WINDOW para
especificar una ventana creada con DEFINE WINDOW.
Si desea crear una versin electrnica del informe, puede enviarlo a un archivo con formato para su
impresora o a un archivo ASCII. Si enva informes a archivos puede imprimirlos ms tarde en un
proceso por lotes.
Si desea crear un archivo ASCII, puede crear un archivo que incluya slo el texto, guiones y signos
ms para representar lneas y formas. Los colores y las fuentes elegidas no estn incluidos. Tambin
puede especificar el nmero de caracteres por lnea y el numero de lneas por pgina.
El ejemplo siguiente define las variables para la pgina ASCII e imprime un informe llamado
Miinforme.frx en un archivo ASCII llamado. Miarch.txt.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 30 de 87
Puede usar la opcin Guardar como HTML del men Archivo cuando cree o modifique un informe
para guardar su contenido como un archivo HTML (Lenguaje de marcado de hipertexto).
1. Abra el informe.
2. Elija Guardar como HTML en el men Archivo. Esta opcin slo est disponible cuando se
ha guardado el informe en disco.
3. Escriba un nombre para el archivo HTML que desea crear y elija Guardar.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 31 de 87
Puede agregar cdigo que ejecute una consulta o un informe a los siguientes objetos de su aplicacin.
DO MICONS.QPR
DO MIPROG.PRG
USE mivista
l Si desea que el usuario simplemente inicie el informe y lo recoja impreso, puede hacer que el
usuario inicie el informe si agrega el comando REPORT a un control de un formulario, un
comando en un men o un botn de una barra de herramientas.
l Si desea permitir al usuario escribir algunas variables utilizadas en el informe, puede recoger
los valores introducidos, de la misma manera que hizo antes para las consultas. Por ejemplo, un
usuario podra introducir un intervalo de fechas que incluir el informe. Para ver ms
informacin al respecto, consulte Recoger entradas de usuario con consultas ms adelante en
este mismo captulo.
l Si desea que el usuario cree informes personalizados, puede ofrecerle la posibilidad de crear
nuevos informes o modificar los ya existentes con el Diseador de informes.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 32 de 87
Si quiere recoger valores desde un formulario, puede utilizar variables en una instruccin SELECT -
SQL y luego utilizarlos en la instruccin, o ejecutar la instruccin ms tarde.
Para recoger valores para uso inmediato, puede utilizar explcitamente el nombre del formulario o
una referencia abreviada para el formulario en su instruccin SELECT - SQL. En este ejemplo, la
referencia abreviada est en la clusula WHERE.
Cdigo Comentario
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = ;
THISFORM.ControlName1.Value ;
AND customer.region = Utilice THISFORM como referencia
THISFORM.ControlName2.Value ; abreviada para el formulario
GROUP BY customer.postal_code ;
ORDER BY customer.postal_code, actualmente activo y sustituya los
customer.company_name nombres de los controles por
ControlName1 y ControlName2.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 33 de 87
Si no quiere utilizar referencias para los controles, puede definir variables en el cdigo. Use variables
en el cdigo si desea almacenar los valores desde un formulario pero no utilizarlos necesariamente
mientras el formulario est activo.
Cdigo Comentario
cValue = THISFORM.ControlName.Value Defina la variable.
Si no define la variable antes de ejecutar la consulta, aparecer un mensaje de error que indique que la
variable no se ha podido encontrar. Si la variable no est definida en el cdigo, Visual FoxPro
supondr que la variable est pre-inicializada.
Para crear rpidamente un proyecto completo con el Marco de aplicaciones, puede usar el Asistente
para aplicaciones. Una vez creado el proyecto, el Generador de aplicaciones abrir el nuevo proyecto
de modo que pueda agregar una base de datos, tablas, informes y formularios.
En este captulo se describe la forma de generar una aplicacin tpica de Visual FoxPro. Para obtener
ms informacin sobre el proceso de programacin de aplicaciones de Visual FoxPro, consulte el
captulo 2, Programar una aplicacin, y el captulo 14, Probar y depurar aplicaciones. Si desea
distribuir la aplicacin, vea la parte 8, Distribuir aplicaciones.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 34 de 87
Una aplicacin tpica de base de datos consta de estructuras de datos, una interfaz de usuario,
opciones de consulta y funciones de generacin de informes. Para disear la estructura de su
aplicacin, considere detenidamente la funcin que ofrece cada componente y su relacin con los
dems componentes.
Una aplicacin ensamblada de Visual FoxPro suele presentar al usuario un men y uno o ms
formularios para introducir o mostrar datos. Para ofrecer determinada funcionalidad y mantener la
integridad y seguridad de los datos, adjunte cdigo a determinados eventos. Las consultas y los
informes permiten que los usuarios extraigan informacin de la base de datos.
En las secciones siguientes se proporcionan detalles sobre todas estas tareas. Normalmente podra
crear un objeto Application para realizarlas; consulte la aplicacin de ejemplo Importadores
Tasmanian ubicada en el directorio ...\Samples\Vfp98\Tastrade de Visual Studio para ver un ejemplo
de esta tcnica. Asimismo, si usa el Asistente para aplicaciones para compilar la aplicacin, se crear
un objeto Application. Tambin puede, si lo desea, usar un programa como archivo principal que
controle estas tareas. Para obtener ms informacin, vea "Estructurar un programa principal".
Debe vincular todos los componentes y establecer un punto inicial para la aplicacin con un archivo
principal. El archivo principal sirve como punto de partida para la ejecucin de su aplicacin y puede
constar de un programa o formulario. Cuando los usuarios ejecuten la aplicacin, Visual FoxPro
inicia el archivo principal de la aplicacin que, a su vez, ejecuta todos los dems componentes a
medida que se vayan necesitando. Todas las aplicaciones deben tener un archivo principal. La mejor
eleccin suele ser crear un programa principal en la aplicacin. Sin embargo, puede combinar las
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 35 de 87
funciones del programa principal y la interfaz inicial de usuario si usa un formulario como programa
principal.
Si usa un Asistente para aplicaciones para crear la aplicacin, puede permitir que el asistente cree un
programa de archivo principal de forma automtica. No es necesario que especifique un archivo
principal a menos que desee cambiarlo una vez finalizadas las acciones del asistente.
Slo se puede establecer como archivo principal un archivo del proyecto. El archivo principal se
muestra en negrita, como se muestra en la ilustracin siguiente.
Inicializar el entorno
Cuando haya creado un archivo principal, utilcelo para configurar el entorno de su aplicacin. Puede
que el entorno de desarrollo predeterminado de Visual FoxPro no sea el entorno ms adecuado para la
aplicacin. El entorno predeterminado establece determinados valores para los comandos SET y las
variables de sistema en el momento de abrir Visual FoxPro.
Sugerencia Para ver los valores predeterminados del entorno de desarrollo de Visual FoxPro, inicie
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 36 de 87
Visual FoxPro sin ningn archivo de configuracin; para ello, escriba VFP6 -C y, a continuacin,
ejecute el comando DISPLAY STATUS.
Siempre es conveniente guardar los valores iniciales del entorno y configurar un entorno especfico
para la aplicacin en el preprograma.
2. Presione Maysculas y elija Aceptar para mostrar los comandos SET del entorno en la
ventana Comandos.
l Inicializar variables.
l Establecer una ruta predeterminada.
l Abrir las bases de datos, las tablas libres y los ndices necesarios. Si la aplicacin requiere
acceso a datos remotos, tambin se puede solicitar al usuario la informacin de inicio de sesin
necesaria en la rutina de inicializacin.
l Hacer referencia a archivos externos de biblioteca y procedimientos.
Por ejemplo, si desea comprobar el valor predeterminado del comando SET TALK, almacenar este
valor y establecer SET TALK como OFF para la aplicacin, podra incluir el siguiente cdigo en el
procedimiento de configuracin:
IF SET('TALK') = "ON"
SET TALK OFF
cTalkVal = "ON"
ELSE
cTalkVal = "OFF"
ENDIF
Suele ser til guardar los valores predeterminados en variables pblicas, en una clase personalizada o
como propiedades de un objeto Application para que pueda restaurar estos valores al salir de la
aplicacin.
La interfaz inicial de usuario puede ser un men, un formulario o cualquier otro componente de
usuario. Normalmente una aplicacin mostrar una pantalla de inicio de sesin o un cuadro de
dilogo de inicio antes de mostrar el men o formulario inicial.
Para iniciar la interfaz de usuario en el programa principal puede usar un comando DO para ejecutar
un men o un comando DO FORM para ejecutar un formulario.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 37 de 87
Cuando el entorno est configurado y se muestre la interfaz de usuario inicial, podr establecer un
bucle de eventos para esperar la interaccin del usuario.
l Ejecute un comando READ EVENTS, que hace que Visual FoxPro comience a procesar los
eventos de usuario, como los clics del mouse y las pulsaciones de teclas.
Es importante situar correctamente el comando READ EVENTS en el archivo principal, porque todo
el proceso de este archivo se suspende desde el momento en que se ejecuta el comando READ
EVENTS hasta que se ejecuta un comando CLEAR EVENTS. Por ejemplo, podra ejecutar un
comando READ EVENTS como el ltimo comando de un procedimiento de inicializacin, que se
ejecutara despus de inicializar el entorno y mostrar la interfaz de usuario. Si no incluye el comando
READ EVENTS, la aplicacin volver al sistema operativo despus de la ejecucin.
Una vez iniciado el bucle de eventos, la aplicacin est bajo el control del ltimo elemento mostrado
de la interfaz de usuario. Por ejemplo, si se ejecutan los dos comandos siguientes en el archivo
principal, la aplicacin muestra el formulario Startup.scx:
DO FORM STARTUP.SCX
READ EVENTS
Para ver un sencillo ejemplo de programa, vea Estructurar un programa principal ms adelante en este
mismo captulo.
Precaucin Necesita establecer una forma de salir del bucle de eventos antes de iniciarlo. Asegrese
de que la interfaz tiene un mecanismo (como un botn "Salir" o un comando de men Salir) para
ejecutar el comando CLEAR EVENTS.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 38 de 87
Para restaurar el valor original de las variables guardadas, puede sustituirlas mediante una macro en
los comandos SET originales. Por ejemplo, si guard la configuracin de SET TALK en cTalkVal,
ejecute el comando siguiente:
Nota Los nombres de variables utilizadas en la sustitucin de macros no deben contener el prefijo
"m." porque el punto presupone una concatenacin de variables y producir un error sintctico.
Si inicializ el entorno en un programa que no sea aqul en el que se est realizando la restauracin
(por ejemplo, si inicializa llamando a un procedimiento, pero restaura llamando a otro) asegrese de
que puede tener acceso a los valores almacenados. Por ejemplo, almacene los valores para
restaurarlos en variables pblicas, clases personalizadas o como propiedades de un objeto
Application.
Si usa un archivo de programa (.prg) como archivo principal en la aplicacin, debe comprobar que
incluya los comandos que gestionarn las tareas asociadas con las principales tareas de la aplicacin.
El archivo principal no tiene que ejecutar comandos directamente para realizar todas las tareas. Por
ejemplo, es frecuente llamar a procedimientos o funciones para gestionar tareas como inicializacin
del entorno y limpieza.
1. Inicialice el entorno; para ello, abra bases de datos, declare variables, etc.
4. Ejecute el comando CLEAR EVENTS desde un men (como un comando Salir) o un botn
(como un botn del comando Salir). El programa principal no debera ejecutar este comando.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 39 de 87
Cdigo Comentarios
DO SETUP.PRG Llama al programa para configurar el entorno
(almacena los valores en variables pblicas)
DO MAINMENU.MPR Muestra la interfaz inicial de usuario
l Para crear un proyecto y agregar archivos existentes, use el Asistente para aplicaciones.
l Para agregar automticamente archivos nuevos a un proyecto, abra un proyecto y, a
continuacin, cree los archivos nuevos en el Administrador de proyectos.
l Para agregar archivos existentes a un proyecto, abra un proyecto y agrguelos con el
Administrador de proyectos.
Si ha utilizado el Asistente para aplicaciones o el Administrador de proyectos para crear los archivos,
normalmente no necesitar hacer nada ms ya que el archivo se incluye automticamente en el
proyecto. Sin embargo, existe una excepcin a lo anterior si la aplicacin incluye un archivo que el
usuario vaya a modificar. Dado que los archivos incluidos son de slo lectura, deber marcar el
archivo como excluido. Para obtener ms detalles, vea el apartado Referencias a archivos
modificables ms adelante en este captulo.
Sugerencia Para obtener una lista de los tipos de archivos y extensiones utilizados en Visual
FoxPro, vea Extensiones y tipos de archivos.
1. En el Administrador de proyectos, elija el tipo de componente que desea agregar; para ello,
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 40 de 87
Visual FoxPro tambin agrega archivos al proyecto si se ha hecho referencia a los mismos en un
programa o formulario. Por ejemplo, si un programa del proyecto incluye la lnea siguiente, Visual
FoxPro agrega el archivo Orders.scx al proyecto:
DO FORM ORDERS.SCX
Importante Visual FoxPro podra no ser capaz de resolver referencias a archivos de imagen (.bmp y
.msk), dependiendo de la forma en que se utilicen en el cdigo. Por tanto, agregue las imgenes a los
archivos manualmente. Adems, Visual FoxPro no puede incluir automticamente archivos a los que
se haya hecho referencia mediante la sustitucin de macros, porque el nombre del archivo no se
conoce hasta que se ejecuta la aplicacin. Si la aplicacin establece referencias a archivos mediante la
sustitucin de macros, incluya estos archivos manualmente.
Cuando compile un proyecto en una aplicacin, los archivos incluidos en el proyecto se ensamblan en
un nico archivo de aplicacin. Una vez compilado el proyecto, los archivos del proyecto que estn
marcados como "incluidos" pasarn a ser de slo lectura.
Los archivos que forman parte del proyecto, como las tablas, suelen estar diseados para que los
usuarios puedan modificarlos. En esos casos, debera agregar los archivos al proyecto pero
marcndolos como excluidos. Los archivos excluidos siguen formando parte de la aplicacin por lo
que Visual FoxPro los registra como parte del proyecto, pero no se compilan en el archivo de
aplicacin y, de este modo, los usuarios podrn actualizarlos.
Nota Como opcin predeterminada las tablas se marcan como excluidas porque Visual FoxPro
supone que las tablas sern modificables en una aplicacin.
Como regla general, los archivos que contengan programas ejecutables (formularios, informes,
consultas, mens y programas) debern incluirse en el archivo de aplicacin y los archivos de datos
debern excluirse. Sin embargo, ha de determinar si va a incluir o excluir archivos segn los
requisitos de la aplicacin. Por ejemplo, una tabla que contenga informacin sobre el sistema o datos
utilizados nicamente para consulta puede incluirse en el archivo de aplicacin para proteger dicha
informacin ante cambios que se realicen sin previo aviso. A la inversa, podra excluir un archivo de
informe (.frx) si la aplicacin permite a los usuarios modificarlo.
Si excluye un archivo, deber asegurarse de que Visual FoxPro pueda encontrar el archivo excluido
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 41 de 87
cuando se ejecute la aplicacin. Por ejemplo, cuando en un formulario se hace referencia a una
biblioteca de clases visuales, el formulario almacena una ruta de acceso relativa a esa biblioteca. Si
incluye la biblioteca en el proyecto, entrar a formar parte del archivo de aplicacin y el formulario
siempre podr localizarla. Sin embargo, si excluye la biblioteca, el formulario debe buscarla usando
la ruta de acceso relativa o la ruta de acceso de bsqueda de Visual FoxPro (definida mediante el
comando SET PATH). Si la biblioteca no se encuentra en las ubicaciones previstas (por ejemplo, si
se ha cambiado de ubicacin desde que se cre el formulario) Visual FoxPro muestra un cuadro de
dilogo en el que se solicita al usuario que localice la biblioteca. Tal vez desee que los usuarios no
vean este cuadro de dilogo. Para estar seguro, incluya todos los archivos que no necesiten
actualizacin por parte de los usuarios.
Nota No puede incluir archivos de aplicacin (.app) y debe optar por excluir los archivos de
biblioteca (.ocx, .fll y .dll).
Nota Los archivos marcados como archivos principales no se pueden marcar como excluidos. Para
obtener detalles sobre los archivos principales, vea el apartado Establecer el punto de partida de este
captulo.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 42 de 87
Sugerencia Para ver simultneamente todos los archivos de proyecto, elija Informacin de
proyecto en el men Proyecto y seleccione la ficha Archivos.
Los pasos necesarios para crear una aplicacin desde el proyecto son:
l Probar el proyecto.
l Generar un archivo de aplicacin a partir del proyecto.
Probar el proyecto
Para comprobar las referencias y que todos los componentes estn disponibles, puede probar el
proyecto. Para ello, deber volver a generar el proyecto. Visual FoxPro tendr que resolver las
referencias a archivos y volver a compilar los archivos no actualizados.
O bien
Una vez generado el proyecto correctamente, deber intentar ejecutarlo antes de crear una aplicacin.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 43 de 87
-O bien
DO MAINPROG.PRG
Si el programa se ejecuta correctamente, estar preparado para generar un archivo de aplicacin que
contenga todos los archivos incluidos en el proyecto.
Debera repetir los pasos de regeneracin y ejecucin del proyecto siempre que agregue componentes
al proyecto. A menos que elija Volver a compilar todos los archivos en el cuadro de dilogo Opciones
para generar, slo se volvern a compilar los archivos que se hayan modificado desde la ltima
generacin.
Para generar un archivo terminado desde la aplicacin, genrelo en un archivo de aplicacin. Los
archivos de aplicacin tienen la extensin .app. Para ejecutar la aplicacin, los usuarios deben iniciar
Visual FoxPro primero y despus cargar el archivo .app.
Puede optar por generar un archivo de aplicacin (.app) o un archivo ejecutable (.exe) desde el
proyecto. Los usuarios pueden ejecutar un archivo .app si ya tienen una copia de Visual FoxPro.
Adems, puede crear un archivo .exe, que funciona con dos bibliotecas de vnculos dinmicos de
Visual FoxPro (Vfp6r.dll y Vfp6enu.dll), las cuales se distribuyen con la aplicacin para ofrecer un
entorno de ejecucin completo para Visual FoxPro. El segundo archivo es especfico del pas de
destino de la aplicacin. Para obtener ms informacin, vea la parte 8, Distribuir aplicaciones.
2. En el cuadro de dilogo Opciones para generar, elija Generar aplicacin si desea generar un
archivo .app o Generar ejecutable si desea generar un archivo .exe.
O bien
Por ejemplo, para generar una aplicacin denominada Miapli.app a partir de un proyecto denominado
Miproy.pjx, escriba:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 44 de 87
Para crear una aplicacin denominada Miapli.exe a partir de un proyecto llamado Miproy.pjx,
escriba:
Nota Tambin puede usar el cuadro de dilogo Opciones de generacin para crear un servidor de
Automatizacin personalizado desde la aplicacin de Visual FoxPro. Para obtener ms informacin,
vea Crear servidores de Automatizacin en el captulo 16, "Agregar OLE".
Una vez creado y terminado un archivo de aplicacin para el proyecto, todos los usuarios podrn
ejecutarlo.
O bien
DO miapli.app
Si ha creado un archivo .exe desde la aplicacin, los usuarios podrn ejecutarlo de diversas maneras.
DO miapli.exe
O bien
Nota Puede usar el Asistente para instalacin para crear una rutina de instalacin que instale
los archivos apropiados.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 45 de 87
consiste en aislar y resolver los problemas. La prueba y la depuracin son partes inevitables del ciclo
de desarrollo, que es mejor incorporar en una etapa inicial. La prueba y depuracin de componentes
individuales simplifica de forma significativa el proceso anlogo de aplicaciones integradas.
Para obtener ms informacin sobre la creacin de una aplicacin, consulte el captulo 2, Programar
una aplicacin y el captulo 13, Compilar una aplicacin.
Visual FoxPro ofrece un variado conjunto de herramientas para facilitar la tarea de aislar e identificar
los problemas del cdigo para que puedan resolverse de forma eficaz. Sin embargo, una de las
mejores maneras de crear aplicaciones robustas es buscar los posibles problemas antes de que se
produzcan.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 46 de 87
El entorno de sistema en el que piensa ejecutar una aplicacin tiene la misma importancia que el
entorno de datos que ha instalado para la propia aplicacin. Para garantizar la portabilidad y crear un
contexto apropiado para las pruebas y la depuracin, debe tener en cuenta lo siguiente:
l El hardware y el software
l Las rutas del sistema y las propiedades de archivo
l La estructura de directorios y las ubicaciones de los archivos
Hardware y software
Para obtener la mxima portabilidad, debe programar las aplicaciones en la plataforma comn de
menor nivel en la que va a ejecutarlas. Para establecer una plataforma de base:
Con el fin de garantizar que todos los archivos de programa necesarios son fcilmente accesibles en
todos los equipos en los que se ejecuta la aplicacin, tambin puede necesitar una configuracin de
archivo de base. Para definir una lnea de base para la configuracin, responda a las siguientes
preguntas:
Si el cdigo fuente hace referencia a rutas o a nombres de archivos absolutos, es obligatorio que tales
rutas y archivos existan en el momento de instalar la aplicacin en cualquier otro PC. Para evitar este
caso puede seguir uno de estos procedimientos:
l Para obtener informacin adicional sobre el uso de los archivos de configuracin, consulte el
captulo 3, Configurar Visual FoxPro, en la Gua de instalacin.
l Cree un directorio o una estructura de directorios independiente para mantener los archivos de
origen apartados de los archivos de aplicacin generados. De esta forma, puede comprobar las
referencias de la aplicacin terminada y saber exactamente los archivos que necesita distribuir.
l Use rutas de acceso relativas.
Establecer aserciones
Puede incluir aserciones en el cdigo para comprobar las hiptesis que tiene sobre el entorno de
ejecucin del cdigo.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 47 de 87
Cuando la condicin estipulada en el comando ASSERT se evala como falsa (.F.), aparece un
cuadro de mensajes de aserciones y se repite en la ventana Resultados del depurador.
Por ejemplo, podra escribir una funcin que espera un valor del parmetro distinto de cero. La lnea
de cdigo siguiente en la funcin le avisa si el valor del parmetro es 0:
Puede especificar si los mensajes de aserciones se van a mostrar mediante el comando SET
ASSERTS. Como valor predeterminado, los mensajes de aserciones no se muestran.
Cuando vea que se producen eventos en relacin con otros eventos, puede determinar la ubicacin
ms eficaz para incluir el cdigo.
O bien
El cuadro de dilogo Seguimiento de eventos permite seleccionar los eventos que desee ver.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 48 de 87
Nota En este ejemplo, los eventos MouseMove y Paint se han eliminado de la lista Eventos para
seguir, porque estos eventos se producen con tanta frecuencia que dificultan la visin de las
secuencias de los dems eventos.
Cuando el seguimiento de eventos est activado, cada vez que se produzca un evento de sistema en la
lista Eventos para seguir, el nombre del evento aparecer en la ventana Resultados del depurador o se
escribir en un archivo. Si opta por mostrar los eventos en la ventana Resultados del depurador,
tambin podr guardarlos en un archivo segn se describe en Mostrar los resultados ms adelante en
este mismo captulo.
Nota Si la ventana Resultados del depurador no est abierta, los eventos no se presentarn en la lista
aun cuando est activado el cuadro Ventana Resultados del depurador.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 49 de 87
DEBUG
SET STEP ON
SET ECHO ON
Una de las estrategias de depuracin ms tiles que tiene a su disposicin es la posibilidad de realizar
un seguimiento del cdigo, ver cada lnea de cdigo segn se ejecute y comprobar los valores de las
variables, propiedades y la configuracin del entorno.
3. Elija Paso a paso por instrucciones en el men Depurar o haga clic en el botn Paso a paso
de la barra de herramientas.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 50 de 87
Una flecha en el rea gris situada a la izquierda del cdigo indica la siguiente lnea que se va a
ejecutar.
l Establezca puntos de interrupcin para reducir el intervalo de cdigo por el que necesita pasar.
l Puede ignorar una lnea de cdigo que sepa que va a generar un error colocando el cursor sobre
la lnea de cdigo despus de la lnea problemtica y eligiendo Configurar siguiente
instruccin en el men Depurar.
l Si tiene mucho cdigo asociado con eventos Timer, puede evitar el seguimiento de este cdigo
desactivando Mostrar eventos Timer en la ficha Depurar del cuadro de dilogo Opciones.
Si asla un problema cuando est depurando cdigo de un programa u objeto, podr repararlo
inmediatamente.
Cuando elija Reparar en el men Depurar, la ejecucin del programa se cancela y el editor de
cdigo se abre donde est situado el cursor en la ventana Seguimiento.
Sugerencia Tambin puede suspender la ejecucin de un programa que est en ejecucin si presiona
la tecla ESC en la ventana Seguimiento.
Puede establecer puntos de interrupcin en el cdigo para suspender la ejecucin del programa de
diferentes maneras. Si conoce el punto exacto en el que desea suspender la ejecucin del programa,
puede establecer un punto de interrupcin directamente en esa lnea de cdigo.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 51 de 87
herramientas Depurador.
O bien
Aparecer un punto slido en el rea gris de la izquierda de la lnea de cdigo para indicar que se ha
establecido un punto de interrupcin en esa lnea.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 52 de 87
denominado Main.
Click C:\Myapp\Form.scx La primera lnea ejecutable de
cualquier procedimiento, funcin,
mtodo o evento denominado Click en
Form.scx.
cmdNext.Click C:\Myapp\Form.scx La primera lnea ejecutable asociada al
evento Click de cmdNext en Form.scx.
cmdNext::Click La primera lnea ejecutable del evento
Click de cualquier control cuya
ParentClass sea cmdNext en cualquier
archivo.
Si desea saber cundo cambia el valor de una variable o una propiedad, o cundo cambia una
condicin del tiempo de ejecucin, puede establecer un punto de interrupcin en una expresin.
Para suspender la ejecucin del programa cuando ha cambiado el valor de una expresin
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 53 de 87
Expresin Uso
RECNO( ) Suspender la ejecucin cuando el puntero de
registro se mueve en la tabla.
PROGRAM( ) Suspender la ejecucin en la primera lnea de
cualquier programa, procedimiento, mtodo o
evento nuevo.
myform.Text1.Value Suspender la ejecucin siempre que se cambie el
valor de esta propiedad de forma interactiva o
mediante programacin.
A menudo desear suspender la ejecucin de un programa no en una lnea determinada, sino cuando
una determinada condicin sea verdadera.
Para suspender la ejecucin del programa cuando una expresin se evale como verdadera
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 54 de 87
Expresin Uso
EOF( ) Suspender la ejecucin cuando el puntero de registro se ha
desplazado detrs del ltimo registro de una tabla.
'CLICK'$PROGRAM( ) Suspender la ejecucin de la primera lnea de cdigo asociado
a un evento Click o DblClick.
nReturnValue = 6 Si el valor devuelto de un cuadro de mensajes se almacena en
nReturnValue, se suspende la ejecucin cuando un usuario
elige S en el cuadro de mensajes.
Puede especificar que la ejecucin del programa se suspenda en una lnea determinada slo cuando
una condicin concreta sea verdadera.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 55 de 87
Para suspender la ejecucin del programa en una lnea determinada cuando la expresin se
evala como verdadera
6. Elija Aceptar.
Puede desactivar los puntos de interrupcin sin quitarlos en el cuadro de dilogo Puntos de
interrupcin. Puede eliminar puntos de interrupcin del tipo "punto de interrupcin en la ubicacin"
en la ventana Seguimiento.
O bien
En la ventana Depurador, puede ver fcilmente los valores de tiempo de ejecucin de las variables,
elementos de matriz, propiedades y expresiones en las ventanas siguientes:
l Ventana Locales
l Ventana Inspeccin
l Ventana Seguimiento
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 56 de 87
La ventana Locales muestra todas las variables, matrices, objetos y miembros de objetos que estn
visibles en cualquier programa, procedimiento o mtodo de la pila de llamadas. Como opcin
predeterminada, los valores del programa que se est ejecutando actualmente se muestran en la
ventana Locales. Puede ver estos valores para otros programas o procedimientos de la pila de
llamadas si elige los programas o procedimientos en la lista Locales para.
Ventana Locales
Puede efectuar un anlisis descendente de matrices u objetos si hace clic en el signo ms (+) situado
junto al nombre de la matriz u objeto en las ventanas Locales e Inspeccin. Cuando efecte el anlisis
descendente, podr ver los valores de todos los elementos de las matrices y las configuraciones de
propiedades de los objetos.
Puede incluso cambiar los valores de las variables, elementos de matrices y propiedades en las
ventanas Locales e Inspeccin seleccionando la variable, elemento de matriz o propiedad si hace clic
en la columna Valor y escribe un valor nuevo.
Ventana Inspeccin
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 57 de 87
Tambin puede seleccionar variables o expresiones en la ventana Seguimiento o en otras ventanas del
Depurador y arrastrarlas hasta la ventana Inspeccin.
l Presione SUPR.
O bien
Site el cursor sobre cualquier variable, elemento de matriz o propiedad de la ventana Seguimiento
para mostrar su valor actual en una sugerencia del valor.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 58 de 87
DEBUGOUT DATETIME( )
Adems, puede activar el seguimiento de eventos, que se describe en apartados anteriores de este
captulo y optar por hacer que el nombre y los parmetros de cada evento que se produzca se
muestren en la ventana Resultados del depurador.
El trayecto del cdigo ofrece informacin sobre las lneas de cdigo que se han ejecutado y el tiempo
empleado para ejecutarlas. Esta informacin puede ayudarle a identificar las reas de cdigo que no
se estn ejecutando y, por tanto, tampoco se estn comprobando, as como las que podra modificar
para obtener mayor rendimiento.
Puede activar y desactivar el trayecto del cdigo si hace clic en el botn Trayecto de cdigo de la
barra de herramientas de la ventana Depurador. Si activa el trayecto de cdigo, se abre el cuadro de
dilogo Trayecto donde puede especificar un archivo en el que se guardar esta informacin.
Despus de la seccin de cdigo cuyo trayecto desee registrar, podra incluir el comando siguiente
para desactivar el trayecto de cdigo:
SET COVERAGE TO
Una vez especificado un archivo para la informacin de trayecto, cambie a la ventana principal de
Visual FoxPro y ejecute el programa, formulario o aplicacin. En el archivo de registro se escribe la
informacin siguiente para cada lnea de cdigo que se ejecute:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 59 de 87
La forma ms sencilla de extraer informacin del archivo de registro es convertirla en una tabla de
modo que se puedan establecer filtros, ejecutar consultas e informes, ejecutar comandos y manipular
la tabla de otras maneras.
La aplicacin Analizador de trayecto crea un cursor a partir de los datos generados en el registro de
trayecto y lo utiliza en una ventana para facilitar el anlisis.
El programa siguiente convierte en una tabla el archivo de texto creado por el registro de trayecto:
cFileName = GETFILE('DBF')
IF EMPTY(cFileName)
RETURN
ENDIF
Los comandos y funciones siguientes resultan tiles para anticiparse y gestionar los errores de tiempo
de ejecucin.
Para Use
Llenar una matriz con informacin de error AERROR( )
Abrir la ventana Depurador o Seguimiento DEBUG o SET STEP ON
Generar un error especfico para probar el control de ERROR
errores
Devolver un nmero de error ERROR( )
Devolver una lnea de programa en ejecucin LINENO( )
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 60 de 87
Previsin de errores
La primera lnea de defensa contra errores de tiempo de ejecucin es anticiparse a que ocurran y
codificarlos. Por ejemplo, esta lnea de cdigo mueve el puntero al siguiente registro de la tabla:
SKIP
Este cdigo funciona a menos que el puntero de registro ya est situado detrs del ltimo registro de
la tabla y es en este punto donde se producir el error.
IF !EOF()
SKIP
IF EOF()
GO BOTTOM
ENDIF
ENDIF
Otro ejemplo es esta lnea de cdigo que muestra el cuadro de dilogo Abrir para permitir al usuario
abrir una tabla en un rea de trabajo nueva:
USE GETFILE('DBF') IN 0
El problema es que el usuario podra elegir Cancelar en el cuadro de dilogo Abrir o escribir el
nombre de un archivo que no existe. El cdigo siguiente se anticipa a esta situacin comprobando que
el archivo existe antes de que el usuario intente utilizarlo:
_
IF FILE(cNewTable)
USE (cNewTable) IN 0
ENDIF
El usuario final tambin podra escribir el nombre de un archivo que no sea una tabla de Visual
FoxPro. Para solucionar este problema, podra abrir el archivo con las funciones de E/S de archivo a
bajo nivel, analizar el encabezado binario y comprobar que el archivo es una tabla vlida. Sin
embargo, esto implica un pequeo trabajo y podra ralentizar perceptiblemente la aplicacin. Lo
mejor sera controlar la situacin durante el tiempo de ejecucin mostrando un mensaje como "Abra
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 61 de 87
otro archivo. Este archivo no es una tabla". cuando se produzca el error 15, "No es una tabla".
No puede, y probablemente tampoco lo desee, anticipar todos los errores posibles, por lo que tendr
que interrumpir algunos mediante cdigo que se ejecutar en caso de que se produzca un error de
tiempo de ejecucin.
Puede incluir cualquier comando o expresin vlida de FoxPro despus de ON ERROR, pero
normalmente se llama a un procedimiento o programa de control de errores.
qxy
Aparecer un cuadro de dilogo de mensaje de error estndar de Visual FoxPro que indica "No se
reconoce el verbo de comando". No obstante, si ejecuta las lneas de cdigo siguientes, aparecer el
error nmero 16 impreso en la ventana de salida activa en lugar de mostrarse el mensaje de error
estndar en un cuadro de dilogo:
ON ERROR ?ERROR()
qxy
Si se ejecuta ON ERROR sin escribir nada ms detrs, se restablecen los mensajes de error
incorporados de Visual FoxPro:
ON ERROR
LOCAL lcOldOnError
PROCEDURE errhandler
LOCAL aErrInfo[1]
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 62 de 87
AERROR(aErrInfo)
DO CASE
CASE aErrInfo[1] = 1 && El archivo no existe
* mostrar el mensaje apropiado
* y emprender alguna accin para solucionar el problema.
OTHERWISE
* mostrar un mensaje genrico, y quiz enviar
* un mensaje electrnico de alta prioridad al administrador
ENDPROC
Cuando se produce un error en el cdigo del mtodo, Visual FoxPro comprueba el cdigo de gestin
de errores asociado al evento Error del objeto. Si no se ha escrito cdigo a nivel del objeto para el
evento Error, se ejecuta el cdigo del evento Error heredado de la clase principal o de otra clase
superior de la jerarqua de clases. Si no se ha escrito cdigo para el evento Error en ninguna clase de
la jerarqua, Visual FoxPro comprueba la existencia de una rutina ON ERROR. Si no existiera,
Visual FoxPro mostrar el mensaje de error predeterminado de Visual FoxPro.
En las clases puede encapsularse todo lo que necesita un control, incluido el control de errores para
que el control pueda utilizarse en diversos entornos. Si posteriormente descubre otro error que podra
encontrar el control, puede agregar la gestin de ese error a la clase; de este modo, todos los objetos
basados en la clase heredarn automticamente la funcin de control del nuevo error.
Por ejemplo, la clase vcr de la biblioteca de clases Buttons.vcx, ubicada en el directorio ...
\Samples\Vfp98\Classes de Visual Studio se basa en la clase de contenedor de Visual FoxPro.
Cuatro botones de comandos del contenedor controlan el desplazamiento por la tabla moviendo el
puntero de registro en una tabla con los comandos siguientes:
Podra producirse un error si un usuario elige uno de los botones y no hay ninguna tabla abierta.
Visual FoxPro intenta escribir en una tabla valores almacenados en el bfer cuando se mueve el
puntero de registro. Por tanto, podra producirse un error si se activa el almacenamiento optimista de
filas en bfer y otro usuario ha cambiado un valor en el registro almacenado en el bfer.
Estos errores podran producirse cuando el usuario elige cualquiera de los botones; por tanto, no tiene
sentido tener cuatro mtodos diferentes de control de errores. El cdigo siguiente asociado al evento
Error de cada uno de los botones de comando transfiere la informacin del error a una sola rutina de
gestin de errores de la clase:
El cdigo siguiente est asociado al evento Error de la clase vcr. El cdigo real es diferente debido a
los requisitos de codificacin para la localizacin.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 63 de 87
Es posible que desee estar seguro de que suministra informacin para un error que nunca ha
controlado. De lo contrario, el cdigo del evento de error se ejecutar pero no realizar ninguna
accin y ya no se mostrar el mensaje de error predeterminado de Visual FoxPro. El resultado es que
ni el programador ni el usuario sabrn lo que ha sucedido.
Dependiendo de los usuarios a los que est destinada la aplicacin, podra suministrar ms
informacin en el caso de un error no controlado, como el nombre y nmero de telfono de la persona
a la que se puede solicitar ayuda.
Despus de ejecutarse el cdigo de control de errores, se ejecuta la lnea de cdigo que sigue a la que
ha producido el error. Si desea volver a ejecutar la lnea de cdigo que ha producido el error cuando
haya cambiado la situacin que lo ha producido, use el comando RETRY.
Nota Puede llamar al evento Error cuando el error encontrado no est asociado a una lnea del
cdigo. Por ejemplo, si llama al mtodo CloseTables de un entorno de datos cuando AutoCloseTables
est establecido como verdadero (.T.) y se libera el formulario, se generar un error interno cuando
Visual FoxPro intente volver a cerrar las tablas. Puede interrumpir en este error pero no existe
ninguna lnea de cdigo para ejecutar RETRY.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 64 de 87
Para obtener informacin sobre la forma de obtener el mximo rendimiento del equipo y del sistema
operativo, consulte el captulo 4, Optimizar el sistema, de la Gua de instalacin e ndice principal.
Usar ndices
El uso de ndices permite agilizar el acceso a los datos de una tabla. Si se agrega un ndice a una tabla
se agilizan las bsquedas, especialmente si se puede utilizar la tecnologa Rushmore para optimizar la
bsqueda. El uso de ndices tambin permite trabajar con los datos en un orden determinado, como
ver una tabla de clientes ordenada por apellido.
Si los registros de una tabla tienen claves exclusivas, cree un ndice principal o candidato en el
campo. Estos tipos de ndice permiten que Visual FoxPro valide la tecla a un nivel inferior con lo que
se consigue el mximo rendimiento.
Adems de usar ndices en los campos utilizados para buscar y ordenar, tambin debera indexar
todos los campos relacionados con una combinacin. Si combina dos tablas en campos que no estn
indexados, la operacin de combinacin puede tardar mucho ms tiempo en realizarse.
Una caracterstica importante de Visual FoxPro es que puede crear un ndice en cualquier expresin
(en algunas bases de datos slo puede indexar los campos). Esta capacidad permite usar ndices para
optimizar las operaciones de bsqueda, ordenacin o combinacin en conjuntos de campos o en
expresiones derivadas de campos. Por ejemplo, puede crear un ndice de un campo de nombres
basado en una expresin que use la funcin SOUNDEX( ). De esa manera, la aplicacin puede
proporcionar un acceso muy rpido a los nombres que guarden un cierto parecido.
Al agregar ndices a las tablas, debe ver si la mejora en los tiempos de recuperacin compensa la
prdida de rendimiento al actualizar la tabla. A medida que agregue ms ndices a la tabla, las
actualizaciones e inserciones en la tabla se ralentizarn porque Visual FoxPro necesita actualizar cada
ndice.
Por ltimo, evite el uso de ndices en campos que contengan slo unos cuantos valores discretos,
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 65 de 87
como los campos lgicos. En estos casos, el ndice slo contiene un pequeo nmero de entradas y el
trabajo de mantener el ndice probablemente sea mayor que la ventaja que se consigue a la hora de
realizar bsquedas.
Para obtener detalles sobre la forma de crear ndices de forma eficaz al usar la tecnologa Rushmore,
vea Usar la tecnologa Rushmore para agilizar el acceso a los datos, ms adelante en este captulo.
Optimizar combinaciones
Cuando vaya a crear combinaciones mediante SELECT - SQL, las situaciones siguientes pueden
reducir el rendimiento y producir resultados imprevistos:
l Combinacin de tablas en datos que no sean una clave principal o exclusiva en una de las
tablas.
l Combinacin de tablas que contengan campos vacos.
Para evitar estas situaciones, cree combinaciones que se basen en la relacin entre las claves
principales de una tabla y las claves externas de la otra. Si crea una combinacin basada en datos que
no sean exclusivos, el resultado final puede ser el producto de las dos tablas. Por ejemplo, la
instruccin SELECT - SQL siguiente crea una combinacin que puede producir un resultado muy
grande:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.postal_code = Orders.postal_code
En el ejemplo, el cdigo postal identifica de forma exclusiva una ubicacin dentro de una ciudad pero
tiene poco valor si lo que pretende es establecer una correspondencia entre las filas de clientes y las
filas de sus pedidos. El cdigo postal no identifica necesariamente un cliente o un pedido de forma
exclusiva. En su lugar, cree una combinacin con una instruccin como la siguiente:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id
En este ejemplo, el campo customer_id identifica de forma exclusiva un cliente determinado y los
pedidos que pertenecen a ese cliente y, por tanto, crea un conjunto de resultados que combina la fila
de clientes con cada fila de pedidos.
Adems, tenga cuidado al combinar tablas que tengan campos vacos porque Visual FoxPro
establecer una correspondencia con los campos vacos. Sin embargo, no establece una
correspondencia con los campos que contengan el valor nulo. Al crear una combinacin, califique las
expresiones del campo en la condicin de combinacin probando con una cadena vaca.
Por ejemplo, si piensa que el campo de identificacin del cliente de la tabla Orders podra estar vaco,
use una instruccin como la siguiente para filtrar los registros de pedidos que no tengan nmero de
cliente:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id; (error w/o ;)
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 66 de 87
Sugerencia Tambin puede probar una cadena vaca con la funcin EMPTY( ), pero la inclusin de
una llamada a la funcin dentro de la expresin de filtro no resulta tan rpida como efectuar una
comparacin con un valor constante.
En primer lugar, Visual FoxPro abre un archivo de programa y lo deja abierto. Despus, cuando se
ejecuta un comando DO en un programa contenido en el archivo, Visual FoxPro no necesita abrir un
archivo adicional.
En segundo lugar, una aplicacin de uno o dos archivos reduce el nmero de archivos necesarios en
el directorio de trabajo. La velocidad de todas las operaciones con el archivo aumentar a medida que
el sistema operativo tenga menos entradas de directorios que examinar al abrir, cambiar el nombre o
eliminar archivos.
Para obtener ms informacin sobre el uso del Administrador de proyectos para crear aplicaciones,
consulte el captulo 13, Compilar una aplicacin.
Para crear tablas e ndices de la forma ms rpida posible, siga las recomendaciones que se muestran
a continuacin.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 67 de 87
Rushmore para acceso a los datos. Con Rushmore puede ejecutar determinadas operaciones
complejas con tablas muchsimo ms rpido que sin esta tecnologa.
La tecnologa Rushmore es una tcnica de acceso a datos que usa los ndices estndar de Visual
FoxPro para optimizar el acceso a datos. Puede utilizar Rushmore con cualquier ndice de Visual
FoxPro, incluyendo los ndices de FoxPro 1.x (.idx), los ndices compactos (.idx) o los ndices
compuestos (.cdx).
Tanto los ndices .cdx como los ndices compactos .idx utilizan una tcnica de compresin que
genera ndices de hasta 1/16 del tamao de los ndices de formato tradicional. Visual FoxPro puede
procesar ndices compactos con mayor rapidez porque son fsicamente ms pequeos. Esto significa
que Visual FoxPro requiere menos acceso a disco para procesar un ndice y puede almacenar
localmente una parte mayor del ndice. Aunque Rushmore, como otras tcnicas de acceso a archivos,
se beneficia del menor tamao de los ndices compactos, tambin funciona correctamente con los
ndices de formatos antiguos.
Cuando Visual FoxPro procesa tablas muy grandes en equipos con poca memoria, es posible que
Rushmore no disponga de suficiente memoria para operar. En este caso, aparecer un mensaje de
advertencia ("No hay suficiente memoria para la optimizacin"). Su programa funcionar
correctamente sin perder ningn dato; sin embargo, la consulta no se beneficiar de la tecnologa
Rushmore.
Los comandos SQL de Visual FoxPro utilizan la tecnologa Rushmore como herramienta bsica para
la optimizacin de consultas de mltiples tablas, utilizando los ndices existentes e incluso creando
nuevos ndices con fines especficos para aumentar la velocidad de dichas consultas.
Utilice Rushmore para optimizar el acceso a datos segn el nmero de tablas que intervengan.
Cuando tenga acceso a una nica tabla, podr beneficiarse de Rushmore siempre que aparezca una
clusula FOR. Cuando tenga acceso a mltiples tablas, las consultas SELECT - SQL prevalecen
sobre todas las optimizaciones Rushmore. En un comando SQL, Visual FoxPro decide lo que se
necesita para optimizar una consulta y realiza las operaciones automticamente. No es necesario que
abra tablas o ndices. Si SQL decide que necesita ndices, crea ndices temporales para su propio uso.
l Para tener acceso a datos que estn contenidos en una nica tabla, utilice una clusula FOR en
un comando como AVERAGE, BROWSE o LOCATE o use comandos SQL para actualizar
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 68 de 87
tablas. Para obtener una lista completa de comandos que utilizan la clusula FOR, consulte la
tabla siguiente.
O bien
l Para tener acceso a datos contenidos en ms de una tabla, utilice un comando SELECT - SQL,
DELETE - SQL y UPDATE - SQL.
La tabla siguiente muestra una relacin de los comandos que utilizan clusulas FOR. Rushmore est
diseado para que su velocidad sea proporcional al nmero de registros obtenidos en la operacin.
AVERAGE BLANK
BROWSE CALCULATE
CHANGE COPY TO
COPY TO ARRAY COUNT
DELETE DISPLAY
EDIT EXPORT TO
INDEX JOIN WITH
LABEL LIST
LOCATE RECALL
REPLACE REPLACE FROM ARRAY
REPORT SCAN
SET DELETED SET FILTER
SORT TO SUM
TOTAL TO
Si utiliza una clusula de alcance, adems de una expresin de clusula FOR optimizable, el alcance
debe ser ALL o REST para poder aprovechar la tecnologa Rushmore. Las clusulas de alcance
NEXT o RECORD desactivan Rushmore. Puesto que el alcance predeterminado es ALL, Rushmore
funcionar cuando omita la clusula de alcance.
Rushmore puede utilizar cualquiera de los ndices abiertos salvo los ndices filtrados y UNIQUE.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 69 de 87
determinado, ejecute SET ORDER TO para desactivar el control de los ndices y luego utilice el
comando SORT.
Rushmore no puede aplicarse a todos los ndices. Si usa una clusula FOR en el comando INDEX,
Rushmore no puede utilizar el ndice para la optimizacin. Por ejemplo, debido a que contiene una
clusula FOR, la instruccin siguiente no puede optimizarse:
De forma anloga, Rushmore no puede usar un ndice creado con una condicin NOT. Por ejemplo,
la instruccin siguiente puede optimizarse:
En el caso especial de que desee excluir los registros eliminados de una consulta, use un ndice como
el del primer ejemplo para agilizar las operaciones cuando haya establecido SET DELETED como
ON.
Las operaciones de obtencin de datos se ejecutan sin la optimizacin Rushmore en las siguientes
situaciones:
Desactivar Rushmore
Aunque no desear hacerlo a menudo, es posible desactivar Rushmore. Cuando ejecute un comando
que utilice Rushmore, Visual FoxPro determinar inmediatamente qu registros coinciden con la
expresin de la clusula FOR. A continuacin, el comando manipula estos registros.
Si un comando que se puede optimizar modifica la clave de ndice en la clusula FOR, el conjunto de
registros sobre el que opera Rushmore puede quedarse desfasado. En este caso, puede desactivar
Rushmore para asegurarse de que disponga de la informacin ms actualizada de la tabla.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 70 de 87
Puede desactivar o activar globalmente Rushmore para todos los comandos que se benefician de
Rushmore, con el comando SET OPTIMIZE.
SET OPTIMIZE ON
La tecnologa Rushmore depende de la presencia de una expresin bsica optimizable en una clusula
FOR. Una expresin bsica optimizable puede formar una expresin completa o puede aparecer
como parte de una expresin. Tambin puede combinar expresiones bsicas para formar una
expresin optimizable compleja.
Una expresin bsica optimizable toma una de las dos formas siguientes:
O bien
l eIndex coincide exactamente con la expresin sobre la cual est construido un ndice.
l eExp es cualquier expresin y puede incluir variables y campos de otras tablas no relacionadas.
l OpRel es uno de los siguientes operadores: <, >, =, <=, >=, <>, #, ==, o !=. Tambin puede
utilizar las funciones ISNULL( ), BETWEEN( ) o INLIST( ) (o sus equivalentes SQL , como IS
NULL, etc.).
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 71 de 87
O bien
Si crea los ndices firstname, custno, UPPER(lastname y hiredate, cada una de las siguientes
expresiones es optimizable:
firstname = "Carlos"
custno >= 1000
UPPER(lastname) = "Martn"
hiredate < {^1997-12-30}
Una expresin optimizable puede contener variables y funciones que se evalan como un valor
concreto. Por ejemplo, al usar el ndice addr, si ejecuta el comando "WASHINGTON AVENUE" TO
cVar, las siguientes instrucciones tambin seran expresiones bsicas optimizables:
ADDR = cVar
ADDR = SUBSTR(cVar,8,3)
Es importante entender cundo se optimizarn las consultas y cundo no. Visual FoxPro optimiza las
condiciones de bsqueda; para ello, busca una coincidencia exacta entre el lado izquierdo de una
expresin de filtro y una expresin de clave de ndice. Por tanto, Rushmore puede optimizar una
expresin slo si busca la expresin exacta usada en un ndice.
Por ejemplo, imagine que acaba de crear una tabla y va a agregar el primer ndice mediante un
comando como el siguiente:
USE CUSTOMERS
INDEX ON UPPER(cu_name) TAG name
En su lugar, debera crear una expresin optimizable con un comando como el siguiente, en la que la
expresin que se est buscando coincida exactamente con la expresin indexada:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 72 de 87
Puede combinar expresiones simples o complejas basadas en las clusulas FOR o WHERE para
incrementar la velocidad de recuperacin de datos. Esto es posible si las expresiones FOR tienen las
caractersticas de las expresiones bsicas optimizables.
Las expresiones bsicas pueden ser optimizables. Puede combinar expresiones bsicas con los
operadores lgicos AND, OR y NOT para formar una expresin de clusula FOR compleja que
tambin se puede optimizar. Una expresin creada con una combinacin de expresiones bsicas
optimizables es totalmente optimizable. Si una o ms de las expresiones bsicas no son optimizables,
la expresin compleja se podra optimizar parcialmente o bien no ser optimizable en absoluto.
Un conjunto de reglas determina si una expresin formada por expresiones bsicas optimizables o no
optimizables se puede optimizar totalmente, parcialmente o no se puede optimizar. La tabla siguiente
resume las reglas de optimizacin de consultas de Rushmore.
Puede utilizar el operador AND para combinar dos expresiones optimizables en una expresin
totalmente optimizable:
En el siguiente ejemplo, el operador OR combina una expresin bsica optimizable con una
expresin no optimizable para crear una expresin que no es optimizable:
Puede crear una expresin totalmente optimizable si utiliza el operador NOT con una expresin
optimizable:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 73 de 87
Del mismo modo que puede combinar expresiones bsicas, puede combinar expresiones complejas
para crear una expresin an ms compleja totalmente optimizable, parcialmente optimizable o no
optimizable. A su vez, puede combinar estas expresiones ms complejas para crear expresiones que
se pueden optimizar total o parcialmente o que no se pueden optimizar. La tabla siguiente describe
los resultados de combinar estas expresiones complejas. Estas reglas tambin se aplican a expresiones
agrupadas con parntesis.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 74 de 87
Puede combinar expresiones totalmente optimizables con el operador OR para crear una expresin
que tambin sea totalmente optimizable:
Para crear expresiones parcialmente optimizables, combine una expresin totalmente optimizable con
una expresin que no sea optimizable. En el siguiente ejemplo, el operador AND se utiliza para
combinar estas expresiones:
Las expresiones parcialmente optimizables se pueden combinar para crear una expresin que tambin
sea parcialmente optimizable:
La combinacin de expresiones que no sean optimizables crea una expresin que tampoco se puede
optimizar:
Utilice conjuntos de formularios solamente cuando sea necesario que un grupo de formularios
comparta una sesin de datos privada. Cuando utilice un conjunto de formularios, Visual FoxPro crea
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 75 de 87
instancias de todos los formularios y de todos los controles de todos los formularios del conjunto, aun
cuando slo se muestre en pantalla el primer formulario del conjunto. Esto puede resultar lento e
innecesario si los formularios no tienen que compartir una sesin de datos privada. En su lugar,
debera ejecutar DO FORM para los otros formularios cuando sean necesarios.
Sin embargo, si utiliza un conjunto de formularios, obtendr una pequea mejora del rendimiento
cuando tenga acceso a los formularios del conjunto porque los formularios ya estarn cargados
aunque no visibles.
Los marcos de pgina, al igual que los conjuntos de formularios, cargan todos los controles de cada
pgina en el momento de cargar el marco de pginas lo que da lugar a una demora perceptible cuando
se carga este ltimo. En su lugar, podra cargar los controles de pgina dinmicamente a medida que
se fueran necesitando, creando una clase fuera de los controles de cada pgina y cargndolos cuando
se activara la pgina.
1. Disee el formulario de la forma habitual, incluyendo todos los controles en todas las pginas.
2. Una vez terminado el diseo, vaya a la segunda pgina del marco de pgina y guarde los
controles all existentes como una clase.
3. Abra la clase que acaba de crear y compruebe que los controles sigan dispuestos de la forma
correcta.
4. Repita los pasos 2 y 3 para la tercera y las pginas siguientes del marco de pgina.
5. En el evento Activate de la segunda pgina y de las siguientes del marco de pgina, agregue
objetos y djelos visibles.
Por ejemplo, si la clase de controles se llama cnrpage1, debe agregar el cdigo siguiente:
IF THIS.ControlCount = 0
THIS.AddObject("cnrpage1","cnrpage1")
THIS.cnrpage1.Visible = .T.
ENDIF
Puede agilizar el tiempo de carga de un formulario que contenga numerosos controles vinculados a
datos si retrasa la vinculacin de esos controles hasta el momento en que sean necesarios.
1. Site las tablas y vistas del formulario en el entorno de datos de modo que se abran cuando se
cargue el formulario.
2. Para cada control dependiente, agregue cdigo al cdigo de evento GotFocus que vincula el
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 76 de 87
control al valor de los datos. Por ejemplo, el cdigo siguiente vincula un control ComboBox al
campo customer.company:
Si realiza varios cambios en la pantalla, por ejemplo, cambia los valores de varios controles a la vez,
puede reducir el tiempo global necesario para actualizar la pantalla si retarda la actualizacin de
pantalla hasta que se realicen todos los cambios. Por ejemplo, si hace que los controles queden
visibles o invisibles, cambia los colores de los controles o mueve los registros de controles
dependientes, resulta mucho ms eficaz retardar el relleno de color de estos controles hasta que se
hayan completado todos los cambios:
THISFORM.LockScreen = .T.
THISFORM.MyButton.Caption = "Guardar"
THISFORM.MyGrid.BackColor = RGB (255, 0, 0) && Rojo
SKIP IN customers
SKIP IN orders
THISFORM.Refresh
THISFORM.LockScreen = .F.
Sugerencia Esta tcnica no proporciona ninguna ventaja si est actualizando un nico control.
Puesto que el mtodo Refresh y el evento Paint suelen utilizarse con frecuencia, puede aumentar el
rendimiento de formularios si reduce la cantidad de cdigo de estos mtodos. De forma anloga, para
acelerar el tiempo de carga de un formulario, podra mover cdigo desde el evento Init a los mtodos
usados con menos frecuencia como Activate, Click y GotFocus. Entonces, use una propiedad del
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 77 de 87
control (como Tag o una propiedad personalizada) para hacer un seguimiento de si el control ya ha
ejecutado el cdigo que slo necesita ejecutarse una vez.
Optimizar programas
Escribiendo cdigo cuidadosamente, puede escribir programas ms rpidos. Son varias las maneras
de aumentar el rendimiento de los programas en Visual FoxPro:
Para escribir programas ms rpidos, siga las recomendaciones que se indican a continuacin.
l Elija el tipo de datos correcto. En particular, use el tipo de datos Integer para la informacin
numrica cuando sea posible, puesto que se procesa de forma ms eficaz. Siempre que sea
posible, use el tipo de datos Integer para los valores de claves externas, lo que dar lugar a
archivos de datos e ndices ms pequeos (y, por tanto, ms rpidos) y a combinaciones ms
rpidas.
Nota Para ver un ejemplo que muestre la forma de crear un ndice ms pequeo y, por tanto,
ms rpido, ejecute Solution.app en el directorio ...\Samples\Vfp98\Solution de Visual Studio.
Elija Ver los ejemplos mediante una lista filtrada, seleccione ndice en la lista desplegable y
despus elija Crear ndices pequeos usando BINTOC( ) en la lista que aparece.
l Evite volver a abrir archivos, puesto que esto ralentiza el rendimiento. En su lugar, asigne
archivos a reas de trabajo cuando los abra y despus use el comando SELECT para elegir un
rea de trabajo especfica cuando se precise.
l Los bucles FOR ENDFOR son ms rpidos que los bucles DO WHILE ENDDO.
l Cuando copie datos de varios campos, SCATTER TO ARRAY es ms rpido que SCATTER
MEMVAR.
l Para optimizar el uso de la memoria, evite la creacin de objetos antes de necesitarlos y borre
los objetos cuando deje de trabajar con ellos para liberar memoria.
Sugerencia Puede comprobar cunta memoria consume cada objeto si llama a la funcin SYS
(1016).
l Enve la salida a la ventana superior siempre que sea posible; la actualizacin de ventanas
situadas detrs de la superior es bastante ms lenta. No se debe, en ningn caso, hacer que la
salida se desplace detrs de una ventana.
l Desactive la presentacin del estado con el comando SET TALK OFF, que elimina el trabajo
de la actualizacin de la pantalla.
l Establezca el comando SET DOHISTORY como OFF para evitar la actualizacin de la ventana
de comandos cada vez que se ejecute un programa.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 78 de 87
cFile = "CUST"
use &cFile && Substitucin de macros, lenta
use (cFile) && Expresin de nombre: rpida, preferida
Comprendiendo la forma en que funciona Visual FoxPro con las propiedades y objetos, puede
optimizar la ejecucin de las aplicaciones.
Cuando haga referencia a una propiedad de objeto con la sintaxis objeto.propiedad, Visual FoxPro
debe buscar el objeto antes de poder tener acceso a la propiedad. Si debe tener acceso a la propiedad
repetidas veces, esta estrategia de bsqueda puede ralentizar el rendimiento.
Para evitar las referencia al mismo procedimiento varias veces (como en un bucle), lea el valor de la
propiedad en una variable, realice los cambios y establezca la propiedad una sola vez cuando termine.
Por ejemplo, el cdigo siguiente rellena una matriz de propiedades; para ello, crea primero una matriz
en la memoria, la rellena y despus establece la propiedad una sola vez al final:
Si actualiza ms de una propiedad para el objeto, Visual FoxPro debe buscar el objeto varias veces, lo
que puede afectar al rendimiento. En el ejemplo siguiente, el cdigo hace que Visual FoxPro busque
en cuatro objetos (como THISFORM, pgfCstInfo, pgCstName y txtName) para encontrar la propiedad
que se va a establecer. Dado que el cdigo establece dos propiedades, la bsqueda a cuatro niveles se
realiza dos veces:
THISFORM.pgfCstInfo.pgCstName.txtName.Value = ;
"Carlos Martn"
THISFORM.pgfCstInfo.pgCstName.txtName.BackColor = ;
RGB (0,0,0) & Rojo oscuro
Para evitar este volumen de trabajo, use el comando WITH ENDWITH. Este mtodo hace que
Visual FoxPro busque el objeto una sola vez. Por ejemplo, el ejemplo siguiente realiza la misma tarea
que el anterior, pero de forma ms rpida:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 79 de 87
WITH THISFORM.pgfCstInfo.pgCstName.txtName
.Value = "Carlos Martn"
.BackColor = RGB (0,0,0) & Rojo oscuro
ENDWITH
Tambin puede almacenar una referencia a un objeto en una variable y despus incluir la variable en
lugar de la referencia al objeto:
oControl = THISFORM.pgfCstInfo.pgCstName.txtName
oControl.Value = "Carlos Martn"
oControl.BackColor = RGB (0,0,0) & Rojo oscuro
Para obtener el mximo rendimiento a la hora de utilizar controles ActiveX en los formularios, siga
estas recomendaciones:
l Inicie los servidores de Automatizacin en primer lugar. Los controles enlazados a campos
generales suelen funcionar mejor cuando los servidores de estos tipos de datos (como
Microsoft Excel o Word) ya se estn ejecutando en el equipo cliente.
l Inserte objetos "como un icono". Cuando inserte un control ActiveX en un campo, hgalo
como un icono o un marcador de posicin en lugar de insertar el objeto completo. Esto reduce
la cantidad de espacio de almacenamiento necesario porque Visual FoxPro almacena una
imagen de presentacin con el objeto, lo que consume gran cantidad de espacio de
almacenamiento. Si se inserta un objeto como un icono tambin se aumenta el rendimiento
para dibujar el objeto.
l Use controles de imgenes. Si desea mostrar un mapa de bits (como, el logotipo de una
empresa), los controles de imgenes son mucho ms rpidos que los controles OLEBound.
l Use vnculos manuales siempre que sea posible. Los vnculos manuales a los objetos son ms
rpidos porque evitan el tiempo de notificacin requerido para los vnculos automticos y
porque el servidor no necesita iniciarse para dibujar el objeto. Si no necesita actualizar un
objeto con frecuencia, use vnculos manuales.
Si la aplicacin interacta con otras aplicaciones, puede conseguir el mximo rendimiento mediante
las tcnicas siguientes.
En algunos casos, los servidores de Automatizacin (como Microsoft Excel) iniciarn una nueva
instancia, aun cuando ya haya una ejecutndose. Para evitar esto y aumentar el rendimiento, use la
funcin GetObject( ) en lugar de CreateObject( ). Por ejemplo, la llamada siguiente siempre utilizar
una instancia existente:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 80 de 87
x = GetObject(,"excel.Application")
x = CreateObject("excel.Application")
Si llama a GetObject( ) pero el servidor no est funcionando, aparecer el error 1426. En ese caso,
puede interrumpir el error y llamar a CreateObject( ):
PROCEDURE oleErr
PARAMETER mError
IF mError = 1426 then
x = CreateObject("excel.application")
ENDIF
La ejecucin de expresiones que usen objetos en un servidor de Automatizacin puede resultar muy
costosa, especialmente cuando se evalan varias veces. Es mucho ms econmico almacenar las
referencias de objetos en variables para tenerlas como referencia. Para obtener ms informacin, vea
Optimizar referencias repetidas a una propiedad, en este mismo captulo.
Asimismo, las sugerencias para trabajar con datos almacenados en servidores remotos pueden
resultarle especialmente tiles. Para obtener ms informacin, vea Optimizar el acceso a datos
remotos, ms adelante en este captulo.
Si la aplicacin intenta bloquear un registro o una tabla sin xito, puede hacer que Visual FoxPro
reintente el bloqueo automticamente despus de un breve intervalo. Sin embargo, cada intento de
bloqueo da lugar a un trfico de red ms intenso. Si ya fuera intenso, el envo de repetidas solicitudes
de bloqueo agregar una sobrecarga de trabajo a la red y provocar una ralentizacin global para
todos los usuarios.
Para controlar esta situacin, puede ajustar el intervalo entre los intentos de bloqueo. Si usa un
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 81 de 87
intervalo ms grande (lo que provocara menos reintentos por segundo) se reducir el trfico de la red
y se aumentar el rendimiento.
l Llame a la funcin SYS(3051); para ello, indique el nmero de milisegundos que debe esperar
entre cada intento de bloqueo.
Cuando utiliza el procesamiento de transacciones, debe disear las transacciones de forma que se
reduzca al mnimo el efecto que puedan tener en otros usuarios. Mientras est abierta una transaccin,
todos los bloqueos establecidos durante la transaccin permanecern bloqueados hasta que se
confirmen o se deshagan. Aun cuando ejecute un comando UNLOCK explcito, los bloqueos se
mantendrn hasta que ejecute el comando END TRANSACTION o ROLLBACK.
Adems si anexa registros a una tabla, es imprescindible que Visual FoxPro bloquee el encabezado
de la tabla. El encabezado permanece bloqueado durante el proceso de la transaccin, lo que impide
que los dems usuarios tambin puedan anexar registros.
Para reducir al mnimo el impacto de las transacciones, diselas de modo que comiencen y terminen
lo ms cerca posible de la actualizacin real de los datos; la transaccin ideal slo contiene
instrucciones de actualizacin de datos.
5. El cliente recoge los datos del servidor a travs de la red. Este paso puede realizarse en una sola
operacin o el cliente puede solicitar que los resultados se enven en partes a medida que se
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 82 de 87
vayan necesitando.
Puede usar varias tcnicas para aumentar la velocidad de la recuperacin o actualizacin de los datos.
En la seccin siguiente se tratan estas estrategias:
La mayor parte de las aplicaciones que usan datos remotos, formularios e informes no necesitan tener
acceso a todos los datos de una tabla a la vez. Por tanto, puede aumentar el rendimiento si crea vistas
remotas que busquen o actualicen nicamente los campos y registros que desee con lo que se reduce
al mnimo la cantidad de datos que deben transmitirse a travs de la red.
Para crear consultas que minimicen el trabajo de recuperacin de datos de orgenes remotos, siga
estas sugerencias:
l Especifique slo los campos que necesite. No use la instruccin SELECT * FROM customers a
menos que necesite todos los campos de la tabla.
l Incluya una clusula WHERE para limitar el nmero de registros transferidos. Cuanto ms
especfica sea la clusula WHERE, menos registros se transmitirn al equipo y con ms rapidez
se terminar la consulta.
l Si no puede predecir durante el diseo los valores que se van a utilizar en una clusula
WHERE, puede utilizar parmetros en la clusula. Cuando se ejecute la consulta, Visual
FoxPro usar el valor de una variable de parmetro o solicitar al usuario el valor de bsqueda.
Por ejemplo, esta consulta permite a la aplicacin o al usuario rellenar la regin en el tiempo de
ejecucin:
Cuando se usa una vista para actualizar una tabla en un origen de datos remoto, Visual FoxPro debe
comprobar si los registros que se estn actualizando han sufrido alguna modificacin. Para ello,
Visual FoxPro debe examinar los datos en el servidor y compararlos con los datos existentes en su
equipo. En algunos casos, esta operacin puede resultar lenta.
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 83 de 87
Para optimizar el proceso de actualizacin de datos en orgenes de datos remotos, puede especificar la
forma en que Visual FoxPro debe comprobar los registros modificados. Para ello, tiene que indicar la
clusula WHERE que Visual FoxPro debe generar para realizar la actualizacin.
Imagine, por ejemplo, que est usando una vista basada en una tabla de clientes en un origen de datos
remoto. Ha creado la vista mediante una instruccin SELECT - SQL como la siguiente:
Quiere actualizar los cuatro campos que ha especificado en la vista, salvo el campo clave (cust_id).
En la tabla siguiente se presenta la clusula WHERE que Visual FoxPro generar para cada una de
las opciones disponibles en la clusula SQL WHERE.
Nota La funcin OLDVAL( ) devuelve la versin preactualizada de los campos que se han
modificado y la funcin CURVAL( ) devuelve el valor actual almacenado en el origen de datos
remoto. Si compara estos valores, Visual FoxPro puede determinar si el registro ha cambiado en el
origen de datos remoto desde que se transfiri al equipo.
En general, debera elegir una opcin para la clusula SQL WHERE en este orden de preferencia:
1. Clave y marca de hora, si la base de datos remota admite los campos de marca de hora, que es
la forma ms rpida de indicar si se ha modificado algn registro.
2. Campos clave y modificados, porque los campos que se actualizan en el servidor son casi
siempre un subconjunto del nmero total de campos que se podra actualizar.
4. Slo campos clave. El uso de esta configuracin implica que el servidor remoto insertar un
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 84 de 87
registro totalmente nuevo que use la clave modificada y eliminar el registro anterior.
Algunos servidores (como Microsoft SQL Server) permiten enviar un lote de instrucciones SQL en
un solo paquete. Esto aumenta el rendimiento porque se reduce el trfico de la red y porque el
servidor puede compilar mltiples instrucciones a la vez.
Por ejemplo, si especifica un tamao de lote de cuatro y actualiza 10 registros en una base de datos,
Visual FoxPro enva en un solo lote cuatro instrucciones como la siguiente a la base de datos del
servidor:
O bien
O bien
1. En el Diseador de vistas, elija Opciones avanzadas del men Consulta para abrir el cuadro
de dilogo Opciones avanzadas.
2. En el rea Rendimiento, situada junto a Nmero de registros para actualizar por lotes,
especifique el nmero de instrucciones que se van a enviar en un lote.
Nota Debera probar con diferentes valores para esta propiedad y la propiedad PacketSize
para optimizar las actualizaciones.
Puede optimizar el acceso a servidores remotos; para ello, ajuste el tamao del paquete de red que se
enva y se obtiene de la base de datos remota. Por ejemplo, si la red admite tamaos grandes (ms de
4096 bytes), puede aumentar el tamao del paquete en Visual FoxPro con el fin de enviar ms datos
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 85 de 87
Nota Es posible que distintos proveedores de red administren esta propiedad de forma distinta
por lo que deber consultar la documentacin de su servicio de red. Novell NetWare, por
ejemplo, tiene un tamao de paquete mximo de 512 bytes por lo que si se establece la
propiedad PacketSize a un valor superior a ste no se obtendr ninguna ventaja adicional.
Si est almacenando datos memo o binarios en un servidor remoto, puede aumentar el rendimiento;
para ello, retarde la transferencia de estos datos hasta que la aplicacin la requiera realmente.
O bien
Muchas aplicaciones incluyen datos de consulta estticos, como abreviaturas de estados, cdigos
postales y cargos de empleados. Si la aplicacin contiene este tipo de datos y si la tabla no es
demasiado grande, podra aumentar la velocidad de la aplicacin; para ello, mantenga copias de esta
informacin en el equipo de cada usuario, ya que las consultas no generan trfico de red.
Esta tcnica es especialmente til para los datos que nunca cambian o lo hacen muy espordicamente.
Si los datos cambian en alguna ocasin, debe disear una estrategia para transferir una copia nueva de
la tabla de consultas al equipo de cada usuario.
Puede aumentar el rendimiento de la aplicacin si crea reglas locales a nivel de campo y de registro
en Visual FoxPro, en lugar de utilizar las reglas definidas en el servidor. Estas reglas pueden impedir
que los datos que no son compatibles con las reglas de datos o de la empresa se introduzcan en la
base de datos.
Mediante la definicin de reglas en Visual FoxPro, se detectan los datos no vlidos antes de enviarse
a travs de la red, lo que es ms rpido y ofrece un mejor control para administrar las condiciones de
error. Sin embargo, el uso de reglas locales tambin implica su coordinacin con las reglas del
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 86 de 87
servidor remoto. Por ejemplo, si se modifican las reglas del servidor, tendra que cambiar las reglas
locales para que coincidieran.
Para obtener informacin sobre la creacin de reglas locales, vea la seccin Actualizar datos en una
vista del captulo 8, "Crear vistas".
Si los datos no incluyen marcas diacrticas, como acentos () o diresis (), puede aumentar el
rendimiento mediante la secuencia de ordenacin del equipo porque:
l Las claves de ndices que no son del equipo son dos veces ms grandes puesto que contienen la
informacin diacrtica.
l La ordenacin que no es del equipo usa muchas reglas especiales para indexar caracteres con el
fin de que devuelvan los resultados adecuados.
Dado que la secuencia de ordenacin del equipo es ms rpida, se suele preferir para combinaciones y
bsquedas mientras que otras secuencias de ordenacin resultan perfectas para ordenar registros.
Cuando cree un ndice, Visual FoxPro usa el valor actual de SET COLLATE. Por tanto, si desea crear
dos ndices con dos secuencias de ordenacin, puede usar una secuencia de comandos como la
siguiente:
Cuando desee buscar, seleccionar o combinar el campo lastname, ejecute el comando SET
COLLATE TO "MACHINE" antes de realizar la operacin. Rushmore utilizar el ndice creado en la
secuencia de ordenacin del equipo y la operacin de bsqueda ser muy rpida.
Cuando ejecute un comando SELECT - SQL, Visual FoxPro usar la secuencia de ordenacin actual
para realizar la bsqueda y para las clusulas ORDER BY y GROUP BY. Si desea buscar y ordenar
mediante diferentes secuencias de ordenacin, puede dividir los comandos SQL en dos pasos, como
se indica a continuacin:
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 87 de 87
file://C:\temp\~hhA455.htm 30/05/2000