Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Visual FoxPro es una eficaz herramienta de administracin de datos, pero adems podr beneficiarse
de toda su eficacia para crear aplicaciones. Comprender las tcnicas de programacin orientada a
objetos y el modelo controlado por eventos puede aumentar su productividad como programador.
Cuando programe una aplicacin, organice sus componentes con el Administrador de programas, una
forma integrada de generar y probar su aplicacin a medida que la cree.
Con la programacin orientada a objetos, puede crear componentes de aplicacin independientes que
respondan a acciones del usuario y al sistema y que se puedan mantener y reutilizar fcilmente.
El modelo de eventos define cundo y cmo tienen lugar las interacciones con el usuario y el sistema.
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
2 of 804
l Ventajas de la programacin
l La mecnica de la programacin en Visual FoxPro
l Conceptos bsicos de programacin
l El proceso de la programacin
l Usar procedimientos y funciones definidos por el usuario
l Pasos siguientes
Ventajas de la programacin
Normalmente, cualquier funcin que pueda realizar con un programa podr realizarla tambin a
mano, si dispone de suficiente tiempo. Por ejemplo, si desea consultar informacin sobre un cliente
en una tabla de clientes, como por ejemplo la empresa Ernst Handel, podra hacerlo manualmente si
sigue una secuencia concreta de instrucciones.
5. Desplcese por la tabla, examinando el campo Company de los registros hasta encontrar Ernst
Handel.
Mediante programacin podra conseguir el mismo resultado escribiendo los siguientes comandos de
Visual FoxPro en la ventana Comandos:
USE Customer
LOCATE FOR Company = "Ernst Handel"
BROWSE
Cuando haya localizado el pedido de esta empresa, tal vez desee incrementar la cantidad mxima del
pedido en un 3%.
2. Multiplique el valor mostrado en el campo max_ord_amt por 1,03 y escriba el nuevo valor en
el campo.
Para conseguir el mismo resultado mediante programacin, escriba el siguiente comando de Visual
FoxPro en la ventana Comandos:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
3 of 804
Es relativamente sencillo cambiar la cantidad mxima del pedido para un cliente, ya sea manualmente
o escribiendo las instrucciones en la ventana Comandos. Sin embargo, suponga que desea
incrementar en un 3% la cantidad mxima de pedido de todos los clientes. Podra hacerlo
manualmente, pero le llevara mucho tiempo y es posible que cometiese errores. Si especifica las
instrucciones correctas en un archivo de programa, Visual FoxPro podr realizar esta tarea con
rapidez y facilidad, sin cometer ningn error.
Programa de ejemplo para incrementar las cantidades mximas de pedido de todos los clientes
Cdigo Comentarios
USE customer Abre la tabla CUSTOMER.
En las siguientes secciones se describe la mecnica, los conceptos y los procesos que subyacen a ste
y otros programas de Visual FoxPro.
l La ventana Comandos.
l Archivos de programa
l Ventanas de cdigo de eventos o de mtodos en el Diseador de formularios o en el Diseador
de clases
l Ventanas de cdigo de procedimientos en el Diseador de mens
l Ventanas de cdigo de procedimientos en el Diseador de informes
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
4 of 804
Puede ejecutar varias lneas de cdigo en la ventana Comandos como si constituyeran un programa.
Como la ventana Comandos es una ventana de edicin, puede modificar comandos con las
herramientas disponibles en Visual FoxPro. Puede modificar, insertar, eliminar, cortar, copiar o pegar
texto en la ventana Comandos.
La ventaja que supone poder escribir cdigo en la ventana Comandos radica en el hecho de que las
instrucciones se ejecutan de inmediato. No es necesario guardar un archivo y ejecutarlo como un
programa.
Adems, las opciones que elige en los mens y los cuadros de dilogo aparecen en la ventana
Comandos como comandos. Puede copiar y pegar estos comandos en un programa de Visual FoxPro
y a continuacin ejecutar el programa repetidamente, lo cual facilita la ejecucin de miles de
comandos, una y otra vez.
Crear programas
Un programa de Visual FoxPro es un archivo de texto que contiene una serie de comandos. Puede
crear un programa en Visual FoxPro de una de las siguientes maneras:
2. Elija Nuevo.
O bien
O bien
30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
5 of 804
MODIFY COMMAND
Visual FoxPro abrir una nueva ventana denominada Programa1. Podr entonces escribir su
programa en esta ventana.
Guardar programas
Si intenta cerrar un programa sin antes guardarlo, aparecer un cuadro de dilogo en el que se le
preguntar si desea guardar o descartar los cambios realizados en el mismo.
Modificar programas
Despus de guardar el programa, podr modificarlo. En primer lugar, abra el programa de una de las
siguientes maneras:
O bien
l En el men Archivo, elija Abrir. Aparecer un cuadro de dilogo en el que se muestra una
lista de los archivos disponibles. En la lista Archivos de tipo, elija Programa. En la lista de
archivos, seleccione el programa que desea modificar y elija Abrir.
O bien
O bien
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
6 of 804
MODIFY COMMAND ?
Despus de abrir el programa, podr realizar cambios en el mismo. Cuando haya terminado de
introducir los cambios, asegrese de guardar el programa.
Ejecutar programas
O bien
O bien
DO miprogram
Para aprovechar plenamente la eficacia de Visual FoxPro, debe utilizar estas herramientas de diseo.
Si desea ms informacin sobre el Diseador de informes, consulte el captulo 7, Disear informes y
etiquetas, del Manual del usuario. Para obtener informacin ms detallada sobre el Diseador de
formularios, consulte el captulo 3, Programacin orientada a objetos, de este manual. Para obtener
informacin ms detallada sobre el Diseador de formularios, consulte el captulo 9, Crear
formularios, y si desea ms informacin acerca del Diseador de mens, consulte el captulo 11,
Disear mens y barras de herramientas.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
7 of 804
Cuando se programa, se almacenan datos y se manipulan mediante una serie de instrucciones. Los
datos y los contenedores en los que se almacenan los datos constituyen la materia prima de la
programacin. Las herramientas utilizadas para manipular esta materia prima son comandos,
funciones y operadores.
Almacenar datos
Los datos con los que trabaja probablemente incluyan perodos de tiempo, dinero y elementos
contables, as como fechas, nombres, descripciones, etc. Cada dato corresponde a un determinado
tipo, es decir, pertenece a una categora de datos que se manipula de maneras similares. Podra
trabajar directamente con estos datos sin almacenarlos, si bien perdera la mayor parte de la
flexibilidad y potencia que ofrece Visual FoxPro. Visual FoxPro aporta numerosos contenedores de
almacenamiento con el fin de ampliar su capacidad para manipular fcilmente los datos.
Los tipos de datos determinan la manera en que se almacenan los datos y la forma en que se pueden
utilizar tales datos. Puede multiplicar dos nmeros, pero no puede multiplicar caracteres. Puede
imprimir caracteres en maysculas, pero no puede imprimir nmeros en maysculas. En la tabla
siguiente se muestran algunos de los principales tipos de datos de Visual FoxPro.
Tipos de datos
Tipo Ejemplos
Numeric 123
3,1415
7
Character Prueba
123
01/01/98
Logical .T. (verdadero)
.F. (falso)
Date {^1998-01-01}
Contenedores de datos
Los contenedores de datos le permiten realizar las mismas operaciones con varios datos. Por ejemplo,
sumar las horas que ha trabajado un empleado, multiplicarlas por el salario por hora y restar los
impuestos para determinar el sueldo que ha percibido el empleado. Deber realizar estas operaciones
para cada empleado y para cada perodo de pago. Si almacena esta informacin en contenedores y
realiza las operaciones sobre stos, bastar con sustituir los datos antiguos por los nuevos datos y
volver a ejecutar el mismo programa. En la siguiente tabla se enumeran algunos de los principales
contenedores de datos disponibles en Visual FoxPro:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
8 of 804
Tipo Descripcin
Variables Elementos individuales de datos almacenados en la memoria RAM
(memoria de acceso aleatorio) del PC.
Registros de tabla Varias filas de campos predeterminados, cada uno de los cuales puede
contener un dato definido previamente. Las tablas se guardan en disco.
Matrices Varios elementos de datos almacenados en la memoria RAM.
Manipular datos
Los contenedores y los tipos de datos le ofrecen los mdulos que necesita para manipular los datos.
Los elementos finales son los operadores, las funciones y los comandos.
Usar operadores
Los operadores se utilizan para vincular los datos. A continuacin se muestran los operadores
utilizados habitualmente en Visual FoxPro.
*, / Numeric ? 5 * 5 Imprime 25
? 25 / 5
Imprime 5
Nota Un signo de interrogacin (?) situado delante de una expresin imprime el resultado de la
expresin y un carcter de nueva lnea en la ventana de salida activa, que es normalmente la ventana
principal de Visual FoxPro.
Recuerde que debe utilizar el mismo tipo de datos con cada operador. Las siguientes instrucciones
almacenan dos datos numricos en dos variables. Los nombres de variable empiezan con la letra n,
por lo que se puede determinar de inmediato que contienen datos numricos, pero puede nombrarlas
con cualquier combinacin de caracteres alfanumricos y caracteres de subrayado.
nPrimero = 123
nSegundo = 45
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
9 of 804
Las instrucciones siguientes almacenan dos datos de caracteres en dos variables. Los nombres de
variable empiezan con la letra c para indicar que contienen datos de tipo character.
cPrimero = "123"
cSegundo = "45"
Las dos operaciones siguientes, suma y concatenacin, producen resultados distintos, ya que el tipo
de datos es diferente en cada una de ellas.
? nPrimero + nSegundo
? cPrimero + cSegundo
Resultado
168
12345
Puesto que cPrimero contiene caracteres y nSegundo contiene datos numricos, se producir un error
de tipo de datos incorrecto si se intenta ejecutar el siguiente comando:
? cPrimero + nSegundo
Puede evitar este problema si utiliza funciones de conversin. Por ejemplo, STR( ) devuelve el valor
de tipo Character equivalente de un valor de tipo Numeric, mientras que VAL( ) devuelve el
equivalente numrico de una cadena de caracteres formada por nmeros. Estas funciones y LTRIM( ),
que elimina los espacios iniciales, le permiten realizar las operaciones siguientes:
? cPrimero + LTRIM(STR(nSegundo))
? VAL(cPrimero) + nSegundo
Resultado
12345
168
Usar funciones
Las funciones devuelven un tipo especfico de datos. Por ejemplo, las funciones STR( ) y VAL( )
utilizadas en la seccin anterior devuelven valores de tipo Character y Numeric, respectivamente. Al
igual que ocurre con todas las funciones, estos tipos devueltos estn documentados con las funciones.
l Asignar a una variable el valor que devuelve la funcin. La siguiente lnea de cdigo almacena
la fecha actual del sistema en una variable denominada dHoy:
dHoy = DATE( )
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
10 of 804
CD GETDIR( )
l Imprimir el valor devuelto en la ventana de salida activa. La siguiente lnea de cdigo imprime
la hora actual del sistema en la ventana principal de Visual FoxPro:
? TIME( )
l Llamar a la funcin sin almacenar en ningn lugar el valor devuelto. La siguiente llamada de
funcin desactiva el cursor:
SYS(2002)
? DOW(DATE( ))
Funcin Descripcin
ISDIGIT( ) Devuelve el valor verdadero (.T.) si el carcter situado al comienzo de
una cadena es un nmero; de lo contrario, devuelve el valor falso (.F.).
FIELD( ) Devuelve el nombre de un campo.
LEN( ) Devuelve el nmero de caracteres de una expresin de caracteres.
RECCOUNT( ) Devuelve el nmero de registros de la tabla que est activa en este
momento.
SUBSTR( ) Devuelve el nmero especificado de caracteres a partir de una cadena de
caracteres, empezando en una posicin especificada de la cadena.
Usar comandos
Un comando hace que se realice una determinada accin. Cada comando dispone de una sintaxis
especfica que indica lo que se debe incluir con el fin de que se ejecute correctamente el comando.
Hay tambin clusulas opcionales asociadas a los comandos que permiten especificar de forma ms
detallada la accin que se desea realizar.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro
11 of 804
en el rea de trabajo.
USE customer IN 0 Abre la tabla CUSTOMER en la siguiente rea de
trabajo disponible.
USE customer IN 0 ; Abre la tabla CUSTOMER en la siguiente rea de
ALIAS miCliente
trabajo disponible y asigna al rea de trabajo el
alias miCliente.
Comando Descripcin
DELETE Selecciona registros especificados de una tabla para su eliminacin.
REPLACE Sustituye el valor almacenado en el campo del registro por un nuevo
valor.
Go Coloca el puntero de registro en una posicin especfica de la tabla.
Visual FoxPro incluye una categora especial de comandos que "envuelven" a otros comandos y
funciones, y determinan cundo y con qu frecuencia se ejecutan. Estos comandos permiten realizar
bifurcaciones condicionales y bucles, dos herramientas de programacin muy eficaces. El siguiente
programa muestra el uso de las bifurcaciones y los bucles condicionales. Estos conceptos se describen
de forma ms detallada despus del ejemplo.
Suponga que su empresa cuenta con 10.000 empleados y desea conceder a todos aqullos que ganan
3.000.000 de pesetas o ms un aumento salarial del 3%, y a todos los que ganan menos de 3.000.000
de pesetas un aumento del 6%. El siguiente ejemplo de programa le permite hacerlo.
Este programa presupone que en el rea de trabajo actual est abierta una tabla que contiene un
campo numrico denominado salario. Si desea obtener informacin sobre las reas de trabajo,
consulte "Usar mltiples tablas" en el captulo 7, Trabajar con tablas..
Cdigo Observaciones
SCAN El cdigo comprendido entre SCAN y ENDSCAN
se ejecuta tantas veces como registros haya en la
tabla. Cada vez que se ejecuta el cdigo, el
puntero de registro se desplaza al siguiente
registro de la tabla.
IF salario >= 3000000 Para cada registro, si el salario es mayor o igual
REPLACE salary WITH ;
salario * 1,03 que 3.000.000, este valor se sustituye por un
nuevo salario que es un 3% superior.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 12 de 83
12 of 804
Este ejemplo utiliza comandos de bifurcacin y bucle condicional para controlar el desarrollo del
programa.
Bifurcacin condicional
Nota Un asterisco al principio de una lnea de un programa indica que la lnea es un comentario.
Los comentarios ayudan al programador a recordar la funcin que debe realizar cada segmento de
cdigo, si bien Visual FoxPro los pasa por alto.
Si se desea comprobar varias condiciones posibles, un bloque DO CASE ... ENDCASE puede
resultar ms eficaz que varias instrucciones IF y adems es ms fcil realizar un seguimiento del
mismo.
Bucles
Un bucle le permite ejecutar una o ms lneas de cdigo tantas veces como sea necesario. En Visual
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 13 de 83
13 of 804
FoxPro hay tres comandos que permiten realizar bucles:
Utilice SCAN cuando realice una serie de acciones para cada uno de los registros de una tabla, como
en el ejemplo de programa descrito anteriormente. El bucle SCAN permite escribir el cdigo una vez
y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla.
Utilice FOR cuando sepa cuntas veces debe ejecutarse la seccin de cdigo. Por ejemplo, sabe que
una tabla contiene un nmero especfico de campos. Puesto que la funcin FCOUNT( ) de Visual
FoxPro devuelve este nmero, puede utilizar un bucle FOR para imprimir los nombres de todos los
campos de la tabla:
Utilice DO WHILE cuando desee ejecutar una seccin de cdigo mientras cumpla una determinada
condicin. Tal vez no sepa cuntas veces debe ejecutarse el cdigo, pero s sabe cundo debe
detenerse la ejecucin. Por ejemplo, supongamos que dispone de una tabla en la que figuran los
nombres y las iniciales de una serie de personas y desea utilizar las iniciales para consultar los
nombres de las personas. Surgira un problema la primera vez que intentase agregar una persona
cuyas iniciales fuesen las mismas que las de otra persona contenida en la tabla.
Para resolver este problema, podra agregar un nmero a las iniciales. Por ejemplo, el cdigo de
identificacin de Miguel Surez podra ser MS. La siguiente persona cuyas iniciales fuesen las
mismas, Margarita Snchez, sera MS1. Si a continuacin anexase Mara Sanz a la tabla, su cdigo de
identificacin sera MS2. Un bucle DO WHILE permite localizar el nmero correcto que se debe
adjuntar a las iniciales.
Programa de ejemplo que utiliza DO WHILE para generar un nmero de identificacin nico
Cdigo Comentarios
nAqu = RECNO() Guardar la posicin del registro.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 14 de 83
14 of 804
funcin FOUND( ) devolver el valor verdadero
(.T.) y se ejecutar el cdigo contenido en el bucle
DO WHILE.
Si no se encuentra ninguna coincidencia, la
siguiente lnea de cdigo que se ejecute ser la
lnea que figura a continuacin de ENDDO.
nSufijo = nSufijo + 1 Preparar un sufijo nuevo y anexarlo al final de las
cIniciales = ;
LEFT(cIniciales,2); iniciales.
+ ALLTRIM(STR(nSufijo))
Puesto que no hay manera de saber de antemano cuntas veces se encontrarn los cdigos de
identificacin coincidentes que ya se estn utilizando, se utiliza el bucle DO WHILE.
El proceso de la programacin
Cuando entienda los conceptos bsicos, la programacin ser un proceso reiterativo. Los pasos se
repiten numerosas veces, perfeccionndose el cdigo a medida que se avanza. Al principio, someter
el cdigo a prueba frecuentemente mediante un sistema de prueba y tanteo. Cuanto ms conozca el
lenguaje, mayor ser la rapidez con que pueda programar y podr realizar ms pruebas preliminares
mentalmente.
l Definir el problema.
l Desglosar el problema en elementos discretos.
l Construir los elementos.
l Comprobar y perfeccionar los elementos.
l Ensamblar los elementos.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 15 de 83
15 of 804
l Comprobar el programa en su conjunto.
A continuacin se enumeran algunos aspectos que debe tener presentes al empezar a programar:
l Defina claramente el problema antes de intentar resolverlo. Si no lo hace, acabar por realizar
numerosos cambios, desechar cdigo, tendr que empezar de nuevo o bien terminar con un
resultado que no es realmente lo que deseaba.
l Desglose el problema en pasos manejables, en lugar de intentar resolver todo el problema de
una sola vez.
l Pruebe y depure secciones de cdigo a medida que desarrolla el programa. Compruebe que el
cdigo hace lo que quiere que haga. La depuracin es el proceso de encontrar y solucionar
problemas que impiden que el cdigo se ejecute correctamente.
l Perfeccione los datos y el almacenamiento de datos para facilitar la manipulacin de estos
datos a travs del cdigo del programa. Esto suele implicar estructurar las tablas de forma
adecuada.
En el resto de esta seccin se describen los pasos que debe seguir para construir un pequeo programa
Visual FoxPro.
Definir el problema
Antes de poder resolver un problema, debe formularlo claramente. Algunas veces, si ajusta la
formulacin del problema podr ver ms opciones para resolverlo.
Suponga que obtiene muchos datos de distintos orgenes. Si bien la mayora de los datos son
estrictamente numricos, algunos valores contienen guiones y espacios en blanco adems de
nmeros. Suponga que quiere eliminar todos los espacios en blanco y los guiones de dichos campos y
guardar los datos numricos.
En lugar de intentar eliminar los espacios en blanco y los guiones de los datos originales, podra
formular el objetivo del programa como:
Objetivo Reemplazar los valores existentes de un campo por otros valores que contengan todo lo
que contenan los valores originales, excepto los espacios en blanco y los guiones.
Esta formulacin evita la dificultad que supone manipular una cadena de caracteres cuya longitud
sigue cambiando a medida que trabaja con ella.
Descomponer el problema
Puesto que tiene que indicar instrucciones especficas a Visual FoxPro en trminos de operaciones,
comandos y funciones, debe descomponer el problema en pasos discretos. La tarea ms discreta para
este problema sera examinar cada carcter de la cadena. Hasta que pueda examinar un carcter
individualmente, no podr determinar si desea guardarlo.
Una vez que examine un carcter, deber comprobar si se trata de un guin o de un espacio en
blanco. En este momento, quiz desee refinar la declaracin del problema. Y si obtuviera ms
adelante datos que contienen parntesis de apertura y de cierre? Y si desea deshacerse de los
smbolos de moneda, las comas y los puntos? Cuanto ms genrico pueda hacer el cdigo, ms
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 16 de 83
16 of 804
trabajo se ahorrar de ahora en adelante; lo principal es ahorrar trabajo. He aqu una formulacin del
problema vlida para una variedad mucho mayor de datos:
Objetivo refinado Reemplazar los valores existentes en un campo por otros valores que contengan
nicamente los caracteres numricos de los valores originales.
Con esta formulacin, ahora puede volver a plantear el problema a nivel de carcter: si el carcter es
numrico, guardar el carcter; si el carcter es no numrico, pasar al siguiente carcter. Cuando haya
construido una cadena que slo contenga los elementos numricos de la cadena inicial, podr
reemplazar la primera cadena y pasar al siguiente registro hasta que haya terminado con todos los
datos.
4. Cuando haya terminado con todos los caracteres de la cadena original, reemplazar la cadena
original con la cadena que slo contiene valores numricos.
Cuando sepa qu debe hacer, puede empezar a formular los elementos en trminos de comandos,
funciones y operadores de Visual FoxPro.
Como los comandos y funciones se usan para manipular datos, tiene algunos datos de prueba para
trabajar con ellos. Los datos de prueba sirven para simular los datos verdaderos lo mejor posible.
Para este ejemplo puede almacenar en una variable una cadena de prueba introduciendo el siguiente
comando en la ventana Comandos:
En primer lugar desea buscar un nico carcter en la cadena. Para obtener una lista de funciones que
se pueden utilizar para manipular cadenas, vea Funciones de carcter.
Ver tres funciones que devuelven determinadas secciones de una cadena: LEFT( ), RIGHT( ) y
SUBSTR( ). De estas tres funciones, SUBSTR( ) devuelve caracteres de cualquier parte de la cadena.
SUBSTR( ) usa tres argumentos o parmetros: la cadena, la ubicacin inicial dentro de la cadena y el
nmero de caracteres que se deben devolver de la cadena, empezando por la ubicacin inicial. Para
comprobar si SUBSTR( ) va a hacer lo que usted quiere, podra escribir los siguientes comandos en la
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 17 de 83
17 of 804
ventana Comandos:
? SUBSTR(cTest, 1, 1)
? SUBSTR(cTest, 3, 1)
? SUBSTR(cTest, 8, 1)
Resultado
1
3
-
Puede ver que en la ventana principal de Visual FoxPro se muestran el primer, el tercer y el octavo
caracteres de la cadena de prueba.
Para hacer eso mismo varias veces, utilice un bucle. Puesto que la cadena de prueba tiene un nmero
determinado de caracteres (14), puede utilizar un bucle FOR. El contador del bucle FOR se
incrementa cada vez que se ejecuta el cdigo del bucle, por lo que puede utilizar el contador de la
funcin SUBSTR( ). Puesto que en la ventana Comandos no puede comprobar las construcciones de
bucles, deber probar la siguiente seccin de cdigo en un programa de ejemplo.
FOR nCnt = 1 TO 14
? SUBSTR(cTest, nCnt, 1)
ENDFOR
Cuando ejecute este programa, los caracteres individuales de la cadena de prueba se imprimirn en
lneas distintas en la ventana principal de Visual FoxPro.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 18 de 83
18 of 804
Cuando tenga un nico carcter de la cadena, debe saber si se trata de un nmero. Puede hacerlo con
ISDIGIT( ).
? ISDIGIT('2')
? ISDIGIT('-')
? ISDIGIT(SUBSTR(cTest, 3, 1))
Resultado
.T.
.F.
.T.
Ahora que puede examinar los caracteres y determinar si son o no numricos, necesita una variable
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 19 de 83
19 of 804
para almacenar los valores numricos: cNumOnly.
Para crear la variable, debe asignarle un valor inicial, una cadena de longitud cero:
cNumOnly = ""
A medida que el bucle FOR recorre la cadena, es conveniente crear otra variable para almacenar
temporalmente cada carcter de la cadena a medida que sta se manipula:
La siguiente lnea de cdigo puede utilizarse cada vez que se encuentra un nmero para sumar el
nmero a la segunda cadena:
cNumOnly = ""
FOR nCnt = 1 TO 14
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
Si agrega un par de comandos al final para imprimir las cadenas y ejecutar el programa, podr ver que
el programa funciona con la cadena de prueba:
cNumOnly = ""
FOR nCnt = 1 TO 14
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? cTest
? cNumOnly
Resultado
123-456-7 89 0
1234567890
El resultado parece correcto. Pero si cambia la cadena de prueba mientras comprueba los elementos,
puede tener problemas. Escriba el siguiente comando en la ventana Comandos y ejecute de nuevo el
programa:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 20 de 83
20 of 804
El programa generar un mensaje de error. El bucle FOR ha intentado ejecutarse 14 veces, pero en la
cadena slo haba 10 caracteres. Necesita una forma de ajustar las longitudes variables de las cadenas.
Use LEN( ) para devolver el nmero de caracteres de una cadena. Si sustituye este comando en el
bucle FOR, ver que el programa funciona correctamente con ambas cadenas de prueba:
cNumOnly = ""
FOR nCnt = 1 TO LEN(cTest)
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? cTest
? cNumOnly
Para completar la solucin de programacin para este problema, quiz desee volver a leer sus datos
de una tabla. Cuando tenga una tabla, explore los registros y aplique su cdigo de programa a un
campo de la tabla, en lugar de a una variable.
En primer lugar, podra crear una tabla temporal que contuviera diversas cadenas de prueba. Dicha
tabla podra contener un nico campo de caracteres llamado Testfield y cuatro o cinco registros:
Contenido de Testfield
123-456-7 89 0 -9221 9220 94321 99-
456-789 22 000001 98-99-234
Cuando sustituya el nombre de la cadena de prueba por el nombre del campo, el programa ser
similar al siguiente:
Puede ajustar manualmente el puntero de registro si examina la tabla y se desplaza por ella. Cuando
el puntero de registro est en cada uno de los registros, el programa funcionar de la forma deseada.
O bien, ahora puede envolver el cdigo de desplazamiento por la tabla en el resto de su programa:
SCAN
cNumOnly = ""
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 21 de 83
21 of 804
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? TestField
? cNumOnly
?
ENDSCAN
Resultado
123-456-7 89 0
1234567890
456-789 22
45678922
000001 98-99-234
0000019899234
En lugar de imprimir la cadena al final del programa, quiz desee guardarla en la tabla. Para ello,
utilice la siguiente lnea de cdigo:
SCAN
cNumOnly = ""
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
REPLACE TestField WITH cNumOnly
ENDSCAN
Cuando tenga el programa completo, necesitar probarlo con los datos de ejemplo antes de probarlo
con los datos reales.
Un programa robusto hace lo que usted quiere que haga, pero tambin se anticipa a posibles
problemas y se encarga de ellos. Este programa hace lo que usted quiere, pero hace algunas
suposiciones que deben ser verdaderas para que funcione:
Si la tabla no est abierta en el rea de trabajo actual o si la tabla no tiene un campo de caracteres con
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 22 de 83
22 of 804
el nombre esperado, el programa generar un mensaje de error y no realizar la tarea prevista.
Programa para eliminar los caracteres no numricos de todos los registros de un campo
Cdigo Comentarios
lFieldOK = .F. Esta variable determina si existen las
condiciones necesarias para que el programa
funcione. Inicialmente se establece la variable
como falsa (.F.) para suponer que las
condiciones necesarias no existen.
FOR nCnt = 1 TO FCOUNT( ) Esta seccin de cdigo recorre todos los campos
IF FIELD(nCnt) = ;
UPPER("TestField") de la tabla actual hasta que encuentra un campo
IF TYPE("TestField") = "C" de caracteres llamado TestField. En cuanto se
lFieldOK = .T. encuentra el campo correcto, lFieldOK se
ENDIF establece como verdadera (.T.) y EXIT finaliza
EXIT
ENDIF el bucle (no hay ninguna razn para continuar
ENDFOR con la comprobacin una vez identificado el
campo correcto). Si ningn campo cumple el
criterio, lFieldOK seguir siendo falso (.F.).
IF lFieldOK La seccin de conversin del programa slo se
ejecuta si en la tabla activa actualmente hay un
campo de caracteres llamado TestField.
SCAN El cdigo de conversin.
cNumOnly = ""
FOR nCnt = 1 TO LEN(TestField)
cCharacter = ;
SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + ;
cCharacter
ENDIF
ENDFOR
La mayor limitacin de este programa es que slo puede utilizarlo para un campo. Si desea eliminar
los caracteres no numricos de un campo distinto de TestField, tendr que recorrer el programa y
cambiar cada aparicin de TestField por el nombre del otro campo.
Convertir el programa a un procedimiento, segn se explica en las prximas secciones, permite hacer
que el cdigo que ha escrito sea ms genrico y ms reutilizable, con lo que ahorrar trabajo ms
adelante.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 23 de 83
23 of 804
PROCEDURE miproc
* Esto es un comentario, pero podra ser cdigo ejecutable
ENDPROC
Tradicionalmente, los procedimientos contienen cdigo que usted escribe para realizar una operacin
y funciones que calculan y devuelven un valor. En Visual FoxPro, las funciones son similares a los
procedimientos:
FUNCTION mifuncin
* Esto es un comentario, pero podra ser cdigo ejecutable
ENDFUNC
Si incluye sus procedimientos y funciones en un archivo de programa distinto, podr hacer accesibles
estos procedimientos y funciones desde su programa si utiliza el comando SET PROCEDURE TO.
Por ejemplo, para un archivo llamado FUNPROC.PRG, utilice el siguiente comando en la ventana
Comandos:
DO miproc
O bien
mifuncin( )
Cada uno de estos mtodos puede ampliarse enviando o recibiendo valores desde el procedimiento o
la funcin.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 24 de 83
24 of 804
Nota Incluir los parmetros dentro de los parntesis en la lnea de definicin de un procedimiento o
una funcin, por ejemplo PROCEDURE miproc(cString), indica que el parmetro tiene alcance local
al procedimiento o la funcin. Tambin puede permitir que una funcin o un procedimiento acepte
parmetros de alcance local mediante LPARAMETERS.
Los parmetros funcionan de manera idntica en una funcin. Para enviar un valor como un
parmetro de este procedimiento o a una funcin, podra utilizar una cadena o una variable que
contuviera una cadena, como se muestra en la tabla siguiente.
Transferencia de parmetros
Cdigo Comentarios
DO miproc WITH cTestString Llama a un procedimiento y transfiere una
DO miproc WITH "cadena de prueba"
variable de caracteres o un literal de cadena.
Puede enviar mltiples valores a un procedimiento o funcin si los separa mediante comas. Por
ejemplo, el siguiente procedimiento espera tres parmetros: una fecha, una cadena de caracteres y un
nmero.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 25 de 83
25 of 804
El valor devuelto de forma predeterminada es verdadero (.T.), pero puede utilizar el comando
RETURN para devolver cualquier valor. Por ejemplo, la siguiente funcin devuelve una fecha
correspondiente a dos semanas despus de la fecha que se ha pasado como parmetro.
FUNCTION plus2weeks
PARAMETERS dDate
RETURN dDate + 14
ENDFUNC
La siguiente lnea de cdigo almacena el valor devuelto desde esta funcin en una variable:
dDeadLine = plus2weeks(DATE())
En la tabla siguiente se muestran las formas en que puede almacenar o mostrar valores devueltos por
una funcin.
Cdigo Comentarios
var = mifuncin( ) Almacena en una variable el valor devuelto por la
funcin.
? mifuncin( ) Imprime en la ventana activa de salida el valor
devuelto por la funcin.
Es conveniente comprobar que los parmetros enviados a su procedimiento o a su funcin son los que
espera recibir. Puede utilizar las funciones TYPE( ) y PARAMETERS( ) para comprobar el tipo y el
nmero de parmetros enviados a su procedimiento o a su funcin.
El ejemplo de la seccin anterior necesita recibir un parmetro de tipo Fecha. Puede utilizar la
funcin TYPE( ) para asegurarse de que el valor que su funcin recibe es del tipo adecuado.
Si un procedimiento espera menos parmetros de los que recibe, Visual FoxPro generar un mensaje
de error. Por ejemplo, si especific dos parmetros pero llam al procedimiento con tres parmetros,
obtendr un mensaje de error. Pero si un procedimiento espera ms parmetros de los que recibe, los
parmetros adicionales simplemente se inicializarn como falso (.F.). Puesto que no hay ninguna
forma de decir si el ltimo parmetro se estableci como falso (.F.) o se omiti, el siguiente
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 26 de 83
26 of 804
procedimiento comprueba que se ha enviado el nmero correcto de parmetros:
Cdigo Comentarios
FUNCTION NumbersOnly( cMixedVal ) Principio de la funcin, que acepta una cadena de
caracteres.
cNumOnly = "" Crea una cadena que slo tiene los caracteres
FOR nCnt = 1 TO LEN(cMixedVal)
cCharacter = ; numricos de la cadena original.
SUBSTR(cMixedVal, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = ;
cNumOnly + cCharacter
ENDIF
ENDFOR
Adems de permitirle utilizar este cdigo en mltiples situaciones, esta funcin mejora la legibilidad
del programa:
SCAN
REPLACE FieldName WITH NumbersOnly(FieldName)
ENDSCAN
O, ms sencillo an:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 27 de 83
27 of 804
Cmo avanzar
La programacin por procedimientos, junto con la programacin orientada a objetos y las
herramientas de diseo de Visual FoxPro, pueden ayudarle a programar una verstil aplicacin de
Visual FoxPro. El resto de este manual explica temas con los que se encontrar a medida que
programe aplicaciones de Visual FoxPro.
l Disear la aplicacin
l Crear bases de datos
l Crear clases
l Proporcionar acceso a la funcionalidad
l Proporcionar acceso a la informacin
l Pruebas y depuracin
Disear la aplicacin
Un diseo apropiado ahorra tiempo, esfuerzo, dinero y permite mantener la cordura al programar.
Cuanto ms implique a los usuarios en el proceso de diseo, mejor. No importa lo cuidadosamente
que se disee; aun as, acabar refinando las especificaciones a medida que avance el proyecto y los
usuarios le proporcionen informacin adicional.
Algunas de las decisiones de diseo que tome afectarn a la forma en que crear elementos de la
aplicacin. Quin utilizar la aplicacin? Cul es el centro de actividad del usuario? Con qu
cantidad de datos se supone que se trabajar? Se utilizarn servidores de datos de apoyo o los datos
sern exclusivamente locales para un nico usuario o para mltiples usuarios a travs de una red?
Considere estos factores antes de avanzar demasiado en el proyecto.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 28 de 83
28 of 804
Incluso si sus usuarios finales trabajan con clientes, pedidos y piezas, lo que determinar la forma en
que la aplicacin deber tratar los datos es el modo en que los usuarios trabajan con esa informacin.
Un formulario de entrada de pedidos, como el de Tastrade.app (en el directorio ...\Samples\Vfp98
\Tastrade de Visual Studio), puede ser necesario para algunas aplicaciones, pero no sera una buena
herramienta para administrar inventarios o para hacer un seguimiento de las ventas, por ejemplo.
Deber pensar ms en el rendimiento si trata con grandes conjuntos de datos. En el captulo 15,
Optimizar aplicaciones, se explican los mtodos para optimizar el rendimiento. Tambin puede
desear ajustar el modo en que los usuarios pueden desplazarse por los datos. Si tiene veinte o treinta
registros en una tabla, est bien que permita que los usuarios desplacen el puntero de registro de una
tabla un registro cada vez. Si tiene veinte o treinta mil registros, deber proporcionar otros sistemas
para obtener los datos deseados: agregar listas o cuadros de dilogos de bsqueda, filtros, consultas
personalizadas, etc. El captulo 10, Usar controles, explica la forma de utilizar una lista para
seleccionar registros especficos de una tabla. En el captulo 8, Crear vistas, se explica la creacin de
consultas parametrizadas.
Es conveniente crear la aplicacin pensando que mltiples usuarios tendrn acceso simultneo a la
base de datos. Visual FoxPro facilita la programacin para acceso compartido. En el captulo 17,
Programar para acceso compartido, se describen tcnicas para permitir que varios usuarios tengan
acceso simultneo a la base de datos.
Consideraciones internacionales
Si sabe que su aplicacin slo se utilizar en el entorno de un nico idioma, no debe preocuparse de
la internacionalizacin. Por otra parte, si desea ampliar su mercado, o si sus usuarios deben trabajar
con datos o configuraciones de entorno internacionales, deber tener en cuenta estos factores al crear
la aplicacin. En el captulo 18, Programar aplicaciones internacionales, se explican los puntos que
debe tener en cuenta cuando programe aplicaciones internacionales.
Si su aplicacin trata con datos remotos, deber administrarlos de forma diferente a como
administrara los datos nativos de Visual FoxPro. En el captulo 8, Crear vistas, se explica la forma de
crear vistas para datos locales o remotos. En la parte 6 del Manual del programador, Crear
soluciones cliente-servidor, se explica cmo disear aplicaciones que trabajen sin problemas con
datos remotos.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 29 de 83
29 of 804
rescritura.
Adems de tener en cuenta la imagen general durante la fase de diseo, tendrn que decidir cules
son las funciones necesarias, qu datos estn implicados y cmo debe estar estructurada la base de
datos. Tendr que disear una interfaz para que el usuario tenga acceso a la funcionalidad de la
aplicacin. Puede crear informes y consultas para que los usuarios puedan extraer informacin til de
sus datos.
Iniciar la programacin
Despus de haber pensado qu componentes son necesarios en la aplicacin, es posible que quiera
configurar un conjunto de directorios y un proyecto para organizar los archivos componentes que
desea crear para la aplicacin. Puede crear el conjunto de directorios mediante el Explorador de
Windows y puede crear el proyecto en el Administrador de proyectos o usar el Asistente para
aplicaciones para configurarlos a la vez. Este nuevo Asistente para aplicaciones abre el Generador de
aplicaciones para que pueda personalizar an ms un proyecto y los componentes que inicie en el
Asistente. Por compatibilidad con versiones anteriores, puede elegir el Asistente para aplicaciones
(5.0) anterior.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 30 de 83
30 of 804
El Administrador de proyectos
l Modificar y ejecutar partes de su aplicacin (formularios, mens, programas) con tan slo
algunos clics.
l Arrastrar clases, tablas y campos desde el Administrador de proyectos hasta el Diseador de
formularios o el Diseador de clases.
l Arrastrar clases entre bibliotecas de clases.
l Ver y modificar fcilmente sus tablas y bases de datos.
l Agregar descripciones para los componentes de la aplicacin.
l Arrastrar y colocar elementos entre proyectos.
Para obtener informacin detallada acerca del uso del Administrador de proyectos, consulte el
captulo 1, Introduccin, del Manual del usuario. Para obtener informacin acerca de la compilacin
de aplicaciones, consulte el captulo 13, Compilar una aplicacin, en este manual.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 31 de 83
31 of 804
de disear cualquier componente de interfaz o de manipulacin de datos. La creacin de una
estructura slida de la base de datos har que el trabajo de programacin sea mucho ms sencillo.
En el captulo 5, Disear bases de datos, el captulo 6, Crear bases de datos y el captulo 7, Trabajar
con tablas, se explican los temas de diseo y uso de Visual FoxPro para disear tablas y bases de
datos efectivas y eficaces.
Crear clases
Puede crear una aplicacin robusta, orientada a objetos y controlada por eventos utilizando
nicamente las clases de base de Visual FoxPro. Es posible que no tenga que crear una clase, pero
desear hacerlo. Adems de hacer que el cdigo sea ms manejable y sencillo de mantener, una
biblioteca de clases slida le permite crear rpidamente prototipos e incorporar funciones a una
aplicacin. Puede crear clases en un archivo de programa, en el Diseador de formularios (mediante
el comando Guardar como clase del men Archivo) o en el Diseador de clases.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 32 de 83
32 of 804
OLE en una aplicacin.
Probar y depurar
La prueba y depuracin es algo que la mayora de los programadores hace en cada paso del proceso
de desarrollo. Es conveniente probar y depurar a medida se va avanzando. Si crea un formulario,
querr asegurarse de que ste hace lo que se desea antes de continuar con otros elementos de su
aplicacin.
En el captulo 14, Probar y depurar aplicaciones, se explica el uso de las herramientas de depuracin
de Visual FoxPro para depurar sus aplicaciones y se ofrecen sugerencias para que el proceso resulte
ms sencillo.
Las mejoras en el lenguaje orientado a objetos de Visual FoxPro proporcionan un mayor control
sobre los objetos de las aplicaciones. Asimismo, facilitan la creacin y el mantenimiento de
bibliotecas de cdigo reutilizable, proporcionando:
l Cdigo ms compacto.
l Incorporacin ms sencilla del cdigo a las aplicaciones sin necesidad de elaborar esquemas de
asignacin de nombres.
l Menos complejidad al integrar cdigo de distintos archivos en una aplicacin.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 33 de 83
33 of 804
Un objeto tiene ciertas propiedades o atributos. Por ejemplo, un telfono tiene un color y un tamao
determinados. Cuando se instala un telfono en la oficina, tiene una determinada posicin sobre la
mesa. El receptor puede estar colgado o descolgado.
Los objetos que se crean en Visual FoxPro tambin tienen propiedades que estn determinadas por la
clase en la que se basa el objeto. Estas propiedades pueden establecerse en tiempo de diseo o en
tiempo de ejecucin.
Por ejemplo, en la tabla siguiente se indican algunas propiedades que puede tener una casilla de
verificacin.
Propiedad Descripcin
Caption Texto descriptivo que aparece junto a la casilla de verificacin.
Enabled Especifica si un usuario puede elegir o no la casilla de verificacin.
ForeColor Color del texto del ttulo.
Left Posicin del extremo izquierdo de la casilla de verificacin.
MousePointer Apariencia del puntero del mouse (ratn) cuando est situado sobre la
casilla de verificacin.
Top Posicin de la parte superior de la casilla de verificacin.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 34 de 83
34 of 804
Cada objeto reconoce y puede responder a determinadas acciones denominadas eventos. Un evento es
una actividad especfica y predeterminada, iniciada por el usuario o por el sistema. Los eventos, en la
mayor parte de los casos, se generan por interaccin del usuario. Por ejemplo, con un telfono, se
desencadena un evento cuando un usuario descuelga el receptor. Los eventos tambin se
desencadenan cuando el usuario presiona los botones para efectuar una llamada.
En Visual FoxPro, las acciones del usuario que desencadenan eventos incluyen clics, movimientos
del mouse y pulsaciones de teclas. Inicializar un objeto y encontrar una lnea de cdigo que produce
un error son eventos iniciados por el sistema.
Los mtodos son procedimientos asociados a un objeto. Los mtodos se diferencian de los
procedimientos normales de Visual FoxPro en que estn vinculados inseparablemente a un objeto y
tienen nombres distintos que los procedimientos normales de Visual FoxPro.
Los eventos pueden tener mtodos asociados. Por ejemplo, si escribe cdigo de mtodo para el
evento Click, ese cdigo se ejecutar cuando se produzca el evento Click. Los mtodos tambin
pueden existir independientemente de los eventos. Se debe llamar a estos mtodos de forma explcita
en el cdigo.
El conjunto de eventos es limitado, aunque amplio. No es posible crear nuevos eventos. Sin embargo,
el conjunto de mtodos puede ampliarse indefinidamente.
La tabla siguiente muestra algunos de los eventos asociados a una casilla de verificacin:
Evento Descripcin
Click El usuario hace clic en la casilla de verificacin.
GotFocus El usuario activa la casilla de verificacin al hacer clic en ella o al llegar a
ella a travs de la tecla TAB.
LostFocus El usuario selecciona otro control.
Mtodo Descripcin
Refresh El valor de la casilla de verificacin se actualiza para reflejar los cambios
que se puedan haber producido en el origen de datos subyacente.
SetFocus El enfoque se establece en la casilla de verificacin como si el usuario
hubiera presionado la tecla TAB hasta activar la casilla de verificacin.
Consulte el captulo 4, Descripcin del modelo de eventos si desea obtener una explicacin del orden
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 35 de 83
35 of 804
en que se producen los eventos.
l Encapsulamiento
l Subclases
l Herencia
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 36 de 83
36 of 804
La creacin de subclases es un modo de reducir la cantidad de cdigo que hay que escribir. Puede
comenzar definiendo un objeto que sea similar al deseado y personalizarlo.
La herencia no funciona con el hardware, pero s en el software. Si descubre un error en una clase, en
lugar de tener que cambiar el cdigo de todas las subclases podr corregirlo una nica vez en la clase
y el cambio se propagar a todas las subclases pertenecientes a ella.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 37 de 83
37 of 804
Contenedores y no contenedores
Los dos tipos principales de clases de Visual FoxPro y por extensin, de objetos de Visual FoxPro,
son las clases de contenedor y las clases de control.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 38 de 83
38 of 804
Clases de contenedor
Los contenedores pueden incluir otros objetos y permiten el acceso a los objetos que contienen. Por
ejemplo, si crea una clase de contenedor que consta de dos cuadros de lista y dos botones de comando
y, a continuacin, agrega a un formulario un objeto basado en esta clase, cada objeto individual podr
manipularse en tiempo de ejecucin y en tiempo de diseo. Puede cambiar fcilmente las posiciones
de los cuadros de lista o los ttulos de los botones de comando. Tambin puede agregar objetos al
control en tiempo de diseo; por ejemplo, puede agregar etiquetas para identificar los cuadros de
lista.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 39 de 83
39 of 804
Cuadrculas Columnas de cuadrcula
Grupos de botones de opcin Botones de opcin
Marcos de pgina Pginas
Pginas Cualquier control, contenedores, personalizado
Proyecto Archivos, servidores
Barras de herramientas Cualquier control, marcos de pgina, contenedor
Clases de control
Las clases de control estn ms encapsuladas que las clases de contenedor, pero por esa misma razn
es posible que sean menos flexibles. Las clases de control no tienen un mtodo AddObject.
Cree una clase de control para funcionalidad genrica. Por ejemplo, los botones de comando que
permiten al usuario mover el puntero de registro en una tabla, un botn para cerrar un formulario y un
botn de ayuda pueden guardarse como clases y agregarse a formularios en cualquier momento que
desee que los formularios tengan esta funcionalidad.
Puede exponer las propiedades y los mtodos en una clase de modo que el usuario pueda integrarlos
en el entorno de datos concreto de un formulario o un conjunto de formularios.
Puede crear clases de conjunto de formularios, de formulario y de control con una apariencia
caracterstica, de modo que todos los componentes de la aplicacin tengan la misma apariencia. Por
ejemplo, podra agregar grficos y patrones de color especficos a una clase de formulario y utilizarla
como plantilla para todos los formularios que cree. Podra crear una clase de cuadro de texto con una
apariencia caracterstica, como un efecto de sombreado, y usar esta clase en la aplicacin en cualquier
momento que desee agregar un cuadro de texto.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 40 de 83
40 of 804
Visual FoxPro permite crear distintos tipos de clases, cada uno con sus propias caractersticas.
Especifique el tipo de clase que desea crear en el cuadro de dilogo Nueva clase o en la clusula AS
del comando CREATE CLASS.
En el Diseador de clases puede crear subclases para la mayora de las clases de base de Visual
FoxPro.
* Estas clases son parte integral de un contenedor primario y no pueden usarse como subclases en el
Diseador de clases.
Todas las clases de base de Visual FoxPro reconocen el siguiente conjunto mnimo de eventos:
Evento Descripcin
Init Ocurre cuando se crea el objeto.
Destroy Ocurre cuando el objeto se libera de la memoria.
Error Ocurre siempre que tiene lugar un error en procedimientos de evento o de
mtodo de la clase.
Todas las clases de base de Visual FoxPro tienen el siguiente conjunto mnimo de propiedades:
Propiedad Descripcin
Class El tipo de clase de que se trata.
BaseClass La clase de base de la que se deriva, como Form, Commandbutton,
Custom, etc.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 41 de 83
41 of 804
ClassLibrary La biblioteca de clases en la que est almacenada.
ParentClass La clase de la que se deriva la clase actual. Si la clase se deriva
directamente de una clase de base de Visual FoxPro, la propiedad
ParentClass es la misma que la propiedad BaseClass.
Puede convertir en subclases estas clases para establecer sus propias propiedades de control
predeterminadas. Por ejemplo, si quiere que los nombres predeterminados de controles que agregue a
formularios de sus aplicaciones reflejen automticamente sus convenciones de nombres, puede crear
clases basadas en las clases de base de Visual FoxPro para hacerlo. Puede crear clases de formulario
con una apariencia o un comportamiento personalizado para que sirvan como plantillas para todos los
formularios que cree.
Tambin podra convertir en subclases las clases de base de Visual FoxPro para crear controles con
funcionalidad encapsulada. Si quiere que un botn libere formularios cuando haga clic en l, puede
crear una clase basada en la clase de botn de comando de Visual FoxPro, establecer como ttulo
"Salir" e incluir el siguiente comando en el evento Click:
THISFORM.Release
Las subclases no estn limitadas a clases de base nicas. Puede agregar mltiples controles a una
nica definicin de clase de contenedor. Muchas de las clases de la biblioteca de clases de ejemplo de
Visual FoxPro estn incluidas en esta categora. Por ejemplo, la clase VCR de Buttons.vcx, ubicada
en la carpeta ...\Samples\Vfp98\Classes de Visual Studio, contiene cuatro botones de comando para
desplazarse por los registros de una tabla.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 42 de 83
42 of 804
Una clase basada en la clase personalizada de Visual FoxPro no tiene un elemento visual de tiempo
de ejecucin. Puede crear mtodos y propiedades para la clase personalizada en el entorno del
Diseador de clases. Por ejemplo, podra crear una clase personalizada llamada StrMethods e incluir
en ella una serie de mtodos para manipular cadenas de caracteres. Podra agregar esta clase a un
formulario con un cuadro de edicin y llamar a los mtodos cuando lo necesitara. Si tuviera un
mtodo llamado WordCount, podra llamarlo cuando lo necesitara:
THISFORM.txtCount.Value = ;
THISFORM.StrMethods.WordCount(THISFORM.edtText.Value)
Las clases no visuales (como el control personalizado y el control cronmetro) tienen una
representacin visual, nicamente en tiempo de diseo, en el Diseador de formularios. Establezca la
propiedad de imagen de la clase personalizada como el archivo .bmp que desea mostrar en el
Diseador de formularios cuando se agregue la clase personalizada a un formulario.
Crear clases
Puede crear nuevas clases en el Diseador de clases y puede ver cmo ver el usuario cada objeto a
medida que lo disea.
O bien
O bien
El cuadro de dilogo Nueva clase le permite especificar el nombre de la nueva clase, la clase en la
que se basa la nueva clase y la biblioteca en la que se almacenar.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 43 de 83
43 of 804
2. Elija Modificar.
Tambin puede modificar una definicin de clase visual mediante el comando MODIFY CLASS.
1. En el cuadro de dilogo Nueva clase, haga clic en el botn de tres puntos situado a la derecha
del cuadro Basada en.
2. En el cuadro de dilogo Abrir, elija la clase en la que desea basar la nueva clase.
O bien
Por ejemplo, para basar una nueva clase, x, en parentclass de Mylibrary.vcx, use el cdigo
siguiente:
Diseador de clases
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 44 de 83
44 of 804
El Diseador de clases proporciona la misma interfaz que el Diseador de formularios, que le permite
ver y modificar las propiedades de la clase en la ventana Propiedades. La ventana de edicin de
cdigo le permite escribir cdigo para que se ejecute cuando ocurran eventos o se llame a mtodos.
Si basa la nueva clase en una clase de control o en una clase de contenedor, podr agregarle controles
del mismo modo que en el Diseador de formularios: elija el botn del control en la barra de
herramientas Controles de formularios y arrastre para ajustar el tamao en el Diseador de clases.
Independientemente del tipo de clase en el que base la nueva clase, puede establecer propiedades y
escribir cdigo de mtodo. Tambin podr crear nuevas propiedades y mtodos para la clase.
Puede agregar tantas propiedades y mtodos nuevos a la nueva clase como desee. Las propiedades
contienen valores, mientras que los mtodos contienen cdigo de procedimiento que se ejecutar
cuando llame al mtodo.
Cuando crea propiedades y mtodos nuevos para clases, las propiedades y los mtodos tienen como
alcance la clase, no los componentes individuales de la misma.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 45 de 83
45 of 804
Puede tener acceso a una propiedad Public desde cualquier lugar de la aplicacin. Las
propiedades Protected y Hidden se tratan en "Proteger y ocultar miembros de clase" ms
adelante en este mismo captulo.
4. Elija Agregar.
Tambin puede incluir una descripcin de la propiedad que aparecer en la parte inferior de la
ventana Propiedades en el Diseador de clases y en el Diseador de formularios cuando se
agregue el control a un formulario.
Solucin de problemas Cuando agregue una propiedad a una clase que un usuario de la clase pueda
establecer, el usuario puede introducir un valor incorrecto para la propiedad que cause errores en
tiempo de ejecucin. Tiene que documentar de forma explcita los valores vlidos de la propiedad. Si
la propiedad puede establecerse como 0, 1 2, por ejemplo, indquelo en el cuadro Descripcin del
cuadro de dilogo Nueva propiedad. Tambin es conveniente comprobar el valor de la propiedad en
cdigo que haga referencia a ella.
Por ejemplo, para crear una propiedad de matriz llamada mimatriz con diez filas y dos
columnas, escriba lo siguiente en el cuadro Nombre:
mimatriz[10,2]
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 46 de 83
46 of 804
uso de una propiedad de matriz, consulte "Administrar varias instancias de un formulario" en el
captulo 9, Crear formularios.
Los mtodos Access y Assign le permiten ejecutar cdigo cuando se consulta el valor de una
propiedad o cuando se intenta cambiar su valor.
El cdigo de un mtodo Assign se ejecuta cuando intenta modificar el valor de una propiedad,
generalmente mediante los comandos STORE o = para asignar un nuevo valor a la propiedad.
Para obtener ms informacin acerca de los mtodos Access y Assign, consulte Mtodos Access y
Assign.
Las propiedades y mtodos de una definicin de clase son Public de forma predeterminada: el cdigo
de otras clases u otros procedimientos puede establecer las propiedades o llamar a los mtodos. A las
propiedades y los mtodos definidos como Protected slo pueden tener acceso otros mtodos de la
definicin de la clase o de subclases de la clase. A las propiedades y los mtodos definidos como
Hidden slo pueden tener acceso otros miembros de la definicin de la clase. Las subclases de la
clase no pueden "ver" o hacer referencia a miembros ocultos.
Para asegurar un correcto funcionamiento en algunas clases, deber impedir que los usuarios cambien
las propiedades o llamen al mtodo desde fuera de la clase mediante programacin.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 47 de 83
47 of 804
Esta clase tiene tambin tres propiedades protegidas, nSec, nMin y nHour, as como un mtodo
protegido, UpdateDisplay. Los otros tres mtodos personalizados de la clase, Start, Stop y Reset no
estn protegidos.
Sugerencia Elija Informacin de clase en el men Clase para ver la visibilidad de todas las
propiedades y mtodos de una clase.
Mtodo UpdateDisplay
Cdigo Comentarios
CSecDisplay = ALLTRIM(STR(THIS.nSec)) Convierte las propiedades numricas al
cMinDisplay = ALLTRIM(STR(THIS.nMin))
cHourDisplay = ALLTRIM(STR(THIS.nHour)) tipo Character para mostrarlas en los
ttulos de etiqueta.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 48 de 83
48 of 804
IIF(THIS.nSec < 10, ;
"0" ,"") + cSecDisplay conservando los 0 iniciales si el valor de
THIS.lblMinutes.Caption = ; la propiedad numrica es menor que 10.
IIF(THIS.nMin < 10, ;
"0", "") + cMinDisplay
THIS.lblHours.Caption = ;
IIF(THIS.nHour < 10, ;
"0", "") + cHourDisplay
Evento Timer
Cdigo Comentarios
THIS.Parent.nSec = THIS.Parent.nSec + 1 Incrementa el valor de la propiedad nSec
IF THIS.Parent.nSec = 60
THIS.Parent.nSec = 0 cada vez que se desencadena el evento de
THIS.Parent.nMin = ; cronmetro cada segundo.
THIS.Parent.nMin + 1 Si nSec ha llegado a 60, lo restablece a 0 e
ENDIF incrementa la propiedad nMin.
La clase Stopwatch tiene tres mtodos que no estn protegidos: Start, Stop y Reset. Un usuario debe
poder llamar directamente a estos mtodos para controlar el cronmetro.
THIS.tmrSWatch.Enabled = .T.
THIS.tmrSWatch.Enabled = .F.
THIS.nSec = 0
THIS.nMin = 0
THIS.nHour = 0
THIS.UpdateDisplay
El usuario no puede establecer directamente estas propiedades o llamar a este mtodo, pero el cdigo
del mtodo Reset s puede hacerlo.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 49 de 83
49 of 804
Al crear una nueva propiedad, su valor predeterminado es falso (.F.). Para especificar un valor
predeterminado distinto para una propiedad, utilice la ventana Propiedades. En la ficha Otras, haga
clic en la propiedad y establezca el valor deseado. Este ser el valor inicial de la propiedad cuando se
agregue la clase a un formulario o a un conjunto de formularios.
Tambin puede establecer cualquiera de las propiedades de clase de base en el Diseador de clases.
Cuando un objeto basado en la clase se agregue al formulario, reflejar el valor de su propiedad en
lugar del valor de la propiedad de la clase de base de Visual FoxPro.
Sugerencia Si desea convertir el valor predeterminado de una propiedad en una cadena vaca,
seleccione el valor en el cuadro Edicin de propiedades y presione la tecla RETROCESO.
2. En el cuadro de dilogo Informacin de clase, escriba el nombre y la ruta de acceso del archivo
.BMP en el cuadro Icono de la barra de herramientas.
Tambin puede especificar que se muestre el icono para la clase en el Administrador de proyectos y
el Examinador de clases si establece el icono contenedor.
2. En el cuadro Icono de contenedor, escriba el nombre y la ruta de acceso del archivo .bmp que
se va a mostrar en el botn de la barra de herramientas Controles de formularios.
Todas las clases diseadas visualmente se almacenan en una biblioteca de clases con la extensin de
archivo .vcx.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 50 de 83
50 of 804
l Cuando cree una clase, especifique un nuevo archivo de biblioteca de clases en el cuadro
Almacenar en del cuadro de dilogo Nueva clase.
O bien
Por ejemplo, la instruccin siguiente crea una nueva clase llamada miclase y una nueva
biblioteca de clases llamada nue_bib:
O bien
Por ejemplo, escriba el comando siguiente en la ventana Comandos para crear una biblioteca de
clases llamada nue_bib:
Cuando agregue una biblioteca de clases a un proyecto, podr copiar clases de una biblioteca a otra
con facilidad o, simplemente, quitar clases de las bibliotecas.
Sugerencia Es conveniente guardar en una biblioteca de clases una clase y todas las subclases
basadas en ella. Si tiene una clase que contiene elementos de muchas bibliotecas de clases
distintas, estas bibliotecas debern estar abiertas, por lo que se tardar un poco ms en cargar
inicialmente la clase en tiempo de ejecucin y en tiempo de diseo.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 51 de 83
51 of 804
O bien
Puede utilizar el comando RENAME CLASS para cambiar el nombre de una clase de una biblioteca
de clases. Sin embargo, recuerde que cuando cambia el nombre de una clase, los formularios que
contienen la clase y las subclases en otros archivos .vcx siguen haciendo referencia al nombre antiguo
y no volvern a funcionar correctamente.
Visual FoxPro incluye un Examinador de clases para facilitar el uso y la administracin de clases y
bibliotecas de clases. Para obtener ms informacin, vea la ventana Examinador de clases.
4. En el cuadro de dilogo Abrir, elija una biblioteca de clases para agregar el registro y, a
continuacin, elija Abrir.
5. Elija Establecer como predeterminado si desea que la biblioteca de clases est disponible en
la barra de herramientas Controles de formularios en sesiones futuras de Visual FoxPro.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 52 de 83
52 of 804
Por ejemplo, un usuario puede agregar a un formulario un objeto basado en su clase y cambiar la
propiedad BackColor de blanco a rojo. Si cambia a verde la propiedad BackColor de la clase, el
objeto del formulario del usuario seguir teniendo un valor rojo para BackColor. Por otra parte, si el
usuario no cambia la propiedad BackColor del objeto y usted cambia a verde el color de fondo de la
clase, la propiedad BackColor del objeto del formulario heredar el cambio y tambin ser verde.
Sin embargo, es ms frecuente que quiera agregar funcionalidad a la nueva clase u objeto
conservando la funcionalidad original. De hecho, una de las decisiones clave que tiene que hacer en
la programacin orientada a objetos es qu funcionalidad va a incluir a nivel de clase, a nivel de
subclase y a nivel de objeto. Puede optimizar el diseo de la clase con la funcin DODEFAULT( ) o
el operador de resolucin de alcance (::) para agregar cdigo a distintos niveles de la jerarqua del
contenedor o de la clase.
Puede llamar al cdigo de la clase primaria desde una subclase mediante la funcin DODEFAULT( ).
Por ejemplo, cmdOK es una clase de botn de comando almacenada en Buttons.vcx, ubicada en el
directorio ...\Samples\Vfp98\Classes de Visual Studio. El cdigo asociado al evento Click de cmdOk
libera el formulario que contiene el botn. cmdCancel es una subclase de cmdOk de la misma
biblioteca de clases. Para agregar funcionalidad a cmdCancel para descartar cambios, por ejemplo,
puede agregar el cdigo siguiente al evento Click:
Como los cambios se escriben en una tabla almacenada en bfer de forma predeterminada cuando se
cierra la tabla, no tiene que agregar cdigo TABLEUPDATE( ) a cmdOk. El cdigo adicional de
cmdCancel deshace los cambios realizados a la tabla antes de llamar al cdigo de cmdOk, la clase
primaria, para liberar el formulario.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 53 de 83
53 of 804
Hacer referencia a un objeto dentro de su jerarqua de contenedores se puede comparar con dar una
direccin del objeto a Visual FoxPro. Cuando describe la ubicacin de una casa a otra persona fuera
de su marco inmediato de referencia, debe indicar el pas, la provincia o la regin, la ciudad, la calle o
bien slo el nmero de la calle donde se encuentra la vivienda, segn lo lejos que se encuentre esa
otra persona. De lo contrario, podra haber cierta confusin.
Contenedores anidados
Formset.Form.PageFrame.Page.;
Grid.Column.Control.Enabled = .F.
La propiedad ActiveForm del objeto aplicacin (_VFP) le permite manipular el formulario activo
aunque no conozca su nombre. Por ejemplo, la siguiente lnea de cdigo cambia el color de fondo del
formulario activo, independientemente del conjunto de formularios al que pertenezca:
_VFP.ActiveForm.BackColor = RGB(255,255,255)
De forma similar, la propiedad ActiveControl permite manipular el control activo del formulario
activo. Por ejemplo, la expresin siguiente introducida en la ventana Inspeccin muestra el nombre
del control activo de un formulario a medida que se eligen interactivamente los distintos controles:
_VFP.ActiveForm.ActiveControl.Name
Referencias relativas
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 54 de 83
54 of 804
Cuando haga referencia a objetos desde la jerarqua de contenedores (por ejemplo, en el evento Click
de un botn de comando de un formulario perteneciente a un conjunto de formularios), puede utilizar
algunos mtodos abreviados para identificar el objeto que desea manipular. La tabla siguiente indica
las propiedades o las palabras clave que facilitan la referencia a un objeto desde la jerarqua del
objeto:
Nota Slo puede utilizar THIS, THISFORM y THISFORMSET en cdigo de mtodos y eventos.
La tabla siguiente proporciona ejemplos del uso de THISFORMSET, THISFORM, THIS y Parent
para establecer propiedades de objetos:
Establecer propiedades
Las propiedades de un objeto pueden establecerse en tiempo de ejecucin o en tiempo de diseo.
Contenedor.Objeto.Propiedad = Valor
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 55 de 83
55 of 804
Por ejemplo, las instrucciones siguientes establecen varias propiedades de un a cuadro de texto
llamado txtDate en un formulario llamado frmPhoneLog:
frsContacts.frmPhoneLog.txtDate.Value = DATE( )
WITH THISFORMSET.frmForm1.grdGrid1.grcColumn1
.Width = 5
.Resizable = .F.
.ForeColor = RGB(0,0,0)
.BackColor = RGB(255,255,255)
.SelectOnEntry = .T.
ENDWITH
Llamar a mtodos
Una vez creado un objeto, puede llamar a los mtodos de ese objeto desde cualquier lugar de la
aplicacin.
Primario.Objeto.Mtodo
Las instrucciones siguientes llaman a mtodos para mostrar un formulario y establecer el enfoque en
un cuadro de texto:
frsFormSet.frmForm1.Show
frsFormSet.frmForm1.txtGetText1.SetFocus
Los mtodos que devuelven valores y se utilizan en expresiones deben terminar en parntesis de
apertura y de cierre. Por ejemplo, la instruccin siguiente establece el ttulo de un formulario como el
valor devuelto por el mtodo definido por el usuario GetNewCaption:
Form1.Caption = Form1.GetNewCaption( )
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 56 de 83
56 of 804
Nota Los parmetros transferidos a mtodos deben incluirse entre parntesis despus del nombre del
mtodo; por ejemplo, Form1.Show(nStyle). transfiere nStyle al cdigo del mtodo Show de
Form1.
Responder a eventos
El cdigo incluido en un procedimiento de evento se ejecuta cuando se produce el evento. Por
ejemplo, el cdigo incluido en el procedimiento de evento Click de un botn de comando se ejecutar
cuando el usuario haga clic en el botn de comando.
Puede activar los eventos Click, DblClick, MouseMove y DragDrop con el evento MOUSE o usar el
comando ERROR para generar eventos Error y el comando KEYBOARD para generar eventos
KeyPress. No puede hacer que se produzca ningn otro evento mediante programacin, pero s puede
llamar al procedimiento asociado con el evento. Por ejemplo, la instruccin siguiente hace que se
ejecute el cdigo del evento Activate de frmPhoneLog, pero no activa el formulario:
frmPhoneLog.Activate
Si desea activar el formulario, utilice el mtodo Show del formulario. Al llamar al mtodo Show se
mostrar y activar el formulario, momento en el que tambin se ejecutar el cdigo del evento
Activate:
frmPhoneLog.Show
En un archivo de programa es posible tener cdigo de programa delante de las definiciones de clase,
pero no despus de ellas, del mismo modo que el cdigo de programa no puede ir despus de los
procedimientos de un programa. El intrprete de comandos bsico para la creacin de clases tiene la
sintaxis siguiente:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 57 de 83
57 of 804
Por ejemplo, si crea una clase para almacenar informacin sobre empleados y no desea que los
usuarios puedan modificar la fecha de contratacin, puede proteger la propiedad FechaContr. Si los
usuarios necesitan averiguar cundo se contrat a un empleado determinado, podr incluir un mtodo
para devolver la fecha de contratacin.
PROCEDURE ObtFechaContr
RETURN This.FechaContr
ENDPROC
ENDDEFINE
Cdigo Comentarios
SET CLASSLIB TO Forms ADDITIVE Establece como biblioteca de clases el archivo
.vcx en el que se guard la definicin del
formulario. La palabra clave ADDITIVE impide
que este comando cierre otras bibliotecas de clases
que estuvieran abiertas.
frmTest = CREATEOBJECT ("FormPrueba") Este cdigo supone que el nombre de la clase de
formulario guardada en la biblioteca de clases es
FormPrueba.
frmTest.Show Muestra el formulario.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 58 de 83
58 of 804
Por ejemplo, la siguiente definicin de clase se basa en un formulario. El comando ADD OBJECT
agrega dos botones de comando al formulario:
Utilice el mtodo AddObject para agregar objetos a un contenedor despus de crear el objeto
contenedor. Por ejemplo, las lneas de cdigo siguientes crean un objeto formulario y le agregan dos
botones de comando:
frmMessage = CREATEOBJECT("FORM")
frmMessage.AddObject("txt1", "TEXTBOX")
frmMessage.AddObject("txt2", "TEXTBOX")
Tambin puede utilizar el mtodo AddObject en el cdigo de mtodo de una clase. Por ejemplo, la
definicin de clase siguiente utiliza AddObject en el cdigo asociado al evento Init para agregar un
control a una columna de cuadrcula.
Puede agregar objetos a un contenedor mediante programacin con el mtodo AddObject. Tambin
puede crear objetos con la funcin CREATEOBJECT( ) en los mtodos Load, Init o en cualquier otro
mtodo de la clase.
Cuando agregue un objeto con el mtodo AddObject, el objeto se convierte en un miembro del
contenedor. La propiedad Parent del objeto agregado se refiere al contenedor. Cuando un objeto
basado en el contenedor o en la clase del control se libera de la memoria, tambin se libera el objeto
agregado.
Cuando crea un objeto con la funcin CREATEOBJECT( ), el objeto est en el alcance de una
propiedad de la clase o variable del mtodo que llama a esta funcin. La propiedad primaria del
objeto no est definida.
l El conjunto de eventos para las clases de base de Visual FoxPro es limitado y no puede
ampliarse.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 59 de 83
59 of 804
l Todas las clases reconocen un conjunto limitado de eventos predeterminados, que incluye
como mnimo los eventos Init, Destroy y Error.
l Al crear en una definicin de clase un mtodo con el mismo nombre que un evento reconocible
por la clase, el cdigo del mtodo se ejecutar cuando se produzca el evento.
l Puede agregar mtodos a las clases mediante la creacin de un procedimiento o una funcin en
la definicin de clase.
l Puede crear mtodos Access y Assign para sus clases si crea un procedimiento o una funcin
con el mismo nombre que una propiedad de clase y anexa _ACCESS o _ASSIGN al nombre de
procedimiento o de funcin.
Al crear una clase, sta hereda automticamente todas las propiedades, los mtodos y los eventos de
la clase primaria. Si se escribe cdigo para un evento en la clase primaria, ese cdigo se ejecutar
cuando se produzca el evento con respecto a un objeto basado en la subclase. Sin embargo, podr
sobrescribir el cdigo de la clase primaria escribiendo cdigo para el evento en la subclase.
Para llamar explcitamente al cdigo de evento en una clase primaria cuando la subclase tiene cdigo
escrito para el mismo evento, utilice la funcin DODEFAULT( ).
Por ejemplo, podra tener una clase llamada cmdBottom basada en la clase de base del botn de
comando que tuviera el cdigo siguiente en el evento Click:
GO BOTTOM
THISFORM.Refresh
Al agregar un objeto basado en esta clase a un formulario llamado, por ejemplo, cmdInferior1,
podra decidir que tambin desea mostrar un mensaje para informar al usuario de que el puntero de
registro est en la parte inferior de la tabla. Podra agregar el cdigo siguiente al evento Click del
objeto para mostrar el mensaje:
Sin embargo, al ejecutar el formulario se muestra el mensaje, pero el puntero de registro no se mueve
porque nunca se ejecuta el cdigo del evento Click de la clase primaria. Para asegurarse de que
tambin se ejecuta el cdigo del evento Click de la clase primaria, incluya las siguientes lneas de
cdigo en el procedimiento del evento Click del objeto:
DODEFAULT( )
WAIT WINDOW "En la parte inferior de la tabla" TIMEOUT 1
Nota Puede utilizar la funcin ACLASS( ) para determinar todas las clases de la jerarqua de clases
de un objeto.
En algunos casos, desear evitar que produzca el comportamiento predeterminado de la clase de base
en un evento o mtodo. Para ello, incluya la palabra clave NODEFAULT en el cdigo de mtodo que
escriba. Por ejemplo, el programa siguiente utiliza la palabra clave NODEFAULT en el evento
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 60 de 83
60 of 804
KeyPress de un cuadro de texto para impedir que se muestren en el cuadro los caracteres escritos:
frmKeyExample = CREATEOBJECT("prueba")
frmKeyExample.Show
READ EVENTS
DEFINE CLASS prueba AS FORM
ADD OBJECT texto1 AS TEXTBOX
PROCEDURE texto1.KeyPress
PARAMETERS nKeyCode, nShiftAltCtrl
NODEFAULT
IF BETWEEN(nKeyCode, 65, 122) && entre 'A' y 'z'
This.Value = ALLTRIM(This.Value) + "*"
ACTIVATE SCREEN && enviar el resultado a la ventana principal de Visual FoxPro
?? CHR(nKeyCode)
ENDIF
ENDPROC
PROCEDURE Destroy
CLEAR EVENTS
ENDPROC
ENDDEFINE
Una caracterstica comn de muchas aplicaciones es una serie de botones de desplazamiento que
permiten a los usuarios moverse por una tabla. Suelen incluir botones para mover el puntero de
registro al registro siguiente o anterior de la tabla, as como al registro superior o inferior de la tabla.
Todos los botones tendrn algunas caractersticas y funciones comunes, por lo que es conveniente
crear una clase de botones de desplazamiento. A continuacin, los botones individuales pueden
aprovechar fcilmente esta apariencia y funcionalidad comunes. Esta clase primaria es la clase
NavButton que se definir posteriormente en esta seccin.
Una vez definida la clase primaria, las subclases siguientes definen la funcionalidad y apariencia
especficas de cada uno de los cuatro botones de desplazamiento: navTop, navPrior, navNext,
navBottom.
Por ltimo se crea una clase de contenedor vcr, a la que se agregan todos los botones de
desplazamiento. El contenedor puede agregarse a un formulario o una barra de herramientas para
proporcionar funcionalidad de desplazamiento por tablas.
Para crear NavButton, guarde las seis definiciones de clase siguientes (Navbutton, navTop,
navBottom, navPrior, navNext y vcr) en un archivo de programa como Navclass.prg.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 61 de 83
61 of 804
Cdigo Comentarios
DEFINE CLASS NavButton AS Define la clase primaria de los botones de
COMMANDBUTTON
desplazamiento.
Height = 25
Width = 25 Asigna dimensiones a la clase.
TableAlias = ""
Incluye una propiedad personalizada, TableAlias,
que contiene el nombre del alias por el que
desplazarse.
PROCEDURE Click Si se ha establecido TableAlias, este
IF NOT EMPTY(This.TableAlias)
SELECT (This.TableAlias) procedimiento de clase priamria selecciona el alias
ENDIF antes de ejecutar el cdigo real de desplazamiento
ENDPROC en las subclases. De lo contrario, se supondr que
el usuario desea desplazarse por la tabla del rea
de trabajo seleccionada actualmente.
PROCEDURE RefreshForm Al emplear _SCREEN.ActiveForm.Refresh en
_SCREEN.ActiveForm.Refresh
ENDPROC lugar de THISFORM.Refresh puede agregar la
clase a un formulario o una barra de herramientas
y hacer que funcione con la misma precisin.
ENDDEFINE Finaliza la definicin de clase.
Cdigo Comentarios
DEFINE CLASS navTop AS BotDespl Define la clase botn de desplazamiento Superior
Caption = "|<"
y establece la propiedad Caption.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 62 de 83
62 of 804
Llama al mtodo RefreshForm de la clase
primaria. No es necesario utilizar el operador de
resolucin de alcance (::) en este caso porque no
hay ningn mtodo en la subclase que tenga el
mismo nombre que el mtodo de la clase primaria.
Por otra parte, tanto la clase primaria como la
subclase tienen cdigo de mtodo para el evento
Click.
ENDPROC Termina el procedimiento Click.
Cdigo Comentarios
DEFINE CLASS navNext AS Navbutton Define la clase de botn de desplazamiento
Caption = ">"
Siguiente y establece la propiedad Caption.
PROCEDURE Click
DODEFAULT( )
SKIP 1
IF EOF( )
GO BOTTOM Incluye el cdigo para establecer el puntero de
ENDIF registro en el siguiente registro de la tabla.
THIS.RefreshForm
ENDPROC
ENDDEFINE
PROCEDURE Click
DODEFAULT( )
SKIP -1
IF BOF( )
GO TOP Incluye el cdigo para establecer el puntero de
ENDIF registro en el registro anterior de la tabla.
THIS.RefreshForm
ENDPROC
ENDDEFINE
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 63 de 83
63 of 804
PROCEDURE Click
DODEFAULT( )
GO BOTTOM
THIS.RefreshForm Incluye el cdigo para establecer el puntero de
ENDPROC registro en el ltimo registro de la tabla.
ENDDEFINE
Termina la definicin de clase.
La siguiente definicin de clase contiene los cuatro botones de desplazamiento para poder agregarlos
como una unidad a un formulario. La clase tambin incluye un mtodo para establecer la propiedad
TableAlias de los botones.
Cdigo Comentarios
DEFINE CLASS vcr AS CONTAINER Comienza la definicin de clase. La
Height = 25
Width = 100 propiedad Height se establece en el
Left = 3 mismo alto que los botones de comando
Top = 3 que contendr.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 64 de 83
64 of 804
Tambin puede crear subclases basadas en vcr que tengan botones adicionales como Buscar,
Modificar, Guardar y Salir. Por ejemplo, vcr2 incluye un botn Salir:
Cdigo Comentarios
DEFINE CLASS vcr2 AS vcr Define una clase basada en vcr y le agrega un
ADD OBJECT cmdQuit AS
COMMANDBUTTON WITH ; botn de comando.
Caption = "Salir",;
Height = 25, ;
Width = 50
Width = THIS.Width + THIS.cmdQuit.Width
cmdQuit.Left = THIS.Width - ;
THIS.cmdQuit.Width
Vcr2 tiene todo lo de vcr ms el nuevo botn de comando y no es necesario volver a escribir ninguna
parte del cdigo.
A causa de la herencia, los cambios realizados en la clase primaria se reflejan en todas las subclases
que se basan en ella. Por ejemplo, puede informar al usuario de que se ha llegado al final de la tabla si
cambia la instruccin IF EOF( ) de navNext.Click por la siguiente:
IF EOF( )
GO BOTTOM
SET MESSAGE TO "Final de la tabla"
ELSE
SET MESSAGE TO
ENDIF
Puede indicar al usuario que ha llegado al principio de la tabla si cambia la instruccin IF BOF( ) de
navPrior.Click por la siguiente:
IF BOF()
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 65 de 83
65 of 804
GO TOP
SET MESSAGE TO "Principio de la tabla"
ELSE
SET MESSAGE TO
ENDIF
Una vez definido vcr como un control, el control puede agregarse a la definicin de un contenedor.
Por ejemplo, el cdigo siguiente agregado a Navclass.prg define un formulario al que se han agregado
botones de desplazamiento:
Una vez definida la subclase de formulario, podr mostrarla fcilmente con los comandos apropiados.
frmPrueba = CREATEOBJECT("navForm")
frmPrueba.Show
Si no llama al mtodo SetTable de oVCR (el objeto VCR de NavForm), cuando el usuario haga clic
en los botones de desplazamiento el puntero de registro se mover por la tabla del rea de trabajo
seleccionada actualmente. Puede llamar al mtodo SetTable para especificar en qu tabla se va a
desplazar.
frmPrueba.oVCR.SetTable("customer")
Nota Cuando el usuario cierre el formulario, frmPrueba se establecer a un valor nulo (.NULL.).
Para liberar de la memoria la variable de objeto, utilice el comando RELEASE. Las variables de
objeto creadas en los archivos de programa se liberan de la memoria cuando se completa el programa.
Una cuadrcula contiene columnas que, a su vez, pueden contener encabezados y cualquier otro
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 66 de 83
66 of 804
control. El control predeterminado contenido en una columna es un cuadro de texto, por lo que la
funcionalidad predeterminada de la cuadrcula se aproxima a una ventana Examinar. Sin embargo, la
arquitectura subyacente de la cuadrcula la abre hasta una extensin ilimitada.
El ejemplo siguiente crea un formulario que contiene un objeto Grid (Cuadrcula) con dos columnas.
La segunda columna contiene una casilla de verificacin para mostrar los valores en un campo lgico
de una tabla.
Definicin de una clase Grid con una casilla de verificacin en una columna de cuadrcula
Cdigo Comentarios
DEFINE CLASS grdProducts AS Grid Comienza la definicin de clase y establece
Left = 24
Top = 10 las propiedades que determinan la apariencia
Width = 295 de la cuadrcula.
Height = 210
Visible = .T. Al establecer la propiedad ColumnCount en
RowHeight = 28
ColumnCount = 2 2, se agregan dos columnas a la cuadrcula.
Cada columna contiene un encabezado con el
nombre Header1. Adems, cada columna
tiene un grupo de propiedades independiente
que determina su apariencia y
comportamiento.
Column1.ControlSource ="prod_name" Al establecer la propiedad ControlSource de
Column2.ControlSource ="discontinu"
una columna, la columna muestra los valores
de ese campo para todos los registros de la
tabla.
Discontinu es un campo lgico.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 67 de 83
67 of 804
en .F. de modo que la casilla de verificacin
sea visible en todas las filas, no slo en la
celda seleccionada.
Procedure Init Establece el ancho de las columnas y los
THIS.Column1.Width = 175
THIS.Column2.Width = 68 ttulos de los encabezados.
THIS.Column1.Header1.Caption = ;
"Nombre de producto"
THIS.Column2.Header1.Caption = ;
"Suspendido"
THIS.Column2.AddObject("chk1", ;
"checkbox")
THIS.Column2.CurrentControl = ;
"chk1"
THIS.Column2.chk1.Visible = .T. El mtodo AddObject permite agregar un
THIS.Column2.chk1.Caption = "" objeto a un contenedor ; en este caso, una
ENDPROC
casilla de verificacin llamada chk1.
Establece la propiedad CurrentControl de la
columna en la casilla de verificacin, de
modo que se muestre la casilla de
verificacin.
Comprueba que la casilla de verificacin es
visible.
Establece el ttulo en una cadena vaca de
modo que no se muestre el ttulo
predeterminado "chk1".
ENDDEFINE Termina la definicin de clase.
Cdigo Comentarios
DEFINE CLASS GridForm AS FORM Crea una clase de formulario y le agrega un
Width = 330
Height = 250 objeto basado en la clase de cuadrcula.
Caption = "Ejemplo de cuadrcula"
ADD OBJECT grid1 AS grdProducts
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 68 de 83
68 of 804
El programa siguiente abre la tabla donde estn incluidos los campos que se van a mostrar en las
columnas de cuadrcula, crea un objeto basado en la clase GridForm y ejecuta el comando READ
EVENTS.
CLOSE DATABASE
OPEN DATABASE (SYS(2004) + "samples\data\testdata.dbc")
USE products
frmTest= CREATEOBJECT("GridForm")
frmTest.Show
READ EVENTS
Este programa puede incluirse en el mismo archivo en el que estn incluidas las definiciones de clase
si aparece al principio del archivo. Tambin puede emplear el comando SET PROCEDURE TO para
especificar el programa que contiene las definiciones de clase e incluir este cdigo en un programa
distinto.
En algunas ocasiones puede resultar conveniente manipular un objeto por medio de una o varias
referencias al mismo. Por ejemplo, el programa siguiente define una clase, crea un objeto basado en
la clase y devuelve una referencia al objeto:
*--NEWINV.PRG
*--Devuelve una referencia a un nuevo formulario de facturas.
frmInv = CREATEOBJECT("InvoiceForm")
RETURN frmInvoice
Tambin puede crear una referencia a un objeto de un formulario, como en el ejemplo siguiente.
txtCustName = frmInvoice.txtCompany
txtCustName.Value = "Usuario de Fox"
Sugerencia Cuando ha creado un objeto, puede usar el comando DISPLAY OBJECTS para mostrar
la jerarqua de clases del objeto, los valores de las propiedades, los objetos contenidos y los mtodos
y eventos disponibles. Puede llenar una matriz con las propiedades (no los valores de las
propiedades), eventos, mtodos y objetos contenidos de un objeto con la funcin AMEMBERS( ).
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 69 de 83
69 of 804
Si existe una referencia a un objeto, la liberacin del objeto no borra el objeto de la memoria. Por
ejemplo, el comando siguiente libera el objeto original, frmFactura:
RELEASE frmFactura
Sin embargo, puesto que sigue existiendo una referencia a un objeto perteneciente a frmFactura, el
objeto no se liberar de la memoria hasta que se libere txtNombrePers con el comando siguiente:
RELEASE txtNombrePers
Puede utilizar las funciones TYPE( ), ISNULL( ) y VARTYPE( ) para determinar si existe un objeto.
Por ejemplo, las lneas de cdigo siguientes comprueban si existe un objeto llamado oConexin:
Cuando un usuario hace clic en un control incluido en una matriz de controles, Visual FoxPro
transfiere el nmero de ndice del control al procedimiento de evento Click. En este procedimiento,
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 70 de 83
70 of 804
puede utilizar una instruccin CASE para ejecutar cdigo distinto segn el botn en el que se haya
hecho clic.
DIMENSION MiMatriz[5]
FOR x = 1 TO 5
MiMatriz[x] = CREATEOBJECT("COMMANDBUTTON")
ENDFOR
Hay una serie de consideraciones que conviene tener en cuenta con respecto a las matrices de objetos:
MiMatriz.Enabled = .F.
l Al redimensionar una matriz de objetos para que sea ms grande que la matriz original, los
elementos nuevos se inicializarn como falso (.F.), como ocurre con todas las matrices de
Visual FoxPro. Cuando redimensione una matriz de objetos para que sea ms pequea que la
matriz original, se liberarn los objetos cuyo subndice sea mayor que el mayor subndice
nuevo.
Sin embargo, los datos almacenados en objetos que se basan en la clase de cliente slo se almacenan
en memoria. Si estos datos estuvieran en una tabla, sta se almacenara en disco. Si tuviera que hacer
un seguimiento de varios clientes, la tabla le dara acceso a todos los comandos y las funciones de
administracin de bases de datos de Visual FoxPro. De este modo, podra localizar informacin
rpidamente, ordenarla, agruparla, realizar clculos, crear informes y consultas basndose en la
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 71 de 83
71 of 804
informacin, etc.
Por ejemplo, en una aplicacin que incluye un sistema de seguridad, normalmente tendra una tabla
de los usuarios que tienen acceso a la aplicacin. La tabla incluira la identificacin, la contrasea y el
nivel de acceso del usuario. Cuando un usuario haya iniciado una sesin no necesitar toda la
informacin de la tabla. Lo nico que necesitar es la informacin sobre el usuario actual y esta
informacin se puede almacenar y manipular fcilmente en un objeto. Por ejemplo, la definicin de
clase siguiente inicia una sesin al crear un objeto basado en la clase:
oUser = CREATEOBJECT('NuevoUsuario')
oUser.Logon
En cualquier parte de la aplicacin, cuando necesite informacin sobre el usuario actual, podr
obtenerla del objeto oUser. Por ejemplo:
IF oUser.GetAccessLevel( ) >= 4
DO ADMIN.MPR
ENDIF
En la mayora de las aplicaciones, puede sacar el mximo partido de la potencia de Visual FoxPro si
integra objetos y datos. La mayora de las clases de Visual FoxPro tienen propiedades y mtodos que
permiten integrar la potencia de un administrador de base de datos relacional y un sistema
completamente orientado a objetos.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 72 de 83
72 of 804
Puesto que estas propiedades de datos pueden cambiarse en tiempo de diseo o en tiempo de
ejecucin, puede crear controles genricos con funcionalidad encapsulada que opere con datos
diversos.
Para obtener ms informacin sobre la integracin de datos y objetos, consulte el captulo 9, Crear
formularios y el captulo 10, Usar controles.
La tabla siguiente contiene una lista del principal conjunto de eventos de Visual FoxPro que se
aplican a la mayora de los controles.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 73 de 83
73 of 804
A la hora de escribir cdigo de eventos para los controles se deben tener en cuenta dos reglas bsicas:
l Los contenedores no procesan los eventos asociados a los controles que contienen.
l Si no hay cdigo de evento asociado a un control, Visual FoxPro comprobar si hay cdigo
asociado al evento en algn nivel superior de la jerarqua de clase para dicho control.
Cuando un usuario interacta con un objeto de alguna forma, ya sea presionando la tecla tab,
haciendo clic en l, moviendo el puntero del mouse sobre l, etc., tienen lugar los eventos de objeto.
Cada objeto recibe sus eventos de forma independiente. Por ejemplo, aunque un botn de comando se
encuentre en un formulario, el evento Click del formulario no se desencadenar cuando un usuario
haga clic en el botn de comando; slo se desencadenar el evento Click del botn de comando.
El cdigo de evento del contenedor es distinto del cdigo de evento del control
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 74 de 83
74 of 804
Si no hay ningn cdigo de evento Click asociado al botn de comando, cuando el usuario haga clic
en el botn no ocurrir nada, incluso cuando haya un cdigo de evento Click asociado al formulario.
Esta regla tambin es aplicable a los controles cuadrcula. La cuadrcula contiene columnas que a su
vez contienen encabezados y controles. Cuando ocurren los eventos, slo el objeto ms interno
implicado en el evento reconoce el evento. Los contenedores de mayor nivel no reconocen el evento.
La ilustracin siguiente muestra qu objetos procesan los eventos MouseMove que se generan cuando
un usuario mueve el puntero del mouse por la cuadrcula.
No obstante, hay una excepcin a esta regla. Si ha escrito cdigo de evento para un grupo de botones
de opcin o para un grupo de botones de comando pero no hay cdigo para el evento en un
determinado botn del grupo, el cdigo de evento del grupo se ejecutar cuando se produzca el
evento del botn.
Por ejemplo, podra tener un grupo de botones de opcin con un cdigo de evento Click asociado.
Slo uno de los dos botones de opcin del grupo tienen asociado cdigo de evento Click:
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 75 de 83
75 of 804
El cdigo de evento para los grupos de botones puede utilizarse como valor predeterminado
Si un usuario hace clic en Opcin1, se ejecutar el cdigo de evento Click asociado a Opcin1. El
cdigo de evento Click asociado al grupo de botones de opcin no se ejecutar.
Puesto que no hay cdigo de evento Click asociado a Opcin2, si el usuario hace clic en Opcin2 se
ejecutar el cdigo de evento Click del grupo de opciones.
Nota Cuando se inicia una secuencia de eventos, como MouseDown y MouseUp, para un control,
toda la secuencia de eventos pertenece al control.
Por ejemplo, si presiona el botn primario del mouse en un botn de comando y arrastra el puntero
del mouse hacia fuera del botn de comando, los eventos MouseMove del botn de comando
seguirn producindose, aunque el puntero del mouse se est moviendo fuera del formulario. Si suelta
el botn primario del mouse sobre el formulario en lugar de hacerlo sobre el botn de comando, el
evento MouseUp que ocurrir ser el asociado al botn de comando, no al formulario.
Si un control de un formulario est basado en una clase definida por el usuario (que, a su vez, est
basada en otra clase definida por el usuario), cuando se produzca un evento, Visual FoxPro
comprobar el cdigo de evento del control inmediato. Si hay cdigo en ese procedimiento de evento,
Visual FoxPro lo ejecutar. Si no existe cdigo en el procedimiento de evento, Visual FoxPro
comprobar un nivel superior en la jerarqua de clases. Si en algn lugar de la jerarqua de clases
Visual FoxPro encuentra cdigo para el evento, se ejecutar dicho cdigo. Cualquier cdigo que haya
ms all dentro de la jerarqua no se ejecutar.
Si no hay cdigo de evento asociado a un objeto, Visual FoxPro comprobar la clase primaria.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 76 de 83
76 of 804
La mejor manera de ver las secuencias de eventos de Visual FoxPro es establecer el seguimiento de
eventos en el depurador. El seguimiento de eventos le permite ver cundo tiene lugar cada evento
asociado a sus propios formularios y controles en relacin a otros eventos, de forma que puede
determinar el lugar ms eficiente para incluir el cdigo.
Los eventos de la lista Eventos para seguir se escriben en la ventana Salida del depurador o en un
archivo cuando tengan lugar.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 77 de 83
77 of 804
Nota En este ejemplo, los eventos MouseMove y Paint han sido eliminados de la lista Eventos para
seguir porque ocurren con tanta frecuencia que hacen ms difcil ver las secuencias de los otros
eventos.
A veces una accin de un usuario desencadena un nico evento, como mover el puntero del mouse
sobre un control, por ejemplo. Sin embargo, con frecuencia una accin del usuario desencadena
mltiples eventos.
En esta seccin se describe el orden en que ocurren los eventos como respuesta a la interaccin del
usuario, utilizando el siguiente formulario como ejemplo.
1. Ejecuta el formulario.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 78 de 83
78 of 804
4. Va a Text2.
Estas acciones desencadenan uno o ms eventos del sistema para cada objeto. En las tablas siguientes
se describen los eventos desencadenados como respuesta a cada accin del usuario.
Accin 1
Visual FoxPro carga el formulario, inicializa cada objeto y despus inicializa el formulario; el
formulario se activa y el primer campo recibe el enfoque de entrada.
Objeto Evento
DataEnvironment BeforeOpenTables
Form1 Load
DataEnvironment Init
Text1 Init
Text2 Init
Command1 Init
Command2 Init
Form1 Init
Form1 Activate
Form1 GotFocus
Text1 When
Text1 GotFocus
Accin 2
El usuario escribe Test en Text1. Cada pulsacin de teclas genera dos eventos. El evento KeyPress
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 79 de 83
79 of 804
recibe 2 parmetros: la tecla presionada y el estado de las teclas MAYS, ALT y CTRL.
Objeto Evento
Text1 KeyPress(84, 1) T
Text1 InteractiveChange
Text1 KeyPress(101, 0) e
Text1 InteractiveChange
Text1 KeyPress(115,0) s
Text1 InteractiveChange
Text1 KeyPress(116,0) t
Text1 InteractiveChange
Accin 3
El usuario hace doble clic en Text1 para seleccionar el texto y presiona CTRL+C para copiar el texto
al Portapapeles. Los eventos Mouse y un evento Click acompaan al evento DblClick. Los eventos
MouseMove y MouseDown reciben cuatro parmetros: qu botn, el estado de MAYS y las
ubicaciones X e Y. Las ubicaciones X e Y son relativas al formulario y reflejan el modo de escala
(por ejemplo, pxeles) del formulario. Slo se presenta un evento MouseMove para cada control. En
realidad, este evento se activara probablemente media docena de veces o ms.
Objeto Evento
Form1 MouseMove(0, 0, 100, 35)
Text1 MouseMove(0,0,44,22)
Text1 MouseDown(1, 0, 44, 22)
Text1 MouseUp(1, 0, 44, 22)
Text1 Click
Text1 MouseDown(1, 0, 44, 22)
Text1 MouseUp(1, 0, 44, 22)
Text1 DblClick
Accin 4
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 80 de 83
80 of 804
Objeto Evento
Text1 KeyPress(9, 0)
Text1 Valid
Text1 LostFocus
Text2 When
Text2 GotFocus
Accin 5
Objeto Evento
Text2 InteractiveChange
Accin 6
Objeto Evento
Form1 MouseMove
Command2 MouseMove
Text2 Valid
Command2 When
Text2 LostFocus
Command2 GotFocus
Command2 MouseDown(1, 0, 143, 128)
Command2 MouseUp(1, 0, 143, 128)
Command2 Click
Command2 Valid
Command2 When
Cuando se cierra el formulario y se libera el objeto se producen estos eventos adicionales, en orden
inverso a los eventos de la Accin 1.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 81 de 83
81 of 804
Objetos Evento
Form1 Destroy
Command2 Destroy
Command1 Destroy
Text2 Destroy
Text1 Destroy
Form1 Unload
DataEnvironment AfterCloseTables
DataEnvironment Destroy
La tabla siguiente muestra la secuencia de activacin general de los eventos de Visual FoxPro. Se
supone que la propiedad AutoOpenTables del entorno de datos est establecida a verdadero (.T.).
Otros eventos pueden tener lugar en base a interacciones de usuario y a respuesta del sistema.
Objeto Evento
DataEnvironment BeforeOpenTables
FormSet Load
Form Load
Cursores DataEnvironment Init
DataEnvironment Init
Objects 1 Init
Form Init
FormSet Init
FormSet Activate
Form Activate
Object1 2 When
Form GotFocus
Object1 GotFocus
Object1 Message
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 82 de 83
82 of 804
Object1 Valid 3
Object1 LostFocus
Object2 3 When
Object2 GotFocus
Object2 Message
Object2 Valid 4
Object2 LostFocus
Form QueryUnload
Form Destroy
Object 5 Destroy
Form Unload
FormSet Unload
DataEnvironment AfterCloseTables
DataEnvironment Destroy
Cursores DataEnvironment Destroy
La secuencia de eventos afecta a dnde debe situar el cdigo. Tenga en cuenta las siguientes
sugerencias:
l El evento Init de todos los controles del formulario se ejecuta antes que el evento Init del
formulario, por lo que puede incluir cdigo en el evento Init del formulario para manipular
cualquier control del formulario. Por ejemplo, si va a agregar controles para columnas de
cuadrcula, podr hacerlo en el evento Init del formulario.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 1: Programacin en Visual FoxPro Pgina 83 de 83
83 of 804
l Si quiere que se procese parte del cdigo siempre que el valor de cuadro de lista, cuadro
combinado o casilla de verificacin cambia, asciela al evento InteractiveChange. El evento
Click puede no tener lugar o puede ser llamado incluso si el valor no ha cambiado.
l Cuando arrastra un control, los otros eventos de mouse se paran. Por ejemplo, los eventos
MouseUp y MouseMove no tienen lugar durante una operacin de arrastrar y colocar.
l Los eventos Valid y When devuelven un valor, verdadero (.T.) de forma predeterminada. Si
devuelve falso (.F.) 0 desde el evento When, el control no puede tener el enfoque. Si
devuelve falso (.F.) 0 desde el evento Valid, el enfoque no puede abandonar el control.
Para obtener ms informacin acerca del uso del Diseador de formularios, consulte el captulo 9,
Crear formularios. Para obtener informacin acerca de la codificacin de clases y la forma de agregar
cdigo de eventos, consulte el captulo 3, Programacin orientada a objetos.
file://C:\temp\~hh52BB.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 1 de 133
84 of 804
Para crear aplicaciones efectivas, debe comprender sus requisitos de datos y despus disear sus
bases de datos, ndices y tablas de forma que resuelvan estas necesidades.
Aproveche la tecnologa de bases de datos relacionales que ofrece Visual FoxPro creando bases de
datos bien diseadas.
Use bases de datos de Visual FoxPro para establecer relaciones entre tablas, hacer cumplir la
integridad referencial y administrar datos locales y remotos.
Asegrese de que sus tablas tengan la estructura que necesita su aplicacin. La eleccin de los tipos
de datos y los ndices es esencial para el xito de su aplicacin.
Use las vistas para tener acceso a registros de varias tablas y actualizarlos. Mediante vistas puede
actualizar datos locales y remotos.
Este captulo proporciona instrucciones para disear las tablas que se incluyen en una base de datos
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 2 de 133
85 of 804
de Visual FoxPro. Le muestra el diseo de base de datos de la base de datos de ejemplo Importadores
Tasmanian y le proporciona diseos de base de datos de ejemplo adicionales. La base de datos de
ejemplo Importadores Tasmanian, Tastrade.dbc, se encuentra en el directorio ...\Samples\Vfp98
\Tastrade\Data de Visual Studio.
Para obtener informacin sobre la creacin de bases de datos de Visual FoxPro despus de disearlas,
consulte el captulo 6, Crear bases de datos. Para obtener informacin sobre la creacin de tablas de
Visual FoxPro, consulte el captulo 7, Trabajar con tablas.
Nota Los trminos "base de datos" y "tabla" no son sinnimos en Visual FoxPro. El trmino base de
datos (archivo .dbc) se refiere a una base de datos relacional que almacena informacin sobre una o
ms tablas (archivos .dbf) o vistas.
La clave para entender el proceso de diseo de una base de datos radica en comprender la forma en
que un sistema de administracin de bases de datos relacionales, como Visual FoxPro, almacena los
datos. Para ofrecer informacin de forma eficiente y precisa, Visual FoxPro debe tener almacenados
los datos sobre distintos temas en tablas separadas. Por ejemplo, puede haber una tabla donde slo se
almacenen datos sobre empleados y otra tabla que slo contenga datos de ventas.
Al organizar los datos de forma apropiada, proporciona flexibilidad a la base de datos y tiene la
posibilidad de combinar y presentar informacin de muchas formas diferentes. Por ejemplo, podra
imprimir informes que combinasen datos sobre empleados con datos sobre ventas.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 3 de 133
86 of 804
Al disear una base de datos, en primer lugar debe dividir la informacin que desea almacenar como
temas distintos y despus indicar a Visual FoxPro cmo se relacionan estos temas para que pueda
recuperar la informacin correcta cuando sea necesario. Si mantiene la informacin en tablas
separadas facilitar la organizacin y el mantenimiento de los datos y conseguir aplicaciones de alto
rendimiento.
A continuacin se indican los pasos que hay que seguir en el proceso de diseo de una base de datos.
Cada paso se trata con mayor detalle en las secciones restantes de este captulo.
1. Determinar el propsito de la base de datos Este paso le ayudar a decidir los datos que
desea que Visual FoxPro almacene.
3. Determinar los campos necesarios Tiene que decidir la informacin que desea incluir en
cada tabla. Cada categora de informacin de una tabla se denomina campo y se muestra en
forma de columna al examinar la tabla. Por ejemplo, un campo de la tabla Empleado podra ser
Apellidos y otro podra ser Fecha_cont.
4. Determinar las relaciones Observe cada tabla y decida cmo se relacionan sus datos con los
de las tablas restantes. Agregue campos a las tablas o cree tablas nuevas para clarificar las
relaciones, si es necesario.
5. Perfeccionar el diseo Busque errores en el diseo. Cree las tablas y agregue algunos
registros de datos de ejemplo. Vea si puede obtener los resultados que desea de sus tablas.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 4 de 133
87 of 804
Haga los ajustes necesarios al diseo.
Consulte con las personas que vayan a utilizar la base de datos. Reflexione sobre las preguntas que
desee que la base de datos responda. Haga un borrador de los informes que desee producir. Rena los
formularios que se utilicen actualmente para registrar los datos. Utilizar toda esta informacin en las
etapas restantes del proceso de diseo.
Suponga que Importadores Tasmanian, una compaa de importacin y exportacin que vende
productos alimenticios de todo el mundo, desea una base de datos que permita hacer un seguimiento
de sus ventas y su inventario.
Comience por escribir una lista de preguntas que la base de datos tenga que responder. Cuntas
ventas de cierto producto logramos el mes pasado? Dnde viven nuestros mejores clientes? Quin
es el proveedor de nuestro producto ms vendido?
A continuacin, rena todos los formularios e informes que contengan la informacin que la base de
datos deba producir. Actualmente, la compaa utiliza un informe impreso para hacer un seguimiento
de los productos pedidos y un formulario para recibir nuevos pedidos. En la siguiente ilustracin se
muestran estos dos documentos.
Los formularios y los informes presentan algunos requisitos de datos para su base de datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 5 de 133
88 of 804
Importadores Tasmanian necesita tambin imprimir etiquetas de correo para los clientes, empleados y
proveedores.
Una vez recopilada esta informacin, podr continuar con el paso siguiente.
Como ejemplo, observe el formulario de pedido anterior. En l se incluyen datos sobre el cliente (su
direccin y su nmero de telfono) junto con datos sobre el pedido. Este formulario contiene datos
que se sabe que deben almacenarse en la base de datos, pero apareceran problemas si se almacenasen
los datos de los clientes en la misma tabla que los datos de los pedidos.
El almacenamiento de informacin una vez reduce las posibilidades de error Por ejemplo, si
slo usa una tabla para almacenar la informacin para un formulario de pedido, suponga que un
cliente coloca tres pedidos diferentes. Podra agregar la direccin del cliente y el nmero de telfono
a su base de datos tres veces, una para cada pedido. Pero esto multiplica la posibilidad de errores de
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 6 de 133
89 of 804
a su base de datos tres veces, una para cada pedido. Pero esto multiplica la posibilidad de errores de
entrada de datos.
Adems, si el cliente cambia de domicilio, deber aceptar informacin contradictoria o bien buscar y
modificar cada uno de los registros de ventas del cliente en la tabla. Resulta mucho mejor crear una
tabla Customer que almacene la direccin del cliente una sola vez en la base de datos. As, si es
necesario modificar los datos, slo se har una vez.
Prevenir la eliminacin de informacin valiosa Suponga que un nuevo cliente hace un pedido y
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 7 de 133
Prevenir la eliminacin de informacin valiosa Suponga que un nuevo cliente hace un90 of 804
pedido y
que posteriormente lo cancela. Al eliminar el pedido de la tabla que contiene informacin de clientes
y pedidos a la vez, se eliminara tambin el nombre del cliente y su direccin. Sin embargo, es
conveniente mantener a este nuevo cliente en la base de datos para poder enviarle el siguiente
catlogo. Una vez ms, es mejor conservar la informacin sobre el cliente en una tabla aparte. De esta
forma se puede eliminar el pedido sin perder la informacin del cliente.
Estudie la informacin que desee obtener de la base de datos y divdala en temas fundamentales que
desee mantener, como por ejemplo clientes, empleados, productos que usted vende, servicios
ofrecidos, etc. Cada uno de estos temas es un candidato para una tabla independiente.
Sugerencia Una estrategia para dividir la informacin en tablas es observar primero los datos
individuales y determinar de qu trata cada uno. Por ejemplo, en el formulario de pedidos de
Importadores Tasmanian, la direccin del cliente no est asociada a la venta, sino al cliente. Este
hecho sugiere la necesidad de una tabla independiente para los clientes. En el informe de productos
pedidos, el nmero de telfono del proveedor no est asociado al producto en existencias, sino al
proveedor. Esto sugiere que es necesaria una tabla independiente para los proveedores.
l Empleados
l Clientes
l Proveedores
l Productos
l Pedidos
A partir de esta lista, puede esbozar un borrador de las tablas de la base de datos, as como apuntar
algunos de los campos de cada una.
Aunque la base de datos terminada de Importadores Tasmanian contiene otras tablas, esta lista es un
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 8 de 133
91 of 804
Aunque la base de datos terminada de Importadores Tasmanian contiene otras tablas, esta lista es un
buen comienzo. Ms adelante en este captulo ver cmo agregar otras tablas para ajustar el diseo.
Relacione cada campo directamente con el tema de la tabla Los campos que describan el tema de
una tabla distinta pertenecern a esa otra tabla. Posteriormente, al definir las relaciones entre las
tablas, ver cmo combinar los datos de los campos de mltiples tablas. Por ahora, asegrese de que
cada campo de una tabla describe el tema de esa tabla. Si descubre que est repitiendo la misma
informacin en varias tablas, ser seal de que algunas tablas contienen campos innecesarios.
Incluya toda la informacin necesaria Es fcil pasar por alto informacin importante. Vuelva a la
informacin que reuni en la primera etapa del proceso de diseo y observe los formularios e
informes impresos para asegurarse de que toda la informacin que ha sido necesaria en el pasado est
incluida en las tablas de Visual FoxPro o que puede derivarse de ellas. Piense en las preguntas que se
formularn a Visual FoxPro. Podr Visual FoxPro encontrar todas las respuestas con la informacin
que tiene en las tablas? Ha identificado campos para almacenar datos nicos, como el Id. de cliente?
Qu tablas incluyen la informacin que desea combinar en un informe o en un formulario? Si desea
ms informacin sobre la forma de identificar campos clave y relacionar tablas, consulte las secciones
Uso de campos de clave principal y Determinacin de las relaciones, ms adelante en este mismo
captulo.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 9 de 133
92 of 804
El informe indica que la tabla Products, que contiene datos sobre los productos vendidos, debe
contener campos para el nombre del producto, las unidades en existencia y las unidades pedidas,
entre otros. Pero qu ocurre con los campos para el nombre y el nmero de telfono del proveedor?
Para producir el informe, Visual FoxPro necesitar saber a qu proveedor corresponde cada producto.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 10 de 133
93 of 804
Puede resolver esto sin almacenar datos redundantes en sus tablas si crea una tabla Supplier con
campos individuales para el nombre y el nmero de telfono del suministrador. En el paso siguiente
agregar un campo a la tabla Products para identificar la informacin de proveedor necesaria.
Si ya dispone de un identificador nico para una tabla, como por ejemplo una serie de nmeros de
producto que haya creado para identificar los productos en existencias, puede utilizarlo como clave
principal de la tabla. Asegrese de que los valores de este campo sern siempre distintos para cada
registro, pues Visual FoxPro no permite valores duplicados en un campo de clave principal. Por
ejemplo, no debe utilizar nombres de personas como clave principal, ya que no son nicos. Puede
ocurrir fcilmente que haya en una misma tabla dos personas con el mismo nombre.
l Visual FoxPro no permite valores duplicados ni nulos en los campos de clave principal. Por
ello, no debe elegir una clave principal que pueda contener valores de este tipo.
l Puede utilizar el valor del campo de clave principal para buscar registros, por lo que no debe
ser demasiado largo para recordarlo o escribirlo. Puede ser conveniente hacer que el valor tenga
un nmero determinado de letras o dgitos, o que se encuentre en un cierto intervalo de valores.
l El tamao de la clave principal afecta a la velocidad de las operaciones en la base de datos.
Cuando cree campos de clave principal, utilice el menor tamao que resulte adecuado a los
valores que se almacenarn en ellos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 11 de 133
94 of 804
En algunos casos puede ser conveniente utilizar dos o ms campos para formar la clave principal de
una tabla. Por ejemplo, la tabla Order_Line_Items de la base de datos de Importadores Tasmanian
utiliza dos campos como clave principal: Order_id y Product_id. En el paso siguiente se explicar la
razn de esto.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 12 de 133
95 of 804
Visual FoxPro es un sistema de administracin de bases de datos relacionales. Esto significa que se
almacenan datos relacionados en tablas separadas y que luego se definen entre las tablas relaciones
que Visual FoxPro utilizar para buscar informacin asociada almacenada en la base de datos.
Por ejemplo, suponga que desea telefonear a un empleado para consultarle sobre una venta que ha
realizado. Los nmeros de telfono de los empleados estn registrados en la tabla Employee, y las
ventas se registran en la tabla Orders. Al indicar a Visual FoxPro la venta en la que estamos
interesados, ste puede buscar el nmero de telfono utilizando la relacin existente entre las dos
tablas. El mecanismo funciona gracias a que Employee_id, la clave principal de la tabla Employee, es
tambin un campo de la tabla Orders. En la terminologa de las bases de datos, el campo
Employee_id de la tabla Orders es una clave externa, ya que se refiere a la clave principal de una
tabla distinta, o externa.
Campo Employee_id como clave principal de la tabla Employee y como clave externa de la
tabla Orders
As, para establecer una relacin entre dos tablas (tabla A y tabla B) se agrega la clave principal de
una de ellas a la otra, de forma que aparezca en ambas. Pero, cmo se decide de qu tabla se toma la
clave principal? Para configurar correctamente las relaciones, primero es necesario determinar su
naturaleza. Hay tres tipos de relaciones entre tablas:
En el resto de esta seccin se presenta un ejemplo de cada tipo de relacin y se explica cmo disear
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 13 de 133
96 of 804
En el resto de esta seccin se presenta un ejemplo de cada tipo de relacin y se explica cmo disear
las tablas de forma que Visual FoxPro pueda asociar sus datos correctamente. El propsito de cada
ejemplo es explicar la forma de determinar las relaciones entre las tablas y cmo decidir los campos
de las tablas que deben utilizarse para las relaciones. No se pretende describir el uso de la interfaz de
Visual FoxPro para relacionar tablas.
La relacin de uno a varios es la ms comn en una base de datos relacional. En una relacin de este
tipo, un registro de la tabla A puede tener ms de un registro coincidente en la tabla B, pero cada
registro de la Tabla B tendr como mximo un registro coincidente en la tabla A.
Por ejemplo, las tablas Supplier y Products de la base de datos de Importadores Tasmanian tienen una
relacin de uno a varios.
Para establecer la relacin, agregue el campo o los campos que forman la clave principal del lado
"uno" de la relacin a la tabla del lado "varios". En el lado "uno" se utiliza una clave de ndice
principal o candidato y en el lado "varios" puede usarse una clave de ndice normal. En este caso, el
campo Supplier_id de la tabla Supplier se agregara a la tabla Products, ya que un proveedor puede
suministrar varios productos. Visual FoxPro utilizar el nmero de Id. de proveedor para localizar el
proveedor correspondiente a cada producto.
Para obtener informacin sobre la creacin de claves de ndice, consulte el captulo 7, Trabajar con
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 14 de 133
97 of 804
Para obtener informacin sobre la creacin de claves de ndice, consulte el captulo 7, Trabajar con
tablas.
Para detectar relaciones de varios a varios entre las tablas es importante observar los dos sentidos de
cada relacin. Por ejemplo, considere la relacin entre pedidos y productos de la base de datos de
Importadores Tasmanian. Un pedido puede incluir ms de un producto, de forma que para cada
registro de la tabla Orders puede haber varios registros en la tabla Products. Pero eso no es todo: cada
producto puede aparecer en varios pedidos, por lo que para cada registro de la tabla Products puede
haber varios registros en la tabla Orders.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 15 de 133
98 of 804
Los temas de las dos tablas (pedidos y productos) tienen una relacin de varios a varios. Esto supone
un problema en el diseo de la base de datos. Para entender este problema, imagine lo que ocurrira si
intentase establecer la relacin entre las dos tablas agregando el campo Product_id a la tabla Orders.
Para tener ms de un producto por pedido, necesitara ms de un registro en la tabla Orders por cada
pedido real y tendra que repetir una y otra vez la informacin para cada registro relacionado con el
mismo pedido, lo que supone un diseo poco eficaz que puede llevar a una falta de exactitud en los
datos. El mismo problema aparece si se incluye el campo Order_id en la tabla Products: sera
necesario ms de un registro en la tabla Products para cada producto real. Cmo puede resolverse
este problema?
La respuesta consiste en crear una tercera tabla que divida la relacin de varios a varios en dos
relaciones de uno a varios. Esta tercera tabla se denomina tabla de unin, ya que acta como conexin
entre las dos tablas y en ella se incluir la clave principal de cada una de las dos tablas anteriores.
Una tabla de conexin podra guardar nicamente las dos claves principales de las tablas que vincula
o, como en la tabla Order_Line_Items, la tabla de conexin podra contener informacin adicional.
Cada registro de la tabla Order_Line_Items representa una lnea de un pedido. La clave principal de la
tabla Order_Line_Items consta de dos campos: las claves externas de las tablas Orders y Products. El
campo Order_id por s solo no sirve como clave principal de la tabla, ya que un mismo pedido puede
tener varias lneas de productos. El Id. de pedido se repite para cada lnea de un pedido, por lo que el
campo no contendr valores nicos. El campo Product_id tampoco funcionar, ya que un mismo
producto puede aparecer en varios pedidos diferentes. Sin embargo, los dos campos juntos en la tabla
de unin producirn siempre un valor nico para cada registro. La tabla de conexin no requiere su
propia clave principal.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 16 de 133
99 of 804
propia clave principal.
l Las tablas Orders y Order_Line_Items tienen una relacin de uno a varios. Cada pedido puede
tener ms de una lnea de producto, pero cada lnea slo estar conectada a un pedido.
l Las tablas Products y Order_Line_Items tienen una relacin de uno a varios. Cada producto
puede tener ms de una lnea asociada, pero cada lnea slo se refiere a un producto.
En una relacin de uno a uno, cada registro de la tabla A no puede tener ms de un registro
coincidente en la tabla B y a cada registro de la tabla B no puede corresponderle ms de un registro
coincidente en la tabla A. Este tipo de relacin es poco habitual y puede indicar la necesidad de una
modificacin en el diseo de la base de datos.
Las relaciones de uno a uno entre dos tablas son poco usuales ya que, en muchos casos, la
informacin de ambas tablas puede combinarse de forma sencilla en una tabla nica. Por ejemplo,
suponga que se crea una tabla, llamada Jugadores de ping-pong, para hacer un seguimiento de un
torneo benfico de ping-pong en Importadores Tasmanian. Como todos los jugadores son empleados,
esta tabla tendr una relacin de uno a uno con la tabla Employee de la base de datos de Importadores
Tasmanian.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 17 de 133
100 of 804
Sera posible agregar todos los campos de la tabla Jugadores de ping-pong a la tabla Employee. Sin
embargo, la tabla Jugadores de ping-pong se utiliza para un acontecimiento puntual y la informacin
dejar de ser necesaria cuando ste termine. Adems, no todos los empleados juegan al Ping-pong, de
modo que si los campos se incorporasen a la tabla Employee, estaran vacos en muchos registros. Por
estas razones tiene sentido crear una tabla distinta.
Cuando detecte la necesidad de una relacin de uno a uno en una base de datos, considere primero si
es conveniente agrupar la informacin en una sola tabla. Por ejemplo, en la tabla Employee, un
empleado puede tener su propio director, que tambin es un empleado. Puede agregar un campo para
el nmero de identificacin del director. Para reunir la informacin ms tarde, puede usar una
autocombinacin en la consulta o vista. No necesita una tabla independiente para resolver la relacin
uno a uno. Si no quiere hacerlo por alguna razn, a continuacin se muestra cmo configurar la
relacin uno a uno entre las dos tablas:
l Si las dos tablas tratan del mismo tema, probablemente podr definir la relacin utilizando el
mismo campo de clave principal en ambas.
l Si las dos tablas tratan de temas distintos y tienen claves principales diferentes, elija una de
ellas e incluya su campo de clave principal en la otra como clave externa.
Perfeccionar el diseo
Cuando ya se tienen las tablas, los campos y las relaciones necesarios, es el momento de estudiar el
diseo y detectar los posibles fallos que puedan quedar.
Puede encontrar varios fallos mientras est diseando su base de datos. Estos problemas comunes
pueden hacer que sus datos sean ms difciles de usar que de mantener:
l Tiene una tabla con un gran nmero de campos que no relaciona con el mismo asunto? Por
ejemplo, una tabla puede contener campos que pertenecen a sus clientes as como informacin
de ventas. Intente asegurarse de que cada tabla contiene datos sobre un solo tema.
l Tiene campos que se dejan intencionadamente en blanco en muchos registros porque no son
aplicables a dichos registros? Esto generalmente significa que los campos pertenecen a otra
tabla.
l Tiene un gran nmero de tablas, muchas de las cuales contienen los mismos campos? Por
ejemplo, tiene tablas distintas para las ventas de enero y las de febrero, o para clientes locales y
clientes remotos, en las que almacena el mismo tipo de informacin. Intente consolidar toda la
informacin perteneciente a un solo asunto en una sola tabla. Es posible que tenga que agregar
un campo adicional, por ejemplo, para identificar la fecha de venta.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 18 de 133
101 of 804
Cree sus tablas, especifique relaciones entre las tablas e introduzca algunos registros de datos en cada
tabla. Vea si puede usar la base de datos para obtener las respuestas que desea. Cree borradores de sus
formularios e informes y vea si muestra los datos que espera. Busque duplicados de datos
innecesarios y elimnelos.
A medida que identifique los cambios que desea realizar, puede modificar las tablas y los campos
para reflejar las mejoras en el diseo. Si desea informacin sobre cmo modificar las tablas, consulte
el captulo 7, Trabajar con tablas.
Cada producto en existencias de Importadores Tasmanian pertenece a una categora general, como
Bebidas, Condimentos o Pescados. La tabla Products podra contener un campo para mostrar la
categora de cada producto.
Suponga que al examinar y perfeccionar la base de datos Importadores Tasmanian decide almacenar
una descripcin de la categora junto con su nombre. Si agregase un campo Category Description a la
tabla Products, tendra que repetir la descripcin de una categora para cada producto que
perteneciese a ella, lo que no es una buena solucin.
Un mtodo ms adecuado es hacer de la categora un nuevo tema del que tenga que ocuparse la base
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 19 de 133
102 of 804
Un mtodo ms adecuado es hacer de la categora un nuevo tema del que tenga que ocuparse la base
de datos, con su propia tabla y su propia clave principal. De esta forma puede agregar la clave
principal de la tabla Category a la tabla Products como clave externa.
La tabla Category proporciona un lugar donde almacenar de forma eficaz la informacin sobre
categoras.
Las tablas Category y Products tienen una relacin de uno a varios: una categora puede tener ms de
un producto, pero cada producto slo pertenece a una categora.
Esta estructura de base de datos almacena las citas de una oficina profesional, y puede modificarse
fcilmente para que la usen mdicos, odontlogos, abogados o contables. La tabla Citas cuenta con
una clave principal de mltiples campos para identificar cada cita de forma nica. Esta clave
principal, el ndice 'client_sta', se crea indexando por una expresin que combina los campos
cliente_id y date_start.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 20 de 133
103 of 804
Esta estructura de base de datos almacena informacin sobre recursos humanos. La tabla Historial de
trabajo almacena informacin sobre cada contrato o ascenso, de forma que puede contener varios
registros por cada empleado.
Esta base de datos almacena informacin sobre los libros de una biblioteca y los prstamos a los
lectores. Observe la relacin de varios a varios entre las tablas Libros y Autores y entre las tablas
Libros y Temas.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 21 de 133
104 of 804
Para obtener ms informacin sobre la forma de crear una base de datos para un entorno de mltiples
usuarios, consulte el captulo 17, Programar para acceso compartido.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 22 de 133
105 of 804
l Crear una base de datos
l Ver y modificar la arquitectura de una base de datos
l Administrar una base de datos
l Hacer referencia a mltiples bases de datos
l Controlar errores de bases de datos
Algunas caractersticas del diccionario de datos, como nombres de campo largos, claves principales y
candidatas, valores predeterminados, reglas a nivel de campo y a nivel de registro y desencadenantes
se almacenan en el archivo .dbc, pero se crean como parte del proceso de generacin de una tabla o
una vista. Para obtener ms informacin, consulte el captulo 7, Trabajar con tablas, y el captulo 8,
Crear vistas.
Para reunir tablas en una base de datos tiene que crear un contenedor de base de datos para guardar
todos los objetos como vistas, conexiones y procedimientos almacenados asociados a las tablas que
forman la base de datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 23 de 133
106 of 804
O bien
Por ejemplo, el cdigo siguiente crea y abre de forma exclusiva una nueva base de datos, llamada
Ejemplo:
Al crear una nueva base de datos, sta estar vaca, pues no contendr tablas asociadas ni ningn otro
objeto. Al agregar una tabla se crean vnculos entre el archivo de tabla y el contenedor de la base de
datos. La informacin de vnculo sobre una tabla almacenada en la base de datos es un vnculo
posterior. La informacin de vnculo almacenada en la tabla sobre el contenedor de base de datos es
el vnculo anterior.
Los vnculos especifican las asociaciones entre un contenedor de bases de datos y las tablas.
Para trabajar con una base de datos y sus objetos mediante programacin, puede utilizar los
comandos y funciones siguientes.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 24 de 133
107 of 804
APPEND PROCEDURES DELETE CONNECTION MODIFY VIEW
CLOSE DATABASE DELETE DATABASE OPEN DATABASE
COPY PROCEDURES DELETE VIEW PACK DATABASE
CREATE CONNECTION DISPLAY DATABASE RENAME TABLE
CREATE DATABASE DROP TABLE REMOVE TABLE
CREATE SQL VIEW INDBC( ) SET DATABASE
CREATE TABLE LIST DATABASE VALIDATE DATABASE
Cada tabla de Visual FoxPro puede existir en uno de dos estados: como tabla libre, que es un archivo
.DBF no asociado a ninguna base de datos, o como tabla de base de datos, que es un archivo .dbf
asociado a una base de datos. Las tablas asociadas a una base de datos pueden tener propiedades que
no tienen las tablas libres, como las reglas a nivel de campo y a nivel de registro, los desencadenantes
y las relaciones persistentes.
Las tablas se asocian a una base de datos al crearlas desde dentro de una base de datos abierta o al
agregar tablas existentes a una base de datos. Si desea informacin sobre la forma de crear tablas
nuevas, consulte el captulo 7, Trabajar con tablas.
-O bien
Por ejemplo, el cdigo siguiente abre la base de datos testdata y le agrega la tabla orditems:
Para que una tabla libre existente pase a formar parte de una base de datos, debe agregarla
explcitamente. La modificacin de la estructura de una tabla libre no hace que Visual FoxPro la
agregue a una base de datos, incluso cuando la base de datos se encuentre abierta al utilizar el
comando MODIFY STRUCTURE.
Una tabla determinada slo se puede asociar a una base de datos. Sin embargo, es posible utilizar los
datos de un archivo .dbf existente sin necesidad de incorporarlo a una base de datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 25 de 133
108 of 804
Para tener acceso a una tabla de otra base de datos
l Cree una vista en la base de datos actual que haga referencia a la tabla en cuestin.
-O bien
El smbolo ! permite hacer referencia a una tabla de una base de datos distinta de la actual. Por
ejemplo, si desea examinar la tabla orditems de la base de datos testdata, puede escribir:
USE testdata!orditems
BROWSE
Si desea informacin sobre el uso de una vista para tener acceso a informacin externa a la base de
datos actual, consulte el captulo 8, Crear vistas.
Al agregar una tabla a una base de datos, Visual FoxPro modifica el registro de encabezado del
archivo para documentar la ruta de acceso y el nombre de archivo de la base de datos a la que ahora
pertenece la tabla. Esta informacin de ruta y nombre de archivo se denomina vnculo anterior, ya que
vincula la tabla a la base de datos a la que pertenece. El proceso de quitar una tabla de una base de
datos no solamente suprime la tabla y la informacin de diccionario de datos asociada del archivo de
la base de datos, sino que tambin actualiza la informacin de vnculo anterior para reflejar el nuevo
estado de la tabla como libre.
Para quitar una tabla de una base de datos puede utilizar la interfaz o bien el comando REMOVE
TABLE. Al quitar la tabla de la base de datos, puede elegir tambin eliminar fsicamente del disco el
archivo de la tabla.
-O bien
l En el Diseador de bases de datos, seleccione la tabla y elija Quitar en el men Base de datos.
O bien
Por ejemplo, el cdigo siguiente abre la base de datos testdata y quita la tabla orditems:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 26 de 133
109 of 804
Por ejemplo, el cdigo siguiente abre la base de datos testdata y quita la tabla orditems:
Al quitar una tabla de una base de datos, el archivo de tabla no se elimina automticamente. Si desea
quitar la tabla de la base de datos y adems eliminar del disco su archivo .dbf, utilice la clusula
DELETE del comando REMOVE TABLE o el comando DROP TABLE. Por ejemplo, el cdigo
siguiente abre la base de datos testdata y elimina la tabla orditems del disco:
El cdigo siguiente tambin abre la base de datos testdata y elimina la tabla orditems sin mover
una copia a la Papelera de reciclaje de Windows:
Si mueve archivos de base de datos (.dbf, .dct y .dcx) o una tabla asociada con la base de datos, las
rutas relativas cambian y pueden romper los vnculos anteriores y posteriores que Visual FoxPro usa
para asociar archivos de bases de datos y de tablas:
l El vnculo anterior vincula la tabla con la base de datos propietaria de la tabla. Est formado
por la ruta relativa y el nombre de archivo para el archivo .dbc asociado a la tabla, y est
almacenado en el encabezado del archivo de tabla de Visual FoxPro (.dbf).
l El vnculo posterior dice a la base de datos qu tablas le pertenecen. Los vnculos posteriores
estn almacenados en el archivo de base de datos (.dbc) y estn formados por la ruta relativa y
el nombre de archivo para cada archivo de tabla asociado.
Puede restablecer vnculos y actualizar la informacin de ruta relativa de forma que refleje la nueva
ubicacin del archivo.
Para actualizar vnculos despus de mover una tabla o una base de datos
Por ejemplo, el cdigo siguiente abre la base de datos testdata y muestra cuadros de dilogo que le
permiten buscar tablas que no estn en las ubicaciones contenidas en la base de datos:
Sugerencia Si quiere usar una tabla sin perder tiempo restableciendo los vnculos para todas las
tablas de la base de datos, puede abrir la tabla con el comando USE. Visual FoxPro muestra el cuadro
de dilogo Abrir que le permitir buscar la base de datos propietaria o eliminar los vnculos.
Para obtener informacin sobre la eliminacin del vnculo anterior de una tabla cuya base de datos
propietaria se ha eliminado accidentalmente del disco, vea FREE TABLE.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 27 de 133
110 of 804
propietaria se ha eliminado accidentalmente del disco, vea FREE TABLE.
Puede crear relaciones persistentes entre las tablas de una base de datos. Las relaciones persistentes
son relaciones entre tablas de una base de datos que se almacenan en el archivo de la base de datos y
tienen las caractersticas siguientes:
A diferencia de las relaciones temporales creadas con el comando SET RELATION, las relaciones
persistentes no necesitan restablecerse cada vez que se utilizan las tablas. Sin embargo, como las
relaciones persistentes no controlan la relacin entre los punteros de registros de las tablas, al
programar aplicaciones de Visual FoxPro se utilizan relaciones de ambos tipos.
En Visual FoxPro se utilizan los ndices para establecer relaciones persistentes entre las tablas de una
base de datos. La relacin se define entre los ndices y no entre los campos, lo que permite relacionar
las tablas basndose en una expresin de ndice simple o compleja.
l En el Diseador de bases de datos, elija el nombre del ndice que desee relacionar y arrstrelo
hasta el nombre del ndice de la tabla relacionada.
O bien
l Utilice la clusula FOREIGN KEY en los comandos CREATE TABLE o ALTER TABLE.
Por ejemplo, el comando siguiente agrega una relacin persistente de uno a varios entre las tablas
customer y orders, basndose en la clave principal cust_id de la tabla customer y en una nueva
clave externa, cust_id, de la tabla orders:
Si examina el esquema de la base de datos en el Diseador de bases de datos, ver una lnea que une
orders y customer, lo que representa la nueva relacin persistente.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 28 de 133
111 of 804
El tipo de etiqueta o clave de ndice determinar el tipo de relacin persistente que puede crear. Es
necesaria una etiqueta de ndice principal o candidato para el lado 'uno' de una relacin de uno a
varios; para el lado 'varios' debe utilizar una etiqueta o clave de ndice normal. Si desea ms
informacin sobre los tipos de ndices y cmo crearlos, consulte el captulo 7, Trabajar con tablas.
1. En el Diseador de bases de datos, haga clic en la lnea de relacin entre las dos tablas.
O bien
Por ejemplo, el comando siguiente elimina una relacin persistente entre las tablas customer y
orders basada en la clave principal cust_id de la tabla customer y en una clave externa, cust_id,
de la tabla orders:
Establecer integridad referencial implica la creacin de un conjunto de reglas para preservar las
relaciones definidas entre las tablas al introducir o eliminar registros.
l Agregar registros a una tabla relacionada cuando no haya ningn registro asociado en la tabla
principal.
l Cambiar valores de una tabla principal cuando tales cambios supongan dejar registros
hurfanos en una tabla relacionada.
l Eliminar registros de una tabla principal cuando tengan registros relacionados coincidentes.
Si lo desea, puede escribir sus propios desencadenantes y procedimientos almacenados para exigir la
integridad referencial. Sin embargo, el Generador de integridad referencial (IR) de Visual FoxPro
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 29 de 133
112 of 804
integridad referencial. Sin embargo, el Generador de integridad referencial (IR) de Visual FoxPro
permite determinar los tipos de reglas que desea exigir, las tablas a las que desea exigirlas y los
eventos del sistema que harn que Visual FoxPro las compruebe.
Al utilizar el Generador de IR para crear reglas que se van a aplicar a la base de datos, Visual FoxPro
guarda el cdigo generado para exigir las reglas de integridad referencial como desencadenantes que
hacen referencia a procedimientos almacenados. Para ver este cdigo puede abrir el editor de texto de
procedimientos almacenados en la base de datos. Si desea informacin sobre la forma de crear
desencadenantes por programa, consulte Uso de desencadenantes en el captulo 7, Trabajar con
tablas.
Precaucin Cuando haga cambios en el diseo de una base de datos, como modificaciones en sus
tablas o en los ndices utilizados en una relacin persistente, debe volver a ejecutar el Generador de
IR antes de utilizar de nuevo la base de datos. De esta forma se revisar el cdigo de procedimiento
almacenado y los desencadenantes utilizados para exigir la integridad referencial, de forma que
reflejen el nuevo diseo. Si no vuelve a ejecutar el Generador de RI, puede que obtenga resultados
inesperados, ya que no se habrn actualizado los procedimientos almacenados y los desencadenantes
para ajustarlos a las modificaciones.
Puede crear procedimientos almacenados para las tablas de una base de datos. Un procedimiento
almacenado est formado por cdigo de Visual FoxPro incluido en el archivo .dbc. Los
procedimientos almacenados son procedimientos de cdigo que operan especficamente sobre los
datos de la base de datos. Su uso puede mejorar el rendimiento, ya que se cargan en memoria en el
momento de abrir la base de datos.
O bien
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 30 de 133
113 of 804
l En la ventana Comandos, utilice el comando MODIFY PROCEDURE.
Cada una de estas opciones abre el editor de texto de Visual FoxPro, que permite crear o modificar en
l procedimientos almacenados de la base de datos activa.
Los procedimientos almacenados se utilizan principalmente para crear funciones definidas por el
usuario a las que se hace referencia en una regla de validacin a nivel de campo o registro. Al guardar
una funcin definida por el usuario como procedimiento almacenado en la base de datos, el cdigo de
la funcin se guarda en el archivo .dbc y se desplaza automticamente con la base de datos cuando
sta cambia de lugar. El uso de procedimientos almacenados permite tambin una mayor portabilidad
de la aplicacin, ya que no es necesario administrar los archivos de funciones definidas por el usuario
independientemente del archivo de base de datos.
Todas las bases de datos de Visual FoxPro contienen las propiedades Comment y Version. Para
verlas puede utilizar las funciones DBGETPROP( ) y DBSETPROP( ).
Por ejemplo, el cdigo siguiente muestra el nmero de versin de la base de datos testdata:
El valor devuelto representa el nmero de versin de .dbc de Visual FoxPro y es de slo lectura. Con
la misma funcin puede ver el comentario, si existe, para la base de datos:
O bien
Tambin puede utilizar las funciones DBGETPROP( ) y DBSETPROP( ) para ver y establecer
propiedades de otros objetos de base de datos como conexiones y vistas.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 31 de 133
114 of 804
Ver y modificar la arquitectura de las bases de datos
Al crear una base de datos, Visual FoxPro crea y abre de forma exclusiva un archivo .dbc
(Contenedor de base de datos). El archivo .dbc almacena toda la informacin sobre la base de datos,
incluidos los nombres de los archivos y los objetos asociados a ella. El archivo .dbc no contiene
fsicamente ningn objeto de alto nivel, como tablas o campos; Visual FoxPro almacena en l
punteros de rutas de archivo que apuntan a las tablas.
Para examinar la arquitectura de una base de datos, puede examinar el archivo de base de datos, ver el
esquema, validar la base de datos, comprobar los vnculos anteriores e incluso extender el archivo
.dbc.
El esquema de la base de datos es una representacin visual de la estructura de las tablas y las
relaciones persistentes establecidas en ella. La ventana Diseador de bases de datos muestra el
esquema de la base de datos abierta.
Por ejemplo, el cdigo siguiente abre la base de datos testdata y muestra su esquema en el
Diseador de bases de datos:
En el Diseador de bases de datos, puede utilizar la barra de herramientas Base de datos para crear
una nueva tabla, agregar a la base de datos una tabla existente, quitar una tabla de la base de datos o
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 32 de 133
115 of 804
una nueva tabla, agregar a la base de datos una tabla existente, quitar una tabla de la base de datos o
modificar la estructura de una tabla. Tambin puede modificar procedimientos almacenados.
El archivo de base de datos contiene un registro por cada tabla, vista, ndice, etiqueta de ndice,
relacin persistente y conexin asociados a la base, y tambin por cada campo de tabla o de vista con
propiedades extendidas. Tambin incluye un registro nico que contiene todos los procedimientos
almacenados de la base de datos.
Para obtener ms informacin acerca de la estructura del archivo .dbc, vea Estructura de archivos de
tabla.
Aunque el Diseador de bases de datos proporciona una representacin conceptual del esquema de la
base de datos, puede que en ocasiones sea necesario examinar el contenido del propio archivo de base
de datos. Para examinar una base de datos cerrada puede utilizar el comando USE con el archivo
.dbc. En el ejemplo siguiente se abre una ventana Examinar que muestra el contenido de la base de
datos sales en formato de tabla.
Todos los archivos .dbc contienen un campo Memo, llamado User, que puede utilizar para almacenar
su propia informacin sobre cada registro de la base de datos. Tambin puede extender un archivo
.dbc agregndole campos para ajustarlo a sus necesidades como programador. Para modificar la
estructura de un archivo .dbc es necesario tener acceso al mismo de forma exclusiva.
Por ejemplo, el cdigo siguiente abre el Diseador de tablas para permitirle agregar un campo a la
estructura de Testdata.dbc:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 33 de 133
estructura de Testdata.dbc: 116 of 804
Al agregar un nuevo campo o un archivo de base de datos, utilice como primer carcter de su nombre
U para indicar que se trata de un campo definido por el usuario. Esta convencin evita que el
campo entre en conflicto con futuras extensiones del archivo .dbc.
Precaucin No modifique ninguno de los campos definidos por Visual FoxPro en un archivo .dbf.
Las modificaciones de un archivo .dbc pueden afectar a la integridad de la base de datos.
La validacin de una base de datos asegura que las filas de la base de datos almacenan
representaciones precisas de los metadatos de la base de datos. Para comprobar la integridad de la
base de datos activa, puede utilizar el comando VALIDATE DATABASE.
Por ejemplo, el cdigo siguiente utiliza y valida el archivo .dbc de la base de datos testdata:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 34 de 133
117 of 804
Al crear una base de datos con el comando CREATE DATABASE, la base de datos no pasa
automticamente a formar parte de un proyecto, an cuando el Administrador de proyectos est
abierto. Puede agregar la base de datos a un proyecto para facilitar la organizacin, la presentacin y
la manipulacin de los objetos de base de datos mediante la interfaz y tambin para simplificar el
proceso de generacin de una aplicacin. Slo se puede agregar una base de datos a un proyecto
mediante el Administrador de proyectos.
Slo se puede quitar una base de datos de un proyecto mediante el Administrador de proyectos.
Para eliminar del disco una base de datos puede utilizar el Administrador de proyectos o el comando
DELETE DATABASE.
O bien
Utilice siempre alguno de los mtodos anteriores para eliminar una base de datos del disco. El uso del
Administrador de proyectos o del comando DELETE DATABASE permite a Visual FoxPro suprimir
los vnculos anteriores que unen la base de datos a sus tablas. Otras utilidades de manipulacin de
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 35 de 133
118 of 804
los vnculos anteriores que unen la base de datos a sus tablas. Otras utilidades de manipulacin de
archivos, como el Administrador de archivos de Windows, no suprimen los vnculos anteriores.
Nota El comando DELETE DATABASE no elimina del disco las tablas asociadas a la base de
datos, sino que las convierte en tablas libres. Si desea eliminar del disco una base de datos y tambin
todas sus tablas asociadas, utilice la clusula DELETETABLES con el comando DELETE
DATABASE.
Por ejemplo, es posible que tenga una base de datos de ventas que guarda informacin de ventas
usada principalmente por la fuerza de ventas que trabaja con clientes y otra base de datos que guarda
informacin de inventario usada principalmente por los compradores que trabajan con los
suministradores. A veces es necesario que la informacin de estos grupos se solape. Estas bases de
datos se pueden abrir simultneamente y se puede tener acceso a las mismas como se desee, pero
contendrn tipos de informacin completamente diferentes.
Puede usar mltiples bases de datos abriendo ms de una base de datos simultneamente o
estableciendo referencias en una base de datos cerrada. Cuando estn abiertas varias bases de datos,
puede establecer la base de datos actual y seleccionar tablas de ella.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 36 de 133
119 of 804
puede establecer la base de datos actual y seleccionar tablas de ella.
Cuando hay abierta una base de datos, las tablas y las relaciones entre ellas estn controladas por la
informacin almacenada en la base de datos abierta. Puede tener abierta ms de una base de datos a la
vez. Por ejemplo, puede utilizar mltiples bases de datos abiertas al ejecutar varias aplicaciones, cada
una basada en una base de datos distinta. Tambin puede ser conveniente abrir varias bases de datos
para utilizar informacin (como por ejemplo controles personalizados) almacenada en una base de
datos distinta de la que utiliza la aplicacin.
O bien
Al abrir una nueva base de datos no se cierran las que se hayan abierto previamente. Las bases
abiertas continuarn en este estado y la ltima en abrirse pasar a ser la base de datos activa.
Al abrir varias bases de datos, Visual FoxPro establece como activa la abierta en ltimo lugar. De
forma predeterminada, todas las tablas u objetos que cree o agregue formarn parte de la base de
datos activa. Los comandos y funciones que manipulan bases de datos abiertas, como ADD TABLE y
DBC( ), se aplican tambin a la base de datos activa.
Puede elegir una base de datos distinta y establecerla como activa mediante la interfaz o mediante el
comando SET DATABASE.
l En la barra de herramientas estndar, seleccione una base de datos en el cuadro Bases de datos.
O bien
Por ejemplo, el cdigo siguiente abre tres bases de datos, establece la primera como activa y luego
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 37 de 133
120 of 804
Por ejemplo, el cdigo siguiente abre tres bases de datos, establece la primera como activa y luego
utiliza la funcin DBC( ) para mostrar el nombre de la base de datos activa:
Sugerencia Visual FoxPro puede abrir una o ms bases de datos automticamente al ejecutar una
consulta o un formulario que requiera que esas bases de datos se encuentren abiertas. Para mantener
el control, establezca la base de datos activa explcitamente antes de utilizar comandos que operen
sobre la base de datos activa.
Para elegir en una lista con las tablas de la base de datos activa, puede utilizar el comando USE.
Aparecer el cuadro de dilogo Usar en el que puede seleccionar la tabla que desea abrir.
Por ejemplo, el cdigo siguiente abre la base de datos ventas y solicita que se seleccione una de las
tablas que contiene.
Si desea seleccionar una tabla no asociada a la base de datos abierta, podr elegir "Otras" en el cuadro
de dilogo Usar.
Puede cerrar una base de datos abierta mediante el Administrador de proyectos o mediante el
comando CLOSE DATABASE.
O bien
Ambas opciones cierran automticamente la base de datos. Tambin puede cerrar bases de datos y
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 38 de 133
121 of 804
Ambas opciones cierran automticamente la base de datos. Tambin puede cerrar bases de datos y
todos los dems objetos abiertos con la clusula ALL del comando CLOSE.
El uso del comando CLOSE DATABASE desde la ventana Comandos no cerrar las bases de datos
que se hayan abierto de las formas siguientes:
l Con el Administrador de proyectos al expandir el esquema para ver el contenido de una base de
datos.
l Con un formulario que se ejecute en su propia sesin de datos.
En estas circunstancias, la base de datos permanecer abierta hasta que el Administrador de proyectos
la cierre o hasta que se cierre el formulario que la utiliza.
Visual FoxPro utiliza la base de datos activa como alcance principal para los objetos con nombre,
como las tablas. Cuando una base de datos est abierta, Visual FoxPro busca primero en ella los
objetos que se soliciten, como pueden ser tablas, vistas, conexiones, etctera. Si el objeto no se
encuentra en la base de datos, Visual FoxPro lo buscar en la ruta de bsqueda predeterminada.
Por ejemplo, si la tabla customer est asociada a la base de datos sales, Visual FoxPro encontrar
siempre la tabla customer de la base de datos al utilizar los comandos siguientes:
Si utiliza el comando siguiente, Visual FoxPro buscar la tabla products comenzando por la base de
datos activa:
USE PRODUCTS
Si products no se encuentra en la base de datos activa, Visual FoxPro intentar buscar fuera de ella
en la ruta de bsqueda predeterminada.
Nota Puede especificar la ruta de acceso completa de una tabla si desea tener acceso a la misma
desde dentro o desde fuera de una base de datos; por ejemplo, si prev un cambio en la ubicacin de
la tabla. Sin embargo, el rendimiento es mejor cuando slo se hace referencia al nombre de la tabla,
ya que en Visual FoxPro es ms rpido el acceso a los nombres de tablas de base de datos que a los
nombres especificados con la ruta de acceso completa.
Cuando ocurre un error de base de datos, el motor de base de datos subyacente que detecta el error
enva normalmente un mensaje de error. Sin embargo, la naturaleza exacta del mensaje de error
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 39 de 133
122 of 804
enva normalmente un mensaje de error. Sin embargo, la naturaleza exacta del mensaje de error
depende de la base de datos a la que se tenga acceso, por ejemplo, los mensajes de error producidos
por un servidor de base de datos remota (como Microsoft SQL Server) probablemente sern distintos
de los que se producen si ocurre un error en una tabla local de Visual FoxPro.
Adems, los errores a nivel de motor son a veces muy genricos, porque el motor de base de datos no
tiene informacin sobre el contexto en el que se actualiza un registro. Como consecuencia, los
mensajes de error producidos por un motor de base de datos suelen ser menos tiles para el usuario
de una aplicacin de Visual FoxPro.
Para controlar errores de base de datos de forma ms especfica para la aplicacin, puede crear
desencadenantes con el comando CREATE TRIGGER. El desencadenante se llama cuando se intenta
la actualizacin de un registro (eliminar, insertar o actualizar). El cdigo de desencadenante
actualizado puede buscar entonces condiciones de error especficas de la aplicacin e informar de
ellas.
l Crear tablas
l Trabajar con registros
l Indexar tablas
l Usar mltiples tablas
Crear tablas
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 40 de 133
123 of 804
Puede crear una tabla en una base de datos o una tabla libre que no est asociada a ninguna base de
datos. A medida que crea la tabla puede crear nombres largos de tabla y de campo, y aprovechar las
posibilidades del diccionario de datos para tablas de base de datos, nombres largos de campo, valores
de campo predeterminados, reglas a nivel de campo y a nivel de registro, y desencadenantes.
Las tablas de Visual FoxPro, o archivos .dbf, pueden existir en dos estados: como tabla de base de
datos (una tabla asociada a una base de datos) o como una tabla libre no asociada a ninguna base de
datos. Las tablas asociadas a una base de datos cuentan con ciertas ventajas sobre las tablas libres.
Cuando una tabla forma parte de una base de datos, es posible crear:
Algunas caractersticas slo son aplicables a las tablas de base de datos. Si desea informacin sobre la
forma de asociar tablas a una base de datos, consulte el captulo 6, Crear bases de datos.
Las tablas de base de datos tienen propiedades con las que no cuentan las tablas libres
Puede disear y crear una tabla de forma interactiva mediante el Diseador de tablas, accesible a
travs del Administrador de proyectos o del men Archivo, o mediante el lenguaje de programacin.
En esta seccin se describe principalmente la creacin de una tabla mediante programacin. Si desea
informacin sobre el uso del Diseador de tablas para crear tablas de forma interactiva, consulte el
captulo 2, Crear tablas e ndices, del Manual del usuario.
Para crear y modificar una tabla mediante programacin se utilizan los comandos siguientes:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 41 de 133
Para crear una nueva tabla en una base de datos puede utilizar el sistema de mens, el Administrador
de proyectos o puede hacerlo mediante el lenguaje. Al crear la tabla puede especificar nombres largos
de tabla y de campo, valores de campo predeterminados, reglas a nivel de campo y a nivel de registro,
y desencadenantes.
O bien
Por ejemplo, el cdigo siguiente crea la tabla peqtbl con una columna, llamada nombre:
Para crear una nueva tabla libreLas tablas libres no estn asociadas a ninguna base de datos. Puede
ser conveniente crear una tabla libre, por ejemplo, para almacenar informacin de consulta que
comparten mltiples bases de datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 42 de 133
125 of 804
comparten mltiples bases de datos.
O bien
Por ejemplo, el cdigo siguiente crea la tabla libre peqtbl con una columna, llamada nombre:
CLOSE DATABASES
CREATE TABLE peqtbl FREE (nombre c(50))
Si no hay ninguna base de datos abierta cuando crea la tabla, no tiene que usar la palabra clave FREE.
Al utilizar el comando CREATE TABLE se especifica el nombre del archivo .DBF que Visual
FoxPro crear para almacenar la nueva tabla. El nombre del archivo ser el nombre predeterminado
de la tabla, tanto en el caso de tablas de base de datos como en el de tablas libres. Los nombres de las
tablas pueden contener letras, dgitos o signos de subrayado y deben empezar por una letra o un signo
de subrayado.
Si la tabla es de base de datos, tambin podr especificar un nombre largo de tabla. Los nombres
largos de tabla pueden tener hasta 128 caracteres y pueden usarse en lugar de los nombres cortos para
identificar la tabla en la base de datos. Cuando se han definido nombres largos de tabla, Visual
FoxPro los mostrar siempre que la tabla aparezca en la interfaz, como por ejemplo en el Diseador
de bases de datos, el Diseador de consultas y el Diseador de vistas, as como en la barra de ttulo de
las ventanas Examinar.
O bien
Por ejemplo, el cdigo siguiente crea la tabla provintl y le asigna el nombre largo
vendors_international, ms legible:
Tambin puede utilizar el Diseador de tablas para cambiar el nombre de las tablas o agregar
nombres largos a tablas creadas sin ellos. Por ejemplo, cuando agregue una tabla libre a una base de
datos, puede utilizar el Diseador de tablas para agregarle un nombre largo de tabla. Los nombres
largos pueden contener letras, dgitos o signos de subrayado, y deben empezar por una letra o un
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 43 de 133
126 of 804
largos pueden contener letras, dgitos o signos de subrayado, y deben empezar por una letra o un
signo de subrayado. No se permite el uso de espacios en blanco en los nombres largos de tabla.
Puede cambiar el nombre de tablas de base de datos a travs de la interfaz porque va a cambiar el
nombre largo. Si quita la tabla de la base de datos, el nombre de archivo de la tabla conserva el
nombre original. Las tablas libres no tienen un nombre largo y slo se puede cambiar su nombre a
travs del lenguaje.
Si una tabla est asociada a una base de datos, para eliminarla qutela de la base de datos. Sin
embargo, eliminar una tabla es distinto de quitarla de una base de datos. Si desea quitar la tabla de la
base de datos, pero no desea eliminarla fsicamente del disco, consulte Quitar una tabla de una base
de datos" en el captulo 6, Crear bases de datos.
O bien
l En el Diseador de bases de datos, seleccione la tabla, elija Quitar del men Base de datos y,
a continuacin, elija Eliminar.
O bien
l Para eliminar la tabla junto a todos los ndices principales, valores predeterminados y reglas de
validacin asociadas a la tabla, use el comando DROP TABLE.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 44 de 133
127 of 804
O bien
Por ejemplo, el cdigo siguiente abre la base de datos testdata y elimina la tabla orditems y sus
ndices, valores predeterminados y reglas de validacin:
Al eliminar una tabla con la clusula DELETE del comando REMOVE TABLE tambin desaparecen
el archivo memo .fpt y el archivo de ndice estructural .cdx.
Si una tabla no est asociada a ninguna base de datos, podr eliminar su archivo mediante el
Administrador de proyectos o con el comando DELETE FILE.
O bien
Por ejemplo, si la tabla actual es ejemplo, el cdigo siguiente cerrar la tabla y eliminar su archivo
del disco:
USE
DELETE FILE ejemplo.dbf
El archivo que desea eliminar no puede estar abierto en el momento de utilizar DELETE FILE. Si
elimina una tabla que tiene otros archivos asociados, como un archivo memo .fpt o archivos de ndice
(.cdx o .idx), asegrese de eliminar tambin este archivo. Por ejemplo, si el archivo ejemplo.dbf
tuviese adems un archivo memo asociado, podra eliminar ambos archivos con los comandos
siguientes:
USE
DELETE FILE ejemplo.dbf
DELETE FILE ejemplo.fpt
Puede hacer una copia idntica de una tabla, sus procedimientos almacenados, expresiones
desencadenantes, valores de campos predeterminados y su contenido a travs de programacin. No
hay ninguna opcin de men que realice la misma funcin. Este procedimiento no copia el contenido
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 45 de 133
hay ninguna opcin de men que realice la misma funcin. Este procedimiento no copia128 of 804
el contenido
de la tabla.
2. Use el comando COPY STRUCTURE para hacer una copia de la tabla original.
4. Use el comando APPEND FROM para copiar los datos desde la tabla original.
Para modificar la estructura de una tabla puede abrir el Diseador de tablas o bien puede realizar los
cambios mediante programacin con el comando ALTER TABLE. De forma alternativa, puede crear
una tabla nueva en base a la estructura de una tabla existente y, a continuacin, modificar la
estructura de la nueva tabla.
2. Use el comando COPY STRUCTURE EXTENDED para producir una tabla nueva que
contenga la informacin estructural de la tabla antigua.
3. Modifique la nueva tabla que contiene la informacin estructural para variar la estructura de
cualquier tabla nueva creada a partir de esa informacin.
5. Use APPEND FROM o uno de los comandos de copia de datos para rellenar la tabla si es
necesario.
Puede utilizar la opcin Guardar como HTML del men Archivo cuando examine el contenido de
una tabla para guardarla como un archivo HTML (Lenguaje de marcado de hipertexto).
1. Abra la tabla.
2. Examine la tabla; para ello, ejecute el comando BROWSE en la ventana Comandos o elija
Examinar en el men Ver.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 46 de 133
129 of 804
3. Elija Guardar como HTML en el men Archivo.
4. Escriba el nombre del archivo HTML que desea crear y elija Guardar.
Crear campos
Al crear campos de tabla debe especificar un nombre de campo, un tipo de datos y un ancho de
campo. Tambin puede indicar si el campo debe permitir valores nulos y especificar el valor
predeterminado del campo. Al configurar las propiedades de presentacin, puede especificar el tipo
de control de formulario que se crea cuando el campo se agrega a un formulario, el formato del
contenido de los campos o el ttulo del contenido del campo.
Nota Las tablas de Visual FoxPro puede contener hasta 255 campos. Si uno o ms campos pueden
contener valores nulos, el nmero mximo de campos que la tabla puede contener se reduce en una
unidad, de 255 a 254.
Los nombres de los campos se especifican al crear la nueva tabla. Estos nombres pueden tener hasta
10 caracteres en las tablas libres y hasta 128 en las tablas de base de datos. Si quita una tabla de una
base de datos, los nombres largos de campo se truncarn a 10 caracteres.
O bien
Por ejemplo, para crear y abrir la tabla customer con tres campos, cust_id, company y contact,
podra utilizar el comando siguiente:
En el ejemplo anterior, C(6) indica que el campo tiene el tipo de datos Character y un ancho de 6. La
eleccin del tipo de datos de los campos de tablas se trata ms adelante en esta seccin.
Con el comando ALTER TABLE agrega los campos, company, y contact, a una tabla customer
existente:
Al crear una tabla en una base de datos, Visual FoxPro almacena el nombre largo de los campos de la
tabla en un registro del archivo .dbc. Los 10 primeros caracteres de cada nombre largo se almacenan
tambin en el archivo .dbf como nombre de campo.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 47 de 133
tambin en el archivo .dbf como nombre de campo. 130 of 804
Si los 10 primeros caracteres del nombre largo de campo no son nicos en la tabla, Visual FoxPro
generar un nombre formado por los n primeros caracteres del nombre largo y un nmero secuencial
a continuacin, de forma que el nombre del campo tenga 10 caracteres. Por ejemplo, los nombres
largos de campo siguientes se convierten en los nombres de 10 caracteres que se indican:
Mientras una tabla est asociada a una base de datos, deber usar los nombres largos para referirse a
sus campos. No puede utilizar los nombres de 10 caracteres para hacer referencia a los campos de una
tabla de base de datos. Si quita una tabla de su base de datos, los nombres largos de los campos se
perdern y deber utilizar los de 10 caracteres (almacenados en el archivo .dbf).
Puede utilizar nombres largos de campo en los archivos de ndice. Sin embargo, si crea un ndice con
nombres largos de campo y luego quita la tabla correspondiente de la base de datos, el ndice no
funcionar. En este caso, puede eliminar el ndice y volver a crearlo con nombres cortos de campo. Si
desea informacin sobre la forma de eliminar un ndice, consulte "Eliminar un ndice", ms adelante
en este mismo captulo.
Las reglas para crear nombres largos de campo son las mismas que para cualquier identificador de
Visual FoxPro, salvo que pueden contener hasta 128 caracteres.
Si desea ms informacin sobre la asignacin de nombres a los identificadores de Visual FoxPro, vea
Crear nombres de Visual FoxPro.
Al crear cada campo de una tabla, deber elegir el tipo de los datos que ese campo va a almacenar. Al
elegir el tipo de datos, decide lo siguiente:
l La clase de valores que se van a permitir en el campo. Por ejemplo, no puede almacenar texto
en un campo Numeric.
l El espacio de almacenamiento que Visual FoxPro debe reservar para los valores almacenados
en el campo. Por ejemplo, todos los valores con tipo de datos Currency ocuparn 8 bytes.
l Los tipos de operaciones que pueden realizarse con los valores almacenados en el campo. Por
ejemplo, Visual FoxPro puede hallar la suma de valores numricos o de moneda, pero no la de
valores de tipo character o general.
l Si Visual FoxPro puede o no indexar u ordenar los valores del campo. No es posible ordenar ni
crear ndices para los campos de tipo memo o general.
Sugerencia Para los nmeros de telfono, nmeros de pieza y otros nmeros que no vaya a
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 48 de 133
131 of 804
Sugerencia Para los nmeros de telfono, nmeros de pieza y otros nmeros que no vaya a
utilizar en clculos matemticos, debe elegir el tipo de datos Character, en lugar de Numeric.
O bien
Por ejemplo, para crear y abrir la tabla products con tres campos, prod_id, prod_name y
unit_price, podra utilizar el comando siguiente:
Para obtener ms informacin acerca de tipos de datos especficos, vea Tipos de datos y tipos de
campos.
Al crear una tabla nueva, puede especificar si uno o ms campos de la misma deben aceptar valores
nulos. Al usar un valor nulo, se indica que la informacin que normalmente se almacenara en un
campo o registro no est disponible en ese momento. Por ejemplo, las ventajas sanitarias o el estado
impositivo de un empleado pueden no estar determinados en el momento de rellenar un registro. En
lugar de almacenar un cero o dejar los campos en blanco, lo que podra interpretarse de modo
errneo, puede almacenar en ellos un valor nulo hasta que la informacin correspondiente est
disponible.
Cuando la columna Null est seleccionada, se pueden introducir valores nulos en el campo.
O bien
l Utilice las clusulas NULL y NOT NULL del comando CREATE TABLE.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 49 de 133
l Utilice las clusulas NULL y NOT NULL del comando CREATE TABLE. 132 of 804
Por ejemplo, el comando siguiente crea y abre una tabla que no admite valores nulos en los campos
cust_id y company pero que s los permite en el campo contact:
Tambin puede controlar si se admiten o no valores nulos en los campos de la tabla con el comando
SET NULL ON.
l En el Diseador de tablas, seleccione la columna Null para todos los campos de la tabla.
O bien
Al especificar el comando SET NULL ON, Visual FoxPro marca automticamente la columna NULL
para cada campo de la tabla a medida que usted agrega campos en el Diseador de tablas. Si ejecuta
el comando SET NULL antes de CREATE TABLE, no ser necesario especificar las clusulas NULL
o NOT NULL. Por ejemplo, el cdigo siguiente crea una tabla que permite valores nulos en todos sus
campos:
SET NULL ON
CREATE TABLE test (field1 C(6), field2 C(40), field3 Y)
La presencia de valores nulos afecta al comportamiento de las tablas y de los ndices. Por ejemplo, si
utiliza APPEND FROM para copiar registros de una tabla que contiene valores nulos a otra que no
los admite, los campos anexados que contengan valores nulos se considerarn en blanco, vacos o con
valor cero en la tabla actual.
Si desea ms informacin sobre la forma en que los valores nulos interactan con los comandos,
consulte Controlar valores nulos.
Una vez creada una tabla en una base de datos abierta, puede agregar una descripcin de cada campo
de la tabla para facilitar la comprensin y la actualizacin de la tabla. Visual FoxPro muestra el texto
de comentario de los campos en el Administrador de proyectos cuando se seleccionan en la lista de
campos de la tabla.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 50 de 133
133 of 804
l Utilice la funcin DBSETPROP( ).
Por ejemplo, puede ser conveniente aclarar el contenido del campo unit_price de la tabla orditems
con el comentario Precio actual por unidad como texto asociado al campo:
Si desea ms informacin sobre el uso de DBSETPROP( ) para establecer propiedades de los campos
de una tabla de base de datos, consulte el captulo 6, Crear bases de datos.
Si desea que Visual FoxPro rellene automticamente un campo al agregar un nuevo registro, puede
crear un valor predeterminado para ese campo. El valor predeterminado se aplica al introducir datos
mediante un formulario, en una ventana Examinar, en una vista o mediante programacin, y
permanece en el campo hasta que se escriba un nuevo valor.
Los valores predeterminados se crean con el Diseador de tablas o a travs del lenguaje. Es posible
especificar valores predeterminados para todos los tipos de datos, excepto General.
O bien
Por ejemplo, puede estimar conveniente que su aplicacin limite la mercanca que puede pedir un
nuevo cliente hasta que haya tenido tiempo de realizar una comprobacin de su crdito y determinar
la cantidad que desea autorizarle. En el ejemplo siguiente se crea un campo maxordamt con un valor
predeterminado de 1000:
Si la tabla customer ya incluye la columna maxordamt, podr agregar un valor predeterminado para
la columna con el comando siguiente:
Puede utilizar valores predeterminados para acelerar la escritura de datos por parte de los usuarios de
la aplicacin, permitindoles as saltar un campo si no desean introducir en l un valor distinto. Por
ejemplo, si en su negocio trata principalmente con clientes nacionales, puede hacer que el campo
pas de la tabla cliente de una base de datos se rellene automticamente con el nombre de su pas.
Al introducir el registro de un cliente extranjero, puede sobrescribir el nombre de su pas con el del
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 51 de 133
134 of 804
Al introducir el registro de un cliente extranjero, puede sobrescribir el nombre de su pas con el del
pas correspondiente.
Sugerencia Si alguna de las reglas de la aplicacin requiere que un campo contenga siempre un
valor, el uso de un valor predeterminado ayudar a asegurar que se cumpla una regla concreta a nivel
de campo o de registro.
Si quita o elimina una tabla de una base de datos, todos los valores predeterminados de la tabla se
eliminarn de la base de datos. Los procedimientos almacenados a los que haga referencia el valor
predeterminado quitado o eliminado permanecern an despus de la eliminacin.
Cuando no especifique un valor predeterminado, se insertar un valor en blanco (tal y como se define
para cada tipo de datos), salvo en el caso en que est activado SET NULL. De esta forma se mantiene
la compatibilidad con el cdigo de FoxPro de versiones anteriores que pueda conservar.
Puede indicar .NULL. como valor predeterminado si desea que el campo utilice valores nulos. Est
activado o no SET NULL, si utiliza .NULL. como valor predeterminado, Visual FoxPro insertar
.NULL. para todos los comandos excepto APPEND BLANK.
Puede especificar valores predeterminados escalares (por ejemplo, un nmero), o expresiones que
se evalen como una cantidad escalar. Tambin puede especificar cualquier expresin de Xbase
vlida que devuelva un valor coherente con el tipo de datos del campo.
Visual FoxPro evala las expresiones para el tipo de datos cuando se cierra la estructura de la tabla.
Si el tipo de datos no coincide con el tipo asociado al campo, Visual FoxPro generar un error. Si la
expresin es una funcin definida por el usuario (FDU) o contiene una FDU, no se evaluar.
Al crear el valor predeterminado por medio del lenguaje, los comandos CREATE TABLE y ALTER
TABLE generarn un error cuando los tipos de datos no coincidan. Si la expresin es una FDU o
contiene una FDU, no se evaluar al ejecutar CREATE y no se generar ningn error.
Los valores predeterminados se evalan (si es necesario) y se colocan en los campos correspondientes
cuando se ejecutan los comandos APPEND, APPEND BLANK o INSERT.
Al asignar valores con los comandos APPEND FROM o INSERT - SQL, Visual FoxPro asignar
valores predeterminados a todos los campos que no los tengan asignados explcitamente. Los
comandos APPEND FROM e INSERT - SQL tambin respetan los valores predeterminados. Sin
embargo, cuando se utiliza alguno de estos comandos, los valores predeterminados no sobrescriben a
los valores existentes en los campos. Si los campos anexados o insertados contienen valores, los
valores existentes se conservarn al anexar o insertar el registro, y no se utilizar el valor
predeterminado.
Los valores predeterminados son especialmente tiles para rellenar automticamente los campos que
no permiten valores nulos. Al agregar un nuevo registro, los valores predeterminados se aplican en
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 52 de 133
135 of 804
no permiten valores nulos. Al agregar un nuevo registro, los valores predeterminados se aplican en
primer lugar y despus se comprueba cada campo segn su orden de definicin para determinar si
falta informacin. As se asegura que los campos designados como NOT NULL tengan ocasin de
rellenarse con valores predeterminados antes de aplicar la restriccin NOT NULL.
Al especificar una mscara de entrada, define la puntuacin, el espacio y otros atributos de formato
de valores que se introducen en el campo. Los valores se almacenan as de una forma uniforme que
puede reducir los errores de entrada de datos, haciendo que se procesen de forma ms eficaz. Por
ejemplo, al agregar una mscara a un campo numrico que almacena nmeros de telfono ayuda al
usuario a rellenar rpidamente el campo porque la puntuacin y los espacios ya los proporciona la
mscara.
O bien
Por ejemplo, el cdigo siguiente especifica una mscara de entrada para una fecha:
DBSetProp("orders.postalcode","field","InputMask", "99999-9999")
Las propiedades adicionales para campos le permiten controlar cmo aparecen un campo y sus
valores en formularios, ventanas Examinar e informes. Puede especificar un formato de presentacin,
un ttulo de campo predeterminado y una clase y una biblioteca de clases predeterminadas.
Definir un formato
Un formato proporciona una mscara de salida que determina la manera en que se presenta el valor de
un campo en un formulario, una ventana Examinar o un informe. Por ejemplo,
O bien
Por ejemplo, el cdigo siguiente especifica un formato de presentacin para una tarjeta postal:
DBSetProp("orders.postalcode","field","Format","@R 99999-9999")
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 53 de 133
DBSetProp("orders.postalcode","field","Format","@R 99999-9999")
136 of 804
Puede crear un ttulo para cada campo de una tabla de base de datos. Visual FoxPro muestra el texto
del ttulo de un campo como encabezado de columna en una ventana Examinar y como nombre de
encabezado predeterminado en una cuadrcula de formulario.
O bien
Por ejemplo, es posible que quiera crear un ttulo para el campo fax de la tabla supplier escribiendo
Supplier_Fax como ttulo del campo:
Para ahorrar tiempo ms tarde al crear formularios puede establecer una clase predeterminada para un
campo. Una vez establecida, cada vez que agrega un campo a un formulario, el control del formulario
usa la clase que especifique como predeterminada. Por ejemplo, los campos de tipo Character
aparecen automticamente como controles cuadro de texto cuando los agrega al formulario. Si en
lugar de esto quiere agregar automticamente un control cuadro combinado cuando use el campo en
un formulario, puede establecer la clase como predeterminada para este campo. Tambin puede usar
bibliotecas de clases que haya creado.
l En el Diseador de tablas, elija una clase y una biblioteca en los cuadros Mostrar clase y
Mostrar biblioteca.
Si cambia a menudo la biblioteca y la clase para sus campos, puede asignar los tipos de datos de los
campos a una biblioteca y a una clase en el cuadro de dilogo Opciones. Para obtener ms
informacin sobre la asignacin de tipos de datos de campo a clases, consulte el captulo 3,
Configurar Visual FoxPro, de la Gua de instalacin e ndice principal. Para obtener ms
informacin sobre la creacin de clases, consulte el captulo 3, Programacin orientada a objetos, en
este manual.
Puede exigir reglas comerciales para la introduccin de datos si crea a nivel de campo y a nivel de
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 54 de 133
Puede exigir reglas comerciales para la introduccin de datos si crea a nivel de campo y 137 of de
a nivel 804
registro las llamadas reglas de validacin, con las que se pueden controlar los datos introducidos en
los campos y registros de las tablas de base de datos. Las reglas a nivel de campo y a nivel de registro
comparan los valores introducidos con expresiones definidas previamente. Si el valor introducido no
satisface los requisitos de la regla, se rechazar el valor. Las reglas de validacin slo pueden darse
para las tablas de base de datos.
Las reglas a nivel de campo y a nivel de registro permiten controlar el tipo de informacin
introducido en una tabla, tanto si el acceso a los datos se realiza mediante una ventana Examinar, un
formulario o mediante programacin. Las reglas permiten exigir su cumplimiento en un campo con
menos cdigo que si se escribiera la expresin de la regla en una clusula VALID de un formulario o
en un fragmento de cdigo del programa. Adems, las reglas establecidas para una base de datos se
aplicarn a todos los usuarios de la tabla, independientemente de los requisitos de la aplicacin.
Tambin puede crear ndices candidatos o principales que eviten entradas duplicadas en un campo, y
desencadenantes que exijan la integridad referencial o que realicen otras acciones cuando se modifica
la informacin de la base de datos.
Las restricciones de la base de datos se eligen basndose en el nivel al que se desea exigir una regla
comercial o de integridad referencial, y tambin la accin que causa que la restriccin se active. En la
tabla siguiente se enumeran las restricciones de validacin de datos en el orden en que las exige el
motor de Visual FoxPro, el nivel al que se aplican y cundo activa el motor la validacin.
Las restricciones se activan en el orden en que aparecen en la tabla. El primer incumplimiento de una
validacin detiene el comando correspondiente.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 55 de 133
138 of 804
validacin detiene el comando correspondiente.
Los ndices candidatos y principales se tratan ms adelante en este captulo, dentro de la seccin
"Controlar los valores duplicados".
Cuando desee controlar el tipo de informacin que un usuario puede introducir en un campo y sea
posible validarlo independientemente de las restantes entradas del registro, puede utilizar una regla de
validacin a nivel de campo. Por ejemplo, puede utilizar una regla de validacin a nivel de campo
para asegurarse de que el usuario no escriba un nmero negativo en un campo que slo debe contener
valores positivos. Tambin puede utilizar una regla a nivel de campo para comparar los valores
introducidos en un campo con los de otra tabla.
No debe crear reglas especficas de la aplicacin a nivel de campo o a nivel de registro. Utilcelas
para exigir reglas de integridad de datos y reglas comerciales que sean siempre aplicables a la
informacin de la base de datos, independientemente de quin tenga acceso a la misma. Por ejemplo,
podra crear una regla que comparase el valor introducido en el campo cdigo postal de una tabla
con una tabla de bsqueda con los cdigos abreviados de su pas y que rechazase los valores que no
fueran una abreviatura vlida de cdigo postal.
O bien
O bien
Por ejemplo, el cdigo siguiente agrega a la tabla orditems una regla de validacin a nivel de campo
que requiere que el nmero introducido en el campo quantity sea mayor o igual que 1:
Cuando el usuario intente introducir un valor menor que 1, Visual FoxPro mostrar un mensaje de
error y rechazar el valor.
Puede personalizar el mensaje que aparece cuando se infringe la regla si agrega texto de validacin al
campo. El texto especificado se mostrar en el cuadro de dilogo en lugar del mensaje de error
predeterminado.
l En el Diseador de tablas, escriba el mensaje de error que desee en el cuadro Mensaje del rea
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 56 de 133
139 of 804
l En el Diseador de tablas, escriba el mensaje de error que desee en el cuadro Mensaje del rea
Validacin de campos.
O bien
l Utilice la clusula opcional ERROR con la clusula CHECK de los comandos CREATE
TABLE o ALTER TABLE.
Por ejemplo, el cdigo siguiente agrega una regla de validacin a nivel de campo para la tabla
orditems que requiere que los nmeros introducidos en la columna quantity sean mayores o
iguales que 1 y adems define un mensaje de error personalizado:
Cuando el usuario intente escribir un valor menor que 1, Visual FoxPro mostrar un cuadro de
dilogo de error con el mensaje de error personalizado que usted ha definido y rechazar el valor.
Tambin puede utilizar la clusula SET CHECK del comando ALTER TABLE con la clusula
opcional ERROR para crear un mensaje de error personalizado.
Las reglas a nivel de campo se comprueban cuando se modifica el valor del campo. Al contrario que
los desencadenantes, las reglas a nivel de campo se activan incluso cuando los datos se encuentran en
bfer. Al trabajar con los datos en una ventana Examinar, en un formulario u otra ventana de interfaz
de usuario, Visual FoxPro comprueba las reglas a nivel de campo al salir del campo correspondiente.
Si el valor del campo no ha cambiado, la regla no se comprobar. Esto significa que puede
desplazarse por los campos sin que el sistema valide su contenido.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 57 de 133
140 of 804
INSERT - SQL
Comandos que especifican UPDATE En el orden en que aparecen los
campos UPDATE - SQL campos en el comando.
REPLACE
Las reglas de validacin a nivel de registro permiten controlar el tipo de informacin que el usuario
puede introducir en los registros. Normalmente, las reglas de validacin a nivel de registro comparan
los valores de dos o ms campos del mismo registro para asegurarse de que cumplen las reglas
comerciales establecidas para la base de datos. Por ejemplo, puede utilizar una regla de validacin a
nivel de registro para asegurarse de que el valor de un campo sea siempre superior al de otro campo
del mismo registro.
Para crear una regla de validacin a nivel de registro y un mensaje de error personalizado
l En la ficha Tabla del Diseador de tablas, escriba la regla y el mensaje de error que desee en
los cuadros Regla y Mensaje.
O bien
Por ejemplo, puede querer asegurarse de que los empleados tengan 18 o ms aos en el momento de
su contratacin. En el cdigo siguiente se agrega a la tabla employee una regla de validacin a nivel
de registro y un texto de error para requerir que la fecha de contratacin introducida en hire_date
sea mayor o igual que la fecha de nacimiento ms 18 aos:
Si el usuario introduce un registro de empleado con una fecha no vlida, Visual FoxPro mostrar un
cuadro de dilogo de error con el mensaje de error personalizado definido y no actualizar el registro.
Tambin puede utilizar la clusula SET CHECK del comando ALTER TABLE para crear una regla
de validacin a nivel de registro. Debe asegurarse de que las reglas especificadas para los campos no
entren en conflicto semntico con las definidas para la tabla. Visual FoxPro no comprueba la
coherencia entre las expresiones a nivel de campo y a nivel de registro.
Las reglas a nivel de registro, al igual que las reglas a nivel de campo, se activan cuando el valor del
registro cambia. Independientemente de la forma de trabajar con los datos, ya sea en una ventana
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 58 de 133
141 of 804
registro cambia. Independientemente de la forma de trabajar con los datos, ya sea en una ventana
Examinar, en un formulario, en otra ventana de interfaz de usuario o mediante comandos que alteren
los datos, Visual FoxPro comprobar las reglas a nivel de registro a medida que usted desplace el
puntero de registro fuera del registro. Si no ha cambiado ningn valor del registro, la regla a nivel de
registro no se comprobar al desplazar el puntero, por lo que es posible desplazarse por los registros
sin que el sistema valide los datos que contienen.
Precaucin No incluya en las reglas de validacin comandos o funciones que intenten desplazar el
puntero de registro del rea de trabajo actual (es decir, del rea de trabajo cuyas reglas se estn
comprobando). El uso de comandos o funciones tales como SEEK, LOCATE, SKIP, APPEND,
APPEND BLANK, INSERT o AVERAGE, COUNT, BROWSE y REPLACE FOR en las reglas de
validacin puede causar su desencadenamiento recursivo, produciendo una condicin de error.
Al contrario que los desencadenantes, las reglas a nivel de registro se activan incluso cuando los
datos se encuentran en bfer. Para el caso de que durante la ejecucin de una aplicacin se active una
regla a nivel de registro, es necesario incluir cdigo de control de errores. Normalmente, este cdigo
no permitir que la aplicacin abandone el formulario (o que cambie el entorno activo, hablando de
forma ms genrica), hasta que el usuario corrija el error detectado o cancele la actualizacin.
Si quita o elimina una tabla de una base de datos, se eliminarn todas las reglas a nivel de campo y a
nivel de registro de la base de datos. Esto se debe a que las reglas se almacenan en el archivo .dbc, y
al quitar una tabla de la base de datos se rompe el vnculo entre el archivo .dbf y su archivo .dbc. Sin
embargo, los procedimientos almacenados a los que haga referencia la regla quitada o eliminada no
se eliminan automticamente, ya que an pueden utilizarlos otras reglas de otras tablas que
permanezcan en la base de datos.
Usar desencadenantes
Un desencadenante es una expresin dependiente de una tabla que se invoca cuando se modifica
alguno de los registros de la tabla con alguno de los comandos de modificacin de datos
especificados. Los desencadenantes pueden utilizarse para realizar cualquier operacin que requiera
una aplicacin de base de datos cuando se modifique la informacin. Por ejemplo, puede utilizar
desencadenantes para llevar a cabo las acciones siguientes:
Los desencadenantes se crean y almacenan como propiedades de una tabla especfica. Si quita una
tabla de una base de datos, los desencadenantes asociados a la misma se eliminarn. Los
desencadenantes se activan una vez realizadas todas las comprobaciones restantes, como las reglas de
validacin, la exigencia de clave principal y la de valor nulo. Al contrario de lo que ocurre con las
reglas de validacin a nivel de campo y a nivel de registro, los desencadenantes no se activan para los
datos almacenados en bfer.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 59 de 133
142 of 804
Crear desencadenantes
Para crear desencadenantes puede utilizar el Diseador de tablas o el comando CREATE TRIGGER.
Puede crear un desencadenante para cada tabla y para cada uno de los tres eventos INSERT,
UPDATE y DELETE. En un momento dado, una tabla puede tener un mximo de tres
desencadenantes. Los desencadenantes deben devolver un valor verdadero (.T.) o falso (.F.).
l En el cuadro de dilogo Tabla del Diseador de tablas, escriba la expresin del desencadenante
o el nombre del procedimiento almacenado que la contiene en los cuadros Insertar
desencadenante, Actualizar desencadenante, o Eliminar desencadenante.
O bien
Por ejemplo, puede que cada vez que Importadores Tasmanian venda un producto desee comparar las
unidades en existencias Units_in_stock con el nivel del nuevo pedido Reorder_level y recibir una
notificacin si es necesario volver a pedir ese producto. Podra crear un desencadenante de
actualizacin para la tabla products para conseguirlo. El desencadenante elegido es de actualizacin
(y no de eliminacin o insercin), ya que debe activarse cada vez que se venda un producto, y el
campo Units_in_stock se actualizar cada vez que se venda un producto para reflejar los que
queden en existencias.
PROCEDURE updProductsTrigger
IF (units_in_stock+units_on_order) <= reorder_level
INSERT INTO Reorder VALUES(Products.product_id, ;
Products.reorder_amount)
ENDIF
ENDPROC
Puede crear desencadenantes similares para los eventos de insercin o eliminacin mediante las
clusulas FOR INSERT o FOR DELETE, respectivamente, en lugar de la clusula FOR UPDATE. Si
intenta crear un desencadenante que ya existe para un evento y una tabla determinados y est activado
SET SAFETY, Visual FoxPro le preguntar si desea sobrescribir el desencadenante existente.
Puede quitar un desencadenante de una tabla de base de datos mediante la interfaz o el comando
DELETE TRIGGER.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 60 de 133
143 of 804
O bien
Si quita o elimina una tabla de una base de datos, todos los desencadenantes dependientes de ella se
eliminarn de la base de datos. Sin embargo, los procedimientos almacenados a los que haga
referencia el desencadenante quitado o eliminado no se eliminarn.
Modificar desencadenantes
Puede modificar los desencadenantes mediante el Diseador de tablas o a travs del lenguaje.
l En el cuadro de dilogo Tabla del Diseador de tablas, introduzca la nueva expresin del
desencadenante en el cuadro Insertar desencadenante, Actualizar desencadenante o
Eliminar desencadenante.
O bien-
l Ejecute el comando SET SAFETY OFF, seguido del comando CREATE TRIGGER.
Visual FoxPro cuenta con un Generador de integridad referencial para generar desencadenantes y
procedimientos almacenados que exijan la integridad referencial (IR) de la base de datos. Si desea
ms informacin sobre el uso del Generador de integridad referencial, consulte el captulo 6,Crear
bases de datos.
Una vez creada una tabla, siempre puede modificar su estructura y sus propiedades. Puede ser
conveniente agregar, modificar o eliminar los nombres, anchos y tipos de datos de los campos, as
como sus valores predeterminados o sus reglas, y tambin agregar comentarios o ttulos.
Para modificar la estructura de una tabla puede abrir el Diseador de tablas o bien puede realizar los
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 61 de 133
144 of 804
Para modificar la estructura de una tabla puede abrir el Diseador de tablas o bien puede realizar los
cambios mediante programacin con el comando ALTER TABLE. Asegrese de que tiene acceso
exclusivo a la tabla antes de modificar su estructura.
O bien
O bien
Por ejemplo, puede modificar la estructura de la tabla de base de datos employee con los comandos
siguientes:
El comando ALTER TABLE ofrece diversas clusulas que permiten agregar o eliminar campos, crear
o eliminar claves principales o nicas, o etiquetas de claves externas, as como cambiar el nombre de
los campos existentes. Algunas clusulas slo son aplicables a las tablas asociadas a una base de
datos. En esta seccin se incluyen algunos ejemplos especficos.
Agregar campos
Para agregar un nuevo campo a una tabla puede utilizar el Diseador de tablas o hacerlo a travs del
lenguaje.
O bien
Por ejemplo, el comando siguiente agrega un campo llamado fax a la tabla customer y permite que
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 62 de 133
Por ejemplo, el comando siguiente agrega un campo llamado fax a la tabla customer y 145 of 804
permite que
el nuevo campo tenga valores nulos:
Eliminar campos
Puede eliminar un campo existente de una tabla mediante el Diseador de tablas o a travs del
lenguaje.
O bien
Al quitar un campo de una tabla tambin se quita su valor predeterminado, sus definiciones de reglas
y su ttulo. Si hay referencias al campo en la clave de ndice o en expresiones de desencadenante,
estas expresiones dejarn de ser vlidas cuando se elimine el campo. Las expresiones no vlidas de
clave de ndice o de desencadenante no generarn errores hasta el tiempo de ejecucin.
Hay dos formas de cambiar el nombre de los campos existentes en una tabla.
l En el Diseador de tablas, escriba un nuevo nombre en el cuadro de texto Nombre del campo
correspondiente.
O bien
Por ejemplo, para cambiar el nombre de la columna company de la tabla customer, podra utilizar el
comando siguiente:
En el ejemplo anterior, el nuevo nombre del campo aprovecha la posibilidad de crear nombres largos
de campo de la que disfrutan las tablas de base de datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 63 de 133
146 of 804
Puede establecer nuevas expresiones y texto de reglas a nivel de campo o de tabla, as como
modificar las reglas y el texto especificados con los comandos CREATE TABLE o ALTER TABLE.
O bien
Puede utilizar la funcin DBGETPROP( ) para ver la expresin o el texto actual de una regla; estos
valores son de slo lectura para las tablas y slo se pueden modificar mediante el comando ALTER
TABLE.
Una vez generada una tabla, puede establecer o cambiar los valores predeterminados de sus campos.
O bien
Puede utilizar la funcin DBGETPROP( ) para ver el valor predeterminado actual de un campo; estos
valores son de slo lectura para las tablas y slo se pueden cambiar mediante el comando ALTER
TABLE.
Agregar registros
Cuando cree una tabla de Visual FoxPro, la tabla estar abierta, pero vaca. Si intenta almacenar datos
en una tabla sin crear primero un registro en ella, no suceder nada. El primer paso para agregar
registros a una tabla nueva es agregar filas en las que almacenar los nuevos datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 64 de 133
El comando INSERT - SQL puede utilizarse para insertar valores indicados en el mismo o tomados
de una matriz o variable de memoria. Por ejemplo, para insertar un nuevo registro en la tabla
customer de la base de datos TasTrade, puede utilizar el comando siguiente:
El comando INSERT - SQL es til en el caso de datos remotos, ya que sigue una sintaxis SQL
compatible con ANSI.
Para agregar un registro en blanco a una tabla y almacenar datos en sus campos puede utilizar el
comando APPEND BLANK seguido del comando REPLACE. El comando APPEND BLANK anexa
un nuevo registro en blanco a la tabla. El comando REPLACE sustituye el valor actual de un campo
(incluso si est vaco) con un nuevo valor.
En el ejemplo siguiente se utiliza el comando APPEND BLANK para crear un registro en el que
almacenar datos con el comando REPLACE:
Puede utilizar el comando UPDATE - SQL en lugar de REPLACE para actualizar los registros de una
tabla.
Otra forma de almacenar datos en los registros es copiarlos de otras tablas o archivos. Por ejemplo,
puede anexar registros de otra tabla o archivo.
O bien
Los registros pueden aceptar los datos directamente, como en el ejemplo anterior, en el que el
comando INSERT especificaba el texto que se va a insertar en campos especficos de la tabla
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 65 de 133
148 of 804
comando INSERT especificaba el texto que se va a insertar en campos especficos de la tabla
customer y tambin tomarlos de constantes, variables, matrices, objetos u otros orgenes de datos. Si
desea ms informacin sobre otras formas de importar datos, consulte el captulo 9, Importar y
exportar datos, del Manual del usuario.
Si desea agregar un nuevo registro a una tabla mientras se encuentra en modo Examinar, puede elegir
Anexar registro en el men Tabla. Por el contrario, si desea evitar que los usuarios puedan anexar
registros en el modo Examinar, puede utilizar la clusula NOAPPEND del comando BROWSE.
Puede introducir datos en una tabla de forma interactiva, a travs de una ventana Examinar o
mediante programacin, con los comandos REPLACE o UPDATE - SQL. Al utilizar REPLACE o
UPDATE - SQL en una aplicacin multiusuario, puede activar el almacenamiento en bfer de
registros o tablas, lo que le permitir modificar los datos sin bloquear el registro hasta que desee
hacer efectivos los cambios. Si desea ms informacin sobre el bfer de registros y tablas, consulte el
captulo 17, Programar para acceso compartido.
Para mostrar y modificar los registros existentes en una tabla puede utilizar la interfaz o hacerlo
mediante programacin.
O bien
Por ejemplo, el cdigo siguiente muestra la tabla customer en una ventana Examinar en modo de
edicin:
USE customer
EDIT
Si desea utilizar un formulario para modificar un registro, cree un cuadro de texto en el formulario y
establezca su propiedad DataSource como el nombre de la tabla que desee modificar. Si desea ms
informacin sobre los formularios, consulte el captulo 9, Crear formularios.
Tambin puede utilizar los comandos CHANGE y EDIT para modificar campos especficos de una
tabla.
Puede almacenar grficos en una tabla de Visual FoxPro si crea un campo de tipo general e importa o
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 66 de 133
149 of 804
Puede almacenar grficos en una tabla de Visual FoxPro si crea un campo de tipo general e importa o
pega en l objetos OLE tales como mapas de bits o grficos. El comando APPEND GENERAL sita
un objeto OLE en un campo General. En el ejemplo siguiente se almacena un archivo grfico de
Microsoft Excel situado en el directorio predeterminado de Visual FoxPro en un campo General
llamado Grfico:
Si desea ms informacin sobre el manejo de objetos OLE en las tablas de Visual FoxPro, consulte el
captulo 16, Agregar OLE.
Para introducir un valor nulo en un campo puede utilizar el lenguaje, con el elemento .NULL, o
hacerlo a travs de la interfaz con una combinacin de teclas si el campo admite valores nulos.
O bien
Por ejemplo, el cdigo siguiente sustituye el valor existente en el campo automvil por un valor
nulo:
Nota Use el comando SET NULLDISPLAY para especificar el texto mostrado para los valores
nulos.
Eliminar registros
Para eliminar registros debe marcarlos primero para eliminacin y luego suprimir los registros
marcados. Hasta su supresin, los registros marcados permanecen en el disco y puede quitarles la
marca para restaurarlos. En esta seccin se explica cmo marcar, desmarcar y suprimir los registros
de una tabla.
Para marcar registros para su eliminacin puede utilizar la interfaz o bien el comando DELETE -
SQL.
l En una ventana Examinar haga clic en el marcador de eliminacin para marcar el registro.
O bien-
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 67 de 133
O bien- 150 of 804
O bien
Tambin puede utilizar el comando DELETE - SQL para especificar un intervalo de registros, as
como una condicin basada en una expresin lgica que los registros deben satisfacer para que se
marquen para su eliminacin. Por ejemplo, el cdigo siguiente marca para eliminacin todos los
registros de productos que contienen T en el campo Discontinu:
USE products
DELETE FROM products WHERE discontinu = .T.
BROWSE
Los registros marcados para su eliminacin no se suprimen fsicamente de la tabla hasta que no se
especifique el comando PACK. Al ver la tabla en la ventana Examinar, cada registro eliminado
tendr un indicador de eliminacin, pero an ser visible en la tabla, siempre que SET DELETED
est desactivado. Si SET DELETED est activado, los registros marcados para su eliminacin no
aparecern en la ventana Examinar.
La configuracin del comando SET DELETED tambin afecta al acceso a los registros marcados para
su eliminacin por parte de los comandos que operan sobre registros.
Para desmarcar los registros marcados para su eliminacin puede utilizar el comando RECALL. El
comando RECALL slo podr recuperar los registros cuando an no se haya especificado un
comando PACK o ZAP, los cuales eliminan fsicamente los registros de la tabla.
l En una ventana Examinar, haga clic en el marcador de eliminacin para quitar el indicador del
registro.
O bien
O bien
Con el comando RECALL puede especificar un intervalo de registros, as como una condicin basada
en una expresin lgica que los registros deben satisfacer para que se les quite la marca de
eliminacin. Por ejemplo, el cdigo siguiente quita la marca de eliminacin de todos los registros de
productos que contengan T en el campo discontinu:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 68 de 133
151 of 804
USE products
RECALL FOR discontinu = .T.
BROWSE
Cuando vea la tabla en la ventana Examinar, los registros especificados ya no tendrn la marca de
eliminacin.
Una vez marcado un grupo de registros para su eliminacin, puede suprimirlos de forma definitiva
del disco a travs de la interfaz o mediante el lenguaje.
O bien
El comando PACK tiene dos clusulas: MEMO y DBF. Si especifica PACK sin MEMO ni DBF, se
suprimirn tanto los registros del archivo de tabla como los del archivo memo asociado. Por ejemplo,
el cdigo siguiente suprime los registros marcados para eliminacin:
Para eliminar solamente los registros del archivo de tabla y dejar intactos los del archivo memo,
utilice PACK DBF.
Conservar espacio
La informacin de los campos memo de una tabla se almacena en un archivo memo asociado con el
mismo nombre de la tabla y la extensin .FPT. Si desea eliminar el espacio no utilizado en el archivo
memo, pero no quiere suprimir los registros de la tabla marcados para eliminacin, ejecute el
comando PACK con la clusula MEMO. Asegrese de tener acceso exclusivo a la tabla.
Si desea suprimir todos los registros de una tabla, dejando slo su estructura, puede utilizar el
comando ZAP. El uso de ZAP equivale a especificar DELETE ALL y a continuacin PACK, pero
ZAP es mucho ms rpido. Asegrese de tener acceso exclusivo a la tabla.
Precaucin Los registros de la tabla actual suprimidos con ZAP no pueden recuperarse.
Indexar tablas
Para desplazarse por los registros de una tabla, verlos o manipularlos en un orden determinado, debe
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 69 de 133
152 of 804
Para desplazarse por los registros de una tabla, verlos o manipularlos en un orden determinado, debe
utilizar un ndice. Visual FoxPro utiliza los ndices como mecanismos de ordenacin para ofrecer
flexibilidad y eficacia al programar una aplicacin. La flexibilidad supone crear y utilizar mltiples
claves de ndice distintas para la misma tabla, lo que permite trabajar con los registros ordenados de
formas diferentes, segn las necesidades de la aplicacin. La potencia implica crear relaciones
personalizadas entre las tablas, basadas en sus ndices, lo que le permite tener acceso a los registros
que desea.
Un ndice de Visual FoxPro es un archivo que contiene punteros ordenados lgicamente segn los
valores de una clave de ndice. El archivo de ndice es independiente del archivo .DBF de la tabla, y
no cambia el orden fsico de los registros contenidos en la misma. Al crear un ndice se crea un
archivo que mantiene punteros a los registros del archivo .DBF. Cuando desee trabajar con los
registros de la tabla en un orden determinado, elija un ndice para controlar el orden en que se ve la
tabla y se tiene acceso a ella.
Crear un ndice
Al crear una tabla, Visual FoxPro crea el archivo .DBF correspondiente y, si la tabla contiene campos
de tipo Memo o General, el archivo .FPT asociado. En este momento no se genera ningn archivo de
ndice. Los registros introducidos en la nueva tabla se almacenarn en el orden de introduccin, y al
examinar la tabla aparecern en ese orden.
Normalmente, ser conveniente ver y tener acceso a los registros en un orden especfico. Por ejemplo,
puede ser adecuado ver los registros de la tabla de clientes ordenados alfabticamente por nombres de
empresa. Cuando se desea controlar el orden en que se muestran los registros y se tiene acceso a los
mismos, es necesario crear un archivo de ndice para la tabla creando la primera ordenacin de
registros, o clave de ndice, de la tabla. A continuacin puede establecer como orden de la tabla la
nueva clave de ndice y tener acceso a los registros siguiendo ese orden.
O bien
Por ejemplo, en el cdigo siguiente se utiliza la tabla customer y se crea una clave de ndice sobre el
campo city. La palabra clave TAG y la palabra city que la sigue especifican un nombre, o
etiqueta, para la nueva clave de ndice asociada al campo de ciudad.
USE customer
INDEX ON city TAG city
En el ejemplo anterior, la etiqueta de la clave de ndice tiene el mismo nombre que el campo de
ndice. Estos nombres no tienen que coincidir necesariamente (y podra haber elegido uno distinto
para la etiqueta).
Al crear un ndice con el comando INDEX, Visual FoxPro lo utiliza automticamente para establecer
el orden de los registros de la tabla. Por ejemplo, si introduce algunos datos en la tabla utilizada en el
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 70 de 133
153 of 804
el orden de los registros de la tabla. Por ejemplo, si introduce algunos datos en la tabla utilizada en el
ejemplo anterior y a continuacin la examina, los registros aparecern ordenados por ciudad.
Al crear la primera clave de ndice para la tabla del ejemplo anterior, Visual FoxPro cre
automticamente un nuevo archivo, Customer.cdx, para almacenar la nueva clave de ndice. Las
claves de ndice se almacenan en archivos con la extensin .cdx. El archivo de ndice .cdx, llamado
ndice compacto estructural compuesto, es el tipo de archivo de ndice ms importante y ms comn
en Visual FoxPro. El archivo .cdx estructural:
Si una tabla de Visual FoxPro tiene un archivo de ndice asociado, normalmente se tratar de un
archivo .cdx estructural. El trmino estructural hace referencia al hecho de que Visual FoxPro trata
al archivo como una parte intrnseca de la tabla y lo abre automticamente al abrir aqulla. Ya sea a
travs del Diseador de tablas o con la forma ms simple del comando INDEX, como se mostraba en
el ejemplo anterior, Visual FoxPro crea el archivo .cdx con el mismo nombre que la tabla actual y
almacena la informacin de ndice de la nueva clave, o etiqueta, dentro de l. Los archivos .cdx
estructurales se utilizan para claves de ndice de uso frecuente, como las que ordenan los registros
para tareas diarias de presentacin o introduccin de datos, vnculos con SET RELATION,
optimizacin Rushmore al ver los registros o para informes que se imprimen con frecuencia.
Visual FoxPro ofrece otros dos tipos de archivos de ndice: el archivo .cdx no estructural y el archivo
.idx de una sola clave. Al ser el ndice .cdx, o ndice estructural compuesto, el ms importante, la
mayora de los ejemplos de esta seccin utilizarn claves de ndice de archivos .cdx para ordenar los
registros de las tablas. Los dos tipos de ndice restantes se usan con menos frecuencia y se tratan al
final de la seccin.
Para ver el nmero registros que se indexan durante el proceso de indexacin, puede establecer
TALK a ON. El intervalo de registros mostrado durante la indexacin puede especificarse con SET
ODOMETER. Si desea ms informacin sobre los archivos de ndice abiertos, utilice el comando
DISPLAY STATUS. Este comando muestra los nombres de todos los archivos de ndice abiertos, su
tipo (estructural, .cdx o .idx), sus expresiones de ndice y el nombre del archivo de ndice principal o
etiqueta principal.
El nmero de archivos de ndice (.idx o .cdx) que pueden abrirse slo est limitado por la memoria y
los recursos del sistema.
Visual FoxPro cuenta con cuatro tipos de ndices: principal, candidato, nico y normal. Estos tipos
determinan si se admiten o no valores duplicados en los campos y registros de la tabla.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 71 de 133
154 of 804
Un ndice principal nunca permite valores duplicados en la expresin o en los campos especificados.
Los ndices principales se utilizan sobre todo en la tabla principal o referenciada para establecer la
integridad referencial en una relacin persistente. Slo es posible crear un ndice principal para cada
tabla. Visual FoxPro devolver un error si especifica un ndice principal sobre un campo que
contenga datos duplicados.
Un ndice candidato nunca permite valores duplicados en la expresin o en los campos especificados.
El nombre candidato hace referencia al estado del ndice: puesto que estos ndices no admiten
valores duplicados, se convierten en candidatos para ser elegidos como ndice principal de la tabla.
Puede crear mltiples ndices candidatos para una tabla. Los ndices candidatos pueden utilizarse para
hacer referencia o para ser referenciados en una relacin persistente con el fin de establecer la
integridad referencial.
Visual FoxPro generar un error si especifica un ndice candidato sobre un campo que contenga datos
duplicados.
Los ndices principales y candidatos pueden crearse con los comandos CREATE TABLE y ALTER
TABLE. Puede utilizar ambos tipos de ndices para definir el lado uno de una relacin persistente
de uno a varios o de uno a uno.
l En el Diseador de tablas, elija la ficha ndices y cree un ndice, seleccionando como tipo
Principal o Candidato.
O bien
Por ejemplo, cualquiera de los dos comandos siguientes hace de cust_id la clave principal de la
tabla customer:
Las claves principales forman parte de una tabla que pertenece a una base de datos. Si libera una tabla
de una base de datos, se elimina la clave principal.
Si utiliza una funcin definida por el usuario en una expresin de ndice asociada a una base de datos,
Visual FoxPro tratar la expresin de la misma forma que las expresiones de reglas y
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 72 de 133
155 of 804
Visual FoxPro tratar la expresin de la misma forma que las expresiones de reglas y
desencadenantes que contienen FDU.
En Visual FoxPro, los ndices nicos no evitan el uso de valores duplicados, aunque slo almacenan
la primera aparicin del valor o valores en el archivo de ndice. En este sentido, la palabra nico se
refiere a las entradas del archivo de ndice, que slo contiene valores nicos, pues no almacena cada
clave ms de una vez e ignora la segunda y posteriores apariciones de los valores no nicos. Las
tablas indexadas con ndices nicos pueden contener valores duplicados. Los ndices nicos se
admiten principalmente por compatibilidad con las versiones anteriores.
Un ndice normal es simplemente un ndice que no es nico, principal ni candidato. Los ndices
normales se utilizan para ordenar y buscar registros, pero no se exige que los datos de dichos registros
sean nicos. Tambin puede usar un ndice normal como lado varios de una relacin persistente de
uno a varios.
l En el Diseador de tablas, elija la ficha ndices y cree un ndice seleccionando Normal como
tipo.
O bien
Por ejemplo, los comandos siguientes hacen de city una clave normal para la tabla customer:
USE customer
INDEX ON city TAG city
A medida que trabaje con los registros de una tabla, descubrir la necesidad de tener acceso a los
registros utilizando varias secuencias diferentes. Por ejemplo, puede ser conveniente ordenar la tabla
customer por el campo contact para encontrar rpidamente un nombre que se busca, o por
postal_code, para generar etiquetas de correo ordenadas para un envo ms eficiente.
Puede crear y almacenar varias ordenaciones distintas para una tabla creando mltiples claves de
ndice para la misma. Esto permite ordenar los registros de una forma distinta en cada momento,
segn las operaciones que vaya a realizar.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 73 de 133
156 of 804
Por ejemplo, el cdigo siguiente crea dos nuevas claves de ndice en la tabla employee: una sobre el
campo last_name y otra sobre el campo country:
USE employee
INDEX ON last_name TAG last_name
INDEX ON country TAG country
Al crear una etiqueta de ndice sin especificar el nombre de un archivo de ndice, la etiqueta se
agregar automticamente al archivo .cdx estructural de la tabla. En el diagrama siguiente se muestra
un archivo de ndice .cdx con tres etiquetas.
ndice .cdx con mltiples etiquetas que representan mltiples ordenaciones de registros
Dos de las etiquetas del diagrama, emp_id y last_name, representan ndices basados en un solo
campo. El ndice cntry_last ordena los registros segn una expresin sencilla de dos campos. Si
desea ms informacin sobre la forma de generar ndices basados en mltiples campos, consulte
"Indexar por prestaciones", ms adelante en este mismo captulo.
Una vez creadas las claves de ndice para la tabla customer sobre los campos company, city, y
country puede tener acceso a la tabla y mostrarla en secuencias distintas; para ello, debe elegir la
clave de ndice que desee. El comando SET ORDER permite elegir un ndice determinado como
clave de ordenacin de la tabla.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 74 de 133
157 of 804
Por ejemplo, el cdigo siguiente abre una ventana Examinar con los registros de la tabla customer
ordenados por pases:
SET ORDER permite designar el archivo o etiqueta de ndice que controla el orden de los registros.
Una tabla puede tener abiertos simultneamente varios archivos de ndice. Sin embargo, para
determinar el orden en que se muestran los registros o se tiene acceso a los mismos, hay que
establecer como ndice de control un archivo de una sola clave (.idx, archivo de control) o una
etiqueta de un archivo de ndice compuesto (.cdx, etiqueta de control). Algunos comandos, como
SEEK, utilizan la etiqueta de ndice de control para buscar registros. No tiene que usar SET ORDER
para ejecutar consultas.
Puede utilizar SET ORDER en tiempo de ejecucin para cambiar el orden de los registros en un
formulario. Por ejemplo, puede ser conveniente que los usuarios de su aplicacin puedan cambiar el
orden de los registros de una cuadrcula haciendo clic en el encabezado de la columna que deseen
ordenar.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 75 de 133
1. Cree un formulario con un control Grid. 158 of 804
3. En el evento Click del encabezado de cada columna de la cuadrcula, inserte cdigo para:
l Establecer como orden de los registros una clave de ndice basada en la columna.
l Actualizar el formulario.
Por ejemplo, si crea un formulario basado en la tabla Customer de la base de datos Testdata con una
cuadrcula que contenga las cuatro columnas, company, contact, postal code y phone, la
cuadrcula aparecer en primer lugar ordenada alfabticamente, ya que los registros de esa tabla se
introdujeron por ese orden.
A continuacin puede permitir que el usuario ordene la cuadrcula por contact o postal_code si
inserta el cdigo siguiente en el evento Click de cada encabezado de columna:
Ejemplo de cdigo de evento para ordenar los registros de una cuadrcula al hacer clic en el
encabezado de las columnas
Cdigo Comentario
SET ORDER TO company En el cdigo de evento Click del encabezado de Company se
GO TOP
THISFORM.Refresh reordena la cuadrcula por la clave de ndice company y se
actualiza el formulario para mostrar los registros ordenados
por empresas.
SET ORDER TO contact En el cdigo de evento Click del encabezado de Contact se
GO TOP
THISFORM.Refresh reordena la cuadrcula por la clave de ndice contact y se
actualiza el formulario para mostrar los registros ordenados
por nombres de contacto.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 76 de 133
159 of 804
SET ORDER TO En el cdigo de evento Click del encabezado de
postalcode
GO TOP Postal_Code se reordena la cuadrcula por la clave de
THISFORM.Refresh ndice postalcode y se actualiza el formulario para mostrar
los registros ordenados por cdigos postales.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 77 de 133
160 of 804
Como en esta aplicacin de ejemplo no hay necesidad de ordenar los contactos por sus nmeros de
telfono, no se inserta el cdigo con SET ORDER en el evento Click del encabezado de la columna
phone. Cuando el usuario hace clic en el encabezado de Phone, la cuadrcula no cambia.
Adems del ndice ms habitual, el compacto estructural compuesto .cdx, Visual FoxPro admite otros
dos tipos de archivos de ndice: el .cdx no estructural y el ndice autnomo .idx. Los ndices .cdx no
estructurales se utilizan como etiquetas de clave mltiple de uso menos frecuente. Los ndices
autnomos, o .idx, se usan como ndices de clave nica de uso poco frecuente o temporal, y se
admiten principalmente por la compatibilidad con las versiones anteriores.
La tabla siguiente es un resumen de los tres tipos de ndices, su nombre, el nmero de claves que
pueden contener y las limitaciones en caracteres de cada uno de ellos.
Un ndice .cdx no estructural resulta til cuando desea crear mltiples etiquetas de ndice con un fin
determinado, pero no quiere cargar sus aplicaciones manteniendo estos ndices de una forma
continua. Por ejemplo, su aplicacin puede tener un conjunto especial de informes que analicen los
datos basndose en campos normalmente no indexados. En este caso el programa puede crear un
ndice .cdx no estructural con las etiquetas necesarias, ejecutar los informes especiales y a
continuacin eliminar el ndice .cdx no estructural.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 78 de 133
Para crear una etiqueta de ndice .cdx no estructural 161 of 804
Al especificar la clusula OF con el comando INDEX, se indica a Visual FoxPro que debe almacenar
la etiqueta en un archivo distinto del ndice .cdx estructural de la tabla. Por ejemplo, el comando
siguiente crea etiquetas llamadas title y hire_date en la tabla employee y las almacena en un
ndice .cdx no estructural llamado QRTLYRPT.CDX:
USE employee
INDEX ON title TO TAG title OF QRTLYRPT
INDEX ON hire_date TO TAG hiredate OF QRTLYRPT
Los ndices autnomos, basados en una expresin de una sola clave, se almacenan como archivos
.idx. Al contrario que los ndices .cdx, que pueden almacenar expresiones de mltiples claves, los
ndices .idx se limitan a una sola.
O bien
Al utilizar el comando INDEX con la clusula COMPACT se crea un nuevo ndice autnomo en un
archivo pequeo y de acceso rpido. Puede omitir la clusula COMPACT si desea crear un archivo
.idx autnomo no compacto y mantener as la compatibilidad con los formatos de ndice de
FoxBASE+ y FoxPro versin 1.0.
El cdigo siguiente crea un archivo .idx autnomo sobre order para la tabla orders, establece como
orden el nuevo ndice y luego abre una ventana Examinar, que muestra los pedidos ordenados por
order_date:
USE ORDERS
INDEX ON order_date TO orddate COMPACT
SET ORDER TO orddate
BROWSE
Puede utilizar el comando COPY TAG para generar un archivo de ndice autnomo a partir de una
etiqueta de ndice de un archivo .cdx existente. Esto puede ser til, por ejemplo, si comprueba que
uno de los ndices que actualmente se incluyen en el .cdx estructural slo se utiliza para informes
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 79 de 133
uno de los ndices que actualmente se incluyen en el .cdx estructural slo se utiliza para 162 of 804
informes
trimestrales o anuales. En el cdigo siguiente se crea un ndice autnomo a partir de una etiqueta
birth_date de la tabla employee:
Una vez creado un ndice autnomo a partir de una etiqueta de un archivo .cdx, normalmente deber
eliminar la etiqueta, ahora innecesaria, del archivo .cdx. En la seccin siguiente se describe la forma
de eliminar ndices.
Eliminar un ndice
Cuando no vaya a utilizar un ndice, puede eliminar su etiqueta en el archivo .cdx o bien puede
eliminar el propio archivo .idx en el caso de los ndices autnomos. La eliminacin de las etiquetas de
ndice no utilizadas mejora el rendimiento, ya que suprime la necesidad de que Visual FoxPro
actualice etiquetas no utilizadas para reflejar los cambios en los datos de la tabla.
Puede eliminar una etiqueta del archivo .idx estructural mediante el Diseador de tablas o bien
mediante el lenguaje.
O bien
O bien
l Utilice las clusulas DROP PRIMARY KEY o DROP UNIQUE TAG del comando ALTER
TABLE.
Por ejemplo, si la tabla employee contiene una etiqueta llamada title, puede eliminarla con el
cdigo siguiente:
USE employee
DELETE TAG title
En el caso de que la etiqueta que desea eliminar sea la clave principal de la tabla employee, puede
utilizar el comando ALTER TABLE:
USE employee
ALTER TABLE DROP PRIMARY KEY
Los ndices .cdx no estructurales y sus etiquetas no son visibles en el Diseador de tablas. Para
eliminar las etiquetas de un archivo .cdx no estructural debe utilizar el lenguaje.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 80 de 133
163 of 804
eliminar las etiquetas de un archivo .cdx no estructural debe utilizar el lenguaje.
Al utilizar la clusula OF con el comando DELETE TAG, se indica a Visual FoxPro que debe
eliminar una etiqueta de un archivo .cdx distinto del .cdx estructural. Por ejemplo, si tiene un archivo
.cdx no estructural llamado QRTLYRPT.CDX con una etiqueta llamada title, puede eliminar la
etiqueta title con el comando siguiente:
Para eliminar todas las etiquetas de un archivo .cdx estructural o no estructural, utilice la clusula
ALL del comando DELETE TAG.
Como los archivos de ndice autnomos solamente contienen una expresin de clave nica, para
eliminar la expresin basta con eliminar el archivo .IDX del disco.
Por ejemplo, el cdigo siguiente elimina el archivo de ndice autnomo .idx Orddate.idx:
Tambin puede utilizar el sistema operativo para eliminar los archivos .idx autnomos innecesarios.
Para hacer ms eficaces sus aplicaciones puede crear ndices basados en expresiones. Estas
expresiones pueden ser simples o complejas, dependiendo de lo que se quiera lograr.
Al examinar la tabla Customer ordenada segn esta etiqueta de ndice, los clientes aparecern
ordenados por pases, dentro de cada pas por regiones y dentro de cada regin por Id. de cliente.
Usar una expresin para evitar valores duplicados en una combinacin de campos
Si desea evitar la duplicacin de valores en mltiples campos, puede crear un ndice principal o
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 81 de 133
164 ofo 804
Si desea evitar la duplicacin de valores en mltiples campos, puede crear un ndice principal
candidato basado en una expresin que combine mltiples campos.
Por ejemplo, si tiene una tabla que almacena el prefijo de zona y el nmero de telfono en dos
columnas:
En ambas columnas existen valores duplicados en otras filas. Sin embargo, no hay ningn nmero de
telfono duplicado, ya que la combinacin de los dos campos siempre es nica. Por ello, si se
especifican las dos columnas en la expresin de un ndice principal o candidato, las filas del ejemplo
no se considerarn duplicadas. Si intenta introducir un valor con el mismo prefijo de zona y el mismo
nmero de telfono que una de las filas existentes, Visual FoxPro rechazar la entrada por estar
duplicada.
Puede crear ndices sobre campos que contengan valores nulos. Las expresiones de ndice cuyo
resultado es .NULL. se insertan en el archivo .CDX o .IDX delante de las entradas no nulas. Todos
los valores nulos quedan por tanto al principio del ndice.
El ejemplo siguiente ilustra un efecto de indexar valores nulos. Es el estado de la tabla antes de
aplicar el ndice:
El valor .NULL. en dos registros representa el hecho de que los nmeros de seguridad social de Anne
Dunn y Alan Carter son desconocidos o no estn disponibles. Puede crear un ndice con el nmero
SocSec, como en el ejemplo siguiente:
Despus de indexar sobre SocSec, los registros con valores nulos en SocSec aparecen en primer
lugar
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 82 de 133
165 of 804
lugar
Cuando la expresin de ndice contiene valores nulos, los registros cuyo valor de SocSec es .NULL.
se sitan los primeros (ordenados por LastName), y a continuacin se colocan los registros cuyos
valores de SocSec son no nulos. Observe que hay dos entradas para Alan Carter. Como el registro 5
contiene un valor nulo, se indexa antes que el registro 2.
Tambin puede crear ndices basados en expresiones ms complejas. Las expresiones de clave de
ndice de Visual FoxPro pueden contener funciones de Visual FoxPro, constantes o funciones
definidas por el usuario.
La expresin que cree debe ofrecer como resultado no ms de 100 caracteres en el caso de ndices
autnomos (.idx) o de 240 caracteres para las etiquetas de ndice .cdx. Puede utilizar campos de tipos
de datos diferentes en una sola etiqueta, convirtiendo los componentes individuales de la expresin a
datos de tipo Character.
Para aprovechar la optimizacin Rushmore, la expresin de ndice debe cumplir exactamente los
criterios.
Puede utilizar funciones de Visual FoxPro en las etiquetas de ndice. Por ejemplo, puede utilizar la
funcin STR( ) para convertir un valor numrico en una cadena de caracteres. Si desea crear una
etiqueta de ndice para la tabla customer que combine el campo cust_id con el campo maxordamt,
puede convertir maxordamt del tipo Currency con ancho 8 a un campo de 8 caracteres con dos lugares
decimales mediante el cdigo siguiente:
Si quiere reducir el tamao de los ndices para campos que contienen valores enteros, puede convertir
los valores enteros en una representacin Character (Binary) mediante la funcin BINTOC( ).
Tambin puede convertir los valores binarios mediante la funcin CTOBIN( ).
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 83 de 133
166 of 804
Si desea crear un ndice para ordenar una tabla en orden cronolgico, puede utilizar la funcin DTOS
( ) para convertir un campo de fecha en una cadena de caracteres. Para tener acceso a la tabla
employee por hire_date y emp_id, puede crear la siguiente expresin de ndice:
Puede ser preferible utilizar un procedimiento almacenado en vez de una FDU en las etiquetas de
ndice. Como las FDU se almacenan en archivos independientes de la base de datos, puede mover o
eliminar el archivo de la FDU, lo que har que la etiqueta que hace referencia a la misma deje de ser
vlida. El cdigo de los procedimientos almacenados, por el contrario, se conserva en el archivo
.DBC y Visual FoxPro puede encontrarlo siempre.
Otra ventaja de los procedimientos almacenados en las etiquetas de ndice es que la referencia a un
procedimiento almacenado garantiza que el ndice se basar en el cdigo especificado. Si utiliza una
FDU en la expresin de ndice, se usar en la indexacin toda FDU que se encuentre al alcance y que
tenga el mismo nombre que la referenciada en el ndice.
Nota Tenga cuidado al referenciar un procedimiento almacenado o una FDU en una expresin de
ndice, ya que el tiempo necesario para crear el ndice aumentar.
Puede crear una etiqueta de ndice que haga referencia a una tabla abierta en otra rea de trabajo. Lo
mejor es utilizar un ndice autnomo (.idx) para las etiquetas que hagan referencia a ms de una tabla,
ya que si se incluye una etiqueta de este tipo en un archivo .cdx estructural, Visual FoxPro no
permitira abrir la tabla hasta que est abierta la tabla referenciada en la etiqueta de ndice.
Para ver los registros en orden descendente puede crear un ndice descendente o bien leer un ndice
existente en orden descendente.
l En la ficha ndices del Diseador de tablas, elija el botn de flecha situado a la izquierda del
cuadro Nombre de forma que la flecha apunte hacia abajo.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 84 de 133
167 of 804
Para crear archivos de ndice estructural compuesto, puede utilizar los dos mtodos. Para crear otros
tipos de archivos de ndice, slo puede utilizar el segundo. Por ejemplo, puede crear un nuevo ndice
descendente que ordene la tabla product de mayor a menor por unit_price y examinar la tabla con
el nuevo orden, mediante el cdigo siguiente:
USE products
INDEX ON unit_price TAG unit_price DESCENDING
BROWSE
l Utilice la clusula DESCENDING del comando SET ORDER para leer el ndice en orden
descendente.
Leer los ndices en orden descendente permite aprovechar los ndices existentes, en lugar de crear
otros nuevos. Por ejemplo, puede que ya haya creado un ndice que ordene la tabla product por
unit_price con el cdigo siguiente:
USE products
INDEX ON unit_price TAG unit_price
USE products
SET ORDER TO unit_price DESCENDING
BROWSE
En los ejemplos anteriores se trata el acceso a la informacin en orden descendente. Tanto SET
ORDER como INDEX cuentan con una clusula ASCENDING. Si combina estos dos comandos
puede obtener una gran flexibilidad en sus aplicaciones. Por ejemplo, si utiliza la clusula
ASCENDING o DESCENDING para crear un ndice en el orden de uso ms frecuente, puede utilizar
la clusula opuesta con el comando SET ORDER para ver o tener acceso a la informacin en el orden
inverso cuando resulte ms adecuado.
Filtrar datos
Puede limitar el acceso a los registros que se desee con un ndice filtrado. Al crear un ndice filtrado,
solamente estarn disponibles para su presentacin y acceso los registros que satisfagan la expresin
de filtro.
l En el Diseador de tablas, escriba una expresin de filtro en el cuadro de texto Filtro del ndice
correspondiente.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 85 de 133
168 of 804
O bien
Si incluye la clusula opcional FOR con el comando INDEX, el archivo de ndice actuar como un
filtro para la tabla. En el archivo de ndice slo se crearn claves para los registros que satisfagan la
expresin de filtro. Por ejemplo, si prepara una circular destinada a los representantes de ventas de su
empresa y desea ordenar el envo por pases, puede crear un ndice que filtre la tabla employee de
forma que slo aparezcan los registros de los representantes de ventas, ordenados por pases y por
apellidos. El cdigo siguiente crea tal ndice filtrado y muestra los datos resultantes en una ventana
Examinar:
USE employee
INDEX ON country+last_name FOR title = "Representante de ventas" ;
TAG reps_cntry
BROWSE
Al ver la ventana Examinar slo aparecern los representantes de ventas, no los registros de los
dems empleados.
Un ndice filtrado se aplica solamente a los registros que satisfacen la expresin de filtro.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 86 de 133
169 of 804
Puede utilizar el comando SET FILTER para filtrar los datos de forma temporal, sin crear un ndice
filtrado especial. Este comando es especialmente til cuando se desea especificar una condicin
temporal que los registros de una tabla deben satisfacer para ser accesibles. Por ejemplo, puede
utilizar el comando siguiente para filtrar la tabla customer de forma que slo muestre los clientes de
Alemania:
USE customer
SET FILTER TO country = "Germany"
BROWSE
El comando SET FILTER admite como condicin de filtro cualquier expresin lgica vlida en
Visual FoxPro. Una vez especificado el comando SET FILTER, slo estarn disponibles en la tabla
los registros que cumplan la condicin de filtro. Todos los comandos de acceso a la tabla respetan la
condicin de SET FILTER. Puede establecer un filtro distinto para cada tabla abierta.
Puede mejorar el rendimiento de las tablas indexadas si mantiene los ndices actualizados y utiliza en
ellos expresiones optimizables.
Los archivos de ndice quedan obsoletos cuando se abre una tabla sin abrir sus archivos de ndice
correspondientes y se modifican los campos clave. Los archivos de ndice tambin pueden quedar
invalidados a consecuencia de una cada del sistema o al tener acceso a una tabla y actualizarla desde
otro programa. Cuando los archivos de ndice quedan obsoletos, puede actualizarlos con el comando
REINDEX.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 87 de 133
170 of 804
O bien
USE customer
REINDEX
REINDEX actualiza todos los archivos de ndice abiertos en el rea de trabajo seleccionada. Visual
FoxPro reconoce cada tipo de archivo de ndice (.cdx compuestos, .cdx estructurales e .idx de ndice
nico) y efecta la reindexacin segn corresponda. Al hacerlo, actualiza todas las etiquetas de los
archivos .cdx y tambin los archivos .cdx estructurales, que se abren automticamente con la tabla.
Tambin puede actualizar los archivos de ndice obsoletos con el comando REINDEX.
La reindexacin lleva tiempo, especialmente cuando se trata de tablas de gran tamao. Slo debe
reindexar cuando sea necesario. Para mejorar el rendimiento, puede reindexar durante la
inicializacin o la finalizacin del programa, en lugar de hacerlo en la ejecucin principal.
Puede utilizar ndices para acelerar las consultas y otras operaciones. Si desea informacin sobre la
forma de crear expresiones de ndice optimizables Rushmore, consulte el captulo 15, Optimizar
aplicaciones
Adems de las reas de trabajo visibles en la ventana Sesin de datos, Visual FoxPro proporciona
automticamente un entorno independiente para cada instancia de un formulario o conjunto de
formularios a travs de las sesiones de datos. Una sesin de datos es una representacin del entorno
de trabajo dinmico actual utilizado por un formulario, un conjunto de formularios o un informe.
Cada sesin de datos contiene su propio conjunto de reas de trabajo. Estas reas de trabajo contienen
las tablas abiertas en las reas de trabajo, sus ndices y sus relaciones. Para obtener informacin sobre
el uso de sesiones de datos, consulte el captulo 17, Programar para acceso compartido.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 88 de 133
171 of 804
Para ver la lista de tablas abiertas en una sesin de Visual FoxPro, puede abrir la ventana Vista.
O bien
Al escribir SET en la ventana Comandos, Visual FoxPro abre la ventana Sesin de datos y muestra
los alias de las reas de trabajo de las tablas abiertas en la sesin actual.
Para abrir una tabla en un rea de trabajo puede utilizar la ventana Sesin de datos o el comando
USE.
O bien
Para abrir una tabla en la menor rea de trabajo disponible, utilice la clusula IN del comando USE
con el rea de trabajo 0. Por ejemplo, si hay tablas abiertas en las reas de trabajo de 1 a 10, el
comando siguiente abrir la tabla customer en el rea de trabajo 11.
USE customer IN 0
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 89 de 133
172 of 804
USE customer IN 0
Tambin puede elegir Abrir en el men Archivo para abrir una tabla en un rea de trabajo.
Para cerrar una tabla en un rea de trabajo puede utilizar la ventana Sesin de datos o bien hacerlo
mediante el lenguaje.
O bien
O bien
l Utilice la clusula IN del comando USE para referirse al rea de trabajo de la tabla que desee
cerrar.
Cuando especifique el comando USE sin ningn nombre de tabla y haya un archivo de tabla abierto
en el rea de trabajo seleccionada actualmente, la tabla se cerrar. Por ejemplo, el cdigo siguiente
abre la tabla customer, muestra una ventana Examinar y luego cierra la tabla:
USE customer
BROWSE
USE
Tambin se cierra la tabla automticamente cuando se abre otra en la misma rea de trabajo o cuando
se especifica el comando USE con la clusula IN y se hace referencia al rea de trabajo actual. El
cdigo siguiente abre, muestra y cierra la tabla customer utilizando USE IN y el alias de tabla
customer:
USE customer
BROWSE
USE IN customer
Antes de abrir una tabla, puede referirse a la siguiente rea de trabajo disponible con el nmero de
rea de trabajo como se indica a continuacin:
SELECT 0
Un alias de tabla es el nombre que utiliza Visual FoxPro para referirse a una tabla abierta en un rea
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 90 de 133
Un alias de tabla es el nombre que utiliza Visual FoxPro para referirse a una tabla abierta173 of 804
en un rea
de trabajo. Visual FoxPro utiliza automticamente el nombre de archivo como alias predeterminado
al abrir una tabla. Por ejemplo, si abre con los comandos siguientes el archivo CUSTOMER.DBF en
el rea de trabajo 0, se asignar automticamente a la tabla el alias predeterminado customer:
SELECT 0
USE customer
A continuacin puede utilizar el alias customer para identificar la tabla en un comando o funcin.
Tambin puede especificar otro alias.
Por ejemplo, para abrir el archivo CUSTOMER.DBF en el rea de trabajo 0 y asignarle el alias
people, utilice los comandos siguientes:
SELECT 0
USE customer ALIAS people
A continuacin podr utilizar el alias people para referirse a la tabla abierta. Un alias puede tener
hasta 254 letras, dgitos o signos de subrayado, y debe comenzar por una letra o un signo de
subrayado. Visual FoxPro crea automticamente un alias alternativo cuando el especificado contiene
algn carcter no admitido.
l Al abrir una misma tabla simultneamente en varias reas de trabajo incluyendo la clusula
AGAIN en el comando USE y sin especificar alias distintos al abrir la tabla en cada rea.
l Cuando se produce un conflicto con los alias.
Los alias predeterminados asignados a las primeras 10 reas de trabajo son las letras de rea de
trabajo de A a J; los asignados a las reas de 11 a 32767 van de W11 a W32767. Puede utilizar estos
alias asignados por Visual FoxPro exactamente de la misma forma que cualquier otro alias
predeterminado o definido por el usuario para referirse a una tabla abierta en un rea de trabajo.
Para pasar de un rea de trabajo a otra puede utilizar el comando SELECT. Por ejemplo, si se ha
abierto Customer.dbf en un rea de trabajo y tiene asignado su alias predeterminado CUSTOMER,
puede pasar a esta rea de trabajo con el comando SELECT siguiente:
SELECT customer
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 91 de 133
174 of 804
Hacer referencia a tablas abiertas en otras reas de trabajo
Tambin puede hacer referencia a campos de otras reas de trabajo si precede el nombre del campo
con el nombre de alias correspondiente y un punto, o con el alias y el operador > . Por ejemplo, si se
encuentra en un rea de trabajo y desea tener acceso al campo contact de la tabla Customer, abierta
en un rea distinta, puede utilizar la siguiente expresin para hacer referencia al campo:
customer.contact
Si la tabla a la que desea hacer referencia se ha abierto con un alias, puede utilizar el nombre del
alias. Por ejemplo, si la tabla Customer se ha abierto con el alias people, puede referirse al campo
lastname con la expresin siguiente:
people.lastname
El uso del nombre o el alias de una tabla la identifica especficamente, independientemente del rea
de trabajo en la que est abierta.
Al establecer una relacin temporal entre tablas, se hace que el puntero de registro de una tabla (la
tabla secundaria) siga automticamente los movimientos del de la otra (la tabla primaria), lo que
permite seleccionar un registro en el lado uno, o primario, de una relacin y tener acceso
automticamente a los registros relacionados del lado varios, o secundario.
Por ejemplo, puede estimar conveniente relacionar las tablas customer y orders de forma que al
situar el puntero de registro en un cliente determinado de la tabla customer, el puntero de la tabla
orders se desplace hasta el registro con el mismo nmero de cliente.
Puede utilizar las reas de trabajo y los alias de las tablas al establecer relaciones entre dos tablas
abiertas con el comando SET RELATION. Si utiliza un formulario para trabajar con las tablas, puede
almacenar estas relaciones como parte del entorno de datos del formulario.
Puede utilizar la ventana Sesin de datos o el lenguaje para crear relaciones temporales entre las
tablas.
l En la ventana Sesin de datos, seleccione las tablas y utilice el botn Relaciones para crear las
relaciones.
O bien
Con el comando SET RELATION puede establecer una relacin entre una tabla abierta en el rea de
trabajo seleccionada actualmente y otra tabla abierta en otra rea. Normalmente se relacionan tablas
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 92 de 133
175 of 804
trabajo seleccionada actualmente y otra tabla abierta en otra rea. Normalmente se relacionan tablas
que tienen un campo comn y la expresin utilizada para establecer la relacin es habitualmente la
expresin del ndice que controla la tabla secundaria.
Por ejemplo, puede que un cliente tenga varios pedidos asociados a su registro de cliente. Si crea una
relacin entre el campo comn a ambas tablas, podr ver fcilmente todos los pedidos de un cliente
determinado. En el programa siguiente se utiliza un campo, cust_id, comn a las dos tablas, para
crear una relacin entre el campo cust_id de la tabla customer y la etiqueta de ndice cust_id de la
tabla orders.
Uso de SET RELATION para establecer una relacin entre dos tablas
Cdigo Comentarios
USE customer IN 1 Abre la tabla customer (tabla primaria) en el rea
de trabajo 1
USE orders IN 2 Abre la tabla orders (tabla secundaria) en el rea
de trabajo 2
SELECT orders Selecciona el rea de trabajo secundaria.
SET RELATION TO cust_id INTO orders Crea la relacin entre la tabla primaria y el ndice
que controla la tabla secundaria.
SELECT orders Abre dos ventanas Examinar. Observe que al
BROWSE NOWAIT
SELECT customer mover el puntero de registro en la tabla primaria
BROWSE NOWAIT los datos de la tabla secundaria cambian.
La ventana Sesin de datos muestra las dos tablas abiertas, Orders y Customer, y la relacin
establecida con el comando SET RELATION.
La ventana Sesin de datos muestra los alias y las relaciones temporales de las tablas abiertas
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 93 de 133
176 of 804
El ndice creado para la tabla secundaria, orders, ordena los registros de la tabla orders por grupos,
segn el cliente que ha originado el pedido. Al establecer una relacin entre la tabla primaria y el
ndice de la tabla secundaria, Visual FoxPro selecciona solamente los registros de la tabla secundaria
cuya clave de ndice coincide con la del registro primario seleccionado.
En el ejemplo anterior se ha establecido una relacin simple entre dos tablas. Tambin puede utilizar
el comando SET RELATION para establecer relaciones mltiples entre una tabla primaria y varias
tablas secundarias.
Si va a crear un formulario que utiliza ms de una tabla, puede utilizar el entorno de datos para crear
relaciones entre tablas y almacenarlas en el formulario. Las relaciones establecidas en el entorno de
datos se abren automticamente al ejecutar el formulario. Si desea informacin sobre cmo crear un
entorno de datos, consulte el captulo 9, Crear formularios.
Tambin puede crear una relacin entre registros de una sola tabla. Esta relacin, denominada con
referencia a s misma, puede ser til en aquellas situaciones en las que se tiene toda la informacin
necesaria almacenada en una sola tabla. Por ejemplo, puede ser conveniente desplazarse por los
supervisores de la tabla Employee haciendo que los empleados a cargo de cada supervisor cambien
automticamente al mover el puntero de registro de un supervisor a otro.
l En la ventana Sesin de datos, seleccione la tabla y utilice el botn Relaciones para establecer
relaciones.
-O bien-
Para crear una relacin con referencia a s misma, debe abrir la misma tabla dos veces, una en un rea
de trabajo y una segunda vez, con el comando USE AGAIN, en otra rea distinta. A continuacin
utilizar un ndice para relacionar los registros. Por ejemplo, el cdigo siguiente establece y examina
una relacin con referencia a s misma creando una etiqueta de ndice llamada mgr_id que ordena la
tabla Employee por el campo reports_to:
SELECT 0
USE employee ALIAS managers
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 94 de 133
177 of 804
USE employee ALIAS managers
SELECT 0
USE employee AGAIN ALIAS employees
INDEX ON reports_to TAG mgr_id
SET ORDER TO mgr_id
SELECT managers
SET RELATION TO emp_id INTO employees
BROWSE
SELECT employees
BROWSE
Los ndices permiten establecer relaciones persistentes entre las tablas de una base de datos. Las
relaciones persistentes son relaciones entre tablas de base de datos almacenadas en el archivo de la
base de datos y se utilizan automticamente como condiciones predeterminadas de combinacin en el
Diseador de consultas y en el Diseador de vistas. Las relaciones persistentes aparecen tambin en el
Diseador de bases de datos en forma de lneas que unen los ndices de las tablas y son las relaciones
predeterminadas al utilizar las tablas en el entorno de datos.
A diferencia de las relaciones temporales establecidas con el comando SET RELATION, las
relaciones persistentes no tienen que establecerse de nuevo cada vez que se utilizan las tablas. Sin
embargo, las relaciones persistentes no controlan la relacin entre los punteros de registros, por lo
que deber utilizar ambos tipos al programar aplicaciones con Visual FoxPro. Si desea ms
informacin sobre el establecimiento de relaciones persistentes, consulte el captulo 6,Crear bases de
datos.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 95 de 133
178
Las vistas combinan las cualidades de las consultas y las tablas: al igual que una consulta, of 804
puede
utilizar una vista para extraer un conjunto de datos de una o ms tablas relacionadas; y como en una
tabla, puede utilizar una vista para actualizar la informacin de la misma y almacenar definitivamente
en disco sus resultados.
Cuando usted crea una vista, Visual FoxPro almacena una definicin de vista en la base de datos
actual. Esta definicin contiene los nombres de las tablas y los campos de la vista, as como los
valores de sus propiedades. Cuando use la vista, la definicin de la misma se usar para generar una
instruccin SQL que define el conjunto de datos de la vista.
Para obtener informacin acerca de las propiedades de la vista, vea Establecer las propiedades de la
vista y de las conexiones ms adelante en este captulo y vea DBGETPROP( ) o CURSORGETPROP
( ).
Puede crear dos tipos de vistas: local y remota. Las vistas remotas utilizan sintaxis remota de SQL
para seleccionar informacin de tablas de un origen de datos ODBC remoto. Las vistas locales usan la
sintaxis SQL de Visual FoxPro para seleccionar informacin de tablas o vistas. Puede agregar una o
ms vistas remotas a una vista local, lo que le permitir tener acceso a informacin de orgenes de
datos de Visual FoxPro y ODBC remoto en la misma vista. Para obtener ms informacin sobre el
acceso a datos remotos y locales en una nica vista, consulte Combinar datos locales y remotos en
una vista, ms adelante en este mismo captulo.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 96 de 133
179 of 804
Puede crear una vista local con el Diseador de vistas o mediante el comando CREATE SQL VIEW.
O bien
l Use el comando CREATE SQL VIEW cuando haya una base de datos abierta para mostrar el
Generador de vistas.
O bien
Por ejemplo, el cdigo siguiente crea una vista que contiene todos los campos de la tabla products:
En el ejemplo anterior, el nombre de la tabla est precedido, o cualificado, por el nombre de la base
de datos de la tabla y el smbolo "!". Si cualifica el nombre de la tabla al crear una vista, Visual
FoxPro buscar la tabla tanto en la lista de bases de datos abiertas, incluyendo las bases de datos
actuales y las no actuales, como en la ruta de acceso predeterminada de la tabla.
Si no cualifica una tabla con un nombre de base de datos en una definicin de vista, la base de datos
deber estar abierta antes de poder utilizar la vista.
Sugerencia Cuando cree o use una vista en el Administrador de proyectos, ste abrir la base de
datos automticamente. Por consiguiente, si usa una vista fuera del proyecto, deber abrir la base de
datos o asegurarse de que la base de datos est en el alcance antes de poder utilizar la vista.
Puede usar sustitucin de macros para almacenar la instruccin SQL SELECT en una variable que
puede llamar con la clusula AS del comando CREATE SQL VIEW. Por ejemplo, el cdigo
siguiente almacena una instruccin SQL SELECT en la variable emp_cust_sql, que se utiliza para
crear una vista nueva.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 97 de 133
WHERE employee.emp_id = customer.emp_id" 180 of 804
CREATE SQL VIEW emp_cust_view AS &emp_cust_sql
Modificar vistas
Sugerencia En el Diseador de vistas, puede abrir una vista existente y, a continuacin, copiar la
cadena SQL de slo lectura y pegarla en el cdigo como mtodo abreviado para la creacin de una
vista mediante programacin.
O bien
l Abra una base de datos y utilice el comando MODIFY VIEW con el nombre de la vista.
Puede cambiar el nombre de una vista desde el Administrador de proyectos o mediante el comando
RENAME VIEW.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 98 de 133
181 of 804
La base de datos que contiene la vista debe estar abierta para que usted pueda cambiar el nombre de
la vista.
Puede eliminar la definicin de una vista de una base de datos en el Administrador de proyectos o con
el comando DELETE VIEW. Antes de eliminar la vista, asegrese de que la base de datos que la
contiene est abierta y establecida como base de datos actual.
O bien
Nota Estos comandos producen el mismo resultado; DROP VIEW es la sintaxis estndar ANSI
SQL para eliminar una vista SQL.
Para tener acceso a informacin relacionada almacenada en tablas distintas, puede crear una vista y
agregar dos o ms tablas, o puede modificar una vista existente agregando tablas. Para agregar las
tablas, puede usar el Diseador de vistas o el comando CREATE SQL VIEW. Despus de agregar las
tablas, puede expandir su control de los resultados de la vista con la condicin de combinacin
definida entre las tablas.
l En el Administrador de proyectos, cree una vista y agregue las tablas que quiera en el
Diseador de vistas.
O bien
l Abra una base de datos y use el comando CREATE SQL VIEW; agregue nombres de tabla a la
clusula FROM y condiciones de combinacin.
Cuando se agregan las tablas al comando CREATE SQL VIEW se produce un producto
cartesiano. Tiene que especificar una condicin de combinacin en la clusula FROM o en la
clusula WHERE de la instruccin para emparejar registros relacionados entre las tablas. Si
existen relaciones persistentes entre las tablas, se usan automticamente como condiciones de
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 99 de 133
182 of 804
existen relaciones persistentes entre las tablas, se usan automticamente como condiciones de
combinacin.
Normalmente, para definir una condicin de combinacin se usan las relaciones establecidas en los
campos clave principal y clave externa entre las tablas. Por ejemplo, puede que quiera buscar
informacin sobre pedidos, incluyendo informacin sobre el cliente que hizo el pedido. Puede crear
una vista con las tablas Customer y Orders. Especifique una condicin de combinacin para comparar
valores de los campos que tienen en comn y, generalmente, devolver los que son iguales. En el
ejemplo, Customer y Orders tienen un campo Customer ID.
O bien
l Abra una base de datos y use el comando CREATE SQL VIEW; agregue nombres de tabla y
condiciones de combinacin a la clusula FROM.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 100 de 133
183 of 804
El cdigo siguiente crea la nueva vista como se describe en el ejemplo anterior, usando la clusula
FROM para especificar las condiciones de combinacin para la vista:
La condicin de combinacin tiene varias caractersticas: el tipo de combinacin, los campos que hay
que combinar y el operador para comparar los campos. En este caso, en el que tenemos una
combinacin interna, slo se incluyen en el resultado las filas de la tabla customer que coinciden con
uno o ms registros de la tabla orders.
Para cambiar el resultado de la vista de forma que satisfaga sus necesidades especficas, puede
especificar:
l Campos de la combinacin
l Operadores de comparacin entre los campos
l Una secuencia de combinaciones, si tiene dos tablas en la vista
l El tipo de combinacin
Especificar combinaciones en campos que no sean clave principal ni clave externa puede ser til en
casos especficos, pero no se suele hacer en la mayor parte de las vistas.
Si elige un tipo de combinacin diferente puede expandir el resultado de su consulta para incluir los
registros que cumplan la condicin de combinacin y los que no la cumplan. Si tiene ms de dos
tablas en la vista, puede cambiar el resultado si cambia el orden de combinaciones en la clusula
FROM.
Puede modificar los tipos de combinacin de la vista con el Diseador de vistas o a travs del
lenguaje.
O bien
-O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 101 de 133
l Abra una base de datos y use el comando CREATE SQL VIEW; agregue nombres de tablas y
condiciones de combinacin a la clusula FROM.
Si desea incluir filas no coincidentes en el resultado, puede usar una combinacin externa. Por
ejemplo, puede querer una lista de todos los clientes y saber si han hecho un pedido o no. Adems,
para los clientes que han hecho pedidos, es posible que quiera incluir los nmeros de pedido en la
vista. Cuando usa una combinacin externa, los campos vacos de las filas no coincidentes devuelven
valores nulos.
Tambin puede usar el lenguaje para crear esta vista con el cdigo siguiente:
Para controlar qu registros no coincidentes estn incluidos en la vista, puede elegir los siguientes
tipos de combinacin.
Para Utilice
Devolver slo registros desde ambas tablas que satisfagan la Condicin interna
condicin de combinacin establecida entre los dos campos
de la condicin de combinacin.
Devolver todos los registros de la tabla situada a la izquierda Combinacin externa izquierda
de la palabra clave JOIN y nicamente los registros
coincidentes de la tabla situada a la derecha de la palabra
clave.
Devolver todos los registros de la tabla situada a la derecha Combinacin externa derecha
de la palabra clave JOIN y nicamente los registros
coincidentes de la tabla situada a la izquierda de la palabra
clave.
Devolver registros coincidentes y no coincidentes de ambas Combinacin externa completa
tablas
Si crea vistas o consultas con ms de dos tablas, puede cambiar el resultado por el orden en que estn
especificadas las condiciones de combinacin. Por ejemplo, es posible que quiera buscar informacin
sobre los pedidos, incluyendo informacin sobre el empleado que hizo la venta y el cliente que hizo
el pedido. Puede crear una vista con las tablas customer, orders y employee y especificando
condiciones de combinacin interna en los campos que tienen en comn: customer y orders tienen
un campo customer ID; orders y employee tienen un campo employee ID.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 102 de 133
185 of 804
Puede especificar sus condiciones de combinacin en la clusula WHERE; sin embargo, no puede
especificar un tipo de combinacin de la misma forma que puede hacerlo en combinaciones en la
clusula FROM. Para vistas remotas, la clusula de combinacin aparece siempre en la clusula
WHERE.
El cdigo siguiente crea la misma vista que el ejemplo anterior, con la clusula WHERE para
especificar las condiciones de combinacin para la vista:
Cuando desee utilizar datos situados en un servidor remoto, deber crear una vista remota. Para crear
una vista remota, primero debe ser capaz de conectarse a un origen de datos.
Para obtener informacin sobre cmo establecer un origen de datos ODBC, consulte el captulo 1,
Instalar Visual FoxPro, de la Gua de instalacin e ndice principal.
En Visual FoxPro, puede crear y almacenar en una base de datos una definicin de conexin con
nombre, a la que se puede referir desde ese momento por su nombre cuando cree una vista remota.
Tambin puede establecer las propiedades de la conexin con nombre para optimizar la
comunicacin entre Visual FoxPro y el origen de datos remoto. Cuando active una vista remota, la
conexin de la vista se convertir en el canal hacia el origen de datos remoto.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 103 de 133
186 of 804
Para crear una conexin con nombre
O bien
l Abra una base de datos y utilice el comando CREATE CONNECTION para abrir el Diseador
de conexiones.
O bien
Por ejemplo, para crear una conexin en la base de datos testdata que almacene la informacin
necesaria para conectarse al origen de datos ODBC sqlremote, puede escribir el cdigo siguiente:
La creacin de una conexin con nombre en su base de datos no utiliza ningn recurso remoto ni de
red, ya que Visual FoxPro no activa la conexin hasta que usted utiliza la vista. Hasta que active la
conexin, la conexin con nombre slo existe como una definicin de conexin almacenada como
una fila en el archivo .dbc de la base de datos. Cuando utilice una vista remota, Visual FoxPro usar
la conexin con nombre mencionada en la vista para crear una conexin activa con el origen de datos
remoto y enviar la solicitud de datos al origen remoto utilizando la conexin activa como canal.
Puede crear opcionalmente una vista que especifique nicamente el nombre del origen de datos, en
lugar del nombre de la conexin. Cuando utilice la vista, Visual FoxPro usar la informacin de
ODBC acerca del origen de datos para crear y activar una conexin con el origen de datos. Cuando
cierre la vista se cerrar la conexin.
Cuando utilice el comando CREATE SQL VIEW con la clusula CONNECTION, especifique un
nombre que represente una conexin o bien un origen de datos. Visual FoxPro buscar primero en la
base de datos actual una conexin con el nombre que especific. Si no existe ninguna conexin con
ese nombre en la base de datos, Visual FoxPro buscar entonces un origen de datos ODBC
establecido con el nombre especificado. Si su base de datos actual contiene una conexin con nombre
cuyo nombre coincide con el de un origen de datos ODBC de su sistema, Visual FoxPro la encontrar
y utilizar la conexin con nombre.
Cuando use una vista cuya informacin de registro de conexin no est totalmente especificada,
Visual FoxPro puede mostrar un cuadro de dilogo especfico del origen de datos que le pida la
informacin que falte.
Puede controlar si Visual FoxPro le pedir la informacin que dej sin especificar en el momento de
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 104 de 133
187 of 804
Puede controlar si Visual FoxPro le pedir la informacin que dej sin especificar en el momento de
la conexin.
O bien
Puede utilizar una conexin con nombre ya existente para crear una vista remota. Puede ver una lista
de las conexiones disponibles en la base de datos y utilizar el Administrador de proyectos o el
comando DISPLAY CONNECTIONS.
O bien
Por ejemplo, el cdigo siguiente muestra las conexiones de la base de datos testdata:
Cuando tiene un origen de datos o una conexin con nombre vlidos, puede crear una vista remota
con el Administrador de proyectos o el lenguaje de programacin. Una vista remota es similar a una
vista local, pero usted agrega un nombre de conexin o de origen de datos al definir la vista. La
instruccin SQL de la vista remota utiliza el dialecto nativo del servidor.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 105 de 133
188 of 804
CONNECTION.
Si usa la clusula CONNECTION con el comando CREATE SQL VIEW, no necesitar incluir la
palabra clave REMOTE. Visual FoxPro identifica la vista como remota por la presencia de la palabra
clave CONNECTION. Por ejemplo, si tiene la tabla products de la base de datos Testdata en un
servidor remoto, el cdigo siguiente crear una vista remota de la tabla products:
Puede utilizar el nombre de un origen de datos en lugar del nombre de una conexin cuando cree una
vista remota. Tambin puede elegir entre omitir el nombre de la conexin o del origen de datos
remoto cuando utilice el comando CREATE SQL VIEW con la clusula REMOTE. Visual FoxPro
mostrar entonces el cuadro de dilogo Seleccin de conexin u Origen de datos, en el que podr
elegir un origen de datos o una conexin vlidos.
Despus de crear una vista, puede abrir el Diseador de bases de datos; la vista se mostrar de la
misma manera que una tabla en el esquema con el nombre de la vista y un icono en lugar del nombre
de la tabla y un icono.
Usar vistas
Despus de haber creado una vista, puede utilizarla para mostrar y actualizar datos. Tambin puede
modificar las propiedades de una vista para aumentar el rendimiento de la misma. Se trata la vista
como una tabla:
Puede utilizar una vista con el Administrador de proyectos o con el lenguaje de programacin.
O bien
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 106 de 133
189 of 804
O bien
Cuando utilice una vista, sta se abrir como un cursor en su propia rea de trabajo. Si la vista est
basada en tablas locales, Visual FoxPro tambin abrir las tablas base en reas de trabajo distintas.
Las tablas base de una vista son las tablas a las que tiene acceso la instruccin SELECT - SQL que
usted incluye en el comando CREATE SQL VIEW al crear una vista. En el ejemplo anterior, al usar
product_view tambin se abre automticamente la tabla products.
Cuando una vista est basada en tablas remotas, estas tablas no se abren en reas de trabajo. En la
ventana Sesin de datos slo aparece el nombre de la vista remota.
Cuando tiene acceso a un origen de datos remoto, tendr acceso a cantidades potencialmente masivas
de datos. Puede limitar el alcance de los datos seleccionados en la vista nicamente a los registros
que necesite en cada momento. Esto reduce el trfico en la red y aumenta el rendimiento de su vista.
Por ejemplo, si desea ver informacin acerca de los clientes de un determinado pas y sus pedidos,
mejorar el rendimiento si descarga en la vista slo los registros correspondientes a ese pas, en lugar
de los de todos los clientes.
Un mtodo que puede utilizar para limitar el alcance de su vista es agregar una clusula WHERE a la
instruccin SQL de su vista. Si deseara buscar los registros de los clientes de Suecia, podra crear esta
clusula SQL WHERE para su vista:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 107 de 133
190 of 804
clusula SQL WHERE para su vista:
Este cdigo limitar el alcance de su vista al descargar nicamente los registros correspondientes a
los clientes de Suecia, pero tambin puede que sea necesaria la creacin de una vista distinta para
cada pas, ya que el valor real de customer.country para un pas est codificado en la instruccin
SELECT de su vista.
Puede limitar el alcance de una vista sin crear una vista distinta para cada subconjunto de registros si
crea vistas parametrizadas. Una vista parametrizada crea una clusula WHERE en la instruccin SQL
SELECT de la vista que limita los registros descargados nicamente a aquellos que cumplen las
condiciones de la clusula WHERE que se cre con los valores proporcionados para el parmetro.
Este valor se puede proporcionar en tiempo de ejecucin o se puede transferir a la vista mediante
programacin.
En el caso del ejemplo anterior, puede crear una vista que le permita descargar los registros para
cualquier pas escribiendo simplemente el nombre del pas al abrir la vista.
O bien
El parmetro que usted proporciona se evala como una expresin de Visual FoxPro y el valor se
enva como parte de la instruccin SQL de la vista. Si la evaluacin falla, Visual FoxPro pedir el
valor del parmetro. Por ejemplo, si tiene la tabla customer de la base de datos Testdata en un
servidor remoto, el cdigo siguiente crear una vista remota parametrizada que limita la vista a
aquellos clientes cuyo pas coincida con el valor proporcionado para el parmetro ?cCountry:
Puede proporcionar un valor para ?cCountry mediante programacin cuando utilice la vista. Por
ejemplo, podra escribir el cdigo siguiente:
cCountry = 'Suecia'
USE Testdata!customer_remote_view IN 0
BROWSE
Visual FoxPro mostrar los registros de los clientes para las compaas suecas en la ventana
Examinar Customer_remote_view.
Vista que muestra los registros cuyo pas coincide con el parmetro proporcionado
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 108 de 133
191 of 804
Vista que muestra los registros cuyo pas coincide con el parmetro proporcionado
Sugerencia Si su parmetro es una expresin, escriba la expresin entre parntesis. Esto permite
que toda la expresin se evale como parte del parmetro.
Si su parmetro no es una variable o una expresin, quiz desee pedir al usuario que suministre el
valor del parmetro mediante la utilizacin de una cadena entre comillas como parmetro de la vista.
Cuando cree un parmetro de vista con una cadena entre comillas despus del smbolo "?", Visual
FoxPro no interpretar la cadena como una expresin. En su lugar, le pedir que introduzca el valor
del parmetro en tiempo de ejecucin. Por ejemplo, el cdigo siguiente crea una vista remota
parametrizada que pide al usuario que suministre un valor para el parmetro ?'mi id cliente':
Cuando utilice la vista del ejemplo anterior aparecer el cuadro de dilogo Parmetro de vista.
Cuando haya introducido un identificador (Id.) de usuario vlido, Visual FoxPro recuperar el
registro que coincide con ese Id.. Si introduce el valor ALFKI en el ejemplo anterior y examina
Customer_remote_view, ver el registro del cliente en la ventana Examinar.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 109 de 133
192 of 804
Mediante la utilizacin de una cadena entre comillas como parmetro de vista, se asegurar de que
Visual FoxPro pedir siempre al usuario el valor del parmetro.
Puede abrir mltiples instancias de una vista en reas de trabajo distintas, del mismo modo que puede
abrir una tabla en ms de un rea de trabajo. A diferencia de las tablas, las vistas recopilan un nuevo
conjunto de datos predeterminado cada vez que usted las utiliza.
O bien
l En la ventana Sesin de datos, elija Abrir y el nombre de la vista. Repita este proceso para
abrir la vista en reas de trabajo adicionales.
O bien
Cuando tiene acceso a la vista mediante programacin con el comando USE, puede elegir abrir otra
instancia de la vista sin necesidad de volver a consultar el origen de datos. Esto resulta especialmente
til cuando quiere abrir una vista remota en mltiples reas de trabajo sin esperar a que los datos se
descarguen desde un origen de datos remoto.
O bien
El cdigo siguiente utiliza la clusula NOREQUERY para mostrar el cursor buscado de la primera
instancia de product_remote_view en dos ventanas Examinar sin volver a consultar el origen de
datos remoto:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 110 de 133
CONNECTION remote_01 ; 193 of 804
AS SELECT * FROM products
USE product_remote_view
BROWSE
SELECT 0
USE product_remote_view NOREQUERY
BROWSE
Si desea que Visual FoxPro busque slo en la sesin actual un conjunto de resultados abierto para su
vista, puede utilizar la clusula AGAIN. El cdigo siguiente muestra product_remote_view en dos
ventanas Examinar:
Cuando utilice la clusula AGAIN, Visual FoxPro buscar un cursor de vista existente en la sesin
actual y abrir un alias adicional que apunta a este cursor de vista. Abrir otra instancia de una vista
con la clusula AGAIN equivale a ejecutar USE con la clusula NONQUERY con el nmero de
sesin actual..
Puede abrir y mostrar nicamente la estructura de una vista mediante la clusula NODATA del
comando USE. Esta opcin resulta especialmente til cuando se quiere ver la estructura de una vista
remota sin tener que esperar a la descarga de datos.
l Tenga acceso a la vista mediante programacin con el comando USE y la clusula NODATA.
El uso de una vista con la clusula NODATA siempre abre un nuevo cursor de la vista. La clusula
NODATa es siempre el modo ms rpido de obtener la estructura de una vista, porque crea el menor
cursor posible en el origen de datos remoto. Cuando utilice la clusula NODATA, Visual FoxPro
crear una clusula WHERE para la vista que siempre devolver un valor falso. Puesto que ningn
registro del origen de datos puede cumplir la condicin de la clusula WHERE, no se seleccionar
ninguna fila en el cursor del origen de datos remoto. Su vista se recuperar rpidamente ya que no
espera que el origen de datos remoto cree un cursor potencialmente grande.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 111 de 133
194 of 804
espera que el origen de datos remoto cree un cursor potencialmente grande.
Sugerencia El uso de la clusula NODATA es ms eficaz que usar un valor 0 para la propiedad
MaxRecords en su vista o en el cursor. Cuando utilice la propiedad MaxRecords, deber esperar
mientras el origen de datos remoto construye un cursor para la vista que contiene todas las filas de
datos que cumplen las condiciones normales de la clusula WHERE. Las filas del cursor completo de
la vista remota se descargarn de acuerdo con el valor de la propiedad MaxRecords.
Puede crear ndices locales en una vista, igual que en una tabla, mediante el comando INDEX ON. A
diferencia de los ndices generados para una tabla, los ndices locales que cree en una vista no se
almacenarn definitivamente: desaparecern cuando cierre la vista.
Sugerencia Considere el tamao del conjunto de resultados de su vista cuando decida si va a crear
un ndice local en una vista. Indexar un conjunto de resultados grande puede llevar un tiempo
considerable y disminuir el rendimiento de su vista.
Para obtener ms informacin acerca de la creacin de ndices, consulte el captulo 7,Trabajar con
tablas, o vea INDEX.
Puede crear relaciones temporales entre ndices de vistas o entre ndices de vistas e ndices de tablas
mediante el comando SET RELATION.
Para obtener un mejor rendimiento cuando utilice el comando SET RELATION para relacionar una
vista y una tabla, haga que la vista sea el objeto primario y la tabla el objeto secundario en la relacin.
Hacer que la tabla sea el objeto secundario es ms eficaz porque el ndice estructural de la tabla se
mantiene constantemente, se tiene acceso al mismo de forma ms rpida y lo puede usar el entorno de
datos para ordenar los registros. Hay que volver a generar el ndice de la vista cada vez que sta se
activa y tarda ms tiempo que el ndice de la tabla. Un ndice de una vista no forma parte de la
definicin de la vista; por lo tanto, si usa un entorno de datos, la vista no puede ser el objeto
secundario porque el ndice del objeto secundario tiene que existir como parte de la definicin y esto
no lo admiten las vistas.
Cuando cree una vista, sta heredar los valores de las propiedades, como UpdateType y
UseMemoSize, del cursor de entorno o cursor 0 de la sesin actual. Puede cambiar estos valores
predeterminados de las propiedades mediante la funcin CURSORSETPROP( ) con 0 como nmero
de cursor. Una vez creada la vista y almacenada en una base de datos, puede cambiar las propiedades
de la vista mediante la funcin DBSETPROP( ). Los cambios que realice a las propiedades de una
vista en una base de datos se almacenarn definitivamente en la base de datos.
Cuando utilice una vista, el cursor activo de la vista heredar los valores de las propiedades
almacenados para la vista en la base de datos. Puede cambiar estas propiedades en el cursor activo
mediante la funcin CURSORSETPROP( ) para el cursor de vista. Los cambios realizados por la
funcin CURSORSETPROP( ) son temporales. El valor temporal para la vista activa desaparece al
cerrar la vista, mientras que el valor temporal para el cursor 0 desaparece al cerrar la sesin de Visual
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 112 de 133
195 of 804
cerrar la vista, mientras que el valor temporal para el cursor 0 desaparece al cerrar la sesin de Visual
FoxPro.
Las conexiones heredan las propiedades de una forma similar. Las propiedades predeterminadas de la
conexin 0 se heredan cuando usted crea y almacena una conexin con nombre en una base de datos.
Puede cambiar estos valores predeterminados de propiedades para la conexin 0 mediante la funcin
SQLSETPROP( ). Despus de haber creado la conexin y haberla almacenado en una base de datos,
puede cambiar las propiedades de conexin mediante la funcin DBSETPROP( ). Cuando utilice una
conexin, la conexin activa heredar los valores de las propiedades almacenados para la conexin en
la base de datos. Puede cambiar estas propiedades en la conexin activa con la funcin
SQLSETPROP( ) para el controlador de la conexin.
Tanto las vistas como las conexiones pueden utilizar un origen de datos ODBC con nombre. Si utiliza
un origen de datos ODBC en una vista, la conexin heredar las propiedades de la configuracin
predeterminada de la sesin.
El diagrama siguiente ilustra la herencia de propiedades para las vistas y conexiones. Las lneas en
gris representan el flujo de herencia de propiedades, mientras que las lneas negras representan los
comandos de Visual FoxPro.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 113 de 133
196 of 804
Cuando cree una vista, se establece la propiedad DataType para todos los campos a un valor
predeterminado. El valor es la letra del tipo de datos (D, G, I, L, M, P, T, Y) para tipos de datos de
longitud fija y la letra seguida por parmetros de precisin y escala entre parntesis (B(d), C(n), N
(n,d)) para tipos de longitud variable. Esta propiedad es de slo lectura para vistas locales. Para ver
una lista de tipos predeterminados, consulte "Descargar y cargar datos de vistas remotas" en el
captulo 21, Implementar una aplicacin cliente-servidor.
Puede modificar el valor de la propiedad DataType para el campo vista remota con la funcin
DBSETPROP( ) como se muestra en esta tabla.
Tipos de datos ODBC para Tipos de datos posibles de un cursor de Visual FoxPro
campos remotos
SQL_CHAR Character o Memo1 (predeterminado); tambin General o
SQL_VARCHAR Picture
SQL_LONGVARCHAR
SQL_BINARY Memo (predeterminado); tambin Character, General o
SQL_VARBINARY Picture
SQL_LONGVARBINARY
SQL_DECIMAL Numeric o Currency2 (predeterminado); tambin Character,
SQL_NUMERIC Integer o Double
SQL_BIT Logical (predeterminado); tambin Character
SQL_TINYINT Integer (predeterminado); tambin Character, Numeric,
SQL_SMALLINT Double o Currency
SQL_INTEGER
SQL_BIGINT Character (predeterminado); tambin Integer, Numeric,
Double o Currency
SQL_REAL Double (predeterminado); el nmero de caracteres decimales
SQL_FLOAT es el valor de SET DECIMALS en Visual FoxPro; tambin
SQL_DOUBLE Character, Integer, Numeric o Currency
SQL_DATE Date (predeterminado); tambin Character o DateTime
SQL_TIME DateTime3 (predeterminado); tambin Character
SQL_TIMESTAMP DateTime4 (predeterminado); tambin Character o Date
1. Si el ancho del campo ODBC es menor que el valor de la propiedad de cursor UseMemoSize, se
convierte en un campo Character en el cursor de Visual FoxPro; si no, se convierte en un campo
Memo.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 114 de 133
197 of 804
Puede usar la propiedad DataType para elegir un tipo de datos diferente que el predeterminado. Por
ejemplo, es posible que quiera descargar un campo marca de hora del servidor a Visual FoxPro, pero
la asignacin de tipo de datos predeterminada a un campo DateTime de Visual FoxPro truncara
cualquier fraccin de segundo almacenada en la marca de hora de servidor. Puede usar la propiedad
DataType para asignar el campo marca de hora remota a un campo Character de Visual FoxPro para
conservar las fracciones de segundo.
Las tablas base locales abiertas automticamente cuando usa una vista no se cierran automticamente
cuando cierra una vista; debe cerrarlas explcitamente. Esto es coherente con el comando SELECT -
SQL.
Puede actualizar datos en una vista a travs de la interfaz o mediante el lenguaje de programacin. El
primer paso para actualizar los datos de una vista consiste en hacer actualizable la vista. En la
mayora de los casos, los valores predeterminados de las propiedades preparan automticamente la
vista para que sea actualizable, pero las actualizaciones no se envan al origen de datos hasta que
usted indique a Visual FoxPro que lo haga estableciendo a On la propiedad SendUpdates.
Una vista utiliza cinco propiedades para controlar las actualizaciones. Estas propiedades se relacionan
a continuacin, junto con sus valores predeterminados:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 115 de 133
KeyField 198 of
Campos clave de la base de datos y claves principales y remotas de804
la
tabla.
UpdateName Nombre_tabla.nombre_columna para todos los campos.
Updatable Todos los campos excepto los campos de clave principal.
SendUpdates De forma predeterminada son los valores predeterminados de la sesin,
que originalmente se establece en falso (.F.); si cambia el valor a
verdadero (.T.), se convertir en el valor predeterminado para todas las
vistas creadas en la sesin.
CompareMemo El valor predeterminado es verdadero (.T.), lo cual significa que los
campos memo se incluyen en la clusula WHERE y se usan para
detectar conflictos de actualizacin.
Si bien las cinco propiedades son necesarias para actualizar datos, la propiedad SendUpdates acta
como "conmutador principal" que controla si se envan o no las actualizaciones. A medida que
desarrolla su aplicacin, puede desactivar la propiedad SendUpdates y configurar las dems
propiedades para permitir actualizaciones de los campos que desee actualizar. Cuando vaya a probar
su aplicacin, podr activar la propiedad SendUpdates para iniciar el flujo de actualizaciones.
Para hacer que una vista sea actualizable desde el Diseador de vistas
El valor predeterminado de las vistas que usted crea mediante el Diseador de vistas normalmente
prepara la vista para que sea actualizable; slo necesita activar la casilla de verificacin "Enviar
actualizaciones SQL" para activar las actualizaciones. Adems puede modificar las tablas, los
campos, la clusula SQL WHERE y las opciones de actualizacin como desee.
Para hacer que una vista sea actualizable estableciendo las propiedades de actualizacin de la
vista
El ejemplo siguiente muestra los pasos que podra seguir para especificar las cinco propiedades de
actualizacin de vista mediante programacin:
Nota Las propiedades View predeterminadas pueden suministrar toda la informacin necesaria para
actualizar la vista.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 116 de 133
199 of 804
actualizar la vista.
Por ejemplo, si tuviera una vista basada en la tabla customer, podra configurar el nombre de
la tabla con la siguiente funcin:
DBSETPROP('cust_view','View','Tables','customer')
2. Establezca la propiedad KeyField con uno o ms nombres de campos locales de Visual FoxPro
que, juntos, definan una clave nica para la tabla de actualizacin.
Con el mismo ejemplo, podra hacer que cust_id fuese el campo clave mediante el cdigo
siguiente:
DBSETPROP('cust_view.cust_id','Field','KeyField',.T.)
Precaucin Asegrese de que el campo o los campos clave que especifique definan una clave
nica tanto en la tabla base que desee actualizar como en la vista.
3. Asigne los campos de la vista a los campos de su tabla base con la propiedad UpdateName.
Esta propiedad resulta especialmente til cuando la vista est basada en una combinacin de
dos tablas con un nombre de campo comn o cuando los campos tienen alias en la vista. Para
actualizar la tabla base deseada, asigne el nombre del campo de la vista de Visual FoxPro al
campo de la tabla base y al nombre de la tabla.
DBSETPROP('cust_view.cust_id','Field','UpdateName',;
'customer.cust_id')
4. Especifique el alcance de los campos que desea actualizar mediante la propiedad UpdateField.
Debe especificar solamente aquellos campos tambin especificados con la propiedad
UpdateName.
DBSETPROP('cust_view.cust_id','Field','Updatable',;
.T.)
5. Establezca la propiedad SendUpdates como verdadera (.T.). Se trata del conmutador principal
que indica a Visual FoxPro que debe crear y enviar actualizaciones a cualquiera de las tablas y
campos que usted especific como actualizables.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 117 de 133
200 of 804
DBSETPROP('cust_view','View','SendUpdates',.T.)
Cuando utilice DBSETPROP( ) para establecer las propiedades de una vista antes de usarla, el valor
se almacenar en la base de datos y se usar automticamente siempre que active la vista. Cuando la
vista est activa, puede utilizar CURSORSETPROP( ) para cambiar el valor de las propiedades de la
vista activa. El valor de las propiedades que establezca para una vista activa mediante
CURSORSETPROP( ) no se almacenar al cerrar la vista.
Puede actualizar mltiples tablas base desde una vista. Cuando su vista combine dos o ms tablas,
debe establecer las propiedades para asegurarse de que slo sea actualizable el lado varios de la
consulta de la vista.
Las vistas se actualizan tabla por tabla. Debe asegurarse de que para cada tabla a la que se tiene
acceso en una vista, el conjunto de campos clave sea una clave nica tanto para el conjunto resultante
de la vista como para la tabla base.
l En el Diseador de vistas, elija la ficha Criterios de actualizacin y seleccione las tablas y los
nombres de los campos que desea actualizar.
O bien
En la mayora de los casos, los valores predeterminados proporcionados por Visual FoxPro preparan
una vista de mltiples tablas para que sea actualizable, aunque cree la vista mediante programacin.
El ejemplo de cdigo siguiente crea y establece explcitamente propiedades para actualizar una vista
de dos tablas. Puede usar este ejemplo como gua para personalizar las propiedades de actualizacin
de una vista.
Cdigo
CREATE SQL VIEW emp_cust_view AS ;
SELECT employee.emp_id, ;
employee.phone, customer.cust_id, ;
customer.emp_id, customer.contact, ;
customer.company ;
FROM employee, customer ;
WHERE employee.emp_id = customer.emp_id
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 118 de 133
201 of 804
DBSETPROP('emp_cust_view.phone', 'Field', ; 'UpdateName', 'employee.phone')
DBSETPROP('emp_cust_view.cust_id', 'Field', ; 'UpdateName', 'customer.cust_id')
DBSETPROP('emp_cust_view.emp_id1', 'Field', ; 'UpdateName', 'customer.emp_id')
DBSETPROP('emp_cust_view.contact', 'Field', ; 'UpdateName', 'customer.contact')
DBSETPROP('emp_cust_view.company', 'Field', ; 'UpdateName', 'customer.
DBSETPROP('emp_cust_view.cust_id', 'Field', ;
'KeyField', .T.)
DBSETPROP('emp_cust_view.emp_id1', 'Field', ;
'KeyField', .T.)
DBSETPROP('emp_cust_view.phone', 'Field', ;
'UpdatableField', .T.)
DBSETPROP('emp_cust_view.contact', 'Field', ; 'UpdatableField', .T.)
DBSETPROP('emp_cust_view.company', 'Field', ; 'UpdatableField', .T.)
DBSETPROP('emp_cust_view', 'View', ;
'SendUpdates', .T.)
GO TOP
REPLACE employee.phone WITH "(206)111-2222"
REPLACE customer.contact WITH "John Doe"
TABLEUPDATE()
Como las vistas estn almacenadas en una base de datos, puede crear:
l Ttulos
l Comentarios para la vista y los campos de vista
l Valores predeterminados para campos de vista
l Reglas a nivel de campo y a nivel de fila para mensajes de error de regla
Las caractersticas del diccionario de datos para vistas son similares en su funcionamiento a sus
homlogos para tablas de base de datos. Sin embargo, se usa el lenguaje en lugar del Diseador de
tablas para crear ttulos, comentarios, valores predeterminados y reglas para vistas.
De la misma manera que los valores predeterminados para campos de tabla, los valores
predeterminados de campo de vista se almacenan en la base de datos y estn disponibles cada vez que
usa la vista. Visual FoxPro no compara los valores predeterminados que cree localmente con ningn
valor predeterminado establecido en el origen de datos remoto. Debe crear valores predeterminados
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 119 de 133
202 of 804
valor predeterminado establecido en el origen de datos remoto. Debe crear valores predeterminados
aceptables para el origen de datos.
O bien-
Por ejemplo, es posible quiera que su aplicacin limite la cantidad de mercancas que un cliente
nuevo puede encargar hasta que haya tenido tiempo de terminar un cheque de crdito y de determinar
la cantidad de crdito que quiere conceder al cliente. El siguiente ejemplo crea un campo maxordamt
con un valor predeterminado de 1000:
Tambin puede usar valores predeterminados para llenar automticamente algunas filas para los
usuarios. Por ejemplo, puede agregar un control Grid para un formulario de entrada de pedidos
basado en una vista remota de una tabla de elementos de pedido. El campo order_id es el campo
clave que asigna cada fila de la cuadrcula a su homloga de la tabla de elementos de pedido remota.
Como el Id. de pedido para cada fila de la cuadrcula ser el mismo para un pedido, puede usar un
valor predeterminado para guardar las pulsaciones de teclas y llenar el campo order_id
automticamente.
Sugerencia Si una de las reglas comerciales de su aplicacin requiere que un campo contenga una
entrada, el hecho de proporcionar un valor predeterminado ayuda a asegurar que no se va a infringir
una regla concreta a nivel de campo o a nivel de registro.
Visual FoxPro no compara las reglas creadas localmente con reglas remotas. Debe crear reglas
aceptables para el origen de datos. Si las reglas remotas cambian, debe cambiar las reglas locales para
que se cumplan.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 120 de 133
203 of 804
Propiedades y escriba la expresin de regla y el texto de mensaje para el campo.
O bien
Por ejemplo, el cdigo siguiente crea una regla a nivel de campo en orditems_view que evita la
entrada de una cantidad inferior a 1:
Tambin puede usar la funcin DBSETPROP( ) para crear reglas a nivel de fila.
Combinar vistas
Puede generar una vista basada en otras vistas. Puede que quiera hacerlo si necesita un subconjunto
de la informacin disponible en varias vistas diferentes o si desea combinar datos locales y remotos
en una nica vista. Una vista basada en otras vistas, o en una combinacin de tablas locales y vistas
locales o remotas, se denomina una vista multicapa. La vista que combina otras vistas es la vista de
nivel superior. Puede tener mltiples niveles de vistas entre la vista de nivel superior y las tablas base
locales o remotas. Cuando utilice una vista multicapa, las vistas en las que se basa la vista de nivel
superior y cualquier tabla base de Visual FoxPro usada en vistas de nivel superior o intermedio se
mostrarn en la ventana Sesin de datos. Las tablas remotas no aparecen en la ventana Sesin de
datos.
Puede combinar datos locales y remotos en una vista si crea una nueva vista local basada en una vista
local y una vista remota.
O bien-
Por ejemplo, para crear una vista local que combine informacin de la tabla local Employee y la tabla
remota Orders, puede utilizar el cdigo siguiente:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 121 de 133
CREATE SQL VIEW remote_orders_view ; 204 of 804
CONNECTION remote_01 ;
AS SELECT * FROM orders
CREATE SQL VIEW local_employee_remote_orders_view ;
AS SELECT * FROM testdata!local_employee_view, ;
testdata!remote_orders_view ;
WHERE local_employee_view.emp_id = ;
remote_orders_view.emp_id
Cuando actualice datos en una vista multicapa, las actualizaciones bajarn un nivel, hasta la vista en
que est basada la vista de nivel superior. Si desea actualizar las tablas base desde las que se
construye una vista multicapa, deber ejecutar un comando TABLEUPDATE para cada vista de la
estructura.
Algunos escenarios en los que son tiles las vistas fuera de lnea son:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 122 de 133
205 of 804
Para crear y usar datos de vista fuera de lnea, puede usar las siguientes caractersticas del lenguaje:
l La funcin CREATEOFFLINE( )
l El comando USE SQLNombreVista con las clusulas ADMIN y ONLINE
l El comando TABLEUPDATE
l La funcin DROPOFFLINE( )
Si pretende usar la vista fuera de lnea en un equipo distinto del utilizado para crear la vista fuera de
lnea, debe preparar el destino fuera de lnea creando una copia del archivo de base de datos host
(.dbc); asegrese de que el origen de datos ODBC usado por la vista existe en el equipo de destino; y
analice los requisitos de datos para determinar el contenido de la vista que necesita.
Nota Use el programa Administrador ODBC para instalar orgenes de datos en un equipo. Puede
tener acceso al programa Administrador ODBC desde el grupo de programas Visual FoxPro o desde
el Panel de control.
Como con los datos en lnea, analice sus requisitos antes de crear vistas fuera de lnea para determinar
el diseo de vistas que necesita en la base de datos fuera de lnea. Cuando determine el subconjunto
de datos que desea usar fuera de lnea, puede partir de una vista existente o crear una vista nueva. Si
ya existe una vista que devuelve los registros que quiere usar fuera de lnea, puede usarla, o puede
crear una vista mediante programacin. La vista que usa fuera de lnea se almacena en un archivo .dbf
en el contenedor de base de datos.
Nota Si pretende modificar datos en una vista fuera de lnea, asegrese de hacer la vista actualizable
antes de usarla fuera de lnea. Cuando una vista est fuera de lnea slo puede establecer sus
propiedades de actualizacin a travs de programacin; no puede modificar una vista fuera de lnea
en el Diseador de vistas.
Por ejemplo, si quiere ir a sitios cliente para actualizar cuentas, agregar clientes y registrar nuevas
ventas, necesita la informacin de los clientes as como los pedidos actuales y las descripciones de
productos en pantalla. Puede tener una vista llamada customerinfo que combine informacin de la
tabla Customers, la tabla Orders y la tabla OrderItems. Para crear la vista, use este cdigo:
CREATEOFFLINE("customerinfo")
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 123 de 133
206 of 804
Por ejemplo, el cdigo siguiente crea una vista que muestra datos de la tabla Products y la tabla
Inventory desde la base de datos en lnea. Como no se especifica ningn criterio de actualizacin,
esta vista es de slo lectura.
Despus de crear la vista para sus datos fuera de lnea, puede usarla como cualquier vista de su
aplicacin: puede agregar, cambiar y eliminar registros. Mltiples usuarios pueden tener acceso a la
vista fuera de lnea simultneamente usando la misma base de datos en modo compartido. Si decide
no conservar las modificaciones, puede revertir la informacin para que refleje la informacin
original.
Si usa los datos fuera de lnea, puede mostrar y actualizar datos de la misma forma que lo hace en
lnea con los mismos formularios, informes o aplicaciones. Por ejemplo, el cdigo siguiente abre la
vista Showproducts:
USE Showproducts
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 124 de 133
207 of 804
incluye un campo Memo en la lista de campos de la vista, se incluye automticamente en el conjunto
de resultados incluso si FetchMemo est establecido como falso (.F.).
Despus de terminar de trabajar fuera de lnea, puede actualizar los datos en el servidor usando las
mismas transacciones de actualizacin de tabla que utiliza normalmente con los datos en lnea. Al
trabajar con datos remotos, recuerde las sugerencias siguientes:
Antes de poder procesar sus actualizaciones, tiene que usar el comando USE y la palabra clave
ONLINE para volver a conectarse a la base de datos host. Despus de ejecutar el comando, Visual
FoxPro intenta localizar la base de datos host con la informacin de origen de datos almacenada en la
vista. Cuando la conexin est establecida, puede usar TABLEUPATE( ) para procesar las
actualizaciones almacenadas en los datos fuera de lnea.
Para procesar un lote de cambios en tablas locales, puede usar transacciones manuales que le
permiten procesar el lote de cambios en una nica transaccin en lugar de una serie de transacciones
independientes.
Cdigo Coment
USE myofflineview ONLINE EXCLUSIVE Volver a conectarse
abrir la vista
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 125 de 133
208 of 804
BEGIN TRANSACTION Comprobar si hay c
IF TABLEUPDATE (2, .F., "myofflineview")
END TRANSACTION actualizacin y actu
ELSE apropiado.
MESSAGEBOX("Ha ocurrido un error: La actualizacin no ha tenido xito")
ROLLBACK
ENDIF
Para procesar un lote de cambios en tablas remotas, use transacciones manuales: empiece con
TABLEUPDATE( ) y termine el procesamiento con SQLCOMMIT( ) o SQLROLLBACK( )..
Para establecer la conexin para administrar sus transacciones manualmente, tiene que usar
CURSORGETPROP( ) en el cursor de la vista para obtener el controlador de conexin y, a
continuacin, establecer la propiedad Transactions a modo manual.
hConn1 = CURSORGETPROP("CONNECTHANDLE","myview") ;
SQLSETPROP(hConn1,"TRANSACTIONS",2)
Despus de establecer la conexin para controlar las actualizaciones, puede usar TABLEUPDATE( )
para controlar sus transacciones.
Si las tablas host residen en un servidor remoto, como SQL Server, puede usar el siguiente cdigo
como directiva.
Cdigo Comentario
USE myofflineview ONLINE EXCLUSIVE Volver a conectarse al h
abrir la vista.
SQLSetProp(liviewhandle,"transacciones",2) Establecer las conexion
SQLSetProp(custviewhandle,"transacciones",2)
SQLSetProp(ordviewhandle,"transacciones",2) las vistas para controlar
manualmente la transac
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 126 de 133
209 of 804
=SQLROLLBACK(liviewhandle)
IF NOT SQLCOMMIT(ordviewhandle)
=SQLROLLBACK(ordviewhandle)
IF NOT SQLCOMMIT(custviewhandle)
=SQLROLLBACK(custviewhandle)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
Actualizar un registro
Si va a actualizar una nica fila, puede usar transacciones automticas. Como cada instruccin para
procesar una actualizacin, eliminacin o insercin se controla como una transaccin independiente,
no puede deshacer instrucciones de transacciones anteriores.
Sugerencia Para actualizar un nico registro en una tabla local, use la funcin
GETNEXTMODIFIED().
Si decide que quiere eliminar los datos fuera de lnea y convertir la vista en una vista en lnea, puede
usar la funcin DROPOFFLINE( ).
Asegrese de comprobar los valores devueltos. Verdadero (.T.) indica que se ha conseguido y falso
(.F.) indica que la vista no se ha cerrado antes de ejecutar el comando.
El cdigo siguiente pasa por alto todas las modificaciones realizadas al subconjunto de datos de
myview. La vista sigue formando parte de la base de datos, pero se ignora el conjunto de datos actual.
DROPOFFLINE("myview")
Puede eliminar registros fuera de lnea, pero no puede usar los comandos PACK, ZAP o INSERT con
una vista fuera de lnea.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 127 de 133
210 of 804
Controlar el tamao de bsqueda de la bsqueda progresiva
Puede controlar el nmero de filas que Visual FoxPro busca progresivamente en el origen de datos
remoto mediante la propiedad FetchSize de la vista y del cursor activo. Utilice DBSETPROP( ) y
CURSORSETPROP( ) para establecer estas propiedades.
Puede utilizar la caracterstica de bsqueda diferida de memo de Visual FoxPro para acelerar la
recuperacin de los datos de la vista. Cuando elija esta caracterstica, Visual FoxPro no recuperar el
contenido de un campo Memo hasta que usted no abra y muestre el campo. Como Visual FoxPro
necesita el campo clave y el nombre de la tabla para encontrar una fila en el origen de datos remoto,
debe establecer la propiedad UpdateName o UpdateFieldList, la propiedad KeyField o KeyFieldList y
la propiedad Tables para que la bsqueda diferida de memo funcione. No obstante, no tiene que
establecer las propiedades SendUpdates o Updatable para que la bsqueda memo funcione.
Puede controlar la cantidad de datos que se descargan al abrir una vista si establece la propiedad
MaxRecords. Cuando Visual FoxPro enva una instruccin SQL al origen de datos para crear una
vista, el origen de datos genera y almacena un conjunto resultante. La propiedad MaxRecords
especifica el nmero mximo de filas que se buscan del conjunto resultante remoto para la vista. El
valor predeterminado es 1, que descarga todas las filas en el conjunto resultante.
-O bien
Por ejemplo, el cdigo siguiente modifica la definicin de la vista para limitar a 50 el nmero de filas
descargadas en la vista, independientemente del tamao del conjunto resultante generado en el origen
de datos remoto:
Puede utilizar la funcin CURSORSETPROP( ) para establecer el lmite de MaxRecords para una
vista activa.
Sugerencia No puede usar la propiedad MaxRecords para detener una consulta en ejecucin, ya que
la propiedad MaxRecords no controla la creacin del conjunto resultante. Use la propiedad
QueryTimeOut para controlar el tiempo de ejecucin en el origen de datos remoto.
Para tomar decisiones de optimizacin para una vista o una consulta, es posible que tenga que
conocer el plan de ejecucin: el orden en que se evalan las clusulas de combinaciones y filtros. Con
la funcin SYS(3054), puede mostrar uno de los tres niveles de optimizacin Rushmore. Los tres
niveles indican el grado en que las condiciones de filtro o las condiciones de combinacin pudieron
utilizar la optimizacin Rushmore. Los niveles son completamente (Full), parcialmente (Partial) o
nada (None).
Entonces puede pasar 11 a la funcin SYS para evaluar combinaciones en las clusulas FROM o
WHERE.
SELECT * ;
FROM customer INNER JOIN orders ;
ON customer.cust_id = orders.cust_id ;
WHERE Upper(country) = "Mjico"
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 129 de 133
212 of 804
Using Index Tag Country to optimize table customer
Rushmore Optimization Level for table customer: Full
Rushmore Optimization level for table orders: none
Joining table customer and table orders using Cust_id
Si el plan de ejecucin para sus combinaciones no satisface sus necesidades especficas, puede hacer
que el orden de combinacin se ejecute exactamente como est escrito sin optimizacin del
procesador. Para forzar el orden de evaluacin de la combinacin, debe agregar la palabra clave
FORCE y colocar sus condiciones de combinacin en la clusula FROM. Las condiciones de
combinacin que se colocan dentro de una clusula WHERE no se incluyen en una evaluacin de
combinacin forzada.
Nota No puede usar la palabra clave FORCE en instrucciones de paso a travs SQL ni en vistas
remotas porque la palabra clave es una extensin de Visual FoxPro del estndar ANSI y no est
admitida en otros diccionarios SQL.
La clusula FORCE es global, por lo que se aplica a todas las tablas de la clusula JOIN. Asegrese
de que el orden en el que aparecen las tablas de combinacin es exactamente el orden en el que se
deben combinar. Tambin puede usar los parntesis para controlar el orden de evaluacin de
combinaciones.
SELECT * ;
FROM FORCE Customers ;
INNER JOIN Orders ;
ON Orders.Company_ID = Customers.Company_ID ;
INNER JOIN OrItems;
ON OrdItems.Order_NO = Orders.Order_NO
En el ejemplo, la combinacin entre parntesis para la tabla Orders y OrdItems se evala primero. El
resultado de la combinacin se utiliza en la evaluacin de la combinacin con Customers:
SELECT * ;
FROM FORCE Customers ;
INNER JOIN (orders INNER JOIN OrdItems ;
ON OrdItems.Order_No = Orders.Order_No) ;
ON Orders.Company_ID = Customers.Company_ID
Puede utilizar una conexin activa como canal de informacin para mltiples vistas remotas si
comparte una conexin. Cuando comparte una conexin activa, usted:
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 130 de 133
213 of 804
Para compartir conexiones establece la definicin de la vista para utilizar una conexin compartida al
activarse. Cuando se utiliza la vista, Visual FoxPro se conecta al origen de datos remoto con la
conexin compartida existente (en caso de que haya alguna). Si no hay ninguna conexin compartida
en uso, Visual FoxPro crear una conexin exclusiva cuando se abra la vista, que puede compartirse
con otras vistas.
Slo una instancia activa de una definicin de conexin con nombre se comparte durante una sesin
de Visual FoxPro. Si hay varias instancias activas de la misma definicin de conexin, la primera de
ellas que se use como conexin compartida se convertir en la conexin compartida designada. Todas
las vistas que utilicen esa definicin de conexin y empleen conexiones compartidas tendrn acceso
al servidor remoto a travs de la conexin compartida designada.
l Elija Opciones en el men Herramientas. Elija la ficha Datos remotos; active la casilla de
verificacin Compartir conexin en el rea Opciones predeterminadas de vista remota y
elija Aceptar.
O bien
O bien
El cdigo siguiente crea una vista que, cuando se activa con el comando USE, comparte una
conexin:
Cuando una conexin est ocupada, como ocurre cuando Visual FoxPro busca datos de forma
progresiva en un cursor, no querr comenzar otra bsqueda o enviar actualizaciones por la misma
conexin. Puede determinar si una conexin est ocupada mediante la propiedad ConnectBusy, que
devuelve un valor verdadero (.T.) si la conexin est ocupada. Puede utilizar esta propiedad en su
aplicacin para comprobar si la conexin est ocupada o no antes de enviar una solicitud a un origen
de datos remoto a travs de una conexin compartida.
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 131 de 133
214 of 804
l Use la propiedad ConnectBusy de la funcin SQLGETPROP( ).
nConnectionHandle=CURSORGETPROP('ConnectHandle')
SQLGETPROP(nConnectionHandle, "ConnectBusy")
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 132 de 133
215 of 804
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Pgina 133 de 133
216 of 804
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 1 de 127
217 of 804
Una interfaz bien diseada puede guiar a los usuarios por su aplicacin. Los formularios, clases,
controles, mens y barras de herramientas ofrecen un conjunto variado de herramientas para disear
una excelente interfaz de usuario.
Su aplicacin necesita formularios para permitir a los usuarios ver e introducir datos. Pero tambin
puede personalizar formularios estndar visualmente y mediante programacin para crear un entorno
especializado para sus usuarios.
Los controles administran las interacciones entre los usuarios y su aplicacin. Visual FoxPro ofrece
diversos controles para mejorar la interfaz de su aplicacin.
Un buen sistema de mens dice mucho a los usuarios acerca del diseo y la estructura de su
aplicacin. Si disea detenidamente los mens puede mejorar la facilidad de uso de su aplicacin,
proporcionar acceso inmediato a tareas comunes y agregar una apariencia de tipo Windows a su
aplicacin.
l Disear formularios
l Crear un formulario nuevo
l Agregar objetos a formularios
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 2 de 127
218 of 804
l Manipular objetos
l Administrar formularios
Disear formularios
Visual FoxPro proporciona un eficaz Diseador de formularios para que el diseo de formularios
resulte rpido y sencillo. Puede disponer de:
Los formularios y los conjuntos de formularios son objetos con sus propias propiedades, eventos y
mtodos que pueden establecerse en el Diseador de formularios. Un conjunto de formularios consta
de uno o ms formularios que pueden manipularse como una unidad. Por ejemplo, si tiene cuatro
formularios en su conjunto de formularios, podr mostrarlos u ocultarlos como uno solo mediante un
nico comando en tiempo de ejecucin.
-O bien
O bien
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 3 de 127
219 of 804
Para obtener una descripcin ms detallada del Diseador de formularios, consulte el captulo 8,
Administrar datos mediante formularios, del Manual del usuario. Si desea ms informacin sobre las
barras de herramientas, busque el nombre de la barra de herramientas en la Ayuda.
El entorno de datos de un formulario o un conjunto de formularios incluye las tablas o vistas con las
que interacta el formulario y las relaciones entre tablas que espera el formulario. Puede disear
visualmente el entorno de datos en el Diseador de entornos de datos y guardarlo con el formulario o
con el conjunto de formularios.
El entorno de datos puede automatizar la apertura y el cierre de tablas y vistas cuando se ejecuta el
formulario. Adems, el entorno de datos le ayuda a establecer la propiedad ControlSource para
controles al rellenar el cuadro del valor de la propiedad ControlSource de la ventana Propiedades con
todos los campos del entorno de datos.
3. En el cuadro de dilogo Abrir, elija la tabla o vista que desea agregar al entorno de datos.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 4 de 127
220 of 804
Las siguientes propiedades del entorno de datos suelen establecerse en la ventana Propiedades:
Cuando agregue tablas o vistas al Diseador de entornos de datos, puede ver los campos y los ndices
que pertenecen a la tabla o a la vista.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 5 de 127
221 of 804
2. En el cuadro de dilogo Agregar tabla o vista, elija una tabla o una vista de la lista.
O bien
Si no hay ninguna base de datos ni ningn proyecto abierto, elija Otros para seleccionar una
tabla.
Tambin puede arrastrar una tabla o una vista desde un proyecto abierto hasta el Diseador de
entornos de datos.
Cuando el Diseador de entornos de datos est activo, la ventana Propiedades muestra objetos y
propiedades asociadas al entorno de datos. Cada tabla o vista del entorno de datos, cada relacin entre
tablas y el mismo entorno de datos son objetos distintos en el cuadro Objeto de la ventana
Propiedades.
Al quitar una tabla del entorno de datos tambin se quitan las relaciones en las que interviene la tabla.
Para quitar una tabla o una vista del Diseador de entornos de datos
Si agrega al Diseador de entornos de datos tablas que tienen relaciones persistentes establecidas en
una base de datos, las relaciones se agregarn automticamente al entorno de datos. Si las tablas no
tienen relaciones persistentes, podr relacionarlas en el Diseador de entornos de datos.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 6 de 127
222 of 804
Tambin puede arrastrar un campo desde la tabla principal hasta un campo de la tabla relacionada. Si
no hay ninguna etiqueta de ndice en la tabla relacionada correspondiente al campo de la tabla
principal, se le pedir que cree la etiqueta de ndice.
Cuando establezca una relacin en el Diseador de entornos de datos, una lnea entre las tablas
indicar la relacin.
Las propiedades de la relacin corresponden a clusulas y palabras clave de los comandos SET
RELATION y SET SKIP.
La propiedad RelationalExpr se establece de forma predeterminada con el nombre del campo clave
principal de la tabla primaria. Si la tabla relacionada est indexada en una expresin, deber
establecer la propiedad RelationalExpr con esta expresin. Por ejemplo, si la tabla relacionada est
indexada en UPPER(cust_id), deber establecer RelationalExpr como UPPER(cust_id).
Si la relacin no es de uno a varios, establezca la propiedad OneToMany como falsa (.F.). Esto
equivale a utilizar el comando SET RELATION sin ejecutar SET SKIP.
Establecer la propiedad OneToMany de una relacin como verdadera (.T.) equivale a ejecutar el
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 7 de 127
223 of 804
comando SET SKIP. Si omite la tabla primaria, el puntero de registro permanecer en el mismo
registro primario hasta pasar a travs de todos los registros relacionados de la tabla secundaria.
Nota Si desea crear una relacin de uno a varios en el formulario o el conjunto de formularios,
establezca como verdadera (.T.) la propiedad OneToMany, aunque se haya establecido una relacin
persistente de uno a varios en la base de datos.
Una aplicacin formada por ventanas sencillas es generalmente una aplicacin SDI, pero algunas
aplicaciones mezclan elementos SDI y MDI. Por ejemplo, Visual FoxPro muestra su depurador como
aplicacin SDI, que a su vez contiene ventanas MDI.
Para admitir ambos tipos de interfaz, Visual FoxPro le permite crear varios tipos de formularios:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 8 de 127
224 of 804
Todos los tipos de formularios se crean de forma similar, pero se establecen propiedades especficas
para indicar cul debe ser el comportamiento de los formularios.
Si va a crear un formulario secundario, debe especificar no slo qu debe aparecer dentro de otro
formulario, sino tambin si es un formulario secundario compatible con MDI, que indica el
comportamiento del formulario cuando se maximiza. Si el formulario secundario es compatible MDI,
se combina con el formulario primario, compartiendo la barra de ttulo, el ttulo, los mens y las
barras de herramientas del formulario primario. Un formulario secundario no compatible con MDI se
maximiza en toda la zona cliente del formulario primario, pero conserva su ttulo y su barra de ttulo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 9 de 127
225 of 804
secundarios se combine con el formulario primario cuando se maximice, o a .F. (falso) si la
ventana secundaria debe seguir siendo una ventana independiente cuando se maximice.
DO FORM MiSecundario
Nota El formulario de nivel superior debe estar visible y activo cuando se muestre el
formulario secundario. Por lo tanto, no puede usar el evento Init del formulario de nivel
superior para mostrar un formulario secundario, porque el formulario de nivel superior an no
estar activo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 10 de 127
226 of 804
formulario secundario.
Si est ejecutando un formulario de nivel superior, es posible que quiera que la ventana principal de
Visual FoxPro est visible. Puede usar la propiedad Visible del objeto Application para ocultar y
mostrar la ventana principal de Visual FoxPro cuando sea necesario.
Application.Visible = .F.
Application.Visible = .T.
Asegrese de que tambin proporciona una forma de cerrar el formulario con THISFORM.Release en
algn mtodo o evento.
Nota Tambin puede incluir la lnea siguiente en un archivo de configuracin para ocultar la
ventana principal de Visual FoxPro:
SCREEN = OFF
3. En el evento Init del formulario, ejecute el programa de men y psele dos parmetros:
oForm es una referencia de objeto al formulario. En el evento Init del formulario, psele THIS
como primer parmetro.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 11 de 127
227 of 804
Por ejemplo, puede llamar a un men llamado mySDImenu con este cdigo:
Nota Todos los formularios de un conjunto de formularios se cargan cuando se ejecuta el conjunto.
Si necesita cargar muchos formularios con muchos controles, puede tardar varios segundos.
Un conjunto de formularios es un contenedor primario para uno o varios formularios. Cuando tenga
activo el Diseador de formularios, podr crear un conjunto de formularios.
Si no desea trabajar con mltiples formularios como si fueran un grupo de formularios, no ser
necesario que cree un conjunto. Despus de crear un conjunto de formularios, podr agregarle
formularios.
Cuando haya creado un conjunto de formularios, podr agregarle formularios nuevos y eliminar
formularios existentes.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 12 de 127
228 of 804
Los formularios se guardan con formato de tabla en un archivo que tiene la extensin .scx. Cuando
cree un formulario, la tabla .scx contendr un registro para el formulario, un registro para el entorno
de datos y dos registros de uso interno. Se agregar un registro para cada objeto que agregue al
formulario o al entorno de datos. Si crea un conjunto de formularios, se agregar un registro adicional
para el conjunto de formularios y para cada formulario nuevo. El contenedor principal de cada
formulario es el conjunto de formularios, mientras que el contenedor primario de cada control es el
formulario en el que est situado.
Sugerencia Cuando ejecute un conjunto de formularios, no desear que todos los formularios del
conjunto sean visibles inicialmente. Establezca la propiedad Visible como falsa (.F.) para los
formularios que no desee mostrar cuando se ejecute el conjunto de formularios. Establezca la
propiedad Visible como verdadera (.T.) si desea mostrar los formularios.
l Controles
l Contenedores
l Clases definidas por el usuario
l Objetos OLE
Los objetos de Visual FoxPro pueden corresponder a dos categoras, segn la naturaleza de la clase
en la que se basen:
l Los contenedores pueden ser el objeto primario para otros objetos. Por ejemplo, un formulario,
como contenedor, es un objeto primario para una casilla de verificacin de ese formulario.
l Los controles puede estar contenidos en contenedores, pero no pueden ser objetos primarios de
otros objetos. Por ejemplo, una casilla de verificacin no puede contener ningn otro objeto.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 13 de 127
229 of 804
Para obtener ms informacin sobre estos objetos contenedores, consulte el captulo 10, Usar
controles.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 14 de 127
230 of 804
Todos los objetos contenedores de Visual FoxPro tienen asociadas una propiedad contador y una
propiedad coleccin. La propiedad coleccin es una matriz que hace referencia a cada objeto
contenido. La propiedad contador es una propiedad numrica que indica el nmero de objetos
contenidos.
Se da nombre a las propiedades coleccin y contador para cada contenedor de acuerdo con el tipo de
objeto que se puede contener en el contenedor. La tabla siguiente muestra los contenedores y las
correspondientes propiedades coleccin y contador.
Estas propiedades le permiten usar un bucle para manipular mediante programacin todos los objetos
contenidos o algunos objetos especficos. Por ejemplo, las lneas de cdigo siguientes establecen la
propiedad BackColor de columnas de una cuadrcula a verde y rojo de forma alterna:
o = THISFORM.grd1
FOR i = 1 to o.ColumnCount
IF i % 2 = 0 && Columna par
o.Columns(i).BackColor = RGB(0,255,0) && Verde
ELSE
o.Columns(i).BackColor = RGB(255,0,0) && Rojo
ENDIF
ENDFOR
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 15 de 127
231 of 804
Check box
Hyperlink
List box
Spinner
Combo box
Image
OLE Bound Control
Text box
Command button
Label
OLE Container Control
Timer
Edit box
Line
Shape
Para obtener ms informacin sobre los controles que puede elegir, consulte el captulo 10, Usar
controles.
Puede vincular controles a datos de una tabla, una vista, un campo de tabla o un campo de vista si
establece la propiedad ControlSource de un control a un campo de la propiedad RecordSource de una
cuadrcula, a una tabla o una vista. Pero tambin puede crear controles vinculados a datos si arrastra
campos o tablas al formulario directamente desde:
l El Administrador de proyectos
l El Diseador de bases de datos
l El Diseador de entorno de datos
Para obtener ms informacin sobre cmo establecer clases de controles predeterminadas, vea el
Diseador de tablas o la ficha Asignacin de campos del cuadro de dilogo Opciones.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 16 de 127
232 of 804
Una de las caractersticas ms potentes de Visual FoxPro es su capacidad para crear clases que se
pueden utilizar y reutilizar fcilmente en distintas partes de las aplicaciones. Cuando haya creado las
clases, podr agregarlas a los formularios o conjuntos de formularios.
Las clases se pueden agregar directamente desde la barra de herramientas Controles de formularios
cuando las registra.
Debe registrar las bibliotecas de clases antes de poder mostrarlas en la barra de herramientas
Controles de formularios.
3. Elija Agregar.
4. En el cuadro de dilogo Abrir, elija una biblioteca de clases que desee agregar a la lista
Seleccionado y elija Abrir.
5. Repita los pasos 3 y 4 hasta agregar todas las bibliotecas que desee registrar.
Las clases de las bibliotecas que se hayan incluido en la lista Seleccionado pueden emplearse en el
Diseador de formularios con la misma facilidad que las clases de base de Visual FoxPro.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 17 de 127
233 of 804
Sugerencia Si quiere que las bibliotecas de clases estn disponibles en la barra de herramientas
Controles de formularios cada vez que ejecute Visual FoxPro, elija Establecer como predeterminado
en el cuadro de dilogo Opciones.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 18 de 127
234 of 804
3. En el cuadro de dilogo Abrir, elija una biblioteca de clases que desee agregar a la barra de
herramientas Controles de formularios y elija Abrir.
Cuando haya agregado bibliotecas de clases en la ficha Clases del cuadro de dilogo Opciones o
desde el submen Ver clases, tendr acceso a las mismas en el Diseador de formularios.
La barra de herramientas est formada por los controles de la biblioteca que ha seleccionado.
3. Haga clic en el control que desee y arrastre para ajustar su tamao en el formulario.
Nota Puede eliminar una biblioteca de clases visuales desde el men de la barra de herramientas Ver
clases si selecciona la biblioteca en la lista Seleccionado de la ficha Controles de formularios del
cuadro de dilogo Opciones y elige Quitar.
Cuando agregue a un formularios objetos que no estn basados en las clases de base de Visual
FoxPro, se almacenar una ruta relativa a la biblioteca de clases (archivo .vcx) en el archivo .scx del
formulario. Si mueve el formulario o la biblioteca de clases a una ubicacin diferente, Visual FoxPro
muestra un cuadro de dilogo cuando intenta ejecutar el formulario de forma que puede localizar
manualmente la biblioteca de clases.
Para determinar cuntos controles hay en un formulario, puede utilizar la propiedad ControlCount. La
propiedad Controls[n] del formulario permite hacer referencia a cada control del formulario. El
programa siguiente imprime la propiedad Name de todos los controles que hay actualmente en el
formulario activo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 19 de 127
235 of 804
Puede agregar a un formulario tantas propiedades y mtodos nuevos como desee. Las propiedades
contienen un valor, mientras que los mtodos contienen cdigo de procedimientos que se ejecuta al
llamar al mtodo. Las propiedades y los mtodos nuevos tienen como alcance el formulario y se hace
referencia a los mismos del mismo modo que a otras propiedades o mtodos.
Si dispone de un conjunto de formularios, las propiedades y los mtodos que agregue en el Diseador
de formularios tendrn como alcance el conjunto de formularios. Si no dispone de ningn conjunto de
formularios, las propiedades y los mtodos tendrn como alcance el formulario.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 20 de 127
236 of 804
Una propiedad de matriz se incluye en el alcance del formulario o del conjunto de formularios como
cualquier otra propiedad, pero puede manipularse mediante los comandos y las funciones de matriz
de Visual FoxPro.
Por ejemplo, podra escribir arrayprop[10,2] en el cuadro Nombre del cuadro de dilogo
Nueva propiedad para crear una matriz bidimensional con 10 filas.
Las propiedades de matriz son de slo lectura en modo de diseo, pero puede administrar,
redimensionar y asignar valores a los elementos de la propiedad matriz en tiempo de ejecucin. Para
ver un ejemplo del uso de una propiedad de matriz, consulte Administrar mltiples instancias de un
formulario.
Puede agregar al formulario mtodos a los que se puede llamar del mismo modo que a los mtodos de
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 21 de 127
237 of 804
clase de formulario.
2. En el cuadro de dilogo Nuevo mtodo, escriba el nombre del mtodo. Opcionalmente, puede
incluir una descripcin del mtodo.
Para llamar a los mtodos definidos por el usuario, como sucede con los mtodos de clase de base,
utilice la sintaxis siguiente:
NombreObjeto.NombreMtodo
El mtodo tambin puede aceptar parmetros y devolver valores. En este caso, se llama al mtodo en
una instruccin de asignacin:
Para utilizar constantes predefinidas en sus mtodos, puede incluir un archivo de encabezado en un
formulario o un conjunto de formularios con #INCLUDE. Un archivo de encabezado suele contener
constantes de tiempo de compilacin definidas con la directiva del preprocesador #DEFINE.
O bien
Elija el botn de tres puntos para abrir el cuadro de dilogo Incluir y elija el archivo.
3. Elija Incluir.
Manipular objetos
Hay varias formas de manipular los objetos en tiempo de diseo:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 22 de 127
238 of 804
los objetos del formulario o del conjunto de formularios es la ventana Propiedades.
Cuando se abre la ventana Propiedades, muestra las propiedades o los eventos del objeto
seleccionado. Si hay ms de un objeto seleccionado, las propiedades que los objetos tienen en comn
se muestran en la ventana Propiedades. Para modificar las propiedades o los eventos de otro objeto,
elija el objeto correspondiente en el cuadro Objeto o bien seleccione otro control en el formulario.
La ventana Propiedades
2. En el cuadro Valores de propiedades, escriba o elija el valor que desee para la propiedad
seleccionada.
Nota Las propiedades de slo lectura en tiempo de diseo, como la propiedad Class de un objeto, se
muestran en cursiva en la lista Propiedades y eventos de la ventana Propiedades.
Si la propiedad necesita un valor de carcter, no ser necesario que incluya el valor entre comillas. Si
desea que el ttulo de un formulario sea CLIENTE, escriba CLIENTE en el cuadro Valores de
propiedades. Si desea que el ttulo de un formulario sea "CLIENTE", mostrando las comillas en el
ttulo de la ventana, escriba "CLIENTE" en el cuadro Valores de propiedades.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 23 de 127
239 of 804
Tambin puede establecer propiedades con los resultados de expresiones o funciones a travs de la
ventana Propiedades.
O bien
Por ejemplo, puede establecer la propiedad Caption de un formulario para indicar la tabla
activa actualmente cuando se ejecuta el formulario; para ello, escriba =ALIAS( ) en el cuadro
Valores de propiedades.
Solucin de problemas Si establece una propiedad con el resultado de una funcin definida por el
usuario, la funcin se evaluar cuando establezca la propiedad o cuando modifique o ejecute el
formulario. Si hay un error en la funcin definida por el usuario, es posible que no pueda abrir el
formulario.
Tambin puede establecer la propiedad para la funcin definida por el usuario en el evento Init del
objeto, como en el ejemplo siguiente:
THIS.Caption = mifuncin( )
Si hay un error en la funcin definida por el usuario, no podr ejecutar el formulario de este modo,
pero s podr modificarlo.
Cuando disea un formulario en el Diseador de formularios, ver los cambios en directo: excepto
para establecer la propiedad Visible a falso (.F.), los cambios visuales y de comportamiento que
efecte se reflejarn inmediatamente en el formulario. Si establece la propiedad WindowState como 1
(Minimizada) o 2 (Maximizada), el formulario del Diseador de formularios reflejar
inmediatamente este cambio. Si establece la propiedad Movable como falso (.F.), el usuario no podr
mover el formulario en tiempo de ejecucin y usted tampoco podr moverlo en tiempo de diseo. Es
conveniente disear la funcionalidad del formulario y agregar todos los controles apropiados antes de
establecer algunas propiedades que determinan su comportamiento.
Las siguientes propiedades de formulario suelen establecerse en tiempo de diseo para definir la
apariencia y el comportamiento del formulario:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 24 de 127
240 of 804
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 25 de 127
241 of 804
WindowType Controla si el formulario es de tipo sin modo (opcin 0 Sin modo
predeterminada) o modal. Si es modal, el usuario
deber cerrar el formulario antes de tener acceso a
ningn otro elemento de la interfaz de usuario de la
aplicacin.
Utilice la propiedad LockScreen para que el ajuste en tiempo de ejecucin de las propiedades de
diseo de controles parezca ms limpio.
En Visual FoxPro para Windows, puede asignar un icono al formulario; el icono se muestra cuando la
ventana est minimizada en Windows NT y en la barra de ttulo en Windows 95. Para asignar un
icono a un formulario, establezca la propiedad Icon del formulario al nombre de un archivo .ICO.
1. Abra el formulario.
Los eventos son acciones del usuario, como clics o movimientos del mouse, o bien acciones del
sistema, como el avance del reloj del sistema. Los mtodos son procedimientos asociados al objeto
que se invocan especficamente mediante programacin. Si desea ver una explicacin de los eventos
y mtodos, consulte el captulo 3, Programacin orientada a objetos. Puede especificar el cdigo que
desea procesar cuando se desencadene un evento o se invoque un mtodo.
Por ejemplo, podra tener en un formulario un botn de comando con el ttulo Salir. En el
evento Click del botn, incluya la lnea:
THISFORM.Release
Sugerencia Para moverse entre los procedimientos en la ventana Edicin de cdigo, presione AV
PG o RE PG.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 26 de 127
242 of 804
THISFORM.Hide
Guardar formularios
Es necesario guardar el formulario antes de poder ejecutarlo. Si intenta ejecutar el formulario o cerrar
el Diseador de formularios cuando an no ha guardado el formulario, Visual FoxPro le pedir que
guarde o que descarte los cambios realizados.
Tambin puede guardar un formulario o un subconjunto de los controles de un formulario, como una
definicin de clase. Si piensa crear subclases basadas en el formulario o volver a utilizar los controles
en otros formularios, guarde el formulario como una definicin de clase.
Para guardar un formulario o los controles seleccionados como una definicin de clase
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 27 de 127
243 of 804
5. Elija Aceptar.
Si no incluye una extensin con el nombre de archivo, se agregar la extensin predeterminada .vcx
cuando se guarde el archivo. Cuando se haya guardado un formulario como una definicin de clase,
podr modificarla mediante el comando MODIFY CLASS. Para obtener ms informacin sobre la
creacin de clases, consulte el captulo 3, Programacin orientada a objetos.
Ejecutar un formulario
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 28 de 127
244 of 804
O bien
Tambin puede ejecutar el formulario si elige Ejecutar en el men Programa, a continuacin elige
Formulario en el cuadro Tipo de archivo y finalmente selecciona el formulario y elige Ejecutar.
De forma predeterminada, cuando usa el comando DO FORM, el nombre del objeto formulario es el
mismo que el del archivo .scx. Por ejemplo, la siguiente lnea de cdigo ejecuta Customer.scx. Visual
FoxPro crea automticamente una variable objeto para el formulario llamada customer:
DO FORM Customer
Por ejemplo, los comandos siguientes ejecutan un formulario y crean dos nombres de variable objeto
formulario:
Si ejecuta el comando DO FORM desde la ventana Comandos, el objeto formulario se asociar a una
variable. Puede tener acceso al objeto formulario a travs del nombre de variable. Por ejemplo, los
comandos siguientes, ejecutados en la ventana Comandos, abren un formulario llamado Customer y
cambian su ttulo.
DO FORM Customer
Customer.Caption = "Hola"
? TYPE("Customer")
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 29 de 127
245 of 804
*formtest.prg
DO FORM Customer
Despus de ejecutar el programa, el formulario permanece visible y todos los controles del formulario
estn activos, pero TYPE("Customer") devuelve U, lo que indica que Customer es una variable no
definida. El comando siguiente, ejecutado en la ventana Comandos, generara un error:
Customer.Caption = "Hola"
Sin embargo, s puede tener acceso al formulario mediante las propiedades ActiveForm, Forms y
FormCount del objeto de la aplicacin.
La palabra clave LINKED del comando DO FORM permite vincular el formulario al objeto
formulario. Si incluye la palabra clave LINKED, cuando la variable asociada al objeto formulario
salga del alcance, se liberar el formulario.
Por ejemplo, el comando siguiente crea un formulario vinculado a la variable de objeto frmCust2:
Para permitir que los usuarios cierren el formulario activo al hacer doble clic en el cuadro de control
o elegir Cerrar en el men Control del formulario, establezca la propiedad Closable del formulario.
O bien
Por ejemplo, puede cerrar y liberar el formulario frmCustomer si ejecuta el comando siguiente en un
programa o en la ventana Comandos:
RELEASE frmCustomer
Tambin puede permitir que un usuario cierre y libere un formulario si incluye el comando siguiente
en el cdigo de evento Click de un control, como un botn de comando con el ttulo Salir:
THISFORM.Release
Tambin puede usar el comando RELEASE en el cdigo asociado a un objeto del formulario, pero no
se ejecutar el cdigo que haya incluido en el mtodo Release.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 30 de 127
246 of 804
El modelo de objetos de Visual FoxPro proporciona mucho control sobre las propiedades en tiempo
de ejecucin.
Para manipular un objeto, deber identificarlo en relacin con la jerarqua contenedora. En el nivel
superior de la jerarqua de contenedores (el conjunto de formularios o el formulario) debe hacer
referencia a la variable de objeto. A no ser que use la clusula NAME del comando DO FORM, la
variable de objeto tiene el mismo nombre que el archivo .scx.
Para manipular las propiedades haga referencia al control y a la propiedad, separadas por un punto (.):
objetovariable.[formulario.]control.propiedad = Configuracin
La tabla siguiente muestra las propiedades o las palabras clave que facilitan el establecimiento de
referencias a un objeto en la jerarqua de objetos.
Por ejemplo, para cambiar el ttulo de un botn de comando del formulario frmCust de un conjunto
de formularios almacenado en Custview.scx, use el siguiente comando en un programa o en la
ventana Comandos:
CustView.frmCust.cmdButton1.Caption = "Modificar"
Utilice las palabras clave THIS, THISFORM y THISFORMSET para hacer referencia a objetos que
estn en un formulario o un conjunto de formularios. Por ejemplo, para cambiar el ttulo de un botn
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 31 de 127
247 of 804
de comando cuando hace clic en ste, incluya el comando siguiente en el cdigo de evento Click para
el botn de comando:
THIS.Caption = "Modificar"
La tabla siguiente ofrece ejemplos del uso de THISFORMSET, THISFORM, THIS y Parent para
establecer propiedades de objeto.
O bien
Por ejemplo, podra establecer el ttulo de un botn como Modificar o Guardar, segn el valor
de una variable. Declare la variable en el programa que llama a su formulario:
PUBLIC glModificar
glModificar = .F.
frsSet1.frmForm1.cmdButton1.Caption = ;
IIF(glModificar = .F., "Modificar", "Guardar")
Podra determinar el tamao de un botn y establecer el ttulo mediante expresiones con campos de
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 32 de 127
248 of 804
una tabla:
Tambin podra establecer el ttulo mediante una funcin definida por el usuario:
frsSet1.frmForm1.cmdButton1.Caption = estttulo()
Por ejemplo, para establecer mltiples propiedades de una columna en una cuadrcula de un
formulario, podra incluir la instruccin siguiente en el cdigo de cualquier evento o mtodo
del formulario:
WITH THISFORM.grdGrid1.grcColumn1
.Width = 5
.Resizable = .F.
.ForeColor = RGB(0,0,0)
.BackColor = RGB(255,255,255)
.SelectOnEntry = .T.
ENDWITH
Primario.Objeto.Mtodo
Cuando crea un objeto, puede llamar a los mtodos de ese objeto desde cualquier lugar de la
aplicacin. Los comandos siguientes llaman a mtodos para mostrar un formulario y establecer el
enfoque en un botn de comando:
myf_set.frmForm1.Hide
Responder a eventos
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 33 de 127
249 of 804
Una llamada al cdigo de procedimiento asociado a un evento no hace que se produzca un evento.
Por ejemplo, la instruccin siguiente hace que se ejecute el cdigo del evento Activate de
frmGuaTel, pero no activa el formulario:
frmGuaTel.Activate
frmGuaTel.Show
El ejemplo siguiente establece propiedades y llama a cdigo de evento desde diversos objetos de un
conjunto de formularios. El ejemplo incluye dos formularios, frmLeft y frmRight, en un conjunto de
formularios.
Las dos casillas de verificacin y el botn de comando de Form1 estn asociados a cdigo de evento.
El nombre del cuadro de texto de frmRight es txtInput.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 34 de 127
250 of 804
Puede establecer las propiedades de un control desde el cdigo de evento de otro con la palabra clave
THISFORM o la propiedad Parent. Los dos comandos siguientes se ejecutan cuando un usuario hace
clic en las casillas de verificacin Cursiva y Negrita, estableciendo las propiedades correspondientes
del cuadro de texto:
THISFORM.txtInput.FontItalic = .T.
THIS.Parent.txtInput.FontBold = .T.
El cdigo del evento Click para cmdClear utiliza THISFORM para restablecer los valores de los
dems controles del formulario.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 35 de 127
251 of 804
Tambin puede establecer propiedades de un formulario desde otro formulario distinto. Form2
contiene 5 botones de comando. El primer botn del formulario tiene este cdigo en su evento Click:
THISFORMSET.frmLeft.Caption = ;
ALLTRIM(ThisFormSet.frmLeft.txtInput.Value)
Observe que debe hacer referencia al conjunto de formularios y al formulario cuando se establecen
propiedades desde otro formulario distinto.
El usuario hace clic en el botn de comando "Cambiar ttulo del formulario de la izquierda" de
frmRight
El cdigo de evento Click del segundo botn de comando de frmRight muestra el cmo se establece
una propiedad de un formulario desde un objeto del formulario:
THISFORM.Caption = ;
ALLTRIM(ThisFormSet.frmLeft.txtInput.Value)
Si el usuario elige este botn, el ttulo de frmRight cambiar al valor del cuadro de texto de frmLeft.
El cdigo siguiente del evento Click del botn de comando Cambiar negrita cambia el valor de la
casilla de verificacin Negrita de Form1 y llama al cdigo de evento asociado a este control.
THISFORMSET.frmLeft.chkBold.Value = ;
NOT THISFORMSET.frmLeft.chkBold.Value
THISFORMSET.frmLeft.chkBold.InteractiveChange
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 36 de 127
252 of 804
La ltima lnea del ejemplo llama al evento Interactive Change de chkBold. Tambin podra llamar a
este procedimiento mediante el comando siguiente:
THISFORMSET.frmForm1.chkBold.InteractiveChange( )
El usuario hace clic en el botn de comando Cambiar negrita del formulario de la derecha
El cdigo siguiente del evento Click del botn de comando Ocultar formulario o Mostrar formulario,
segn el valor de la propiedad Visible, y cambia el ttulo del botn:
IF ThisFormSet.frmLeft.Visible
ThisFormSet.frmLeft.Hide
THIS.Caption = "Mostrar formulario"
ELSE
ThisFormSet.frmLeft.Show
THIS.Caption = "Ocultar formulario"
ENDIF
Observe que la palabra clave THIS se utiliza en el cdigo de evento de un control para hacer
referencia a propiedades del control.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 37 de 127
253 of 804
El comando siguiente del evento Click del botn de comando Salir libera el conjunto de formularios;
esto hace que se cierren ambos formularios:
RELEASE ThisFormSet
Administrar formularios
Los procedimientos siguientes describen tareas comunes relacionadas con la administracin de
formularios en una aplicacin.
Ocultar un formulario
Puede ocultar un formulario para que deje de estar visible para un usuario. Cuando el formulario est
oculto, el usuario no puede tener acceso a sus controles, pero sigue teniendo control total sobre ellos
mediante programacin.
Por ejemplo, en el cdigo asociado al evento Click de un botn de comando puede incluir la
siguiente lnea de cdigo:
THISFORM.Hide
Cuando el usuario haga clic en el botn de comando, el formulario permanecer en memoria, pero no
ser visible.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 38 de 127
254 of 804
Liberar un formulario
Puede permitir que un usuario libere un formulario cuando haya terminado de interactuar con l. Al
liberar un formulario, ya no podr tener acceso a sus propiedades y mtodos.
Por ejemplo, en el cdigo asociado al evento Click de un botn de comando, podra incluir la lnea de
cdigo siguiente:
THISFORM.Release
En algunos casos puede resultar conveniente transferir parmetros a formularios cuando se ejecutan
para establecer valores de propiedad o para especificar valores operativos predeterminados.
2. En el cdigo de evento Init para el formulario, incluya una instruccin PARAMETERS como
sta:
3. En el cdigo de evento Init para el formulario, asigne los parmetros a las propiedades, como
en este ejemplo:
THIS.ItemName = cString
THIS.ItemQuantity = nNumber
Puede utilizar formularios en su aplicacin para permitir que los usuarios especifiquen un valor.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 39 de 127
255 of 804
2. En el cdigo asociado al evento Unload del formulario, incluya un comando RETURN con el
valor devuelto.
Puede usar la opcin Guardar como HTML del men Archivo cuando cree un formulario para
guardar el contenido de un formulario como un archivo HTML (Lenguaje de marcado de hipertexto).
1. Abra el formulario.
2. Elija Guardar como HTML en el men Archivo. (Se le pedir que guarde el formulario si lo
ha modificado.)
3. Escriba el nombre del archivo HTML que desea crear y elija Guardar.
Puede tener activas varias instancias de una definicin de clase al mismo tiempo. Por ejemplo, puede
disear un formulario de pedido pero tener varios pedidos abiertos en la aplicacin, cada uno de los
cuales emplea la misma definicin de formulario, pero que se muestran y manipulan individualmente.
Si dispone de mltiples instancias de un formulario, los puntos clave que deber tener en cuenta son
los siguientes:
l Cree una propiedad de matriz en el formulario de inicio para almacenar las variables de objeto
asociadas con cada instancia del formulario de mltiples instancias. El modo ms sencillo de
hacer un seguimiento de las variables de instancia cuando no se sabe con antelacin cuntas va
a tener consiste en utilizar una matriz.
l Para el formulario que va a tener mltiples instancias, establezca la propiedad DataSession
como 2 Sesin privada de datos. Una sesin de datos privada proporciona un conjunto
independiente de reas de trabajo para cada instancia del formulario de forma que las tablas
seleccionadas y las posiciones de puntero de registro sean todas independientes.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 40 de 127
256 of 804
El ejemplo siguiente proporciona cdigo que muestra cmo se crean mltiples instancias de un
formulario. Para no hacerlo demasiado extenso, este cdigo no est optimizado; est pensado
nicamente para presentar los conceptos.
Formulario Launch
Para refinar el cdigo de este ejemplo, podra administrar la matriz de objetos de formulario de modo
que se cerraran los elementos vacos de la matriz reutilizados como formularios y se abrieran nuevos
formularios, en lugar de redimensionar siempre la matriz y aumentar en uno el nmero de elementos.
El formulario que puede tener mltiples instancias es Multi.scx. El entorno de datos para este
formulario contiene la tabla Employee.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 41 de 127
257 of 804
Al elegir Iniciar formulario en el formulario Launch, se crea una instancia del formulario Multi. Al
cerrar el formulario Launch se libera la matriz de propiedades aForms y se destruyen todas las
instancias de Multi.
Visual FoxPro proporciona algunas funciones y propiedades que le ayudan a administrar mltiples
instancias de objetos. Para obtener informacin al respecto, vea AINSTANCE( ), AUSED( ) y
DataSessionID en la Referencia del lenguaje.
Puede establecer el rea mxima de diseo para el Diseador de formularios en el cuadro de dilogo
Opciones.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 42 de 127
258 of 804
3. En el cuadro rea de diseo mxima , elija las coordenadas en pxeles del rea mxima de
diseo.
Cuando establezca el rea mxima de diseo, el fondo del Diseador de formularios tendr color
blanco dentro de los lmites del rea de diseo, y gris fuera del rea mxima de diseo. Por ejemplo,
si desarrolla aplicaciones en un monitor con una resolucin de 1024 x 768, podr establecer la
resolucin de diseo en 640 x 480 y saber con seguridad que los formularios que disee siempre
cabrn en pantallas de 640 x 480.
En el rea de diseo, deje espacio para los atributos estndar de las ventanas, como las barras de
herramientas. Por ejemplo, en una pantalla de 640 x 480, un formulario con una barra de estado y una
barra de herramientas acoplada en la parte superior o inferior de la pantalla puede tener una altura
mxima de 390 pxeles.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 43 de 127
259 of 804
Puede crear formularios que pueden usar alternativamente datos locales y datos almacenados de
forma remota (por ejemplo, en un servidor de base de datos). Esto le permite crear una aplicacin
prototipo con datos locales o de prueba, y despus cambiar a datos remotos sin cambios importantes
en sus formularios.
Por ejemplo, si su aplicacin de Visual FoxPro es un cliente para una tabla grande de clientes
almacenada en un servidor de base de datos, puede crear un archivo .dbf local que contiene una
muestra pequea pero representativa de datos. Entonces puede crear, probar y depurar sus formularios
en base a este pequeo conjunto de datos. Cuando est preparado para distribuir la aplicacin, puede
vincular el formulario al conjunto grande de datos.
La clave para poder cambiar entre datos remotos y locales es asegurarse de que usa vistas en lugar de
vincular directamente el formulario (y sus controles) a una tabla. Para tener acceso a datos remotos,
debe usar una vista en cualquier evento. Por lo tanto, para facilitar el cambio entre datos locales y
remotos, cree tambin una vista para los datos remotos. Cuando cree el formulario, puede agregar
ambas vistas a sus entornos de datos y, a continuacin, cambie de un tipo a otro segn sea necesario.
Para crear un formulario que pueda cambiar entre datos locales y datos remotos
1. Cree dos vistas de los datos, una que apunte a los datos remotos, y otra que apunte a los datos
locales.
6. Establezca la propiedad OpenViews del entorno de datos a 1 Slo local o 2 Slo remota,
en funcin de qu vista quiera usar al ejecutar el formulario.
Nota Como usa el mismo alias para ambas vistas, no elija 0 Local y remota
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 44 de 127
260 of 804
(predeterminada).
Despus de crear el formulario, puede cambiar los alias de vistas si cambia la propiedad OpenViews
del entorno de datos. Puede hacerlo en el Entorno de datos mientras usa el Diseador de formularios.
De forma alternativa, puede escribir cdigo y adjuntarlo a un evento, lo cual es til si quiere cambiar
vistas en tiempo de ejecucin. Por ejemplo, puede colocar el cdigo en el evento Activate del
formulario:
Si crea un formulario que puede alternar entre datos locales y remotos, tambin debe disear el
cdigo de desplazamiento para acomodar ambas vistas, en particular si disea formularios con
relaciones uno a varios. Por ejemplo, su formulario slo tiene acceso a una tabla o vista local, puede
usar cdigo como el siguiente en un botn de comando Siguiente para mover al siguiente registro en
un cursor:
SKIP 1
THISFORM.Refresh()
Sin embargo, este cdigo es ineficaz cuando se desplaza en una vista remota, porque supone que el
cursor contiene todos los datos que requiere el formulario. Como regla general, debe minimizar la
cantidad de datos que transfiere desde el origen de datos remoto.
La solucin consiste en usar una vista parametrizada. Por ejemplo, la definicin para una vista usada
para modificar informacin de clientes podra ser:
Cuando el formulario se ejecuta, puede pedir al usuario un nombre de cliente mediante un cuadro de
dilogo o permitiendo al usuario escribir un nombre en un cuadro de texto. El cdigo para un botn
Mostrar sera similar al siguiente:
pCompanyName = THISFORM.txtCompanyName.Value
REQUERY("customer")
THISFORM.Refresh()
Para obtener ms informacin sobre vistas parametrizadas, consulte Crear una vista parametrizada en
el captulo 8, Crear vistas.
Puede crear su propia clase de formulario con el fin de utilizar una plantilla para todos los
formularios nuevos o bien puede utilizar una de las clases de ejemplo que se incluyen con Visual
FoxPro.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 45 de 127
261 of 804
Cuando cree un formulario nuevo, ste se basar en el formulario de plantilla que se establece en el
cuadro de dilogo Opciones. Si no se especifica ninguna plantilla, el nuevo formulario se basar en la
clase de base Form de Visual FoxPro. Para obtener ms informacin sobre las clases de Visual
FoxPro, consulte el captulo 3, Programacin orientada a objetos.
Las plantillas de formulario permiten establecer propiedades predeterminadas para los formularios, de
forma que todos los formularios de la aplicacin tengan una apariencia parecida y se utilicen de
forma similar. Podra incluir un logotipo de su compaa, por ejemplo, y utilizar un mismo esquema
de colores en todos los formularios diseando una clase de formulario de plantilla con estos atributos.
Si cambiara el logotipo de la compaa, podra cambiar la imagen que aparece en la clase de
formulario de plantilla y todos los formularios creados con esa plantilla heredaran automticamente
el nuevo logotipo.
Puede especificar una clase de formulario procedente de una biblioteca de clases registrada para la
plantilla de formulario.
5. Elija Aceptar.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 46 de 127
262 of 804
Puede especificar plantillas de conjuntos de formularios del mismo modo que las plantillas de
formularios. Se permiten las combinaciones siguientes:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 47 de 127
263 of 804
nuevo formulario) se crear automticamente un formulario basado en la clase de formulario de
plantilla.
l No especificar plantillas.
Para obtener informacin adicional, vea Controles y objetos en la Referencia del lenguaje.
Control Efecto
Casilla de verificacin Si el ControlSource es un campo de una tabla, los valores lgicos
verdadero (.T.) o falso (.F.), o numricos 0, 1 2 del campo
ControlSource harn que la casilla de verificacin se active, desactive
o atene a medida que el puntero de registro se mueva por la tabla.
Columna Si el ControlSource es un campo de tabla, el usuario modificar
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 48 de 127
264 of 804
directamente el campo cuando modifique valores en la columna. Para
vincular una cuadrcula completa a datos, establezca la propiedad
RecordSource de la cuadrcula.
Cuadro de lista Si el ControlSource es una variable de memoria, el valor que elija el
o cuadro combinado usuario en la lista se almacenar en la variable de memoria. Si el
ControlSource es un campo de una tabla, el valor se almacenar en el
campo, en el puntero de registro. Si un elemento de la lista coincide
con el valor del campo de la tabla, se seleccionar el elemento de la
lista cuando el puntero de registro se desplace por la tabla.
Botn de opcin Si ControlSource es un campo numrico, 0 1 se escribe en el campo,
en funcin de si se elige el botn.
Algunas de las tareas que se llevan a cabo con controles, aunque no todas, exigen disponer de datos
dependientes del control.
La mayor parte de la funcionalidad que querr incorporar a sus formularios corresponder a una de
estas categoras:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 49 de 127
265 of 804
l Aceptar entradas del usuario que no se pueden determinar de forma previa
l Aceptar entradas del usuario en un determinado intervalo
l Permitir a los usuarios realizar acciones especficas
l Realizar determinadas acciones a intervalos especficos
l Mostrar informacin
Uno de los modos ms sencillos de asegurar la validez de los datos de una base de datos consiste en
proporcionar a los usuarios una serie de opciones predeterminadas. Si controla las opciones del
usuario puede asegurarse de que en la base de datos no se almacenan datos no vlidos. Los controles
siguientes permiten proporcionar a los usuarios una serie de opciones predeterminadas:
Los grupos de botones de opcin son contenedores que alojan botones de opcin. Generalmente, los
botones de opcin permiten a los usuarios especificar una opcin entre varias en un cuadro de
dilogo, en lugar de introducir los datos. Los botones de opcin tambin se pueden emplear para
especificar la salida a un archivo, a una impresora o para realizar una vista previa, como se describe
en el captulo 12, Agregar consultas e informes.
Cuando crea un grupo de botones de opcin en un formulario, se incluyen dos botones de opcin de
forma predeterminada. Puede determinar el nmero de botones de opcin que hay en un grupo si
cambia la propiedad ButtonCount.
Por ejemplo, para tener un grupo de seis botones de opcin, establezca a 6 la propiedad
ButtonCount del grupo de botones de opcin.
La propiedad Value del grupo indica qu botn se ha elegido. Por ejemplo, si un usuario elige el
cuarto botn de opcin de un grupo de seis, el valor del grupo de botones de opcin ser 4.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 50 de 127
266 of 804
Para ajustar manualmente los elementos individuales de un grupo de botones de opcin o de botones
de comando en el Diseador de formularios, elija Modificar en el men de mtodo abreviado del
grupo.
Tambin puede establecer estas propiedades en tiempo de ejecucin mediante la propiedad Buttons y
especificando el nmero de ndice del botn de opcin del grupo. Por ejemplo, si optCust es el tercer
botn del grupo, la lnea de cdigo siguiente establecer el ttulo de optCust:
Por ejemplo, la lnea de cdigo siguiente deshabilita todos los botones de un grupo de botones
de opcin llamado opgMyGroup en un formulario:
THISFORM.opgMyGroup.SetAll("Enabled",.F., "OptionButton")
El ejemplo anterior muestra cmo desactivar mediante programacin todos los botones de opcin de
un grupo. Cuando los botones estn desactivados, se muestran en los colores especificados en las
propiedades DisabledForeColor y DisabledBackColor de los botones de opcin. Tambin puede
establecer la propiedad Enabled del grupo de botones de opcin como falso (.F.) para desactivar el
grupo; sin embargo, no habra ninguna pista visual para el usuario.
La propiedad Value del grupo de botones de opcin permite determinar el botn de opcin que est
seleccionado en el grupo. Si el origen de control para el botn es numrico, tiene cinco botones de
opcin en un grupo. Si hay cinco botones de opcin en un grupo y el tercero est seleccionado, la
propiedad Value del grupo de botones de opcin ser 3. Si ningn botn de opcin est seleccionado,
la propiedad Value del grupo ser 0.
Tambin puede determinar el ttulo del botn de opcin seleccionado con las propiedades Value y
Buttons del grupo. Por ejemplo, la lnea de cdigo siguiente almacena en una variable cSelected la
propiedad Caption del botn de opcin seleccionado.
oGroup = THISFORM.opg1
cSelected = oGroup.Buttons(oGroup.Value).Caption
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 51 de 127
267 of 804
Si tiene un pequeo grupo de filtros de tabla predeterminados, puede usar botones para permitir al
usuario cambiar entre los filtros.
Los filtros se establecen en el cdigo del evento Click de los botones de opcin.
Cdigo de evento para filtrar una lista cuando el usuario elige un botn de opcin
Cuando el usuario cierre el formulario, no olvide restablecer el filtro incluyendo SET FILTER TO en
el evento Click del botn de cierre o en el evento Destroy.
Sugerencia Para actualizar una lista cuando el origen de la lista puede haber cambiado, utilice el
mtodo Requery.
Aunque no es tan comn, puede utilizar botones de opcin para obtener informacin de un usuario y
almacenarla en una tabla guardando la propiedad Caption. Por ejemplo, si dispone de una aplicacin
de prueba normalizada, puede utilizar los botones de opcin para permitir que el usuario elija entre
mltiples opciones A, B, C o D. Tambin puede utilizar botones de opcin para indicar el gnero en
una tabla de empleados.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 52 de 127
268 of 804
1. Establezca la propiedad Value del grupo de botones de opcin como una cadena vaca.
2. Establezca la propiedad ControlSource del grupo de botones de opcin como un campo de tipo
Character de una tabla.
Por ejemplo, si los ttulos de los botones de opcin de un grupo son "A", "B", "C" y "D", y el
ControlSource del grupo de botones de opcin es un campo de caracteres, cuando el usuario elija el
botn con el ttulo "B", en el campo se almacenar "B".
Para ver un ejemplo de una prueba de eleccin mltiple con botones de opcin
2. En la vista de rbol, haga clic en Controles y, a continuacin, haga clic en Botones de opcin.
Los cuadros de lista y los cuadros de lista desplegables (controles de tipo cuadro combinado con la
propiedad Style establecida como 2Lista desplegable) proporcionan al usuario una lista por la que
puede desplazarse y que contiene una serie de opciones o informacin. En un cuadro de lista, puede
haber mltiples elementos visibles en todo momento. En un cuadro de lista desplegable slo se ve un
elemento, aunque el usuario puede hacer clic en el botn de flecha abajo para mostrar una lista
desplegable con todos los elementos del cuadro de lista desplegable.
Cuadro de lista y cuadro de lista desplegable con los mismos valores para la propiedad
RowSource
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 53 de 127
269 of 804
Sugerencia Cuadro de lista y cuadro de lista desplegable con los mismos valores para la propiedad
RowSource.
Propiedad Descripcin
ColumnCount Indica el nmero de columnas del cuadro de lista.
ControlSource Indica dnde se almacena el valor que elige un usuario en la lista.
MoverBars Indica si las barras de movimiento se muestran a la izquierda de los
elementos de la lista de modo que el usuario pueda reorganizar fcilmente
los elementos de la lista.
Multiselect Indica si el usuario puede seleccionar o no ms de un elemento de la lista
al mismo tiempo.
RowSource Indica de dnde provienen los valores que se muestran en la lista.
RowSourceType Indica si RowSource es un valor, una tabla, una instruccin SQL, una
consulta, una matriz, una lista de archivos o una lista de campos.
Nota La propiedad Value de una lista puede ser numrica o de caracteres. El valor predeterminado
es numrico. Establezca la propiedad Value como una cadena vaca si RowSource es un valor de tipo
Character y desea que la propiedad Value refleje la cadena de caracteres del elemento seleccionado en
la lista. Puede presionar la barra espaciadora y, a continuacin, la tecla retroceso para introducir una
cadena vaca para una propiedad en la ventana Propiedades.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 54 de 127
270 of 804
Mtodo Descripcin
AddItem Agrega un elemento a una lista con un RowSourceType de 0.
RemoveItem Quita un elemento de una lista con un RowSourceType de 0.
Requery Actualiza la lista si han cambiado los valores de RowSource.
Puede rellenar un cuadro de lista con elementos procedentes de diversos orgenes si establece las
propiedades RowSourceType y RowSource.
frmForm1.lstMyList.RowSourceType = 0
frmForm1.lstMyList.AddItem("Primer elemento")
frmForm1.lstMyList.AddItem("Segundo elemento")
frmForm1.lstMyList.AddItem("Tercer elemento")
El mtodo RemoveItem permite quitar elementos de la lista. Por ejemplo, la lnea de cdigo siguiente
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 55 de 127
271 of 804
quita "Segundo elemento" de la lista:
frmForm1.lstMyList.RemoveItem(2)
Form1.lstMyList.RowSourceType = 1
Form1.lstMyList.RowSource = "uno,dos,tres,cuatro"
Nota De forma predeterminada, las instrucciones SELECT de Visual FoxPro sin clusulas INTO
muestran inmediatamente el cursor resultante en una ventana Examinar. Puesto que este
comportamiento no suele ser conveniente en una instruccin SQL de RowSource, incluya una
clusula INTO CURSOR en la instruccin SELECT.
Consulta Si establece la propiedad RowSourceType a 4, podr rellenar el cuadro de lista con los
resultados de una consulta diseada en el Diseador de consultas. Cuando RowSourceType est
establecida a 4, establezca RowSource en el archivo .qpr. Por ejemplo, la lnea de cdigo siguiente
establece la propiedad RowSource de una lista en una consulta.
THISFORM.List1.RowSource = "region.qpr"
Matriz Si establece la propiedad RowSourceType en 5, la lista se rellenar con los elementos de una
matriz. Puede crear una propiedad de matriz del formulario o el conjunto de formularios para
RowSource o bien utilizar una matriz creada en otra parte de la aplicacin.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 56 de 127
272 of 804
Para obtener informacin sobre la creacin de propiedades de matrices, consulte el captulo 9, Crear
formularios.
Solucin de problemas Cuando es necesario, Visual FoxPro evala el valor de RowSource de una
lista en la aplicacin, no slo en el mtodo en que se establece la propiedad RowSource. Debe tener
en cuenta este alcance. Si crea una matriz local en un mtodo, esa matriz tendr como alcance el
mtodo y no estar disponible en todos los casos en que Visual FoxPro necesite evaluar el valor de la
propiedad. Si establece la propiedad RowSource de una lista como una propiedad de matriz del
formulario o el conjunto de formularios, deber hacer referencia a la propiedad en relacin a la lista,
no en relacin al mtodo en el que se ha establecido la propiedad. Por ejemplo, si tiene una propiedad
de matriz de formulario llamada arrayprop, las lneas de cdigo siguientes del Init del formulario
producirn resultados distintos:
Para rellenar una lista con los elementos de una matriz multidimensional
contact,company,country
Puede incluir los siguientes tipos de informacin en la propiedad RowSource de una lista cuya
propiedad RowSourceType tenga el valor 6Campos:
l campo
l alias.campo
l alias.campo, campo, campo, ...
Si en la lista desea incluir campos de mltiples tablas, establezca la propiedad RowSourceType como
3Instruccin SQL.
Archivos Si establece la propiedad RowSourceType en 7, la lista se llenar con los archivos del
directorio actual. Adems, las opciones de la lista permiten elegir una unidad y un directorio distintos
para los nombres de archivos que se muestran en la lista.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 57 de 127
273 of 804
Establezca RowSource como la estructura del tipo de archivos que desea mostrar en la lista. Por
ejemplo, para mostrar tablas de Visual FoxPro en la lista, establezca la propiedad RowSource como
*.dbf.
En Visual FoxPro un cuadro de lista puede contener tantas columnas como desee, aunque su nmero
predeterminado es uno. Un cuadro de lista multicolumna se diferencia de una cuadrcula en que en el
primero se selecciona una fila cada vez, mientras que en el segundo pueden seleccionarse celdas
individuales de una cuadrcula y los datos de la lista no se pueden modificar directamente.
4. Establezca la propiedad RowSource como los campos que se van a mostrar en columnas. Por
ejemplo, el comando siguiente establece los orgenes de tres columnas en un cuadro de lista de
tres columnas como los campos contact, city y country de la tabla customer:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 58 de 127
274 of 804
form.listbox.RowSource = "contact,city,country"
Nota Para que las columnas se alineen correctamente, deber establecer la propiedad
ColumnWidths o cambiar la propiedad FontName a una fuente de espacio simple.
THISFORM.lst1.ColumnCount = 3
THISFORM.lst1.Columnwidths = "100,100,100"
THISFORM.lst1.AddListItem("fila1 col1", 1,1)
THISFORM.lst1.AddListItem("fila1 col2", 1,2)
THISFORM.lst1.AddListItem("fila1 col3", 1,3)
THISFORM.lst1.AddListItem("fila2 col2", 2,2)
El comportamiento predeterminado de una lista permite seleccionar un elemento cada vez. Sin
embargo, puede permitir que un usuario seleccione mltiples elementos de una lista.
Para procesar los elementos seleccionados (para copiarlos a una matriz o incorporarlos en cualquier
lugar de la aplicacin), efecte un bucle a travs de los elementos de la lista y procese aqullos para
los que la propiedad Selected sea verdadera (.T.). Podra incluir el cdigo siguiente en el evento
InteractiveChange de un cuadro de lista para mostrar los elementos seleccionados en un cuadro
combinado cboSelected, y el nmero de elementos seleccionados en un cuadro de texto,
txtNoSelected:
Adems de permitir a los usuarios seleccionar elementos de un cuadro de lista, puede permitir a los
usuarios agregar elementos de forma interactiva a una lista.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 59 de 127
275 of 804
En el ejemplo siguiente, el cdigo del evento KeyPress de un cuadro de texto agrega el texto del
cuadro de texto al cuadro de lista y borra el texto del cuadro cuando el usuario presiona entrar:
Permitir a los usuarios introducir datos en una tabla desde una lista
Por ejemplo, si tiene una lista de regiones o pases para que elija un usuario, el usuario no podr
introducir una abreviatura no vlida de pas o regin.
A menudo resultar til dejar que los usuarios seleccionen el registro que quieren ver o modificar.
Por ejemplo, puede proporcionar a los usuarios una lista de nombres de clientes. Cuando el usuario
seleccione un cliente de la lista, se seleccionar el registro del cliente en la tabla y se mostrar la
informacin de ese cliente en los cuadros de texto del formulario. Esto puede llevarse a cabo de
varias formas, segn el origen de datos del formulario.
Cuando el usuario decide ir a un registro eligiendo un valor de una lista, puede tener una relacin de
uno a varios que necesite reflejar el puntero de registro modificado en la tabla primaria. Puede
implementar esta funcionalidad con tablas locales y vistas locales o remotas.
Tablas locales
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 60 de 127
276 of 804
Vistas
En primer lugar, en el Diseador de vistas cree una vista parametrizada para los pedidos. Cuando cree
la vista en el Diseador de vistas, establezca el criterio de seleccin para la clave principal a una
variable. En el ejemplo siguiente, la variable se llama m.cCust_id.
A continuacin, cuando disee el formulario, siga los pasos del procedimiento siguiente. Observe que
la vista requiere un valor para el parmetro que no est disponible cuando se carga el formulario. Si
establece la propiedad NoDataOnLoad del objeto cursor de la vista como verdadero (.T.), impide que
la vista se ejecute hasta que se llame a la funcin REQUERY( ), momento en que el usuario habra
seleccionado un valor para la variable utilizada en la vista parametrizada.
Para disear una lista de uno a varios basada en vistas locales o remotas
2. En la ventana Propiedades para el objeto cursor de vista del Entorno de datos, establezca la
propiedad NoDataOnLoad como verdadero (.T.).
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 61 de 127
277 of 804
5. En el cdigo de evento InteractiveChange del cuadro de lista, almacene el valor del cuadro de
lista en la variable y, a continuacin, vuelva a consultar la vista, como en este ejemplo:
m.cCust_id = THIS.Value
*suponemos que el nombre de la vista es orders_view
=REQUERY("orders_view")
Para obtener ms informacin sobre vistas locales y remotas, consulte el captulo 8,Crear vistas.
Se pueden mostrar registros de una relacin uno a varios en una lista de modo que la lista muestre los
registros secundarios de la relacin a medida que el puntero de registro se mueve a travs de la tabla
primaria.
Por ejemplo, si desea mostrar los campos Order_id, Order_net, y Shipped_on en la lista,
establezca la propiedad ColumnCount a 3.
3. Establezca la propiedad ColumnWidths a los anchos apropiados para mostrar los campos
seleccionados.
6. En el evento Init del formulario y en el cdigo que mueve el puntero de registro a travs de la
tabla, vuelva a consultar la lista:
THISFORM.lstChild.Requery
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 62 de 127
278 of 804
Puede establecer la propiedad Picture de la lista como el archivo.bmp que desea mostrar junto a los
elementos de la lista.
Por ejemplo, podra tener un cuadro de lista lleno de archivos, con mapas de bits distintos junto a
cada archivo segn se trate de tablas, programas u otro tipo de archivos.
Las casillas de verificacin pueden emplearse para permitir que un usuario especifique un estado
booleano: Verdadero o Falso, Activado o Desactivado, Abierto o Cerrado. Sin embargo, en algunos
casos la evaluacin de algo como Verdadero o Falso no es muy precisa, como preguntas no
contestadas en un cuestionario de tipo Verdadero o Falso.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 63 de 127
279 of 804
Hay cuatro estados posibles para una casilla de verificacin, determinados por la propiedad Value.
Sugerencia Un usuario puede mostrar un valor nulo en una casilla de verificacin si presiona
CTRL+0.
No siempre es posible anticipar todos los valores posibles que un usuario necesita introducir en un
control. Los controles siguientes permiten aceptar entradas de usuarios que no se pueden determinar
previamente:
l Cuadros de texto
l Cuadros de edicin
l Cuadros combinados
El cuadro de texto es el control bsico que permite a los usuarios agregar o modificar datos
almacenados en un campo no memo de una tabla.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 64 de 127
280 of 804
2. En la vista de rbol, haga clic en Controles y, a continuacin, haga clic en Cuadro de texto.
Si establece la propiedad ControlSource para el cuadro de texto, el valor que aparece en el cuadro de
texto se almacenar en la propiedad Value del cuadro de texto y en el campo de la tabla o del cursor
que se especifique en la propiedad ControlSource.
Para comprobar el valor del cuadro de texto, incluya cdigo en el mtodo asociado al evento Valid. Si
el valor no es vlido, se devolver falso (.F.) o 0. Si Valid devuelve falso (.F.) se muestra el mensaje
"La entrada no es vlida". Si desea mostrar su propio mensaje, incluya el comando WAIT WINDOW
o la funcin MESSAGEBOX( ) en el cdigo Valid y devuelva 0.
Por ejemplo, si tiene un cuadro de texto que permite a un usuario escribir la fecha de una cita, puede
asegurarse de que la fecha no ha pasado si incluye el cdigo siguiente en el evento Valid del cuadro
de texto:
Para seleccionar todo el texto cuando el usuario escribe en el cuadro de texto usando el teclado,
establezca la propiedad SelectOnEntry a verdadero (.T.).
Puede utilizar la propiedad InputMask para determinar los valores que se pueden escribir en el cuadro
de texto y la propiedad Format para determinar cmo se muestran los valores en el cuadro de texto.
La propiedad InputMask determina las caractersticas de cada carcter escrito en el cuadro de texto.
Por ejemplo, puede establecer la propiedad InputMask en 999.999,99 para limitar la entrada del
usuario a valores numricos inferiores a 1.000.000 con dos posiciones decimales. La coma y el punto
se mostrarn en el cuadro de texto antes de que el usuario pueda introducir algn valor. Si el usuario
presiona una tecla de carcter, el carcter no aparecer en el cuadro de texto.
Si tiene un campo lgico y desea que un usuario puede introducir "S" o "N", pero no "T" o "F",
establezca la propiedad InputMask como "S".
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 65 de 127
281 of 804
Con frecuencia, en una aplicacin es conveniente obtener informacin segura de un usuario, como
una contrasea. Puede utilizar un cuadro de texto para obtener esta informacin sin que aparezca en
la pantalla.
l Establezca la propiedad PasswordChar del cuadro de texto como * o algn otro carcter
genrico.
Si establece la propiedad PasswordChar como algo que no sea una cadena vaca, las propiedades
Value y Text del cuadro de texto contendrn el valor real que el usuario escribi en el cuadro de
texto, pero ste mostrar un carcter genrico para cada tecla que haya presionado el usuario.
Los cuadros de texto tienen varias propiedades que se pueden establecer para facilitar a los usuarios
escribir valores de fecha.
Propiedad Descripcin
Century Especifica si los dos primeros dgitos del ao se muestran o no.
DateFormat Formato de la fecha en el cuadro de texto entre quince formatos
predefinidos, como Americano, Alemn, Japons.
StrictDateEntry Si se establece StrictDateEntry a 0 - Libre, permite al usuario escribir
fechas en formatos ms flexibles que el predeterminado 99/99/99.
Propiedad Descripcin
Alignment Especifica si el contenido del cuadro de texto est alineado a la
izquierda, a la derecha, centrado o alineado automticamente. La
alineacin automtica depende del tipo de datos. Los nmeros, por
ejemplo, se alinean a la derecha y los caracteres se alinean a la
izquierda.
ControlSource El campo de tabla o variable cuyo valor se muestra en el cuadro de
texto.
InputMask Especifica la regla de entrada de datos que cada carcter escrito debe
seguir. Para obtener informacin especfica sobre InputMask, vea la
Ayuda.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 66 de 127
282 of 804
SelectOnEntry Especifica si el contenido del cuadro de texto se selecciona
automticamente cuando el cuadro de texto recibe el enfoque.
TabStop Especifica si el usuario puede llegar al control mediante tabulaciones.
Si TabStop est establecido a .F., un usuario puede seleccionar el
cuadro de texto si hace clic en l.
Puede permitir que los usuarios modifiquen texto de campos de caracteres o de campos memo largos
en cuadros de edicin. Los cuadros de edicin permiten el ajuste automtico de lnea y ofrecen la
posibilidad de moverse por el texto con las teclas de direccin, las teclas de avance y retroceso de
pgina, y las barras de desplazamiento.
2. En la vista de rbol, haga clic en Controles y, a continuacin, haga clic en Cuadro de edicin.
Lo nico que debe hacer para permitir a un usuario modificar un campo memo en un cuadro de
edicin es establecer la propiedad ControlSource del cuadro de edicin como el campo memo. Por
ejemplo, si tiene un campo memo llamado comentarios en una tabla llamada registro, podr
establecer la propiedad ControlSource de un cuadro de edicin como registro.comentarios para
permitir que un usuario modifique el campo memo en el cuadro de edicin.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 67 de 127
283 of 804
RELEASE THISFORM
Los otros dos botones de este ejemplo, cmdOpenFile y cmdSave, permiten a un usuario abrir un
archivo de texto y guardar el archivo despus de modificarlo.
Cdigo Comentarios
CREATE CURSOR textfile ; Crea un cursor con un campo de caracteres para
(filename c(35), mem m)
APPEND BLANK guardar el nombre del archivo de texto y un
campo memo para guardar el contenido del
archivo de texto.
APPEND MEMO mem FROM ; Llena el campo memo con el texto del archivo.
(textfile.FileName) OVERWRITE
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 68 de 127
284 of 804
Una vez abierto y modificado el archivo, el botn "Guardar" permite que el usuario vuelva a escribir
los cambios en el archivo.
Cdigo Comentarios
COPY MEMO textfile.mem TO ; Sobrescribe el valor antiguo en el archivo con el
(textfile.filename)
texto del campo memo.
Los cuadros de edicin y los cuadros de texto tienen tres propiedades que le permiten trabajar con
texto seleccionado: SelLength, SelStart y SelText.
Puede seleccionar texto mediante programacin con las propiedades SelStart y SelLength. Por
ejemplo, las lneas de cdigo siguientes seleccionan la primera palabra de un cuadro de edicin.
Form1.edtText.SelStart = 0
Form1.edtText.SelLength = AT(" ", Form1.edtText.Text) - 1
Sugerencia Cuando cambia la propiedad SelStart, el cuadro de edicin desplaza el texto para
mostrar el nuevo valor de SelStart. Si cambia SelStart en un bucle, por ejemplo, al buscar texto, el
cdigo se ejecutar ms rpido si incluye THISFORM.LockScreen = .T. antes de procesar y
THISFORM.LockScreen = .F. despus de procesar.
Para tener acceso al texto seleccionado en un cuadro de edicin o en un cuadro de texto, utilice la
propiedad SelText. Por ejemplo, la lnea de cdigo siguiente escribir en maysculas el texto
seleccionado:
Form1.edtText.SelText = UPPER(Form1.edtText.SelText)
Las propiedades siguientes de los cuadros de edicin suelen establecerse en tiempo de diseo.
Propiedad Descripcin
AllowTabs Si el usuario puede insertar tabulaciones en el cuadro de edicin en lugar
de moverse al control siguiente. Si permite tabulaciones, asegrese de
indicar que los usuarios pueden moverse al control siguiente presionando
CTRL+TAB.
HideSelection Si el texto seleccionado en el cuadro de edicin est seleccionado de
forma visible cuando el cuadro de edicin no tiene el enfoque.
ReadOnly Si el usuario puede cambiar el texto en el cuadro de edicin.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 69 de 127
285 of 804
El control cuadro combinado tiene la funcionalidad de un cuadro de lista y un cuadro de texto. Hay
dos estilos para un cuadro combinado: cuadro combinado desplegable y cuadro de lista desplegable.
Puede especificar cul desea si cambia la propiedad Style del control. Las listas desplegables se
describieron en la seccin "Usar cuadros de lista y cuadros de lista desplegables" de este mismo
captulo.
Un usuario puede hacer clic en el botn para ver una lista de opciones o introducir un nuevo elemento
directamente en el cuadro situado junto al botn. La propiedad Style predeterminada de un cuadro
combinado es 0 Cuadro desplegable.
Para agregar el nuevo valor de usuario al cuadro combinado desplegable, puede utilizar la lnea de
cdigo siguiente en el mtodo asociado al evento Valid del cuadro combinado:
THIS.AddItem(THIS.Text)
Sin embargo, antes de agregar un elemento, es conveniente asegurarse de que el valor no est ya en el
cuadro combinado desplegable:
IF !lItemExists
THIS.AddItem(THIS.Text)
ENDIF
Las siguientes propiedades de los cuadros combinados suelen establecerse en tiempo de diseo.
Propiedad Descripcin
ControlSource Especifica el campo de la tabla en el que se almacena el valor que
elige o escribe el usuario.
DisplayCount Especifica el nmero mximo de elementos mostrados en la lista.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 70 de 127
286 of 804
InputMask Para cuadros combinados desplegables, especifica el tipo de valores
que se pueden escribir.
IncrementalSearch Especifica si el control intenta hacer coincidir un elemento de la lista a
medida que el usuario escribe cada letra.
RowSource Especifica el origen de los elementos del cuadro combinado.
RowSourceType Especifica el tipo de origen del cuadro combinado. Los tipos de origen
de fila de un cuadro combinado son iguales que los de una lista. Para
ver una explicacin de cada uno de ellos, vea la Ayuda o la seccin
sobre cuadros de lista y cuadros de lista desplegable en este captulo.
Style Especifica si el cuadro combinado es un cuadro combinado
desplegable o una lista desplegable.
Aunque puede establecer la propiedad InputMask e incluir cdigo en el evento Valid para comprobar
que los valores numricos introducidos en los cuadros de texto quedan dentro de un determinado
intervalo, el modo ms sencillo de comprobar el intervalo de valores consiste en utilizar un control
numrico.
Los controles numricos pueden emplearse para permitir a los usuarios realizar selecciones
mostrando los valores o escribiendo directamente el valor en el cuadro del control numrico.
En algunos casos, si el control numrico refleja un valor como "prioridad", ser conveniente que el
usuario pueda aumentar la prioridad de 2 a 1 haciendo clic en el botn "Arriba". Para hacer que el
nmero del control numrico disminuya cuando el usuario haga clic en el botn "Arriba", establezca
la propiedad Increment como 1.
Si bien el valor de un control numrico es numrico, puede utilizar el control Spinner y un cuadro de
texto para que los usuarios puedan utilizar diversos tipos de datos. Por ejemplo, si desea que un
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 71 de 127
287 of 804
usuario pueda recorrer un intervalo de fechas, puede ajustar el tamao del control numrico de modo
que slo estn visibles los botones y situar un cuadro de texto junto a los botones del control
numrico. Establezca la propiedad Value del cuadro de texto como una fecha y en los eventos
UpClick y DownClick del control numrico, incremente o disminuya la fecha.
Las siguientes propiedades de los controles numricos suelen establecerse en tiempo de diseo.
Propiedad Descripcin
Interval Cunto se incrementa o disminuye el valor cada vez que el usuario
hace clic en los botones "Arriba" o "Abajo".
KeyboardHighValue El valor ms alto que puede escribirse en el cuadro de texto del
control numrico.
KeyboardLowValue El valor ms bajo que puede escribirse en el cuadro de texto del
control numrico.
SpinnerHighValue El valor ms alto que muestra el control numrico cuando el usuario
hace clic en el botn "Arriba".
SpinnerLowValue El valor ms bajo que muestra el control numrico cuando el usuario
hace clic en el botn "Abajo".
Es posible que en numeras ocasiones desee permitir que los usuarios realicen determinadas acciones
que no tienen nada que ver con la manipulacin de valores. Por ejemplo, puede permitir que un
usuario cierre un formulario, abra otro formulario, se mueva por una tabla, guarde o cancele
modificaciones, ejecute un informe o una consulta, salte a una direccin de un destino de Internet o
una intranet o realice alguna otra accin.
Uno de los lugares ms frecuentes para situar el cdigo para acciones especficas es el evento Click
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 72 de 127
288 of 804
de un botn de comando.
Establezca la propiedad Default como verdadera (.T.) para convertir el botn de comando en la
opcin predeterminada. La opcin predeterminada tiene un borde ms grueso que otros botones de
comando. Si un botn de comando es la opcin predeterminada, cuando el usuario presione
ENTRAR, se ejecutar el evento Click del botn de comando.
Las siguientes propiedades de los botones de comando suelen establecerse en tiempo de diseo.
Propiedad Descripcin
Cancel Especifica que el cdigo asociado al evento Click del botn de comando
se ejecuta cuando el usuario presiona ESC.
Caption Texto que se muestra en el botn.
DisabledPicture Imagen .bmp que se muestra cuando se desactiva el botn.
DownPicture Imagen .bmp que se muestra cuando se presiona el botn.
Enabled Indica si puede elegirse o no el botn.
Picture Imagen .bmp que se muestra en el botn.
Tambin puede incluir botones de comando en un grupo de modo que pueda manipularlos
individualmente o como un grupo.
Si desea trabajar con un nico procedimiento de mtodo para todo el cdigo de los eventos Click de
botones de comando de un grupo, podr adjuntar el cdigo al evento Click del grupo de botones de
comando. La propiedad Value del grupo de botones de comando indica en qu botones se ha hecho
clic, como demuestra el ejemplo de cdigo siguiente:
DO CASE
CASE THIS.Value = 1
WAIT WINDOW "Ha hecho clic en " + THIS.cmdCommand1.Caption NOWAIT
* realizar alguna accin
CASE THIS.Value = 2
WAIT WINDOW "Ha hecho clic en " + THIS.cmdCommand2.Caption NOWAIT
* realizar otra accin
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 73 de 127
289 of 804
CASE THIS.Value = 3
WAIT WINDOW "Ha hecho clic en " + THIS.cmdCommand3.Caption NOWAIT
* realizar una tercera accin
ENDCASE
Nota Si el usuario hace clic en el grupo de botones de comando pero no en un determinado botn, la
propiedad Value seguir reflejando el ltimo botn de comando seleccionado.
Si ha escrito cdigo para el evento Click de un determinado botn del grupo, cuando el usuario elija
ese botn se ejecutar ese cdigo en lugar del cdigo del evento Click del grupo.
Las siguientes propiedades de los grupos de botones de comando suelen establecerse en tiempo de
diseo.
Propiedad Descripcin
ButtonCount Nmero de botones del grupo de comandos.
BackStyle Especifica si el grupo de botones de comando tiene un fondo transparente
u opaco. Un fondo transparente parece tener el mismo color que el que
tiene el objeto subyacente, normalmente el formulario o una pgina.
Puede utilizar el objeto Hyperlink para saltar a una direccin de un destino de Internet o de una
intranet. El objeto Hyperlink se puede utilizar para iniciar una aplicacin que admita hipervnculos,
generalmente un explorador de Internet como Microsoft Internet Explorer, y abrir la pgina
especificada en la direccin. El mtodo Hyperlink NavigateTo( ) le permite especificar la direccin
de destino a la que se salta.
Por ejemplo, para ir al sitio Internet de Microsoft en World Wide Web desde un formulario, agregue
en primer lugar el control Hyperlink al formulario. Agregue un comando al formulario y, a
continuacin, agregue el cdigo siguiente al evento Click del botn de comando:
THISFORM.Hyperlink1.NavigateTo(www.microsoft.com)
Cuando se ejecute el formulario puede hacer clic en el botn de comando para saltar al sitio Web de
Microsoft.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 74 de 127
290 of 804
Los controles Cronmetro responden al paso del tiempo independientemente de la interaccin con el
usuario, de modo que pueden programarse para que realicen acciones a intervalos regulares. Suelen
emplearse para comprobar el reloj del sistema y ver si es hora de llevar a cabo una determinada tarea.
Los cronmetros tambin resultan tiles para otros tipos de procesamiento en segundo plano.
Cada cronmetro tiene una propiedad Interval, que especifica el nmero de milisegundos que
transcurren entre un evento de cronmetro y el siguiente. A menos que se desactive, un cronmetro
contina recibiendo un evento (denominado de acuerdo con el evento Timer) a intervalos de tiempo
aproximadamente iguales. La propiedad Interval tiene algunas limitaciones que deben tenerse en
cuenta cuando se programa un cronmetro:
l El intervalo puede estar entre 0 y 2.147.483.647, inclusive, lo que significa que el intervalo ms
largo es de unas 596,5 horas (ms de 24 das).
l No se garantiza que el intervalo tenga una duracin exacta. Para asegurar la precisin, el
cronmetro debe comprobar el reloj del sistema cuando lo necesita, en lugar de intentar realizar
un seguimiento interno del tiempo acumulado.
l El sistema genera 18 impulsos de reloj por segundo por lo que, aunque la propiedad Interval se
mide en milisegundos, la precisin real de un intervalo no es superior a la decimoctava parte de
un segundo.
l Si su aplicacin u otra distinta sobrecarga el sistema (por ejemplo, a travs de bucles largos,
clculos intensivos o acceso al disco, a la red o al puerto), es posible que la aplicacin no
obtenga eventos de cronmetro con la frecuencia que especifica la propiedad Interval.
Colocar un control Timer en un formulario es como dibujar cualquier otro control: se elige la
herramienta Timer en la barra de herramientas Controles de formularios y se arrastra a un formulario.
Un control Timer
El cronmetro aparece en el formulario en tiempo de diseo de forma que puede seleccionarlo, ver
sus propiedades y escribir un procedimiento de evento para el mismo. En tiempo de ejecucin, el
cronmetro es invisible y su posicin y tamao son irrelevantes.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 75 de 127
291 of 804
Propiedad Valor
Enabled Si desea que el cronmetro comience a funcionar en cuanto se cargue el
formulario, establzcala a verdadero (.T.). De lo contrario, deje esta
propiedad establecida a falso (.F.). Puede elegir un evento externo (como
un clic en un botn de comando) para que se inicie la operacin del
cronmetro.
Interval Nmero de milisegundos entre los eventos del cronmetro.
Observe que la propiedad Enabled del cronmetro es distinta que la de otros objetos. Con la mayora
de los objetos, la propiedad Enabled determina si el objeto puede responder o no a un evento causado
por el usuario. Con el control Timer, al establecer Enabled a falso (.F.) se suspende el funcionamiento
del cronmetro.
Recuerde que el evento Timer es peridico. La propiedad Interval no determina "cunto tiempo", sino
ms bien "con qu frecuencia". La duracin del intervalo debe depender de la precisin que desee.
Puesto que existen posibilidades inherentes de error, cree el intervalo con la mitad de la precisin
deseada.
Cuando transcurre el intervalo del control Timer, Visual FoxPro genera el evento Timer. La respuesta
a este evento suele consistir en comprobar alguna condicin general, como el reloj del sistema.
Un reloj digital es una aplicacin muy sencilla pero de gran utilidad que interviene en un control
Timer. Cuando comprenda cmo funciona la aplicacin, podr mejorarla para que funcione como un
despertador, un cronmetro u otro dispositivo de temporizacin.
La aplicacin de reloj digital incluye un cronmetro y una etiqueta con un borde. En tiempo de
diseo, la aplicacin tiene esta apariencia:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 76 de 127
292 of 804
IF THISFORM.lblTime.Caption != Time()
THISFORM.lblTime.Caption = Time()
ENDIF
La propiedad Interval del cronmetro est establecida a 500, siguiendo la regla de establecer el
intervalo en la mitad del perodo ms corto que desea distinguir (en este caso, un segundo). Esto
puede hacer que el cdigo de cronmetro actualice la etiqueta con la misma hora dos veces en un
segundo, lo que podra producir un parpadeo visible. Por ello, el cdigo comprueba si la hora es
distinta de lo que aparece en la etiqueta antes de cambiar el ttulo.
Mostrar informacin
Uno de los principios de un buen diseo consiste en que la informacin relevante est visible. Puede
utilizar los controles siguientes para mostrar informacin a los usuarios:
l Imgenes
l Etiquetas
l Cuadros de texto
l Cuadros de edicin
l Formas
Usar imgenes
El control Image permite agregar imgenes (archivos .bmp) al formulario. Un control Image tiene la
gama completa de propiedades, eventos y mtodos que tienen otros controles, por lo que puede
cambiarse dinmicamente en tiempo de ejecucin. Los usuarios pueden interactuar con imgenes
haciendo clic, haciendo doble clic, etc.
Propiedad Descripcin
Picture La imagen (archivo .bmp) que se muestra.
BorderStyle Indica si la imagen tiene o no un borde visible.
Stretch Si Stretch se establece a 0 Recortar, no se mostrarn las partes de la
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 77 de 127
293 of 804
imagen que superen las dimensiones del control Image. Si Stretch se
establece a 1 Isomtrico, el control Image conservar las dimensiones
originales de la imagen y mostrar la imagen en la medida que lo
permitan las dimensiones del control Image. Si Stretch se establece a 2
Estirar, la imagen se ajustar para que coincida exactamente con el alto y
el ancho del control Image.
Usar etiquetas
Se pueden cambiar las propiedades Caption y Visible de las etiquetas mediante programacin para
adaptar la etiqueta a la situacin concreta.
Propiedad Descripcin
Caption El texto que muestra la etiqueta.
AutoSize Indica si el tamao de la etiqueta se ajusta a la longitud del ttulo.
BackStyle Indica si la etiqueta es opaca o transparente.
WordWrap Indica si el texto que se muestra en la etiqueta puede ajustarse
automticamente a lneas adicionales.
Establezca la propiedad ReadOnly de cuadros de texto y cuadros de edicin para mostrar informacin
que el usuario puede ver pero no modificar. Si slo desactiva un cuadro de edicin, el usuario no
podr desplazarse por el texto.
Las formas y las lneas ayudan a agrupar visualmente elementos de los formularios. Se ha
comprobado que la asociacin de elementos relacionados ayuda a los usuarios a comprender y utilizar
una interfaz, lo que facilita el uso de la aplicacin.
Las siguientes propiedades del control Shape suelen establecerse en tiempo de diseo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 78 de 127
294 of 804
Propiedad Descripcin
Curvature Un valor entre 0 (ngulos de 90 grados) y 99 (crculo o elipse).
FillStyle Indica si la forma es transparente o tiene un determinado modelo de
relleno del fondo.
SpecialEffect Indica si la forma es sencilla o tridimensional. Slo tiene efecto cuando la
propiedad Curvature se establece a 0.
Propiedad Descripcin
BorderWidth Indica cuntos pxeles de ancho tiene la lnea.
LineSlant Cuando la lnea no es horizontal ni vertical, indica el sentido de la
inclinacin. Los valores vlidos para esta propiedad son una barra
diagonal ( / ) y una barra inversa ( \ ).
Puede mostrar informacin grficamente en un formulario con los siguientes mtodos de formulario.
Mtodo Descripcin
Circle Dibuja una figura circular o un arco en un formulario.
Cls Borra grficos y texto de un formulario.
Line Dibuja una lnea en un formulario.
Pset Establece un punto de un formulario con un determinado color.
Print Imprime una cadena de caracteres en un formulario.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 79 de 127
295 of 804
Los botones de comando, las casillas de verificacin y los botones de opcin pueden mostrar una
imagen adems de un ttulo. Todos estos controles tienen propiedades que permiten especificar
imgenes que se muestran en los controles.
Propiedad Descripcin
DisabledPicture Imagen que se muestra en el botn cuando ste est desactivado.
DownPicture Imagen que se muestra en el botn cuando ste est presionado.
Picture Imagen que se muestra en el botn cuando ste est activado y no
presionado.
Si no especifica una propiedad DisabledPicture, Visual FoxPro mostrar la imagen atenuada cuando
se desactive el control. Si no especifica DownPicture, Visual FoxPro mostrar la imagen con los
colores del fondo cambiados de modo que el botn aparezca presionado cuando se presione el botn.
Si no desea que se muestre un ttulo adems de la imagen, establezca la propiedad Caption como una
cadena vaca eliminando el ttulo predeterminado en el cuadro "Edicin de propiedades" de la
ventana Propiedades.
En muchos casos, una imagen .bmp contiene espacio en blanco que no conviene que aparezca en los
controles. Un borde blanco alrededor de una imagen de forma irregular puede dar una mala apariencia
al control. Para evitar este problema, Visual FoxPro crea una mscara temporal predeterminada para
el .bmp. Las reas en blanco reciben un atributo transparente de modo que sea transparente el color
subyacente del botn o el fondo. Para mantener en blanco algunas reas del .bmp, cree una mscara
para el .bmp que no aplique el valor predeterminado.
2. Pinte de negro todas las reas de la imagen que desea que aparezcan tal como son en el .bmp.
Deje en blanco todas las reas que desea que sean transparentes.
3. Guarde el archivo en el mismo directorio y con el mismo nombre que el archivo .bmp pero con
la extensin .msk.
Cuando Visual FoxPro cargue un archivo .bmp especificado por la propiedad Picture para un botn
de comando, un botn de opcin o una casilla de verificacin, buscar en el mismo directorio un
archivo .msk equivalente. Si en el directorio hay un archivo .msk con el mismo nombre que el .bmp,
Visual FoxPro lo utilizar como mscara para el .bmp. Todas las reas en blanco de la imagen .msk
se convierten en transparentes en el .bmp, mientras que las reas negras de la imagen .msk se
muestran tal como aparecen en el .bmp.
Nota La imagen .bmp y la imagen .msk deben tener las mismas dimensiones para que la mscara
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 80 de 127
296 of 804
pueda representar el rea del .bmp.
Visual FoxPro proporciona una herramienta muy potente, el objeto Grid, para mostrar y manipular
mltiples filas de datos.
Usar cuadrculas
La cuadrcula es un objeto contenedor. Del mismo modo que un conjunto de formularios puede
contener formularios, una cuadrcula puede contener columnas. Las columnas, a su vez, contienen
encabezados y controles, cada uno de los cuales tiene su propio conjunto de propiedades, eventos y
mtodos, lo que proporciona un gran control sobre los elementos de la cuadrcula.
El objeto Grid permite mostrar y manipular filas y columnas de datos de un formulario o una pgina.
Una aplicacin especialmente til del control Grid consiste en crear formularios de uno a varios,
como un formulario de facturas.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 81 de 127
297 of 804
Si no especifica ningn valor RecordSource para la cuadrcula y hay una tabla abierta en el rea de
trabajo actual, la cuadrcula mostrar todos los campos de esa tabla.
Una de las primeras propiedades que puede establecer para el control Grid es el nmero de columnas.
Cuando haya agregado columnas a la cuadrcula, podr cambiar el ancho de las columnas y el alto de
las filas. Podr ajustar de forma manual las propiedades de alto y ancho de los objetos columna y fila
en la ventana Propiedades o bien establecer visualmente estas propiedades en modo de diseo de
cuadrcula.
O bien
Cuando est en modo de diseo de cuadrcula, aparecer un borde grueso alrededor de la cuadrcula.
Para salir de este modo, seleccione el formulario u otro control.
1. En modo de diseo de cuadrcula, site el puntero del mouse entre los encabezados de columna
de la cuadrcula de modo que el puntero cambie a una barra con las flechas que apunta a la
izquierda y la derecha.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 82 de 127
298 of 804
O bien
1. En modo de diseo de cuadrcula, site el puntero del mouse entre el primer botn y el segundo
botn de la parte izquierda del control Grid de modo que el puntero cambie a una barra con las
flechas que apunta hacia arriba y hacia abajo.
O bien
Sugerencia Puede evitar que un usuario cambie la altura de las filas de cuadrcula en tiempo de
ejecucin si establece AllowRowSizing a falso (.F.).
Puede establecer el origen de los datos para la cuadrcula y para cada columna individualmente.
2. Establezca la propiedad RecordSourceType como 0 - Tabla, si desea que Visual FoxPro abra
la tabla o como 1 - Alias si desea que la cuadrcula se llene con los campos de una tabla que ya
est abierta.
4. Escriba el nombre del alias o la tabla que va a servir de origen de datos para la cuadrcula.
Si desea especificar determinados campos para que aparezcan en columnas especficas, tambin
puede establecer el origen de datos para una columna.
2. Escriba el nombre del alias o la tabla y el campo que va a servir como origen para los valores
que se muestran en la columna. Por ejemplo, puede escribir:
Orders.order_id
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 83 de 127
299 of 804
Puede permitir a los usuarios agregar nuevos registros a una tabla mostrada en una cuadrcula si
establece la propiedad AllowAddNew de la cuadrcula a verdadero (.T.). Cuando la propiedad
AllowAddNew est establecida a verdadero, se agregan nuevos registros a la tabla cuando el ltimo
registro est seleccionado y el usuario presiona la tecla FLECHA ABAJO.
Si quiere tener ms control sobre cundo un usuario agrega nuevos registros a una tabla, puede
establecer la propiedad AllowAddNew a falso (.F.), el valor predeterminado, y usar los comandos
APPEND BLANK o INSERT para agregar nuevos registros.
Uno de los usos ms comunes de una cuadrcula consiste en mostrar los registros secundarios de una
tabla, mientras que los cuadros de texto muestran los datos de los registros primarios. Cuando el
usuario se mueve por los registros de la tabla primaria, la cuadrcula muestra los registros secundarios
correspondientes.
Si tiene un entorno de datos para su formulario que incluye una relacin de uno a varios entre dos
tablas, le resultar muy fcil mostrar la relacin de uno a varios en el formulario.
1. Arrastre los campos deseados desde la tabla primaria del Diseador de entorno de datos hasta
el formulario.
En casi todos los casos, ser conveniente crear un entorno de datos para el formulario o el conjunto
de formularios. Sin embargo, no es mucho ms complicado crear un formulario de uno a varios sin
utilizar el Diseador de entornos de datos.
1. Agregue cuadros de texto al formulario para mostrar los campos deseados de la tabla principal.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 84 de 127
300 of 804
relacionada con la tabla principal. Por ejemplo, si la etiqueta ChildOrder est indexada en
"apellido + nombre", establezca RelationalExpr con la misma expresin.
De cualquiera de las formas que establezca el formulario uno a varios, podr agregar controles de
desplazamiento para moverse por la tabla primaria y actualizar los objetos del formulario. Por
ejemplo, el cdigo siguiente puede incluirse en el evento Click de un botn de comando:
Adems de mostrar datos de campos en una cuadrcula, puede tener controles en las columnas de una
cuadrcula para poder mostrar a un usuario cuadros de texto, casillas de verificacin, controles
desplegables, controles numricos y otros tipos de controles incrustados. Por ejemplo, si tiene un
campo lgico en una tabla, cuando ejecute el formulario un usuario podr distinguir qu valores de
registro son verdaderos (.T.) y cules son falsos (.F.) si ve si la casilla de verificacin est activada.
Cambiar el valor es tan fcil como activar o desactivar la casilla de verificacin.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 85 de 127
301 of 804
Sugerencia Si desea poder centrar una casilla de verificacin en una columna de cuadrcula, cree
una clase de contenedor, agregue una casilla de verificacin a la clase de contenedor y ajuste la
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 86 de 127
302 of 804
posicin de la casilla en dicha clase. Agregue la clase de contenedor a la columna de cuadrcula y
establezca la propiedad ControlSource de la casilla de verificacin como el campo deseado.
Si la ventana Propiedades est visible, el nombre del control aparecer en el cuadro Objeto.
Tambin puede agregar controles a una columna de cuadrcula con el mtodo AddObject en el
cdigo.
Por ejemplo, las lneas de cdigo siguientes del evento Init de una cuadrcula agregan dos controles a
una columna de cuadrcula y especifican una de ellas como el control actual:
THIS.grcColumn1.AddObject("spnQuantity", "SPINNER")
THIS.grcColumn1.AddObject("cboQuantity", "COMBOBOX")
THIS.grcColumn1.CurrentControl = "spnQuantity"
* Las siguientes lneas de cdigo aseguran que el control est visible
* y se muestra en cada fila de la cuadrcula
THIS.grcColumn1.spnQuantity.Visible = .T.
THIS.grcColumn1.Sparse = .F.
l spnQuantity
l cboQuantity
Nota Las propiedades establecidas a nivel de cuadrcula no se transfieren a las columnas o los
encabezados. Del mismo modo, deber establecer directamente las propiedades de los encabezados y
los controles contenidos, ya que no heredan sus propiedades de los valores a nivel de columna.
Sugerencia Para presentar mejor los cuadros combinados en columnas de cuadrcula, establezca las
siguientes propiedades de cuadro combinado:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 87 de 127
303 of 804
Por ejemplo, puede agregar una cuadrcula a un formulario y establecer la propiedad ColumnCount a
2. Establezca la propiedad ControlSource de la primera columna como orders.to_name y la
propiedad ControlSource de la segunda columna como orders.order_net. Para mostrar totales de
pedido inferiores a 500,00 con negro como color de primer plano y los totales de pedido mayores o
iguales que 500,00 con rojo como color de primer plano, incluya la lnea siguiente en el cdigo de
evento Init de la cuadrcula:
THIS.Column2.DynamicForeColor = ;
"IIF(orders.order_net >= 500, RGB(255,0,0), RGB(0,0,0))"
Propiedad Descripcin
ChildOrder La clave externa de la tabla secundaria que se combina con la clave
principal de la tabla primaria.
ColumnCount Nmero de columnas. Si ColumnCount est establecida
a - 1, la columna tendr tantas columnas como campos haya en la
propiedad RecordSource de la cuadrcula.
LinkMaster La tabla primaria para registros secundarios que se muestran en la
cuadrcula.
RecordSource Los datos que se muestran en la cuadrcula.
RecordSourceType Indica de dnde provienen los datos que se muestran en la cuadrcula:
una tabla, un alias, una consulta o una tabla seleccionada por el
usuario como respuesta a una peticin.
Propiedad Descripcin
ControlSource Los datos que se muestran en la columna. Suele ser un campo de una
tabla.
Sparse Si Sparse se establece como verdadero (.T.), los controles de una
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 88 de 127
304 of 804
cuadrcula slo se mostrarn como controles cuando se seleccione la
celda de la columna. Otras celdas de la columna muestran el valor de
datos subyacente en un cuadro de texto. Si establece Sparse como
verdadero (.T.), la actualizacin ser ms rpida si un usuario se desplaza
por una cuadrcula con muchas filas visibles.
CurrentControl Indica cul es el control activo de la cuadrcula. El valor predeterminado
es Text1, pero si agrega un control a la columna, podr especificarlo
como CurrentControl.
Nota La propiedad ReadOnly de un control de una columna queda anulada por la propiedad
ReadOnly de la columna. Si establece la propiedad ReadOnly del control de una columna en el
cdigo asociado al evento AfterRowColChange, el nuevo valor ser vlido mientras se encuentre en
esa celda.
Un usuario puede elegir un control en cualquier lugar del formulario; para ello debe presionar ALT y
la tecla correspondiente.
l Site una barra inversa y un signo menor que (\<) delante de la letra deseada en la propiedad
Caption del control.
Por ejemplo, el valor de la propiedad siguiente para el ttulo de un botn de comando convierte la
letra A en la tecla de acceso.
\<Abrir
Un usuario puede elegir el botn de comando desde cualquier lugar del formulario presionando
ALT+A.
Para especificar una tecla de acceso para un cuadro de texto o un cuadro de edicin
1. Cree una etiqueta con una barra invertida y un signo menos (\<) delante de la letra deseada,
como C\<liente.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 89 de 127
305 of 804
El orden de tabulacin predeterminado de los controles del formulario es el orden en que se agregan
los controles al formulario.
Sugerencia Establezca el orden de tabulacin de los controles de forma que el usuario pueda
moverse fcilmente por los controles en un orden lgico.
2. Haga doble clic en el cuadro situado junto al control que desea que tenga el enfoque inicial
cuando se abra el formulario
3. Haga clic en el cuadro situado junto a los otros controles en el orden en que quiere que se
llegue a ellos mediante tabulaciones.
4. Haga clic en cualquier lugar fuera de los cuadros de orden de tabulacin para terminar.
Tambin puede establecer el orden de tabulacin para los objetos del formulario por lista, segn los
valores de la ficha Formularios en el cuadro de dilogo Opciones.
Puede establecer el orden de seleccin para los botones de opcin y de comando de un grupo de
controles. Para mover un grupo de controles con el teclado, el usuario tabula al primer botn del
grupo de controles y, a continuacin, usa las flechas para seleccionar otros botones del grupo.
1. En la ventana Propiedades, seleccione el grupo en la lista Objeto. Un borde grueso indica que
el grupo est en modo de edicin.
4. Establezca el orden de seleccin de la misma forma que lo hara para el orden de tabulacin
para controles.
Cada control tiene una propiedad ToolTipText que permite especificar el texto que se muestra cuando
el usuario detiene el puntero del mouse sobre el control. La Informacin sobre herramientas es
especialmente til para los botones que tienen iconos en lugar de texto.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 90 de 127
306 of 804
Puede cambiar la presentacin del puntero del mouse para que proporcione pistas visuales a sus
usuarios sobre los distintos estados en los que puede estar la aplicacin.
Si quiere cambiar el puntero del mouse a otro que no sea uno de los punteros predeterminado,
establezca la propiedad MousePointer a 99 - Personalizado y establezca la propiedad MouseIcon
como su propio archivo de cursor (.cur) o de icono (.ico).
Establezca la propiedad Enabled del control como falsa (.F.) si la funcionalidad del control no est
disponible en una determinada situacin.
frmForm1.cmgCommandGroup1.Enabled = .T.
Cuando se establece como falsa (.F.) la propiedad Enabled de un grupo de botones de opcin o de un
grupo de botones de comando, se deshabilitan todos los botones del grupo, pero no se muestran con
las propiedades ForeColor y BackColor deshabilitadas. Al establecer la propiedad Enabled del grupo
no cambia la propiedad Enabled de los botones individuales del grupo. De este modo, se puede
deshabilitar un grupo de botones con algunos de los botones ya deshabilitados. Cuando se habilita el
grupo, los botones que estaban deshabilitados originalmente permanecen deshabilitados.
Si desea deshabilitar todos los botones de un grupo para que aparezcan deshabilitados y no desea
conservar informacin sobre qu botones estaban deshabilitados o habilitados originalmente, puede
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 91 de 127
307 of 804
utilizar el mtodo SetAll del grupo, de este modo:
frmForm1.opgOptionGroup1.SetAll("Enabled", .F.)
Cuando se disean aplicaciones de Visual FoxPro, se puede arrastrar texto, archivos y objetos desde
la Galera de componentes, el Administrador de proyectos, el Diseador de bases de datos y el
Diseador de entornos de datos hasta las ubicaciones deseadas de formularios e informes. Las
caractersticas de arrastrar y colocar de Visual FoxPro permiten ampliar esta capacidad al usuario en
tiempo de ejecucin.
Ahora, Visual FoxPro admite dos tipos de operaciones de arrastrar y colocar: arrastrar y colocar de
OLE y arrastrar y colocar controles. Arrastrar y colocar de OLE, le permite mover datos entre otras
aplicaciones que admiten arrastrar y colocar de OLE (como Visual FoxPro, Visual Basic, el
Explorador de Windows, Microsoft Word y Excel, etc.). En una aplicacin distribuida de Visual
FoxPro puede mover datos entre controles de la aplicacin o entre controles y otras aplicaciones para
Windows que admitan arrastrar y colocar de OLE.
Arrastrar y colocar controles le permite arrastrar y colocar controles de Visual FoxPro en sus
aplicaciones de Visual FoxPro. Tambin se admite en versiones anteriores de Visual FoxPro. Cuando
el usuario arrastra un control, Visual FoxPro proporciona un contorno gris del mismo tamao que el
objeto y que se mueve con el puntero del mouse. Puede pasar por alto este comportamiento
predeterminado si especifica un archivo de cursor (.cur) para la propiedad DragIcon de un control.
Esta seccin describe el proceso de arrastrar y colocar controles. Para obtener ms informacin acerca
de arrastrar y colocar de OLE, vea Tcnica arrastrar y colocar de OLE en el captulo 31,
"Interoperabilidad e Internet".
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 92 de 127
308 of 804
Si emplea las siguientes propiedades, eventos y mtodos de arrastrar y colocar, podr especificar el
significado de una operacin de arrastrar y cmo puede iniciarse el arrastre (si se inicia) para un
determinado control.
Todos los controles visuales pueden arrastrarse en tiempo de ejecucin y todos los controles
comparten las propiedades que se indican en la tabla anterior. Los formularios reconocen los eventos
DragDrop y DragOver, pero no tienen propiedades DragMode y DragIcon.
Para permitir que el usuario arrastre un control siempre que haga clic en el control, establezca su
propiedad DragMode como 1. De este modo se habilitar el arrastre automtico del control. Cuando
se establece como Automtico, el arrastre siempre est activado.
Nota Mientras se produce una operacin de arrastre automtico, el control que se arrastra no
reconoce otros eventos del mouse.
Cuando el usuario suelta el botn del mouse despus de arrastrar un control, Visual FoxPro genera un
evento DragDrop. Hay muchas formas de responder a este evento. Se puede colocar el control en la
nueva ubicacin (indicada por la ltima posicin del contorno gris). Recuerde que el control no se
mueve automticamente a la nueva ubicacin.
Hay dos trminos muy importantes relativos a las operaciones de arrastrar y colocar: origen y destino.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 93 de 127
309 of 804
Trmino Significado
Origen El control que se arrastra.
Destino El objeto sobre el que el usuario coloca el control. Este objeto, que puede
ser un formulario o un control, reconoce el evento DragDrop.
Un control se convierte en el destino si la posicin del mouse se encuentra dentro de sus bordes
cuando se suelta el botn. Un formulario es el destino si el puntero est en una parte en blanco del
formulario.
El evento DragDrop recibe tres parmetros: oSource, nXCoord y nYCoord. El parmetro oSource es
una referencia al control que se coloc sobre el destino. Los parmetros nXCoord y nYCoord
contienen, respectivamente, las coordenadas horizontal y vertical del puntero del mouse dentro del
destino.
Puesto que oSource es un objeto, se utiliza del mismo modo que un control; se puede hacer referencia
a sus propiedades o llamar a uno de sus mtodos. Por ejemplo, las instrucciones siguientes del cdigo
asociado al evento DragDrop comprueban si el usuario ha colocado un control sobre s mismo:
Todos los tipos posibles de control para oSource tienen una propiedad Visible. Por lo tanto, un
control puede hacerse invisible cuando se coloca en una determinada parte de un formulario o sobre
otro control. La siguiente lnea del cdigo asociado al evento DragDrop de un control Image hace que
un control arrastrado desaparezca cuando se coloca sobre una imagen:
Al habilitar arrastrar y colocar, puede ayudar a los usuarios; para ello, incluya claves visuales sobre
dnde pueden y dnde no pueden colocar un control. Para ello, lo mejor que se puede hacer es
cambiar la propiedad DragIcon del origen en el cdigo asociado al evento DragOver.
El siguiente cdigo del evento DragOver de un control indica a un usuario que el control no es un
destino de colocacin vlido. En este ejemplo, cOldIcon es una propiedad del formulario definida
por el usuario.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 94 de 127
310 of 804
CASE nState = 1 && Salir
oSource.DragIcon = THISFORM.cOldIcon
ENDCASE
Visual FoxPro tiene un valor Manual para la propiedad DragMode que proporciona ms control que
el valor Automtico. El valor Manual permite especificar cundo se puede y cundo no se puede
arrastrar un control. (Cuando DragMode se establece como Automtico, el control siempre se puede
arrastrar a condicin de que no se cambie el valor).
Por ejemplo, puede que necesite habilitar el arrastre como respuesta a eventos MouseDown y
MouseUp o como respuesta a un comando del teclado o de men. La configuracin Manual tambin
permite reconocer un evento MouseDown antes de comenzar a arrastrar, de modo que pueda registrar
la posicin del mouse.
Para habilitar el arrastre desde cdigo, deje DragMode en su valor predeterminado (0 Manual). A
continuacin, utilice el mtodo Drag cuando quiera comenzar o detener el arrastre de un objeto:
container.control.Drag(nAction)
Si nAction es 1, el mtodo Drag iniciar el arrastre del control. Si nAction es 2, se colocar el control,
lo cual producir un evento DragDrop. El valor 0 para nAction cancela el arrastre. El efecto es similar
a dar el valor 2, salvo que no se produce ningn evento DragDrop.
Nota Para activar la capacidad de arrastrar y colocar desde un cuadro de lista, el mejor lugar para
llamar al mtodo Drag es el cdigo asociado al evento MouseMove del cuadro de lista de origen,
despus de determinar que el botn del mouse est presionado. Para ver un ejemplo, consulte
Lmover.scx en el directorio ...\Samples\Vfp98\Solution\Controls\Lists de Visual Studio.
Puede interesar que el control de origen cambie de posicin cuando el usuario libere el botn del
mouse. Para mover un control a la nueva ubicacin del mouse, use el mtodo Move. Por ejemplo, el
siguiente cdigo de evento DragDrop de un formulario mueve el control que se arrastra a la nueva
ubicacin:
Es posible que este cdigo no produzca con precisin los efectos deseados, ya que la esquina superior
izquierda del control est situada en la ubicacin del mouse. El cdigo siguiente sita el centro del
control en la ubicacin del mouse:
El cdigo funciona mejor cuando se establece DragIcon con un valor distinto del predeterminado
(rectngulo gris). Cuando se usa el rectngulo gris, normalmente se desea mover el control de forma
precisa a la posicin final del rectngulo gris. Para ello, registre la posicin inicial del mouse en el
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 95 de 127
311 of 804
control de origen. A continuacin, use esta posicin como referencia cuando mueva el control. Para
ver un ejemplo, vea Ddrop.scx en el directorio ...\Samples\Vfp98\Solution\Forms de Visual Studio.
Ampliar formularios
Los marcos de pgina permiten ampliar la superficie de los formularios y los controles ActiveX
permiten ampliar la funcionalidad de los formularios.
Un marco de pgina es un objeto contenedor que contiene pginas. A su vez, las pginas contienen
controles. Las propiedades pueden establecerse a nivel de marco de pgina, de pgina o de control.
2. En la vista de rbol, haga clic en Controles y, a continuacin, haga clic en Marco de pginas.
El marco de pgina puede considerarse como un contenedor tridimensional que presenta pginas en
capas. Slo los controles de la pgina superior (o sobre el marco de pgina) pueden estar visibles y
activos.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 96 de 127
312 of 804
El marco de pgina define la ubicacin de las pginas y la cantidad de pgina que est visible. La
esquina superior izquierda de una pgina est acoplada a la esquina superior izquierda del marco de
pgina. Los controles pueden situarse en pginas que van ms all de las dimensiones del marco de
pgina. Estos controles estn activos, pero no son visibles a menos que se cambien mediante
programacin las propiedades Height y Width del marco de pgina para hacer visibles los controles.
Con marcos de pgina y pginas, se pueden crear formularios o cuadros de dilogo con fichas con los
mismos tipos de capacidades de interfaz que se ven en el Administrador de proyectos.
Asimismo, los marcos de pgina permiten definir una regin del formulario en la que pueden
intercambiarse fcilmente controles. Por ejemplo, en los Asistentes, la mayor parte del formulario
permanece constante, pero un rea del formulario cambia con cada paso. En lugar de crear cinco
formularios con pasos de asistente, puede crear un formulario con un marco de pgina y cinco
pginas.
2. Establezca la propiedad PageCount para indicar el nmero de pginas que se van a incluir en el
marco.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 97 de 127
313 of 804
3. En el men contextual del marco, elija Modificar para activar el marco como contenedor. El
borde del marco de pgina se ampla para indicar que est activo.
Nota Al igual que otros controles de contenedor, seleccione el marco de pgina y elija
Modificar en el men que aparece al presionar el botn secundario del mouse o seleccione el
contenedor en la lista desplegable "Objeto" de la ventana Propiedades, de modo que se
seleccione el contenedor (es decir, tenga un borde ms amplio) antes de agregar controles a la
pgina que est diseando. Si no activa el marco de pgina como contenedor antes de agregar
controles, los controles se agregarn al formulario en lugar de a la pgina, aunque puede
parecer que estn en la pgina.
1. Active el marco de pginas como contenedor; para ello, haga clic con el botn secundario del
mouse y elija Modificar.
O bien
O bien
Cuando se agregan controles a una pgina, slo estn visibles y activos cuando su pgina est activa.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 98 de 127
314 of 804
2. En la barra de herramientas Controles de formularios, elija el botn del control que desea y
arrstrelo para ajustarlo a la pgina.
Si los ttulos de las fichas son ms largos de lo que puede mostrarse en la ficha dado el ancho del
marco de pgina y el nmero de pginas, dispone de dos opciones:
l Establezca la propiedad TabStretch como 1 - Recortar para mostrar slo los caracteres de los
ttulos que se ajustan a las fichas. Recortar es el valor predeterminado.
l Establezca la propiedad TabStretch como 0 - Pila para apilar las fichas de modo que sea visible
el ttulo completo de todas las fichas.
Tanto si el marco de pgina se muestra con fichas como si no, es posible convertir en activa una
pgina mediante programacin con la propiedad ActivePage. Por ejemplo, el siguiente cdigo del
procedimiento de evento Click de un botn de comando de un formulario cambia la pgina activa de
un marco de pginas del formulario en la tercera pgina:
THISFORM.pgfOptions.ActivePage = 3
Las propiedades siguientes de los marcos de pginas suelen establecerse en tiempo de diseo.
Propiedad Descripcin
Tabs Especifica si las fichas son visibles o no para las pginas.
TabStyle Especifica si las fichas tienen o no el mismo tamao y si juntas ocupan el
mismo ancho que el marco de pginas.
PageCount El nmero de pginas del marco de pgina.
Agregue un objeto OLE a un formulario; para ello haga clic en esta herramienta y arrstrela para
ajustar su tamao en la ventana Formulario. Esta herramienta puede representar un objeto servidor
como Microsoft Excel o Microsoft Word, o puede representar un control ActiveX si el directorio
SYSTEM de Windows contiene controles ActiveX (archivos con una extensin .ocx). Para obtener
informacin general sobre los controles ActiveX, consulte el captulo 16, Agregar OLE.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 99 de 127
315 of 804
Puede crear un objeto ActiveX dependiente en un formulario; para ello, haga clic en esta herramienta
y arrstrela para ajustar su tamao en la ventana Formulario. Despus de crear el objeto, conctelo a
un campo General de la tabla. A continuacin, utilice el objeto para mostrar el contenido del campo.
Por ejemplo, si almacena documentos de Word en un campo de tipo General, podr mostrar el
contenido de estos documentos con un objeto OLE dependiente en un formulario.
3. Vincule el objeto ActiveX a un campo de tipo General; para ello, establezca la propiedad
ControlSource del objeto.
Para ver un ejemplo de cmo se usa el control ActiveX dependiente, consulte el captulo 16, Agregar
OLE.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 100 de 127
316 of 804
Cada componente de una aplicacin de Visual FoxPro puede tener su propio sistema de mens o
conjunto de mens. En las secciones siguientes se describe la forma de crear un sistema de mens,
pero no se indica cmo incorporarlo a una aplicacin. Si desea informacin al respecto, consulte el
captulo 13, Compilar una aplicacin.
Diseador de mens
Decida los mens que necesita, dnde deben aparecer en la interfaz, cules requieren
submens, etc. Si desea ms informacin sobre el diseo de sistemas de mens, consulte
Disear un sistema de mens, ms adelante en este mismo captulo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 101 de 127
317 of 804
Especifique las tareas que los mens deben realizar, como mostrar formularios y cuadros de
dilogo. Incluya tambin un preprograma y postprograma si es conveniente. El preprograma se
ejecuta antes de que se defina el sistema de mens y puede incluir cdigo para abrir archivos,
declarar variables de memoria o colocar el sistema de mens en una pila de forma que se pueda
recuperar despus. El postprograma contiene los procedimientos que usted escribe, se ejecuta
despus del cdigo de definicin de los mens y determina los elementos de men disponibles
o no disponibles para su seleccin.
La utilidad de una aplicacin puede depender de la calidad de sus sistemas de mens. Si dedica
tiempo de diseo a los mens, los usuarios los aceptarn con facilidad y los aprendern rpidamente.
l Organice el sistema segn las tareas que vayan a realizar los usuarios y no segn la jerarqua de
los programas de la aplicacin.
Si no puede predecir la frecuencia de uso ni determinar un orden lgico, ordene los elementos
de men alfabticamente. El orden alfabtico es especialmente efectivo cuando un men
contiene ms de ocho elementos. Con tantos elementos, el usuario dedica tiempo a la bsqueda
y la ordenacin alfabtica la facilitar.
Por ejemplo, ALT+F podra ser una tecla de acceso para un men Archivo.
Utilice palabras comunes, evitando la jerga informtica y utilice verbos simples y activos para
indicar las acciones que resultarn de elegir cada elemento de men. No utilice nombres como
verbos. Describa tambin los elementos de mens con construcciones paralelas. Por ejemplo, si
utiliza una nica palabra para todos los elementos, use el mismo tipo de palabra para todos
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 102 de 127
318 of 804
ellos.
Una vez diseado el sistema de mens, puede crearlo con el Diseador de mens. Puede crear mens,
elementos de men, submens, lneas para separar grupos de elementos relacionados, etc. En las
secciones siguientes se explica detalladamente la manera de hacerlo.
Crear mens
Para crear mens, puede personalizar el sistema de mens de Visual FoxPro o bien desarrollar un
sistema propio. Para partir del sistema de mens de Visual FoxPro, utilice la funcin Men rpido.
2. Elija Men.
El Diseador de mens contendr ahora informacin sobre los mens principales de Visual
FoxPro.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 103 de 127
319 of 804
Por ejemplo, inserte un men Cliente delante del men Ayuda; para ello, haga clic en el botn
de movimiento asociado al men Ayuda, haga clic en el botn Insertar y escriba Cliente en la
columna Indicador. El resultado tendr el siguiente aspecto:
Sugerencia Arrastre los botones de movimiento para cambiar la posicin de los mens en la barra
de mens.
Si necesita un men Ayuda, sitelo en ltimo lugar en la barra de mens, de modo que los usuarios
puedan encontrarlo rpidamente.
Visual FoxPro le pedir que guarde el sistema de mens en un archivo con la extensin .MNX. Este
archivo es una tabla que almacena toda la informacin sobre el sistema de mens. Despus de haber
guardado el sistema de mens, Visual FoxPro le pedir un archivo de salida con la extensin .MPR.
Este archivo contendr el programa de men generado.
Los mens contextuales aparecen cuando hace clic con el botn secundario del mouse en un control o
un objeto, y proporcionan una forma rpida de ofrecer todas las funciones que se aplican a ese objeto
exclusivamente. Puede usar Visual FoxPro para crear mens contextuales y, a continuacin, adjuntar
estos mens a controles. Por ejemplo, puede crear un men contextual que contenga los comandos
Cortar, Copiar y Pegar, y que aparecer cuando el usuario haga clic con el botn secundario en datos
contenidos en un control Grid.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 104 de 127
320 of 804
Cuando est en el Diseador de mens contextuales, el proceso para agregar elementos de men es el
mismo que para la creacin de mens.
Para ver un ejemplo de mens contextuales, ejecute Solution.app, ubicado en el directorio ...
\Samples\Vfp98\Solution de Visual Studio.
Los mens SDI son mens que aparecen en ventanas de interfaz de un nico documento (SDI). Para
crear un men SDI debe indicar que el men se va a usar en un formulario SDI cuando est diseando
el men. Aparte de esto, el proceso de creacin de un men SDI es el mismo que el de creacin de un
men normal.
l Mientras el Diseador de mens est abierto, elija Opciones generales en el men Ver y
seleccione Formulario de nivel superior.
Una vez creados los mens, puede colocar en ellos elementos de men. Los elementos de men
pueden representar comandos o procedimientos de Visual FoxPro que tenga que ejecutar el usuario o
bien pueden contener submens que a su vez ofrezcan otros elementos.
1. En la columna Indicador, haga clic en el ttulo del men al que desee agregar elementos.
Aparecer una ventana de diseo vaca, en la que puede introducir los elementos de men.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 105 de 127
321 of 804
Crear submens
Para cada elemento de men, puede crear un submen con elementos adicionales.
Aunque normalmente los mens y sus elementos se crean con el Diseador de mens, tambin es
posible crearlos con comandos de Visual FoxPro. Por ejemplo, puede crear un men con DEFINE
PAD, un submen con DEFINE POPUP y elementos del submen con una serie de comandos
DEFINE BAR.
Para mejorar la legibilidad, puede separar grupos de elementos de men similares con lneas
divisorias. Por ejemplo, en Visual FoxPro, el men Edicin tiene una lnea que separa los comandos
Deshacer y Rehacer de los comandos Cortar, Copiar, Pegar y Pegado especial.
1. En la columna Indicador, escriba \-. De esta forma se crea una lnea divisoria.
2. Arrastre el botn situado a la izquierda del indicador \- para desplazar la lnea divisoria hasta
situarla en el lugar deseado.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 106 de 127
322 of 804
Puede usar la opcin Guardar como HTML del men Archivo cuando cree un men para guardar
su contenido como un archivo HTML (Lenguaje de marcado de hipertexto).
1. Abra el men.
2. Elija Guardar como HTML en el men Archivo. (Se le pedir que guarde el men si lo ha
modificado).
3. Escriba el nombre del archivo HTML que desea crear y elija Guardar.
Cuando haya creado y generado un men contextual, puede adjuntarlo a un control. Los mens
contextuales aparecen tpicamente cuando el usuario hace clic con el botn secundario en un control.
Puede adjuntar un men contextual a un control especfico si escribe una pequea cantidad de cdigo
en el evento clic asociado al botn secundario del control.
Nota Asegrese de usar la extensin .mpr al hacer referencia a los mens contextuales.
Cuando cree un men SDI, puede adjuntarlo a un formulario SDI. Adems, debe:
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 107 de 127
323 of 804
Al crear un sistema de mens, debe considerar la facilidad de acceso al mismo y tambin asignarle
tareas. Es conveniente definir teclas de acceso para facilitar la entrada al sistema de mens, y hay que
asignar a los mens y a sus elementos tareas que deben realizar, como mostrar formularios, barras de
herramientas y otros sistemas de mens. Debe definir teclas de acceso para permitir la entrada al
sistema de mens. Tambin puede agregar mtodos abreviados de teclado y activar o desactivar
elementos de men para conseguir un mayor control.
Los mens bien diseados cuentan con teclas de acceso para conseguir un acceso rpido por el
teclado a la funcionalidad del men. La tecla de acceso se representa en el ttulo o elemento de men
con una letra subrayada. Por ejemplo, el men Archivo de Visual FoxPro utiliza la "A" como tecla de
acceso.
Si no asigna una tecla de acceso a un ttulo o elemento de men, Visual FoxPro asignar
automticamente la primera letra como tecla de acceso. Por ejemplo, para el men Cliente creado
anteriormente no se defini ninguna tecla de acceso y por ello Visual FoxPro le asign su primera
letra (C).
l Escriba \< a la izquierda de la letra que desee que acte como tecla de acceso.
Por ejemplo, para hacer que la tecla de acceso del ttulo del men Cliente sea "l", sustituya
Cliente por C\<liente en la columna Indicador.
Solucin de problemas Si una tecla de acceso a un men no funciona, compruebe si hay teclas de
acceso duplicadas.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 108 de 127
324 of 804
Adems de asignar teclas de acceso, puede especificar mtodos abreviados de teclado para los mens
o sus elementos. Como ocurre con las teclas de acceso, los mtodos abreviados de teclado permiten
elegir un men o un elemento de men al mantener presionada una tecla mientras presiona otra. La
diferencia entre las teclas de acceso y los mtodos abreviados de teclado es que estos ltimos pueden
utilizarse para elegir un elemento de men sin tener que mostrar primero el men correspondiente.
Los mtodos abreviados de teclado para los elementos de men de Visual FoxPro son combinaciones
de la tecla CTRL o ALT con otra tecla. Por ejemplo, en Visual FoxPro puede crear un archivo nuevo
si presiona CTRL+N
3. En el cuadro Etiqueta de tecla, presione una combinacin de teclas para crear un mtodo
abreviado de teclado.
4. En el cuadro Texto de tecla, agregue el texto que desee que aparezca junto al elemento de
men.
De forma predeterminada, Visual FoxPro repite el mtodo abreviado de teclado del cuadro
Etiqueta de tecla en el cuadro Texto de tecla. Sin embargo, puede modificar el contenido de
Texto de tecla. Por ejemplo, si tanto en Etiqueta de tecla y Texto de tecla aparece CTRL+R,
puede cambiar el contenido de Texto de tecla por ^R.
Nota CTRL+J es un mtodo abreviado de teclado no vlido porque se usa para cerrar ciertos
cuadros de dilogo en Visual FoxPro.
Puede activar o desactivar un men o un elemento de men basndose en una condicin lgica.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 109 de 127
325 of 804
Generador de expresiones
4. En el cuadro Saltar por, escriba la expresin que determinar si el men est activado o
desactivado.
Nota Una vez mostrado el sistema de mens, puede activar y desactivar los mens y sus
elementos con el comando SET SKIP OF..
En un men, una marca de verificacin junto a un elemento indica que est activo. Por ejemplo, si
coloca una marca de verificacin junto al elemento Crdito del men Cliente antes creado, esta
opcin quedar activada.
En tiempo de ejecucin puede colocar una marca de verificacin junto a un elemento de men
mediante el comando SET MARK OF.
Para ver un ejemplo sobre cmo desactivar y marcar el estado de elementos de men, ejecute
Solution.app en el directorio ...\Samples\Vfp98\Solution de Visual Studio.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 110 de 127
326 of 804
Cuando se selecciona un men o un elemento de men, ste realiza una tarea, como mostrar un
formulario, una barra de herramientas o bien otro sistema de mens. Para realizar una tarea, el men
o elemento deber ejecutar un comando de Visual FoxPro. Este comando puede estar contenido en
una lnea o puede ser una llamada a procedimiento.
Para realizar una tarea, puede asignar un comando a un men o elemento de men. Puede tratarse de
cualquier comando vlido de Visual FoxPro, incluyendo una llamada a un programa que exista en la
ruta de acceso o a un procedimiento definido en la opcin Postprograma del cuadro de dilogo
Opciones generales. Para obtener ms informacin, consulte Crear un procedimiento predeterminado
para un sistema de mens, ms adelante en este mismo captulo.
Si el comando llama a un procedimiento del postprograma del men, utilice el comando DO con la
sintaxis siguiente:
DO nombreproc IN nombremen
En esta sintaxis, nombremen especifica la ubicacin del procedimiento. Se trata del nombre del
archivo de men y debe tener la extensin .mpr. Si no especifica la ubicacin en nombremen, deber
hacerlo con SET PROCEDURE a nombremen.mpr, si el procedimiento se encuentra en el
postprograma del men.
Para mostrar un formulario, conjunto de formularios o cuadro de dilogo compilados desde un men
o un elemento de men, puede llamarlos con un comando o con un procedimiento. Por ejemplo, para
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 111 de 127
327 of 804
mostrar un formulario llamado "Pedidos", utilice el comando siguiente:
DO FORM Pedidos
Si crea una barra de herramientas personalizada para una aplicacin, puede mostrarla llamndola
desde un men o un elemento de men. Si desea ms informacin al respecto, consulte Crear barras
de herramientas personalizadas ms adelante en este mismo captulo.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 112 de 127
328 of 804
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 113 de 127
329 of 804
O bien
l Haga clic en el botn Modificar y luego en Aceptar, para abrir una ventana de edicin
independiente para escribir o llamar a un procedimiento.
Para ajustar el sistema de mens a sus necesidades, puede agregarle un postprograma. Normalmente,
el postprograma contiene cdigo que activa o desactiva inicialmente los mens y sus elementos.
Cuando genera y ejecuta el programa de men, el preprograma y el cdigo de definicin de men se
procesan antes que el postprograma.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 114 de 127
330 of 804
Todos los mens de Visual FoxPro tienen dos nombres y cada elemento de men tiene un nombre y
un nmero. Visual FoxPro utiliza un nombre en la interfaz de usuario y el otro nombre o el nmero
en el programa de men generado (.mpr). Puede usar estos nombres o nmeros para hacer referencia
a mens de control y a elementos de men en tiempo de ejecucin. Si no proporciona un nombre o un
nmero al crear mens y elementos de men, Visual FoxPro crea uno cuando genera el programa de
men.
Para ver un ejemplo de adicin y eliminacin de mens en tiempo de ejecucin, vea Solution.app en
el directorio ...\Samples\Vfp98\Solution de Visual Studio.
Precaucin Evite utilizar nombres y nmeros generados en el cdigo, ya que cambiarn cada vez
que se genere el programa de men. Si hace referencia a un nombre o nmero generado, el cdigo
puede fallar.
Usar Ttulo de men para hacer referencia a un ttulo de men en el programa de men
generado
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 115 de 127
331 of 804
3. En el cuadro de dilogo Ttulo de men, escriba el nombre que prefiera.
Sugerencia Si utiliza la funcin Men rpido, no cambie los nombres o nmeros que
proporciona Visual FoxPro para los mens y elementos de men, pues de lo contrario podra
obtener resultados impredecibles al ejecutar el programa de men generado.
Las siguientes secciones describen la forma de crear barras de herramientas personalizadas para sus
aplicaciones. Para ver ms informacin acerca de la personalizacin de las barras de herramientas
incluidas con Visual FoxPro, busque Personalizar barras de herramientas.
Para crear una barra de herramientas personalizada, debe definir primero una clase para la misma.
Visual FoxPro ofrece una clase de base ToolBar a partir de la cual puede crear la clase que necesite.
Despus de definir una clase de barra de herramientas, puede agregar un objeto a la clase barra de
herramientas y, a continuacin, definir las propiedades, eventos y mtodos para la barra de
herramientas personalizada. Finalmente, puede agregar la barra de herramientas a un conjunto de
formularios.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 116 de 127
332 of 804
3. En el cuadro Basado en, seleccione Toolbar para utilizar la clase de base Toolbar.
O bien
Elija el botn del dilogo para elegir otra clase de barra de herramientas.
O bien
Haga clic en el botn con tres puntos para seleccionar una biblioteca existente.
Por ejemplo, podra almacenar una clase de impresin basada en la clase de base ToolBar de una
biblioteca de inventario.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 117 de 127
333 of 804
Tambin puede definir una clase de barra de herramientas de las maneras siguientes:
Despus de crear una clase de barra de herramientas personalizada puede agregarle objetos,
incluyendo cualquier objeto admitido por Visual FoxPro. Por ejemplo, puede agregar objetos de la
barra de herramientas Controles de formularios.
3. Ponga el objeto en la barra de herramientas personalizada; para ello, haga clic en dicha barra.
4. Repita los pasos 2 y 3 hasta que la barra de herramientas personalizada est completa.
Por ejemplo, puede ajustar el tamao de los objetos, arrastrarlos, eliminarlos haciendo clic en a
tecla SUPR o agregar espacio adicional entre ellos insertando objetos separadores de la barra
de herramientas Controles de formularios.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 118 de 127
334 of 804
7. Guarde la clase de barra de herramientas personalizada.
Despus de definir una clase de barra de herramientas, puede crear una barra de herramientas a partir
de la misma. Puede coordinar barras de herramientas y formularios con el Diseador de formularios o
mediante programacin.
Puede agregar una barra de herramientas a un conjunto de formularios de forma que dicha barra se
abra junto con los formularios del conjunto de formularios. No puede agregar la barra de
herramientas directamente al formulario.
2. Abra el conjunto de formularios con el que desea utilizar la clase de barra de herramientas,
haga clic en el botn Ver clases en la barra de herramientas Controles de formulario y
seleccione la clase de barra de herramientas en la lista que aparecer.
5. Defina las acciones de la barra de herramientas y sus botones (consulte "Definir acciones de
barra de herramientas" en la prxima seccin).
Para obtener ms informacin sobre cmo registrar y seleccionar la biblioteca que contiene la clase
de barra de herramientas, consulte "Adicin de clases a formularios, conjuntos de formularios y
barras de herramientas" en el captulo 3, Programacin orientada a objetos.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 119 de 127
335 of 804
l En el evento Init del conjunto de formularios, utilice el comando SET CLASSLIB para
especificar la biblioteca que contiene la clase de barra de herramientas y despus cree una barra
de herramientas desde esa clase en el conjunto de formularios.
Por ejemplo, para agregar y ver la barra de herramientas tbrPrint, que est basada en la clase
printing de la biblioteca de clases inventory, agregue el cdigo siguiente al evento Init del
conjunto de formularios:
Nota Si la clase de barra de herramientas no define las acciones de la barra de herramientas y sus
botones, deber definir las acciones en los procedimientos de evento asociados a la barra de
herramientas y sus botones. Para obtener ms informacin al respecto, consulte "Definir acciones de
barra de herramientas".
Puede definir todos los aspectos de una barra de herramientas en el cdigo. Por ejemplo, si agrega el
cdigo siguiente al evento Init de un conjunto de formularios, cuando se cargue el conjunto de
formularios Visual FoxPro crear y mostrar la barra de herramientas definida en el cdigo. Esta
barra contiene dos botones.
Cuando se haga clic en estos botones, cambiarn los atributos de fuente del formulario frmForm1 del
conjunto de formularios.
Cdigo Comentarios
THIS.AddObject("tbrTool1","mibarra") Agrega una barra de herramientas de la
THIS.tbrTool1.Show
clase mibarra al conjunto de formularios
actual y hace que dicha barra sea visible.
Este cdigo est en el evento Init del
conjunto de formularios.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 120 de 127
336 of 804
Cdigo Comentarios
DEFINE CLASS mibarra AS TOOLBAR Principio de la definicin de clase: una
ADD OBJECT cmdBold AS COMMANDBUTTON barra de herramientas con un botn de
ADD OBJECT sep1 AS SEPARATOR comando, un separador y otro botn de
ADD OBJECT cmdItalic AS COMMANDBUTTON comando.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 121 de 127
337 of 804
Establecer propiedades de barras de herramientas personalizadas
Mientras disea una barra de herramientas personalizada puede establecer sus propiedades. Por
ejemplo, puede establecer la propiedad Movable para permitir al usuario mover la barra de
herramientas.
Adems, puede utilizar mtodos y eventos para controlar las barras de herramientas personalizadas.
Por ejemplo, puede utilizar el mtodo Dock para acoplar o liberar una barra de herramientas y los
eventos BeforeDock y AfterDock para controlar lo que ocurre antes y despus de acoplar una barra de
herramientas.
Despus de crear una barra de herramientas debe definir las acciones asociadas a la barra de
herramientas y sus objetos. Por ejemplo, debe definir lo que ocurrir cuando el usuario haga clic en la
barra de herramientas o en uno de sus botones.
1. Seleccione el objeto para el que desee definir una accin: la barra de herramientas o uno de sus
botones.
Si crea una barra de herramientas, deber sincronizar sus botones con los correspondientes comandos
de men. Por ejemplo, si activa un comando de men, deber activar su botn correspondiente.
l Realizar las mismas acciones cuando el usuario elige botones de barra de herramientas y
elementos de men asociados.
l Coordinar la activacin y desactivacin de botones de barra de herramientas y elementos de
men asociados.
Siga los pasos generales al coordinar elementos de men y botones de barra de herramientas:
1. Cree una barra de herramientas; para ello, defina una clase de barra de herramientas, agregue
botones de comando e incluya el cdigo operacional de los mtodos asociados a los eventos
Click de los botones de comando.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 122 de 127
338 of 804
Cuando coordine un men con una barra de herramientas, los elementos de men cumplen las
mismas tareas que la barra de herramientas asociada y los elementos de men asociados se desactivan
automticamente cuando el botn de barra de herramientas asociado se desactiva.
1. En el Diseador de mens, cree un submen con un indicador descriptivo para cada botn de la
barra de herramientas.
3. Para cada elemento de submen, llame al cdigo asociado al evento Click del botn de
comando de barra de herramientas apropiado.
Por ejemplo, si el nombre del botn de la barra de herramientas es cmdA, agregue la lnea de
cdigo siguiente en el cuadro de edicin para el comando de elemento de submen:
Formset.toolbar.cmdA.Click
4. Elija el botn de la columna Opciones para abrir el cuadro de dilogo Opciones de la accin y
elija Saltar por.
5. En el Generador de expresiones, escriba una expresin que indique que la opcin de men se
debe saltar cuando el botn de comando de la barra de herramientas no est activado.
Por ejemplo, si el nombre del botn en la barra de herramientas es cmdA, escriba la siguiente
expresin en el cuadro Saltar por:
NOT formset.toolbar.cmdA.Enabled
6. Genere el men.
Cuando el usuario abra el men, Visual FoxPro evala la condicin Saltar por y desactiva el elemento
de men si el botn de comando de barra de herramientas asociado est desactivado. Cuando el
usuario elija un elemento en el men, el cdigo del evento Click del botn de comando de barra de
herramientas asociado se ejecuta.
Cuando haya creado una clase de barra de herramientas y un men que estn diseados para que
funcionen conjuntamente, es fcil incorporarlos a un conjunto de formularios.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 123 de 127
339 of 804
lEn el evento Init del conjunto de formularios, incluya cdigo con el mtodo AddObject
para agregar la barra de herramientas.
2. En el evento Load del conjunto de formularios, guarde el men existente y ejecute su programa
de men.
Por ejemplo, si su nombre de men es mymenu, incluya las siguientes lneas de cdigo con los
comandos PUSH MENU y DO:
3. En el evento Unload del conjunto de formularios, restablezca el men original con el comando
POP MENU:
Si algunos comandos de men se usan ms que otros, puede crear barras de herramientas
personalizadas que contengan botones para esos comandos. Los usuarios podrn simplemente hacer
clic en los botones siempre que necesiten los comandos. Sin embargo, si crea una barra de
herramientas, debera sincronizar los comandos de men con sus botones correspondientes. Por
ejemplo, si activa un botn, debera activar su correspondiente comando de men.
Al hacer clic en Vista previa aparecer en el borde superior de la pantalla el sistema de mens que
haya definido. Adems, el cuadro de dilogo Vista previa mostrar el nombre de archivo (o nombre
temporal) del sistema de mens.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 124 de 127
340 of 804
3. Elija Generar para crear un archivo de programa de men con la extensin .mpr.
Precaucin Si modifica el programa de men generado (el archivo .mpr), perder todos los
cambios al modificar el men con el Diseador de mens y volver a generar el programa de
men.
Si el programa de men no funciona como se pretende, utilice las herramientas de diagnstico que
incluye Visual FoxPro. Si desea ms informacin al respecto, consulte el captulo 14, Probar y
depurar aplicaciones.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 125 de 127
341 of 804
Cuando selecciona un men o un elemento de men, puede mostrar un mensaje en la barra de estado
que lo describa. Estos mensajes ayudan al usuario ofrecindole informacin adicional sobre la
eleccin en el men.
Puede personalizar la ubicacin de los ttulos de mens definidos por el usuario en las aplicaciones.
Puede personalizar la posicin respecto al sistema de mens activo; para ello, elija las opciones del
cuadro de dilogo Opciones generales. Tambin puede especificar la posicin de los ttulos de los
mens cuando el usuario modifica visualmente un objeto.
Para especificar una posicin relativa para los ttulos de men definidos por el usuario
Visual FoxPro volver a colocar todos los ttulos de men que haya definido. Si solamente desea
volver a colocar algunos, arrastre los botones de movimiento hasta los ttulos de men
correspondientes en el Diseador de mens.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 126 de 127
342 of 804
Tambin puede especificar la posicin de los ttulos de los mens cuando el usuario modifica un
objeto en la aplicacin. Si incluye un objeto y el usuario lo activa, los ttulos no aparecern en la barra
de mens resultante a menos que lo especifique explcitamente.
Para controlar la posicin de los ttulos de los mens durante la modificacin visual
Si no elige Izquierda, Centro o Derecha, el ttulo de men no aparecer en la barra de mens cuando
el usuario modifique un objeto. Para obtener ms informacin sobre la modificacin visual de
objetos, consulte el captulo 16, Agregar OLE.
Para guardar y restaurar mens en la pila puede utilizar los comandos PUSH MENU y POP MENU.
Esta funcionalidad es til cuando se desea quitar temporalmente un men, sustituirlo por otro y
despus restaurar el men original.
El nmero de mens que se pueden guardar slo est limitado por la cantidad de memoria disponible.
Sugerencia Compruebe la memoria disponible con la funcin SYS(1016). Por ejemplo, para saber
cunta memoria utiliza el sistema de mens, llame a SYS(1016), guarde el men en la pila y llame de
nuevo a SYS(1016).
Puede crear un procedimiento global que se aplica a todo el sistema de mens. Este procedimiento se
ejecutar siempre que se elija un men que no tenga asignado ningn procedimiento.
Por ejemplo, suponga que est programando una aplicacin en la que algunos mens an no cuentan
con submens, procedimientos, etc. Para estos mens, puede crear cdigo general que se ejecute al
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Pgina 127 de 127
343 of 804
elegirlos. Por ejemplo, este procedimiento general puede incluir la funcin siguiente:
MESSAGEBOX("Caracterstica no disponible")
O bien
l Haga clic en el botn Edicin, y luego en el botn Aceptar, para abrir una ventana de
edicin independiente en la que escribir o llamar al procedimiento.
Puede manipular mens que utilizan el sistema de mens de Visual FoxPro mediante el comando
SET SYSMENU. Con SET SYSMENU puede desactivar los mens, agregarles o quitarles
elementos, restaurar los mens predeterminados de Visual FoxPro y controlar el acceso a los mens
durante la ejecucin.
file://C:\temp\~hh572C.htm 30/05/2000
Manual del programador, Parte 4: Agrupar todos los elementos Pgina 1 de 87
344 of 804
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
345 of 804
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
346 of 804
en los que el campo country contenga el valor "Canad":
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
347 of 804
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
348 of 804
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
349 of 804
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
350 of 804
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
351 of 804
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
352 of 804
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
353 of 804
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
354 of 804
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
355 of 804
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
356 of 804
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
357 of 804
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
358 of 804
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
359 of 804
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
360 of 804
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
361 of 804
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
362 of 804
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
363 of 804
3. Escriba el nombre del archivo HTML que va a crear y elija Guardar.
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
364 of 804
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
365 of 804
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
366 of 804
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
367 of 804
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
368 of 804
grupo en una nueva pgina.
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
369 of 804
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
370 of 804
Para imprimir Elija esta opcin de alcance
Cada registro del archivo de origen TODO
Un intervalo de registro que empieza por 1 SIGUIENTE
Un registro especfico por nmero REGISTRO
El registro actual ms todos los que le siguen hasta RESTO
el final del archivo
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
371 of 804
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
372 of 804
informe MiInforme a la impresora predeterminada y detiene la impresin del informe en la ventana
activa:
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
373 of 804
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
374 of 804
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
375 of 804
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
376 of 804
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
377 of 804
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
378 of 804
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
379 of 804
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
380 of 804
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
381 of 804
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
382 of 804
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
383 of 804
seleccinelo en la jerarqua y, a continuacin, haga clic en Agregar.
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
384 of 804
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
385 of 804
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
386 of 804
-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
387 of 804
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
388 of 804
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
389 of 804
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
390 of 804
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
391 of 804
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
392 of 804
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
393 of 804
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
394 of 804
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
395 of 804
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
396 of 804
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
397 of 804
cuadro de dilogo Puntos de interrupcin.
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
398 of 804
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
399 of 804
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
400 of 804
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
401 of 804
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
402 of 804
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
403 of 804
Devolver una cadena de mensaje de error MESSAGE( )
Ejecutar un comando cuando se produce un error ON ERROR
Devolver comandos asignados a los comandos de ON( )
control de errores
Devolver el nombre del programa actualmente en PROGRAM( ) o SYS(16)
ejecucin
Volver a ejecutar el comando anterior RETRY
Devolver cualquier parmetro de mensaje de error SYS(2018)
actual
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
404 of 804
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
405 of 804
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
406 of 804
CASE nError = 13 && No se ha encontrado el alias
cNewTable = GETFILE('DBF')
IF FILE(cNewTable)
SELECT 0
USE (cNewTable)
This.SkipTable = ALIAS()
ELSE
This.SkipTable = ""
ENDIFCASE nError = 1585 && Conflicto de datos
* Actualizar conflicto controlado por una clase de comprobacin de datos
nConflictStatus = ;
THIS.DataChecker1.CheckConflicts()
IF nConflictStatus = 2
MESSAGEBOX "No se puede resolver un conflicto de datos."
ENDIFOTHERWISE
* Mostrar informacin sobre otros errores.
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
407 of 804
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
408 of 804
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
409 of 804
WHERE tastrade!orders <> ""
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
410 of 804
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
411 of 804
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
412 of 804
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
413 of 804
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
414 of 804
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
415 of 804
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
416 of 804
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
417 of 804
NOT No optimizable No optimizable
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
418 of 804
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
419 of 804
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
420 of 804
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
421 of 804
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
422 of 804
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
423 of 804
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
424 of 804
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
425 of 804
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
426 of 804
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
427 of 804
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
428 of 804
cada vez que lea o escriba en la red.
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
429 of 804
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
430 of 804
WHERE lname = "Alzaga"
* Ordenar registros usando una secuencia de ordenacin diferente
SET COLLATE TO "GENERAL"
SELECT * FROM temp1 INTO TABLE output ORDER BY lastname
file://C:\temp\~hhA455.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 1 de 89
431 of 804
Para ampliar una aplicacin bsica de Visual FoxPro, puede activarla para que funcione con mltiples
usuarios, aprovechar las ventajas de los controles ActiveX y las aplicaciones compatibles con la
Automatizacin, y agregar caractersticas internacionales.
Use controles ActiveX y vinculacin e incrustacin de objetos en su aplicacin para vincular datos y
aprovechar las posibilidades de otras aplicaciones.
Si su aplicacin se ejecuta en red o contiene formularios que tienen acceso a los mismos datos, la
aplicacin necesitar compartir dichos datos de manera eficaz para ofrecer la mxima productividad.
Aprenda a lanzar sus aplicaciones hacia el mercado mundial disendolas para su uso internacional.
Otras aplicaciones pueden ampliar la eficacia de Visual FoxPro mediante Automatizacin. Incluso
puede crear servidores de Automatizacin (componentes ActiveX) en Visual FoxPro a los que
pueden tener acceso todas las aplicaciones en modo local o remoto.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 2 de 89
432 of 804
l Agregar objetos OLE a sus aplicaciones
l Usar controles ActiveX
l Manipular objetos con Automatizacin
l Crear subclases de objetos
l Controlar Visual FoxPro desde otras aplicaciones
l Crear servidores de Automatizacin
l Usar Automatizacin remota
Los objetos OLE insertables provienen de aplicaciones compatibles con OLE tales como Excel o
Word. Entre estos objetos se incluyen documentos de Word y hojas de clculo de Excel. En los
formularios puede vincular o incrustar estos objetos con el control contenedor OLE y puede
almacenar los objetos en los campos de tipo General de una tabla, mostrndolos en sus formularios
con el control OLE dependiente.
En una aplicacin de Visual FoxPro, puede usar la tecnologa OLE y ActiveX de diversas maneras.
Antes de crear una aplicacin, considere las distintas formas en que puede crearla.
Puede incrustar o vincular archivos de otras aplicaciones para Windows en sus tablas y formularios.
Por ejemplo, puede incrustar o vincular un documento de Word en un campo de tipo General de una
tabla y puede incrustar o vincular una hoja de clculo de Excel en un formulario.
La diferencia entre incrustacin y vinculacin est en la forma en que se almacenan los datos.
Mediante la incrustacin, los datos se almacenan en una tabla o en un formulario; esto no ocurre
mediante la vinculacin. Por ejemplo, cuando incrusta una hoja de clculo de Excel en un formulario,
el formulario contiene una copia de la hoja de clculo y otras aplicaciones no pueden modificar esta
copia. Sin embargo, cuando la vincula, el formulario contiene tan slo una referencia a la hoja de
clculo y no la hoja de clculo propiamente dicha.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 3 de 89
433 of 804
Tanto los datos incrustados como los vinculados estn relacionados con el contenido original del
archivo del servidor, como se muestra en la ilustracin:
Pero cuando se modifica el archivo original, los datos vinculados se actualizan automticamente para
reflejar el cambio; sin embargo, los datos incrustados no lo hacen:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 4 de 89
434 of 804
Los datos incrustados no son necesariamente estticos. Tanto los datos incrustados como los
vinculados pueden mostrarse, modificarse y manipularse de forma interactiva y mediante
programacin en Visual FoxPro.
En un formulario o un informe, puede crear objetos que dependan de campos de tablas de tipo
General. Estos objetos se llaman objetos OLE dependientes y puede usarlos para mostrar el contenido
de campos de tipo General. Puede crear objetos OLE dependientes con el control OLE dependiente
situado en la barra de herramientas Controles de formularios. De forma alternativa puede crear
objetos OLE independientes con el control contenedor OLE. Un objeto OLE independiente no est
conectado a campos de tipo General de una tabla.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 5 de 89
435 of 804
Cuando disee las tablas para la aplicacin, considere si necesita objetos OLE en las tablas. Por
ejemplo, suponga que tiene una tabla de empleados y quiere incluir documentos de Word que
contengan las evaluaciones de los empleados. Para incluir las evaluaciones, tiene que definir un
campo General en la tabla. Luego, agregue los documentos a la tabla mediante vinculacin o
incrustacin de dichos documentos en el campo General.
1. Use el Diseador de tablas para crear una tabla con el campo General.
2. Abra la ventana correspondiente al campo General; para ello, examine la tabla y haga doble
clic en el campo General o utilice el comando MODIFY GENERAL.
O bien
Para obtener ms informacin sobre cmo agregar objetos OLE con el Diseador de tablas, consulte
el captulo 10, Uso compartido de informacin con otras aplicaciones, del Manual del usuario.
Puede agregar objetos OLE a tablas mediante programacin con el comando APPEND GENERAL.
Con este comando puede importar un objeto OLE de un archivo y colocarlo en un campo General. Si
el campo ya contiene un objeto, el nuevo objeto lo reemplazar.
Puede utilizar APPEND GENERAL para incrustar objetos OLE o vincular objetos OLE creados por
aplicaciones tales como Excel o Word. Estas aplicaciones son compatibles tanto para vincular como
para incrustar. Sin embargo, algunas aplicaciones, como por ejemplo Microsoft Graph, tan slo
permiten incrustar.
Suponga que tiene archivos de Word para Windows que desea almacenar en una tabla de Visual
FoxPro. Si la tabla tiene un campo General llamado WordDoc, puede incrustar los documentos
mediante el cdigo siguiente:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 6 de 89
436 of 804
ELSE
MESSAGEBOX("No hay archivos de Word".)
ENDIF
Nota Este cdigo slo busca los archivos que terminen en .doc, la extensin estndar empleada por
los archivos de Word. Puesto que Word para Windows y OLE se dan cuenta de este hecho, los
archivos se asocian automticamente con el servidor de Word para Windows cuando usted utiliza
APPEND GENERAL.
Si emplea una extensin diferente de la esperada por el servidor, deber declarar la clase de servidor
mediante el empleo de la clusula CLASS. Por ejemplo, si agrega la clase de Word al ejemplo
anterior, el cdigo se convierte en:
Si tiene archivos con extensiones comunes (por ejemplo, .bmp) que otros servidores pueden utilizar,
puede emplear la clusula CLASS para especificar el servidor que desea usar para esos archivos.
Alternativamente, si prefiere vincular objetos en lugar de incrustarlos, emplee la palabra clave LINK.
Adems, puede reemplazar datos de un objeto con la palabra clave DATA de APPEND GENERAL,
como ilustra el ejemplo siguiente de Microsoft Graph.
Microsoft Graph es una aplicacin incrustada. Los valores de un grfico de Microsoft Graph se basan
en los valores de una hoja de datos.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 7 de 89
437 of 804
Para cambiar los datos de un grfico de Microsoft Graph mediante programacin, debe crear una
cadena que contenga los datos nuevos, incluyendo las tabulaciones, los retornos de carro y los
avances de lnea, y pasarla a un objeto de Microsoft Graph con la clusula DATA del comando
APPEND GENERAL.
En el ejemplo siguiente se supone que tiene una tabla, denominada stock, con los campos date y
close (entre otros) correspondientes a la fecha y al precio de cierre del stock. El objeto de Microsoft
Graph se almacena en el campo General msgraph de una tabla denominada graph. El ejemplo
actualiza un grfico con los precios de cierre de stock desde los 30 ltimos das.
Cdigo Comentarios
#DEFINE CRLF CHR(13)+CHR(10) Define los caracteres de retorno de carro y
#DEFINE TAB CHR(9)
LOCAL lcData tabulacin.
SELECT date, close; Selecciona los valores con los que se desea
FROM Stock WHERE BETWEEN(date, ;
DATE(),DATE() - 30) ; actualizar el grfico; en este caso, los valores de
ORDER BY date INTO CURSOR wtemp fecha y cierre de los stocks correspondientes a
los 30 ltimos das.
SELECT wtemp Genera una cadena de caracteres (lcData) de
lcData = " " + ;
TAB + "Precio de cierre" + CRLF datos desde la posicin del cursor para actualizar
SCAN el grfico.
lcData = lcData + DTOC(date)
lcData = lcData + TAB
lcData = lcData + ;
"Precio de cierre", como encabezado de la
ALLTRIM(STR(close)) + CRLF columna, es el texto predeterminado que se
ENDSCAN mostrar en la leyenda del grfico.
Nota Tambin puede mostrar objetos OLE desde campos de tipo General en los informes. Para
obtener detalles sobre la presentacin de objetos OLE en informes, consulte "Agregar un campo de
tipo general" en el captulo 7, Disear informes y etiquetas, del Manual del usuario.
Con el Diseador de formularios, puede agregar objetos OLE insertables a formularios mediante el
control contenedor OLE. Adems, puede mostrar objetos OLE de los campos de tipo General con el
control OLE dependiente.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 8 de 89
438 of 804
2. En el cuadro de dilogo Insertar objeto, seleccione Crear nuevo o Crear desde archivo.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 9 de 89
439 of 804
3. En la lista Seleccionado, elija los objetos OLE y los controles ActiveX que desee dejar
disponibles en la barra de herramientas Controles de formularios.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 10 de 89
440 of 804
4. Elija Establecer como predeterminado y, a continuacin, Aceptar.
2. Especifique el campo General que contiene los datos; para ello, establezca la propiedad
ControlSource del objeto.
Cdigo Comentarios
frm1 = CREATEOBJECT("form") Crea un formulario
Si agrega un objeto OLE a un formulario o campo General, puede modificar los datos y mostrar las
caractersticas del objeto en tiempo de ejecucin o durante el diseo.
Nota No puede modificar los datos de un objeto OLE en un control OLE dependiente durante el
diseo.
Algunos objetos OLE admiten la modificacin directa, por lo que puede modificar el objeto en la
ventana utilizada por la aplicacin. Por ejemplo, si hace doble clic en un objeto de hoja de clculo de
Microsoft Excel en un campo General, en lugar de iniciar una copia de Microsoft Excel en otra
ventana, los nombres de los mens cambian para reflejar la estructura de mens de Microsoft Excel y
se muestran las barras de herramientas predeterminadas de Microsoft Excel. El programador o el
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 11 de 89
441 of 804
se muestran las barras de herramientas predeterminadas de Microsoft Excel. El programador o el
usuario de la aplicacin podr entonces modificar el objeto Excel sin abandonar la aplicacin.
Nota Slo puede modificar directamente los objetos incrustados, no los vinculados.
Tambin puede abrir el servidor de Automatizacin en otra ventana, modificar los datos o ver las
caractersticas en dicha ventana y hacer que los valores nuevos se reflejen en la aplicacin cuando
vuelva a ella.
O bien
Para abrir la aplicacin para un objeto OLE en una ventana de un campo General
Cuando agregue un objeto OLE a un formulario en el control contenedor OLE o el control OLE
dependiente, tendr mayor control sobre la apertura y modificacin del objeto.
Para controlar el acceso de modo que el objeto OLE slo pueda abrirse o modificarse mediante
programacin con el mtodo DoVerb, establezca AutoActivate como 0 - Manual y AutoVerbMenu
como falso (.F.) .
Cuando un usuario modifica directamente un objeto OLE, aparece la barra de mens del objeto OLE
y no los mens de la aplicacin. Si crea un ttulo de men y desea que se muestre mientras el usuario
modifica objeto OLE, seleccione Negociar en el cuadro de dilogo Opciones de la accin del
Diseador de mens. Para obtener ms informacin, consulte el captulo 11, Disear mens y barras
de herramientas o la clusula NEGOTIATE en el tema DEFINE PAD de la Ayuda.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 12 de 89
442 of 804
mtodos. Proporcionan una amplia gama de funciones que se puede utilizar fcilmente. Algunos de
los controles ActiveX incluidos en Visual FoxPro son:
Los controles ActiveX son verstiles porque se pueden crear subclases para crear otros controles y se
pueden controlar mediante los eventos, mtodos y propiedades que tengan asociados. No puede crear
controles ActiveX con Visual FoxPro; sin embargo, puede crearlos con Microsoft OLE Custom
Control Developers Kit suministrado con Microsoft Visual C++ 4.0 y con Microsoft Visual Basic
Control Creation Edition versin 5.0.
Para obtener ms informacin sobre el acceso a controles ActiveX, consulte el captulo 27, Extender
Visual FoxPro con bibliotecas externas. Para obtener ms informacin sobre la creacin de controles
ActiveX especficos de Visual FoxPro, consulte el captulo 28, Acceso a la API de Visual FoxPro.
Los controles ActiveX de Visual FoxPro deben estar incluidos en un control contenedor OLE (la
clase de base es OLEControl). Cuando se agrega un control Contenedor OLE a un formulario, puede
elegir el control ActiveX que desea agregar al formulario.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 13 de 89
443 of 804
4. Elija Aceptar.
Si un control ActiveX admite la vinculacin sencilla de datos, Visual FoxPro ofrecer una propiedad
ControlSource para el control. Todo lo que tiene que hacer es establecer la propiedad ControlSource
en un campo de la tabla y el valor mostrado en el control ActiveX reflejar el valor del campo
subyacente. Los cambios realizados en el valor del control se guardan en el campo.
Para obtener ejemplos sobre el uso de controles ActiveX, ejecute el archivo Solution.app ubicado en
el directorio ...\Samples\Vfp98\Solution de Visual Studio.
Nota Para asegurar que se procesan todos los eventos de controles ActiveX, establezca la propiedad
AutoYield del objeto Application de Visual FoxPro como falsa (.F.).
En el cdigo, puede manipular un objeto mediante sus propiedades. La manera en que se hace
referencia a una propiedad depende de si el objeto es autnomo o forma parte de un contenedor,
como el control Contenedor OLE u OLE dependiente.
Nota Los controles ActiveX siempre forman parte de un objeto Contenedor OLE.
Un objeto de un contenedor consta de dos partes: el propio objeto y el contenedor alrededor del
mismo. Tanto el objeto como el contenedor tienen propiedades y, a veces, tienen los mismos nombres
de propiedades. Para asegurarse de que hace referencia a las propiedades del objeto, anexe siempre la
propiedad Object del contenedor al nombre del objeto. Por ejemplo, el cdigo siguiente hace
referencia a la propiedad Left del objeto.
Por ejemplo, suponga que tiene una aplicacin que enva correo cuando el usuario hace clic en un
botn de comando Enviar. Si ha agregado un control de mensajes de Microsoft MAPI a un formulario
como olecontrol1, el cdigo asociado al evento Click del botn de comando podra ser:
THISFORM.olecontrol1.Object.Enviar
THISFORM.olecontrol1.Object.Send(.T.)
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 14 de 89
444 of 804
Adems de usar la propiedad Object para hacer referencia a las propiedades del objeto contenido,
puede emplear otras propiedades del control contenedor. Por ejemplo, puede hacer referencia a la
propiedad OLEClass de slo lectura para identificar el tipo de objeto del contenedor y la propiedad
Sizable para impedir que los usuarios puedan cambiar el tamao de un objeto. Para obtener detalles
sobre las propiedades del control contenedor, consulte Control Contenedor OLE.
En los diseadores de formularios y clases, las propiedades de los controles ActiveX se muestran en
la ventana Propiedades de Visual FoxPro, pero la mayora de los controles ActiveX tambin tienen su
propia interfaz para establecer propiedades comunes. Puede ver esta interfaz de las propiedades si
selecciona la opcin Propiedades especfica del objeto en el men contextual del control ActiveX.
Por ejemplo, para abrir el cuadro de dilogo Propiedades correspondiente a un control RichText, elija
Propiedades del control Microsoft RichText en el men contextual.
Adems de establecer y recuperar las propiedades de los objetos, puede manipular un objeto usando
los mtodos que admite. Por ejemplo, puede usar el mtodo Add de un objeto de coleccin de
Microsoft Excel para crear un libro de trabajo de Excel.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 15 de 89
445 of 804
El siguiente ejemplo de automatizacin OLE emplea el mtodo Add para crear un libro de trabajo de
Excel, el mtodo Save para guardar el libro de trabajo y el mtodo Quit para salir de Excel:
Cdigo Comentarios
oleApp = CREATEOBJECT("Excel.Application") Inicia Excel.
Si crea un objeto con el control contenedor OLE o el control OLE dependiente, puede usar el mtodo
DoVerb del control para ejecutar un verbo en el objeto. Por ejemplo, use DoVerb(0) para ejecutar el
verbo predeterminado, DoVerb( 1) para activar el objeto para edicin visual, y DoVerb( 2) para
abrir el objeto en una ventana distinta.
Cuando se transfiere una solicitud a un objeto OLE, el servidor OLE la procesa. No tendr mucho
control sobre el proceso del servidor, pero podr especificar el tiempo que puede esperar para que
finalice el proceso si establece las propiedades OLERequestPendingTimeout y
OLEServerBusyTimeout. Tambin podr determinar lo que ocurrir cuando haya transcurrido ese
tiempo si establece la propiedad OLEServerBusyRaiseError.
Un tipo de objeto puede representar un nico objeto o una coleccin de objetos relacionados. Por
ejemplo, un objeto Workbook de Excel representa un nico libro, mientras que el objeto Workbooks
representa todos los libros actualmente cargados. Puesto que el objeto Workbooks representa una
coleccin de objetos, se llama objeto de coleccin.
En cdigo, una coleccin es una lista no ordenada en la que la posicin de un objeto puede cambiar
siempre que se agreguen o quiten objetos de la coleccin. Para tener acceso a un objeto de una
coleccin debe iterar dentro de la coleccin mediante la propiedad Count de la misma. La propiedad
Count devuelve el nmero de elementos de la coleccin. Adems, puede usar el mtodo Item para
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 16 de 89
Count devuelve el nmero de elementos de la coleccin. Adems, puede usar el mtodo 446
Itemof 804
para
devolver un elemento de la coleccin.
Por ejemplo, para mostrar los nombres de las hojas de clculo en un libro de Excel, use el siguiente
cdigo:
oleApp = CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
FOR EACH x IN oleApp.Workbooks
? x.Name
ENDFOR
Tambin puede tener acceso a una coleccin dentro de otra coleccin. Por ejemplo, puede tener
acceso a una coleccin de celdas dentro de un intervalo con el cdigo siguiente:
oleApp = CREATEOBJECT("Excel.sheet")
oleApp.Workbooks.Add
oleApp.Range(oleApp.Cells(1,1),oleApp.Cells(10,10)).Value=100
oleApp.Visible=.T.
Puede transferir matrices a mtodos y recibir matrices de vuelta. Sin embargo, debe transferir las
matrices por referencia prefijando el nombre de la matriz con el signo @.
Por ejemplo, para transferir una matriz de Visual FoxPro a Microsoft Excel, considere el siguiente
cdigo. Crea una matriz en Visual FoxPro, asigna a la matriz algunos valores, inicia Microsoft Excel,
crea un libro, establece un valor como la primera celda de un libro y entonces copia el valor a las
otras hojas de la matriz:
DIMENSION aV(3)
aV(1) = "Hoja1"
aV(2) = "Hoja2"
aV(3) = "Hoja3"
oleApp=CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
oleI=oleApp.Workbooks.Item(1)
oleI.Sheets.Item(1).Cells(1,1).Value = 83
oleI.Sheets(@aV).;
FillAcrossSheets(oleI.Worksheets("Hoja1").Cells(1,1))
oleApp.Visible = .T.
Adems, el siguiente ejemplo devuelve una matriz a Visual FoxPro y muestra el contenido de la
matriz:
oleApp = CREATEOBJECT("Excel.Application")
aOleArray = oleApp.GetCustomListContents(3)
FOR nIndex = 1 to ALEN(aOleArray)
? aOleArray(nIndex)
ENDFOR
Nota Con Visual FoxPro no puede transferir matrices de ms de dos dimensiones a objetos OLE.
Para obtener ms informacin acerca de cmo trabajar con matrices en Visual FoxPro, consulte el
captulo 3, Programacin orientada a objetos y Descripcin general del lenguaje.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 17 de 89
447 of 804
Cdigo Comentarios
PUBLIC frmMyForm, cFilename Declara variables y las
SET SAFETY OFF
inicializa.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 18 de 89
448 of 804
DEFINE CLASS myoutline AS olecontrol Define una subclase del control
OleClass = "msoutl.outline"
Top = 5 Contenedor OLE y agrega el
Left = 5 control Outline estableciendo la
Height = 10 propiedad OleClass del
Width = 60 contenedor y definiendo los
ENDDEFINE
otros valores personalizados.
Si desea distribuir las aplicaciones, hay algunas otras consideraciones. Para obtener ms informacin,
consulte el captulo 25, "Generar una aplicacin para su distribucin".
Puede incluso manipular Visual FoxPro desde aplicaciones que no admitan Automatizacin mediante
Fpole.dll
Puede controlar Visual FoxPro desde otras aplicaciones mediante el objeto Application de Visual
FoxPro. Se crea automticamente un objeto Application siempre que se inicia Visual FoxPro
directamente, mediante DDE o mediante Automatizacin.
Por ejemplo, las lneas de cdigo siguiente en Visual Basic, o en un mdulo de Microsoft Excel,
crean una referencia a un objeto Application de Visual FoxPro:
Una vez establecida una referencia al objeto Application de Visual FoxPro, puede llamar a mtodos
asociados con el objeto y tener acceso a otros objetos mediante las propiedades de la coleccin del
objeto Application.
DataToClip Help
DoCmd Quit
Eval RequestData
El ejemplo siguiente usa Visual Basic para cdigo de aplicaciones en un mdulo Excel para crear un
objeto Application de Visual FoxPro, abrir una tabla de Visual FoxPro y agregar los resultados de
una consulta a la hoja de clculo activa:
Sub FoxTest()
Dim oFox as Object
Set oFox = CreateObject("VisualFoxPro.Application")
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 19 de 89
449 of 804
Set oFox = CreateObject("VisualFoxPro.Application")
Cada vez que inicia Visual FoxPro se crea un objeto Application automticamente, ya sea
directamente, a travs de Automatizacin o de DDE. Este objeto Application proporciona acceso a
todos los objetos creados en una sesin de Visual FoxPro a travs de las propiedades de la coleccin.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 20 de 89
450 of 804
El objeto Application de Visual FoxPro y todos los objetos contenedores de Visual FoxPro tienen
asociada una propiedad Count y una propiedad Collection. La propiedad Collection es una matriz que
hace referencia a cada objeto contenido. La propiedad Count es una propiedad numrica que indica el
nmero de objetos contenidos.
Estas propiedades permiten el uso de un bucle para manipular mediante programacin todos los
objetos contenidos o slo los especificados. Por ejemplo, las lneas de cdigo siguientes establecen la
propiedad Visible de todos los formularios como verdadera (.T.):
Por ejemplo, podra crear una o varias clases para controlar las reglas comerciales de toda la
compaa. Una aplicacin cliente que utilice los objetos de regla comercial transferira los parmetros
de entrada en una llamada a un mtodo y el servidor de Automatizacin podra estar demasiado
ocupado transfiriendo datos de varios orgenes y realizando clculos completos antes de devolver la
respuesta.
Crear el servidor
Todo lo que necesita para crear un servidor de Automatizacin en Visual FoxPro es un proyecto que
contenga clases definidas como OLEPUBLIC. Puede tener en el proyecto tantas clases OLEPUBLIC
como desee y se pueden definir en archivos de programa (.prg) o en bibliotecas de clases (.vcx).
Por ejemplo, la definicin de clase siguiente en un archivo de programa crea una clase pblica OLE
personalizada:
PROCEDURE GetName
RETURN THIS.FirstName + " " + THIS.LastName
ENDPROC
ENDDEFINE
Cuando disee una clase en el Diseador de clases, seleccione OLE pblico en el cuadro de dilogo
Informacin de clase para designar la clase como OLEPUBLIC.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 22 de 89
452 of 804
Cada componente tiene sus propias ventajas. Un servidor en proceso es ms rpido porque no hay
necesidad de comunicacin entre procesos. Por otro lado, un servidor fuera de proceso puede
utilizarse en modo remoto, funcin no disponible en el servidor en proceso. Adems, dado que el
servidor en proceso y el cliente comparten un espacio de direcciones de proceso, cualquier error grave
en el archivo .dll interrumpir el funcionamiento del cliente, mientras que un error en un .exe fuera de
proceso slo interrumpira el servidor.
Cuando se crea un ejecutable con clases OLE pblicas, no se pierde ninguna de las capacidades .exe
habituales. Podr hacer funcionar el ejecutable, proporcionar una interfaz de usuario y todas las
funciones habituales que incluira en una aplicacin. Puede aumentar, por tanto, la capacidad de
expansin de la aplicacin permitiendo que otras aplicaciones exploten las funciones especficas que
desea ofrecer.
Nota Si hay ms de un usuario que intenta tener acceso al servidor de Automatizacin, pueden
surgir conflictos. Si ha proporcionado acceso a Automatizacin adems de una interfaz de usuario
para la funcionalidad, proporcione un nivel adicional de coherencia comprobando la interfaz para
garantizar que el entorno no se ha modificado.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 23 de 89
453 of 804
Cuadro de dilogo Opciones de generacin
3. Elija Aceptar.
O bien
Una vez creado el proyecto, puede ver las clases de servidor mostradas en el cuadro de dilogo
Informacin del proyecto, donde tambin puede especificar un archivo de ayuda y un identificador
del contexto en la Ayuda para cada clase. Este archivo de ayuda puede abrirse desde los
examinadores de objetos ms genricos.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 24 de 89
454 of 804
l No se puede crear An cuando la clase est marcada como OLE pblica, no estar disponible
en otras aplicaciones. Por ejemplo, podra tener una biblioteca estndar de clases OLE pblicas
en mltiples aplicaciones y desactivar la automatizacin de una o varias clases para una sola
aplicacin.
l Uso nico Todas las aplicaciones cliente que utilicen el servidor crean una instancia diferente
de la clase de servidor. Cada instancia tiene un solo subproceso de ejecucin. Aunque
instancias independientes requieren ms memoria, si se elige Uso nico el sistema operativo
podr aplicar multitarea de asignacin prioritaria.
l Multiuso Una vez creado el servidor, otras aplicaciones pueden utilizar la misma instancia.
Nota Si realiza cambios en la ficha Servidores del cuadro de dilogo Informacin del
proyecto, ser necesario volver a generar la .dll o el .exe para que entre en vigor la nueva
configuracin.
Cuando cree un proyecto con clases OLE pblicas, se crean tres archivos:
El archivo de biblioteca de tipos es un archivo binario que presenta una relacin de todas las clases
publicadas en el servidor de Automatizacin, junto con sus propiedades, mtodos y eventos. Los
examinadores de objetos OLE leen esta informacin y la presentan en una interfaz legible.
El archivo de registro muestra identificadores nicos globales (GUID) de las clases del servidor.
Nota Un archivo de registro .vbr es igual que un archivo .reg, salvo que el primero no incluye rutas
de acceso en cdigo.
Archivo .VBR con GUID para cada clase OLE pblica de un proyecto
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 25 de 89
455 of 804
Los servidores OLE quedarn disponibles para otras aplicaciones cuando se hayan agregado los
servidores al Registro de Windows. Cuando genere un servidor de Automatizacin, se registrar
automticamente en la mquina donde se ha efectuado la generacin. Tambin puede registrar los
servidores en otras mquinas.
Cuando utilice el Asistente para instalacin de Visual FoxPro para crear discos de instalacin, el
programa de instalacin registrar los servidores en los equipos de los clientes. Tambin puede
registrar servidores manualmente.
miservid /regserver
Por ejemplo, para eliminar Miservid.exe del registro, ejecute el comando siguiente:
miservid /unregserver
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 26 de 89
miservid /unregserver 456 of 804
REGSVR32 miservid.dll
REGSVR32 /u miservid.dll
Nota El registro contiene el nombre completo de la ruta de acceso al archivo, por lo que si
mueve el archivo tendr que registrarlo de nuevo.
Una aplicacin que puede crear objetos de Automatizacin puede crear objetos basados en el servidor
de Automatizacin, establecer propiedades que no estn HIDDEN o PROTECTED y llamar a
mtodos. Por ejemplo, suponiendo que el nombre del servidor sea foxole y que contenga una clase
denominada persona con un mtodo GetName, el cdigo siguiente podra ejecutarse en Visual
FoxPro 3.0:
oTest = CREATEOBJECT("foxole.persona")
cName = oTest.GetName()
La nica interaccin con los objetos proporcionados por un servidor de Automatizacin (componente
COM) se hace mediante los mtodos y las propiedades de las clases expuestas. Cuando una
aplicacin cliente llama a un mtodo de un objeto y se produce un error en el servidor de
Automatizacin, el mtodo devuelve un valor de error o surge un error en la aplicacin cliente.
La aplicacin cliente decide si debe avisar al usuario o continuar con otra ruta de acceso de ejecucin.
El propio servidor de Automatizacin nunca interacta con el usuario. Esto permite que la aplicacin
del servidor de Automatizacin sea transparente para la aplicacin cliente. El servidor de
Automatizacin puede ser local (es decir, se ejecuta en el equipo del usuario) o se puede usar la
caracterstica de Automatizacin remota de Visual FoxPro para ejecutarlo en un servidor de red.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 27 de 89
457 of 804
Cuando se crean servidores locales para Automatizacin, puede utilizarlos en modo remoto. La
automatizacin remota permite la misma flexibilidad, capacidad de ampliacin y eficacia que la
automatizacin local, pero en una red. La Automatizacin remota permite que:
Puede configurar un servidor y un equipo local para la automatizacin remota con el Administrador
de conexiones de automatizacin remota, con lo que se guarda la configuracin en el registro. Al
ejecutarse el Administrador de Automatizacin en el equipo servidor, se administra la automatizacin
de modo que el mismo cdigo que manipula un objeto local pueda manipular automticamente un
objeto remoto.
Automatizacin remota
Configurar el servidor
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 28 de 89
458 of 804
Para configurar el servidor de automatizacin remota
5. En la ficha Acceso de cliente, compruebe que la opcin Permitir activacin remota est
activada.
Configurar el cliente
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 29 de 89
459 of 804
1. Copie en la mquina cliente el archivo .vbr que se cre cuando se cre el servidor de
Automatizacin.
2. Ejecute CLIREG32 con el nombre del archivo .vbr. Por ejemplo, si el archivo es
MiServid.VBR, ejecute el comando siguiente en el smbolo del sistema:
CLIREG32 Miservid.vbr
En la tabla siguiente se describen las opciones del rea Poltica de seguridad del sistema de la ficha
Acceso de cliente del Administrador de conexiones de automatizacin remota.
Para los servidores de Automatizacin remotos que se ejecuten en cualquier sistema operativo
Windows, el procedimiento de llamada remota (RPC) ofrece los niveles de autenticacin siguientes.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 30 de 89
460 of 804
Llamar 3 Se autentica slo al comienzo de cada llamada a
procedimiento remota, cuando el servidor recibe la
solicitud. No se aplica a las secuencias de protocolo
basadas en la conexin (las que comienzan con el prefijo
"ncacn").
Paquete 4 Comprueba que todos los datos recibidos proceden del
cliente esperado.
Integridad del paquete 5 Comprueba que no se ha modificado ningn dato
transferido entre el cliente y el servidor.
Privacidad del paquete 6 Comprueba todos los niveles anteriores y codifica los
valores de argumentos de cada llamada a procedimiento
remoto.
La necesidad de autenticacin RPC debera evaluarse detenidamente, porque a medida que aumenta
el nivel de autenticacin RPC, disminuye el rendimiento. Puede especificar un nivel de autenticacin
para cada clase del servidor de Automatizacin, de modo que tanto los niveles costosos, como la
codificacin, no necesiten aplicarse a todo el componente.
Por ejemplo, un servicio de datos implementado como servidor de Automatizacin remoto podra
tener una clase Logon utilizada para transmitir la informacin del usuario y la contrasea y esta clase
podra requerir la autenticacin Privacidad del paquete. Otras clases expuestas por el servidor podran
utilizar un nivel de autenticacin ms bajo.
Problema Accin
Cdigo de error OLE 0x800706d9: No hay Compruebe que el Administrador de
ms puntos finales disponibles en el Automatizacin se est ejecutando en el equipo
administrador de puntos finales. servidor y que el nombre de este equipo se haya
introducido correctamente en el cuadro Direccin de
la red del Administrador de conexiones de
automatizacin remota.
Visual FoxPro: la aplicacin no aparece en 1. Ejecute Regedit.exe para abrir el registro.
la lista de Clases OLE del Administrador de
automatizacin remota. vfp6.exe r
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 31 de 89
461 of 804
Visual FoxPro proporciona soporte para acceso compartido o exclusivo a datos, opciones de bloqueo,
sesiones de datos, almacenamiento de registros y tablas en bfer, y transacciones. Aunque estas
caractersticas son especialmente tiles en entornos compartidos, tambin puede utilizarlas en
entornos de un solo usuario.
Acceso a datos
En un entorno compartido, hay dos formas de tener acceso a datos: desde archivos exclusivos o desde
archivos compartidos. Si abre un tabla para acceso compartido, otros usuarios tambin tendrn acceso
al archivo. Si abre una tabla para acceso exclusivo, ningn otro usuario podr leer o escribir en ese
archivo. Puesto que el uso exclusivo elimina muchas de las ventajas que implica compartir datos en
una red, deber hacerse un uso comedido de esta caracterstica.
La forma ms restrictiva de abrir un archivo consiste en abrirlo de forma exclusiva. Cuando abra una
tabla a travs de la interfaz, se abrir para uso exclusivo de forma predeterminada. Tambin puede
abrir explcitamente una tabla para uso exclusivo mediante comandos de Visual FoxPro.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 32 de 89
462 of 804
SET EXCLUSIVE ON
USE cMiTabla
O bien
Los comandos siguientes requieren que abra una tabla para uso exclusivo:
l ALTER TABLE
l INDEX al crear, agregar o eliminar una etiqueta de ndice compuesto.
l INSERT [BLANK]
l MODIFY STRUCTURE: si utiliza este comando para cambiar la estructura de una tabla,
deber abrir la tabla de forma exclusiva. Sin embargo, podr utilizar este comando en modo de
slo lectura cuando abra la tabla para uso compartido.
l PACK
l REINDEX
l ZAP
Visual FoxPro devolver el error "Se requiere apertura exclusiva del archivo" si intenta ejecutar uno
de estos comandos en una tabla compartida.
Puede restringir el acceso a una tabla mediante la funcin FLOCK( ). Si utiliza FLOCK( ) para
bloquear la tabla, los dems usuarios no podrn escribir en ella, aunque s podrn leerla.
Cuando abra una tabla para uso compartido, varias estaciones de trabajo podrn utilizar la misma
tabla a la vez. Cuando abra una tabla a travs de la interfaz, podr anular la configuracin
predeterminada EXCLUSIVE ON. Puede abrir explcitamente una tabla para uso compartido
mediante los comandos de Visual FoxPro.
O bien
Cuando agregue o cambie datos en una tabla compartida, en primer lugar deber bloquear el registro
afectado o toda la tabla. Hay varias formas de bloquear un registro o una tabla abierta para uso
compartido:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 33 de 89
l Utilice un comando que realice un bloqueo automtico de registro o tabla. Consulte la tabla de
comandos que realizan bloqueo automtico en la seccin Elegir bloqueos automticos o
manuales.
l Bloquee manualmente uno o varios registros, o una tabla completa, mediante las funciones de
bloqueo de registro o de tabla.
l Inicie el almacenamiento en bfer mediante la funcin CURSORSETPROP( ).
Los archivos memo y de ndice asociados siempre se abren con el mismo estado compartido que su
tabla.
Si la aplicacin slo utiliza una tabla con fines de consulta y todos los usuarios de la aplicacin tienen
acceso a la misma, podr mejorar el rendimiento de la tabla si la marca como de slo lectura.
Bloquear datos
Si comparte el acceso a los archivos, tambin deber administrar el acceso a los datos bloqueando
tablas y registros. Los bloqueos, a diferencia de los permisos de acceso, pueden proporcionar un
control de los datos a largo y a corto plazo. Visual FoxPro proporciona tanto bloqueo automtico
como manual.
El bloqueo de registro, tanto si es automtico como si es manual, impide que un usuario escriba en un
registro en el que est escribiendo otro usuario. El bloqueo de tabla impide que otros usuarios
escriban en la tabla, aunque pueden leerla. Puesto que el bloqueo de tabla prohibe a otros usuarios
actualizar los registros de una tabla, deber hacer un uso comedido de esta caracterstica.
Adems del bloqueo de registro o de tabla, tambin puede elegir entre bloqueo automtico y manual.
Muchos comandos de Visual FoxPro intentan bloquear automticamente un registro o una tabla antes
de que se ejecute el comando. Si el registro o la tabla estn bloqueados correctamente, el comando se
ejecutar y se liberar el bloqueo.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 34 de 89
464 of 804
APPEND MEMO Registro actual
BLANK Registro actual
BROWSE, CHANGE y EDIT Registro actual y todos los registros de campos con alias de
tablas relacionadas cuando comienza la edicin de un campo
CURSORSETPROP( ) Depende de los parmetros
DELETE Registro actual
DELETE NEXT 1 Registro actual
DELETE RECORD n Registro n
DELETE de ms de un registro Toda la tabla
DELETE - SQL Registro actual
GATHER Registro actual
INSERT Toda la tabla
INSERT SQL Encabezado de la tabla
MODIFY MEMO Registro actual cuando comienza la edicin
READ Registro actual y todos los registros de campos con alias
RECALL Registro actual
RECALL NEXT 1 Registro actual
RECALL registro n Registro n
RECALL de ms de un registro Toda la tabla
REPLACE Registro actual y todos los registros de campos con alias
REPLACE NEXT 1 Registro actual y todos los registros de campos con alias
REPLACE registro n Registro n y todos los registros de campos con alias
REPLACE de ms de un registro Toda la tabla y todos los archivos de campos con alias
SHOW GETS Registro actual y todos los registros de campos con alias
TABLEUPDATE( ) Depende del almacenamiento en bfer
UPDATE Toda la tabla
UPDATE SQL Toda la tabla
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 35 de 89
465 of 804
Caractersticas del bloqueo de registros
Los comandos que intentan bloquear registros son menos restrictivos que los comandos que bloquean
tablas. Si bloquea un registro, los dems usuarios podrn seguir agregando o eliminando otros
registros. Si otro usuario ya ha bloqueado un registro o una tabla o, si ha abierto la tabla de forma
exclusiva, no se podr bloquear dicha tabla o registro. Los comandos que intentan bloquear un
registro y fallan devuelven el error "Registro utilizado por otra persona".
Los comandos BROWSE, CHANGE, EDIT y MODIFY MEMO no bloquean un registro hasta que
usted lo modifique. Si est modificando campos procedentes de registros de tablas relacionadas, los
registros relacionados se bloquearn si es posible. El intento de bloqueo fallar si el registro actual o
alguno de los registros relacionados est bloqueado por otro usuario. Si se consigue realizar el
bloqueo, podr modificar el registro; el bloqueo se liberar cuando usted vaya a otro registro o active
otra ventana.
Algunos comandos de Visual FoxPro bloquean toda una tabla mientras que otros slo bloquean su
encabezado. Los comandos que bloquean la tabla completa son ms restrictivos que los comandos
que slo bloquean el encabezado de la tabla. Cuando bloquee el encabezado de la tabla, otros
usuarios no podrn agregar ni eliminar registros, aunque s podrn cambiar los datos de los campos.
Los usuarios pueden compartir la tabla sin ocasionar conflictos cuando se ejecuta el comando
APPEND BLANK pero puede producirse un error cuando otro usuario tambin anexa un registro
BLANK a la tabla. Puede interceptar el error "Archivo utilizado por otra persona", que se devuelve
cuando dos o ms usuarios ejecutan APPEND BLANK simultneamente. Los comandos que
bloquean toda la tabla devuelven el error "Archivo utilizado por otra persona" si la tabla no puede
bloquearse. Para cancelar el intento de bloqueo, presione ESC.
Bloqueo manual
Puede bloquear manualmente un registro o una tabla mediante las funciones de bloqueo.
RLOCK()
LOCK()
FLOCK()
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 36 de 89
466 of 804
RLOCK( ) y LOCK( ) son idnticos y bloquean uno o varios registros, mientras que FLOCK( )
bloquea un archivo. Las funciones LOCK( ) y RLOCK( ) pueden aplicarse a un encabezado de tabla.
Si especifica 0 como el registro para LOCK( ) o RLOCK( ) y la prueba indica que el encabezado est
desbloqueado, la funcin bloquear el encabezado y devolver verdadero (.T.).
Una vez bloqueado un registro o una tabla, asegrese de liberar el bloqueo mediante UNLOCK lo
antes posible para proporcionar acceso a otros usuarios.
Si falla el intento de bloquear un registro o una tabla, el comando SET REPROCESS y la rutina de
error actual determinarn si vuelve a intentarse el bloqueo. SET REPROCESS afecta al resultado de
un intento de bloqueo sin xito. Puede controlar el nmero de intentos de bloqueo o el perodo de
tiempo durante el cual se intenta un bloqueo mediante SET REPROCESS.
El ejemplo siguiente abre la tabla customer para acceso compartido y utiliza FLOCK( ) para intentar
bloquearla. Si la tabla se bloquea con xito, REPLACE ALL actualizar todos sus registros.
UNLOCK libera el bloqueo de archivo. Si el archivo no puede bloquearse porque otro usuario haya
bloqueado el archivo o uno de sus registros, se mostrar un mensaje.
Desbloquear datos
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 37 de 89
467 of 804
Para desbloquear un registro que se ha bloqueado automticamente, slo necesitar mover el puntero
de registro, aunque haya establecido MULTILOCKS ON. No obstante, deber eliminar
explcitamente el bloqueo de un registro que haya bloqueado manualmente; mover el puntero de
registro no es suficiente.
En la tabla siguiente se describen los efectos que producen diversos comandos sobre el bloqueo
manual y automtico de registros y tablas.
Comando Efecto
UNLOCK ALL Libera los bloqueos de registro y archivo en el rea de
trabajo actual.
UNLOCK ALL Libera todos los bloqueos de todas las reas de trabajo de la
sesin actual.
SET MULTILOCKS OFF Activa la liberacin automtica del bloqueo actual al
asegurar un bloqueo nuevo.
FLOCK( ) Libera todos los bloqueos de registro de un archivo afectado
antes de bloquear el archivo.
CLEAR ALL, CLOSE ALL, Libera todos los bloqueos de registro y archivo.
USE, QUIT
END TRANSACTION Libera los bloqueos automticos.
TABLEUPDATE( ) Libera todos los bloqueos antes de actualizar la tabla.
Para asegurarse de que todos los usuarios de un entorno compartido disponen de un duplicado exacto
y seguro del entorno, y que mltiples instancias de un formulario pueden funcionar
independientemente, Visual FoxPro proporciona sesiones de datos.
Una sesin de datos es una representacin del entorno de trabajo dinmico actual. Podra considerar
la sesin de datos como un entorno de datos en miniatura dentro de una sesin de Visual FoxPro
abierta en un equipo. Cada sesin de datos contiene:
El concepto de una sesin de datos se entiende fcilmente cuando se considera lo que ocurre al abrir
el mismo formulario simultneamente en dos estaciones de trabajo diferentes en una aplicacin
multiusuario. En este caso, cada estacin de trabajo ejecuta una sesin de Visual FoxPro diferente y,
por tanto, tiene su propio conjunto de reas de trabajo: cursores que representan las tablas base
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 38 de 89
468 of 804
por tanto, tiene su propio conjunto de reas de trabajo: cursores que representan las tablas base
abiertas, los ndices y las relaciones.
Sin embargo, si abre en un solo equipo mltiples instancias del mismo formulario en un solo
proyecto, dentro de la misma sesin de Visual FoxPro, los formularios comparten la sesin de datos
predeterminada, lo que representa un nico entorno de trabajo dinmico. Cada instancia del
formulario abierto en la misma sesin de Visual FoxPro usa el mismo conjunto de reas de trabajo y
las acciones en una nica instancia de un formulario que mueven el puntero de registro en un rea de
trabajo afectan automticamente a otras instancias del mismo formulario.
Si desea tener ms control sobre mltiples instancias de un formulario, puede implementar sesiones
privadas de datos. Cuando el formulario utiliza sesiones privadas de datos, Visual FoxPro crea una
nueva sesin de datos para cada instancia del control Form, FormSet o Toolbar que crea la aplicacin.
Cada sesin privada de datos contiene:
l Una copia diferente de cada tabla, ndice y relacin del entorno de datos del formulario.
l Un nmero ilimitado de reas de trabajo.
l Punteros de registro para la copia de cada tabla, independientes de las tablas base del
formulario.
El nmero de sesiones de datos disponibles est limitado slo por la memoria y el espacio en disco
disponible en el sistema.
O bien
frmFormName.DataSession = 2
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 39 de 89
469 de
Nota Slo puede establecer la propiedad DataSession durante el diseo y, en tiempo of 804
ejecucin, esta propiedad es de slo lectura.
Cuando un formulario utiliza sesiones privadas de datos, cada instancia de un formulario abierta en
un solo equipo en una nica sesin de Visual FoxPro usa su propio entorno de datos. El uso de
sesiones privadas de datos es similar a la ejecucin simultnea del mismo formulario desde diferentes
estaciones de trabajo.
Cada sesin privada de datos se identifica por separado. Puede ver el contenido de cada sesin de
datos en la ventana Sesin de datos. Tambin puede cambiar la descripcin de la sesin de datos
mediante comandos en el cdigo del evento Load.
Puede ver el nmero de identificacin de cada sesin de datos mediante la propiedad de tiempo de
ejecucin DataSessionID. El ejemplo siguiente muestra la propiedad DataSessionID de un formulario
denominado frmMiFormulario:
DO FORM frmMiFormulario
? frmMiFormulario.DataSessionID
Si activa el formulario mediante la clusula NAME, puede usar el nombre del formulario para tener
acceso a la propiedad DataSessionID, como en el cdigo siguiente:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 40 de 89
? one.DataSessionID 470 of 804
La propiedad DataSessionID sirve para identificar una sesin de datos determinada. Evite cambiar la
propiedad DataSessionID de una instancia de un formulario porque los controles dependientes de
datos pierden sus orgenes de datos cuando se modifica esta propiedad.
Mientras que las sesiones privadas de datos generan reas de trabajo diferentes que contienen copias
independientes de las tablas abiertas, ndices y relaciones de un formulario, cada copia del formulario
hace referencia a los mismos archivos de tablas base y de ndices base subyacentes. Cuando un
usuario actualiza un registro en una instancia de un formulario, se actualiza la tabla base a la que hace
referencia el formulario. Los cambios realizados en otra instancia del formulario pueden verse al
desplazarse por el registro modificado.
Los bloqueos realizados en registros o tablas en una sesin privada de datos son respetados por otras
sesiones privadas de datos. Por ejemplo, si el usuario de la sesin de datos 1 pone un bloqueo en un
registro, el usuario de la sesin de datos 2 no puede bloquear el registro. Si el usuario de la sesin 1
abre una tabla de forma exclusiva, el usuario de la sesin de datos 2 no puede abrir la tabla.
Respetando los bloqueos realizados por otras sesiones de datos, Visual FoxPro protege la integridad
de las actualizaciones en las tablas base subyacentes.
Debido a que las sesiones de datos controlan el alcance de determinados comandos SET, puede usar
sesiones privadas de datos para establecer configuraciones personalizadas de comandos SET dentro
de una sola sesin de Visual FoxPro.
Por ejemplo, el comando SET EXACT, que controla las reglas utilizadas al comparar cadenas de
caracteres de diferentes longitudes, pertenece al mbito de la sesin de datos actual. La configuracin
predeterminada de SET EXACT es Off, lo que especifica que, para ser equivalentes, las expresiones
deben coincidir, carcter a carcter, hasta que se llega al final de las expresiones en el lado derecho.
Tal vez desee activar bsquedas "borrosas" o equivalentes; para ello, establezca SET EXACT como
OFF para la sesin de datos actual. Sin embargo, la aplicacin podra contener un formulario
determinado que requiriera coincidencias exactas. Podra establecer la propiedad DataSession como 2
para el formulario que requiere coincidencias exactas, para activar las sesiones privadas de datos y
despus establecer SET EXACT a ON para ese formulario. Si ejecuta un comando SET slo para el
formulario que utiliza sesiones privadas de datos, se mantiene intacta la configuracin global de la
sesin de Visual FoxPro a la vez que permite la configuracin personalizada para un formulario
determinado.
Cuando las sesiones privadas de datos para un formulario estn en uso, los cambios realizados en los
datos de un formulario no se representan automticamente en otras instancias del mismo formulario.
Si desea que todas las instancias de un formulario tengan acceso a los mismos datos y reflejen
automticamente los cambios realizados en datos comunes, puede ignorar la asignacin automtica
de sesin de datos.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 41 de 89
471 of 804
Para ignorar la asignacin automtica de sesin de datos
SET DATASESSION TO 1
O bien
SET DATASESSION TO
Si desea proteger los datos durante las actualizaciones, utilice bferes. El almacenamiento en bfer de
registros y tablas de Visual FoxPro ayuda a proteger las operaciones de mantenimiento y
actualizacin de datos en registros individuales y mltiples registros de datos en entornos
multiusuario. Los bferes pueden comprobar, bloquear y liberar automticamente registros o tablas.
Antes de activar el almacenamiento en bfer, evale el entorno de datos para elegir el mtodo de
almacenamiento en bfer y las opciones de bloqueo que mejor se ajusten a las necesidades de edicin
de la aplicacin, los tipos y tamaos de registros y tablas, y cmo se utiliza y actualiza la
informacin, entre otros factores. Una vez activado el almacenamiento en bfer, permanecer en
vigor hasta que lo desactive o hasta que cierre la tabla.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 42 de 89
472 of 804
l Para tener acceso, modificar y escribir un registro individual cada vez, elija el almacenamiento
de registros en bfer.
l Para almacenar en bfer las actualizaciones a varios registros, elija el almacenamiento de tablas
en bfer.
l Para proporcionar la mxima proteccin para los datos existentes, utilice transacciones de
Visual FoxPro.
Las transacciones pueden utilizarse por s solas, pero obtendr una mayor efectividad si las
emplea como encapsuladores para comandos de almacenamiento en bfer de tablas o registros.
Para obtener ms informacin al respecto, consulte la seccin, Administrar actualizaciones
mediante transacciones, ms adelante en este mismo captulo.
El almacenamiento pesimista en bfer impide que otros usuarios de un entorno multiusuario tengan
acceso a un determinado registro o tabla mientras usted realiza cambios en el mismo. Un bloqueo
pesimista proporciona el entorno ms seguro para cambiar registros individuales, aunque puede hacer
ms lentas las operaciones del usuario. Este modo de almacenamiento en bfer es bastante similar al
mecanismo de bloqueo estndar de versiones anteriores de FoxPro, con la ventaja adicional del
almacenamiento de datos incorporados en bfer.
El almacenamiento optimista en bfer es un modo eficaz de actualizar registros ya que los bloqueos
slo se realizan en el momento en que se escribe el registro, minimizando de este modo el tiempo que
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 43 de 89
473 of 804
slo se realizan en el momento en que se escribe el registro, minimizando de este modo el tiempo que
un nico usuario monopoliza el sistema en un entorno multiusuario. Cuando utilice el
almacenamiento en bfer de registros o tablas para vistas, Visual FoxPro impondr el bloqueo
optimista.
El valor predeterminado de Buffering es 1 para las tablas y 5 para las vistas. Si utiliza el
almacenamiento en bfer para tener acceso a datos remotos, la propiedad Buffering tendr un valor 3,
almacenamiento optimista de filas en bfer o 5, almacenamiento optimista de tablas en bfer. Para
obtener ms informacin sobre el acceso a los datos de tablas remotas, consulte el captulo 6,
Consultar y actualizar mltiples tablas, del Manual del usuario.
Nota Establezca MULTILOCKS como ON para todos los modos de almacenamiento en bfer por
encima de 1.
CURSORSETPROP("Buffering", 2)
Visual FoxPro intenta bloquear el registro en la ubicacin del puntero. Si el bloqueo tiene xito,
Visual FoxPro situar el registro en un bfer y permitir su modificacin. Cuando mueva el puntero
de registro o ejecute el comando TABLEUPDATE( ), Visual FoxPro escribir el registro almacenado
en bfer en la tabla original.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 44 de 89
CURSORSETPROP("Buffering", 3)
Visual FoxPro escribe en un bfer el registro situado en la ubicacin del puntero y permite
modificaciones. Cuando mueva el puntero de registro o ejecute el comando TABLEUPDATE( ),
Visual FoxPro intentar un bloqueo del registro. Si se produce el bloqueo, Visual FoxPro comparar
el valor actual del registro en el disco con el valor original del bfer. Si ambos valores son iguales, las
modificaciones se escribirn en la tabla original; si la comparacin entre estos valores indica que son
distintos, Visual FoxPro generar un error.
CURSORSETPROP("Buffering", 4)
Visual FoxPro intenta bloquear el registro situado en la ubicacin del puntero. Si se produce el
bloqueo, Visual FoxPro situar el registro en un bfer y permitir su modificacin. Utilice el
comando TABLEUPDATE( ) para escribir en la tabla original los registros almacenados en bfer.
CURSORSETPROP("Buffering", 5)
Visual FoxPro escribe los registros en un bfer y permite modificarlos hasta que usted ejecute un
comando TABLEUPDATE( ). A continuacin, Visual FoxPro llevar a cabo la siguiente secuencia
en cada registro del bfer:
Cuando se activa el almacenamiento de tablas en bfer, Visual FoxPro slo intentar realizar
actualizaciones despus de que se ejecute el comando TABLEUPDATE( ).
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 45 de 89
475 of 804
Puede anexar y eliminar registros mientras est activado el almacenamiento de tablas en bfer: los
registros anexados se agregan al final del bfer. Para tener acceso a todos los registros del bfer,
incluidos los registros anexados, utilice la funcin RECNO( ). La funcin RECNO( ) devuelve
nmeros negativos secuenciales para los registros que usted anexe a un bfer de tabla. Por ejemplo, si
inicia el almacenamiento de tablas en bfer, modifica los registros 7, 8 y 9, y a continuacin anexa
tres registros, el bfer contendr valores RECNO( ) de 7, 8, 9, 1, 2 y 3.
Slo podr quitar del bfer registros anexados si utiliza el comando TABLEREVERT( ). Para
cualquier registro anexado, TABLEUPDATE( ) y TABLEREVERT( ) eliminan el valor negativo de
RECNO( ) para ese registro y mantienen la secuencia.
Mientras utiliza un bfer de tabla, puede usar el comando GO con el valor negativo de RECNO( )
para tener acceso a un determinado registro anexado. Por ejemplo, utilizando el ejemplo anterior,
puede escribir:
Los registros anexados tienen nmeros de RECNO( ) negativos y secuenciales en sentido ascendente.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 46 de 89
476 of 804
Para quitar un registro anexado de un bfer de tabla
1. Utilice el comando GO con un valor negativo para situar el puntero de registro en el registro
que desea eliminar.
TABLEREVERT( ) quita de un bfer de tabla los registros anexados sin escribir los registros en la
tabla. TABLEUPDATE( ) escribe en una tabla todos los registros que estn almacenados en bfer,
aunque se hayan marcado para su eliminacin.
Actualizar datos
Para actualizar datos, puede usar almacenamiento en bfer, transacciones o vistas.
O bien
Por ejemplo, puede activar el almacenamiento pesimista de filas en bfer si coloca el cdigo
siguiente en el procedimiento Init de un formulario:
CURSORSETPROP('Buffering', 2)
Despus escriba cdigo para las operaciones de actualizacin en el cdigo del mtodo apropiado para
los controles.
Para escribir las modificaciones en la tabla original, utilice TABLEUPDATE( ). Para cancelar las
modificaciones despus de una operacin fallida de actualizacin en una tabla restringida por reglas,
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 47 de 89
477 of 804
modificaciones despus de una operacin fallida de actualizacin en una tabla restringida por reglas,
utilice TABLEREVERT( ). TABLEREVERT( ) es vlido aunque el almacenamiento explcito de
tablas en bfer no est activado.
El ejemplo siguiente demuestra cmo actualizar registros cuando est activado el almacenamiento
pesimista de registros en bfer.
Cdigo Comentarios
OPEN DATABASE testdata En el cdigo Init del formulario,
USE customers
CURSORSETPROP('Buffering', 2) abre la tabla y activa el
almacenamiento pesimista de
registros en bfer.
lModificado = .F.
FOR nNmCampo = 1 TO FCOUNT()
IF GETFLDSTATE(nNmCampo) = 2 Se desplaza por campos y
lModificado = .T. comprueba los que se han
EXIT modificado.
ENDIF
ENDFOR
Nota: este cdigo podra estar en
el evento Click de un botn de
comando "Guardar" o
"Actualizar".
IF lModificado Busca el siguiente registro
nResultado = MESSAGEBOX;
("El registro cambi. Modificar? ; modificado.
4+32+256, "Cambiar datos
SKIP
IF EOF()
MESSAGEBOX( "ya est al final"
THISFORM.Refresh
SKIP garantiza que se escribe el
ltimo cambio.
Incluso si utiliza el almacenamiento en bfer pueden surgir problemas. Si desea proteger las
operaciones de actualizacin y recuperar una seccin completa de cdigo como una unidad, utilice
transacciones.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 48 de 89
478 of 804
almacenamiento en bfer de registros y tablas de Visual FoxPro, situando una seccin completa de
cdigo en una unidad protegida y recuperable. Puede anidar transacciones y emplearlas para proteger
actualizaciones almacenadas en bfer. Las transacciones de Visual FoxPro slo estn disponibles con
tablas pertenecientes a una base de datos.
Una transaccin acta como un envoltorio que almacena en memoria cach o en disco las
operaciones de actualizacin de datos, en lugar de aplicar directamente esas actualizaciones a la base
de datos. La actualizacin real de la base de datos se realiza al final de la transaccin. Si por alguna
razn el sistema no puede realizar las operaciones de actualizacin en la base de datos, podr anular
la transaccin completa para que no se lleve a cabo ninguna actualizacin.
Nota Las operaciones de actualizacin almacenadas en bfer que se haya realizado fuera de una
transaccin se ignoran en otra transaccin de la misma sesin de datos.
Para Utilice
Iniciar una transaccin BEGIN TRANSACTION
Determinar el nivel actual de la transaccin TXNLEVEL( )
Invertir todos los cambios realizados desde la instruccin ROLLBACK
BEGIN TRANSACTION ms reciente
Bloquear registros, grabar en disco todos los cambios END TRANSACTION
realizados en tablas de la base de datos desde la instruccin
BEGIN TRANSACTION ms reciente y, a continuacin,
desbloquear los registros
Puede utilizar transacciones para encapsular modificaciones a tablas, archivos .cdx estructurales y
archivos memo asociados a tablas de una base de datos. Las operaciones en las que intervienen
variables de memoria y otros objetos no respetan las transacciones, por lo que no se pueden anular o
grabar.
Nota Cuando se utilicen los datos almacenados en tablas remotas, el control de los comandos de la
transaccin slo actualiza los datos de la copia local del cursor de la vista; las actualizaciones de
tablas base remotas no se ven afectadas. Para activar las transacciones manuales en tablas remotas,
utilice SQLSETPROP( ) y, a continuacin, controle la transaccin mediante SQLCOMMIT( ) y
SQLROLLBACK( ).
En general, deber utilizar las transacciones con bferes de registro en lugar de con almacenamiento
en bfer de tablas, salvo para envolver llamadas de TABLEUPDATE( ). Si incluye un comando
TABLEUPDATE( ) en una transaccin, podr anular una actualizacin fallida, resolver la causa del
fallo y, a continuacin, volver a intentar TABLEUPDATE( ) sin perder datos. De este modo se
asegurar de que la actualizacin se produce como una operacin de "todo o nada".
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 49 de 89
479 of 804
BEGIN TRANSACTION
* Actualizar registros
IF lSuccess = .F. && se produce un error
ROLLBACK
ELSE && aplicar las modificaciones
* Validar los datos
IF && ocurre un error
ROLLBACK
ELSE
END TRANSACTION
ENDIF
ENDIF
Usar transacciones
l Una transaccin comienza con el comando BEGIN TRANSACTION y termina con el comando
END TRANSACTION o ROLLBACK. Una instruccin END TRANSACTION que no vaya
precedida de una instruccin BEGIN TRANSACTION generar un error.
l Una instruccin ROLLBACK que no vaya precedida de una instruccin BEGIN
TRANSACTION generar un error.
l Una vez comenzada una transaccin, permanecer en vigor hasta que comience el END
TRANSACTION correspondiente (o hasta que se ejecute un comando ROLLBACK), incluso
en programas y funciones, a menos que se termine la aplicacin, lo que producir una
anulacin.
l Visual FoxPro utiliza datos almacenados en cach en el bfer de transaccin antes de utilizar
datos del disco para consultas sobre los datos relacionados con transacciones. De este modo se
asegura la utilizacin de los datos ms actuales.
l Si la aplicacin termina durante una transaccin, todas las operaciones se anularn.
l Una transaccin slo funciona en un contenedor de base de datos.
l No es posible utilizar el comando INDEX si sobrescribe un archivo de ndice existente o si hay
abierto algn archivo de ndice .cdx.
l Las transacciones pertenecen al mbito de las sesiones de datos.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 50 de 89
480 of 804
explcitamente todos los bloqueos realizados en una transaccin.
Anidamiento de transacciones
Observe en el ejemplo siguiente que, puesto que los cambios en una transaccin anidada no se
escriben en disco, sino en el bfer de transacciones, la transaccin ms interna sobrescribir los
cambios realizados en los mismos campos STATUS de la transaccin anterior:
El siguiente ejemplo de transaccin anidada elimina un registro de cliente y todas las facturas
relacionadas. La transaccin se anular si se producen errores durante un comando DELETE. Este
ejemplo demuestra la agrupacin de operaciones de actualizacin de tablas para impedir que las
actualizaciones se completen parcialmente y para evitar conflictos de simultaneidad.
Cdigo Comentarios
DO WHILE TXNLEVEL( ) > 0 Limpia el entorno de otras
ROLLBACK
ENDDO transacciones.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 51 de 89
481 of 804
OPEN DATABASE test
USE mrgtest1
CURSORSETPROP('buffering',5)
GO TOP Activa el almacenamiento optimista
de tablas en bfer.
REPLACE fld1 WITH "cambiado" Cambia un registro.
SKIP
REPLACE fld1 WITH "otro cambio"
MESSAGEBOX("modificar primer campo de ambos " + ; Cambia otro registro.
" registros en otro equipo ")
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 52 de 89
"Registro modificado") 482 of 804
Las transacciones pueden protegerle frente a los errores generados por el sistema durante
actualizaciones de datos en tablas remotas. El ejemplo siguiente utiliza una transaccin para envolver
operaciones de escritura de datos en una tabla remota.
Cdigo Comentarios
hConex = CURSORGETPROP('connecthandle') Obtiene el controlador de
SQLSETPROP(hConnect, 'transmode',
DB_TRANSMANUAL) conexin
y activa transacciones manuales.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 53 de 89
483 of 804
BEGIN TRANSACTION Comienza la transaccin manual.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 54 de 89
484 of 804
CASE aErrors[1,1] = 109 El error 109 indica que otro
* Controlar el error
usuario est utilizando el
registro.
CASE aErrors[1,1] = 1583 El error 1583 indica que se ha
* Controlar el error
infringido una regla de la fila.
OTHERWISE
* Controlar errores genricos.
Administrar el rendimiento
Cuando haya creado la aplicacin multiusuario, podr emplear las siguientes sugerencias para
mejorar su rendimiento:
Visual FoxPro crea sus archivos temporales en la carpeta de directorios temporales predeterminada
de Windows. Las sesiones de modificacin de texto tambin pueden crear temporalmente una copia
completa del archivo que se est modificando (un archivo .BAK).
Si las estaciones de trabajo locales disponen de disco duro con abundante espacio libre, podr
mejorar el rendimiento si sita estos archivos temporales en la unidad local o en una unidad RAM. Al
redirigir estos archivos a una unidad local o RAM aumentar el rendimiento, ya que se reduce el
acceso a la unidad de red.
Puede especificar una ubicacin alternativa para esos archivos si incluye las instrucciones
EDITWORK, SORTWORK, PROGWORK y TMPFILES en el archivo de configuracin
Config.fpw. Para obtener ms informacin sobre las opciones de configuracin, consulte el captulo
4, Optimizar el sistema, de la Gua de instalacin.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 55 de 89
485 of 804
4, Optimizar el sistema, de la Gua de instalacin.
Cuando los datos que contiene una tabla son relativamente estticos, el procesamiento de tablas
ordenadas secuencialmente sin un orden establecido mejora el rendimiento. Esto no significa que las
tablas ordenadas no puedan o no deban aprovechar los archivos de ndice; el comando SEEK que
requiere un ndice, es incomparable para encontrar registros rpidamente. Sin embargo, cuando
encuentre un registro con SEEK, podr desactivar la ordenacin.
Los comandos que se ejecutan cuando ningn otro usuario necesita tener acceso a los datos, como las
actualizaciones nocturnas, pueden verse beneficiados si abre los archivos de datos para uso exclusivo.
Cuando se abren archivos para uso exclusivo, el rendimiento mejora porque Visual FoxPro no
necesita comprobar el estado de los bloqueos de registros o archivos.
Para disminuir la contencin entre los usuarios para tener acceso de escritura a una tabla o un
registro, reduzca el tiempo que un registro o una tabla permanecen bloqueados. Para ello, bloquee el
registro nicamente despus de modificarlo en lugar de hacerlo durante la modificacin. El
almacenamiento optimista de filas en bfer proporciona el menor tiempo de bloqueo.
Para obtener ms informacin sobre la mejora del rendimiento, consulte el captulo 4, Optimizar el
sistema, de la Gua de instalacin e ndice principal. Tambin encontrar informacin sobre la
mejora del rendimiento en aplicaciones cliente-servidor en el captulo 22, Optimizar el rendimiento
cliente-servidor, de este manual.
l DB_KEY
l DB_KEYANDUPDATABLE
l DB_KEYANDMODIFIED (la predeterminada)
l DB_KEYANDTIMESTAMP
Si elige una de estas cuatro configuraciones, puede controlar cmo genera Visual FoxPro la clusula
WHERE de la instruccin SQL Update enviada a las tablas base de la vista. Puede elegir la
configuracin que desee mediante la ficha Criterios de actualizacin del Diseador de vistas o puede
usar DBSETPROP( ) para establecer WhereType para una definicin de vista. Para cambiar la
configuracin de WhereType para un cursor en la vista activa, use CURSORSETPROP( ).
Por ejemplo, suponga que tiene una vista remota sencilla basada en la tabla Customer que incluye
siete campos: cust_id, company, phone, fax, contact, title y timestamp. La clave principal de la
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 56 de 89
486 of 804
siete campos: cust_id, company, phone, fax, contact, title y timestamp. La clave principal de la
vista es cust_id.
Slo ha establecido como actualizables dos campos: contact_name y contact_title. Desea que el
usuario pueda cambiar el nombre de la persona de contacto de la empresa y su cargo desde la vista.
Sin embargo, si cambian otros datos de la compaa, como su direccin, los cambios deben pasar a
un coordinador que identificar el efecto de los cambios en la empresa, como si va a cambiar la
regin de ventas del cliente. Ahora que la vista se ha configurado para enviar actualizaciones, puede
elegir WhereType segn sus preferencias.
Ahora suponga que cambia el nombre del campo contact para un cliente, pero no cambia el valor en
el otro campo actualizable, title. Segn este ejemplo, la seccin siguiente trata sobre cmo afectar
la configuracin de WhereType a la clusula WHERE que Visual FoxPro genera para enviar el
nombre del nuevo contacto a las tablas base.
La actualizacin menos restrictiva usa la configuracin DB_KEY. La clusula WHERE utilizada para
actualizar tablas remotas consta nicamente del campo clave principal con la propiedad KeyField o
KeyFieldList. A menos que se haya modificado o eliminado el campo clave principal en la tabla base
desde que se recuper el registro, se inicia el proceso de actualizacin.
En el caso del ejemplo anterior, Visual FoxPro preparara una instruccin de actualizacin con una
clusula WHERE que compara el valor del campo cust_id con el del campo cust_id en la fila de la
tabla base:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 57 de 89
487 of 804
WHERE OLDVAL(customer.cust_id) = CURVAL(customer_remote_view.cust_id)
Cuando la instruccin de actualizacin se enva a la tabla base, slo se comprueba el campo clave.
La clusula WHERE utilizada para actualizar tablas base consta de los campos principales
especificados con la propiedad KeyFieldList y de todos los campos que se hayan modificado en la
vista. En el caso del ejemplo anterior, Visual FoxPro preparar una instruccin de actualizacin que
compare los valores del campo cust_id (porque es el campo principal) y el campo contact, porque
se ha cambiado el nombre de la persona de contacto. Aun cuando sea actualizable, el campo title
no se incluye en la instruccin de actualizacin porque no se ha modificado.
Los campos clave y modificados de la vista se comparan con sus campos correspondientes de la
tabla base
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 58 de 89
488 of 804
La clusula WHERE utilizada para actualizar tablas base consta de campos principales especificados
con la propiedad KeyField o KeyFieldList y de todos los dems campos que son actualizables. En el
caso del ejemplo, Visual FoxPro preparara una instruccin de actualizacin que compara los valores
de los campos cust_id, contact y title con los mismos campos de la fila de la tabla base.
Todos los campos actualizables de la vista se comparan con sus homlogos de la tabla base
En el caso del ejemplo, Visual FoxPro prepara una instruccin de actualizacin que compara los
valores del campo cust_id y el valor del campo timestamp con los de los campos de la fila de la
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 59 de 89
489 of 804
valores del campo cust_id y el valor del campo timestamp con los de los campos de la fila de la
tabla base.
La marca de hora del registro de la vista se compara con la marca de hora del registro de la
tabla base.
Administrar conflictos
Cuando elija el almacenamiento en bfer, transacciones o vistas, debe administrar los conflictos que
puedan surgir durante el proceso de actualizacin.
Puede hacer que las operaciones de actualizacin de datos sean ms eficientes si elige
cuidadosamente cmo y cundo abrir, almacenar en bfer y bloquear datos en un entorno
multiusuario. Deber limitar el tiempo que un registro o una tabla estn sometidos a conflictos de
acceso. A pesar de todo, tendr que anticiparse a los conflictos que se producen de forma inevitable y
administrarlos. Un conflicto se produce cuando un usuario intenta bloquear un registro o una tabla
que ya ha bloqueado otro usuario. Dos usuarios no pueden bloquear el mismo registro o la misma
tabla a la vez.
La aplicacin deber contener una rutina para administrar estos conflictos. Si la aplicacin no tiene
una rutina de conflictos, el sistema puede quedar bloqueado. Se produce un punto muerto cuando un
usuario ha bloqueado un registro o una tabla e intenta bloquear otro registro ya bloqueado por un
segundo usuario que, a su vez, est intentando bloquear el registro bloqueado por el primer usuario.
Aunque esto no suele ocurrir, cuanto ms tiempo permanezca bloqueado un registro o una tabla,
mayores posibilidades habr de que se produzca un punto muerto.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 60 de 89
490 of 804
Detectar errores
Disear una aplicacin multiusuario o agregar soporte de red a un sistema de un solo usuario exige
interceptar colisiones y errores. El uso de los bferes de registro y tabla de Visual FoxPro simplifica
parte de este trabajo.
Si intenta bloquear un registro o una tabla que ya estn bloqueados por otro usuario, Visual FoxPro
devolver un mensaje de error. Puede utilizar SET REPROCESS para resolver automticamente los
intentos fallidos de bloqueo. Este comando, en combinacin con una rutina ON ERROR y el
comando RETRY permite continuar o cancelar los intentos de bloqueo.
Ejemplo del uso de SET REPROCESS y ON ERROR para administrar colisiones de usuarios
Cdigo Comentarios
ON ERROR DO rep_err ERROR(),MESSAGE() Esta rutina se ejecuta si se
SET EXCLUSIVE OFF
SET REPROCESS TO AUTOMATIC produce un error.
USE customer Abre los archivos de forma no
IF !FILE('copi_cli.dbf') exclusiva.
COPY TO cus_copy El reprocesamiento de bloqueos
ENDIF
fallidos es automtico.
Abre la tabla.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 61 de 89
491 of 804
PROCEDURE reem_todo Rutina que reemplaza los datos
REPLACE ALL contact WITH ;
PROPER(contact) de todos los registros.
GO TOP
RETURN
ENDPROC
El ejemplo siguiente muestra un procedimiento de error que se inicia cuando el usuario presiona ESC.
Cdigo Comentario
PROCEDURE rep_err Este programa se activa cuando
PARAMETERS errnum, msg
surge un error y el usuario sale
del proceso de espera.
DO CASE Averigua de qu tipo de error se
trata.
Es "Archivo utilizado por otra
persona"?
CASE errnum = 108
lnea1 = "El archivo no se puede bloquear."
lnea2 = " Intntelo ms tarde..."
CASE errnum = 109 .OR. errnum = 130 Es "Registro utilizado por otra
lnea1 = "El registro no se puede bloquear."
lnea2 = "Intntelo ms tarde." persona"?
OTHERWISE O es desconocido?
lnea1 = msg + " "
lnea2 = ;
"Pngase en contacto con el administrador del sistema."
ENDCASE
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 62 de 89
492 of 804
Durante las operaciones de actualizacin de datos, sobre todo en entornos compartidos, puede resultar
conveniente determinar qu campos han cambiado o cules son los valores originales o actuales de
los campos modificados. El almacenamiento en bfer de Visual FoxPro y las funciones
GETFLDSTATE( ), GETNEXTMODIFIED( ), OLDVAL( ) y CURVAL( ) permiten determinar qu
campo ha cambiado, buscar los datos modificados y comparar los valores actuales, originales y
modificados para decidir cmo solucionar un error o un conflicto.
GETFLDSTATE( ) funciona sobre datos no almacenados en bfer. Sin embargo, esta funcin es an
ms efectiva cuando se ha activado el almacenamiento de registros en bfer. Por ejemplo, utilice
GETFLDSTATE( ) en el cdigo de un botn "Ignorar" de un formulario. Cuando mueva el puntero
de registro, Visual FoxPro comprobar el estado de todos los campos del registro como en el ejemplo
siguiente:
lModificado = .F.
FOR nNmCampo = 1 TO FCOUNT( ) && Comprobar todos los campos
if GETFLDSTATE(nNmCampo) = 2 && modificado
lModificado = .T.
EXIT && Insertar aqu rutina para actualizar/guardar
ENDIF && Vea el ejemplo siguiente
ENDFOR
GETNEXTMODIFIED( ), con cero como parmetro, busca el primer registro modificado. Si otro
usuario realiza cambios en la tabla almacenada en bfer, los cambios que encuentre el comando
TABLEUPDATE( ) en el bfer ocasionarn conflictos. Puede evaluar los valores conflictivos y
resolverlos mediante las funciones CURVAL( ), OLDVAL( ) y MESSAGEBOX( ). CURVAL( )
devuelve el valor actual de registro en el disco, mientras que OLDVAL( ) devuelve el valor del
registro en el momento en que se almacen en el bfer.
CURVAL( ) devuelve el valor actual en el disco de un campo almacenado en bfer antes de realizar
modificaciones.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 63 de 89
493 of 804
modificaciones.
Puede crear un procedimiento de control de errores que compare los valores actual y original, lo que
le permitir determinar si desea grabar el cambio actual como definitivo o aceptar un cambio anterior
en los datos de un entorno compartido.
Cdigo Comentarios
DO WHILE GETNEXTMODIFIED(nCurRec) <> 0 Hace un bucle a travs de
GO nCurRec
RLOCK( )
Bloquea el registro modificado.
Puede usar la propiedad CompareMemo para controlar cundo deben usarse campos memo para
detectar conflictos en la actualizacin. Esta propiedad de la vista y del cursor determina si los campos
memo (de los tipos M o G) estn incluidos en la clusula WHERE de actualizacin. La configuracin
predeterminada, Verdadero (.T.), significa que los campos memo estn incluidos en la clusula
WHERE. Si establece esta propiedad como Falso (.F), los campos memo no participan en la clusula
WHERE de actualizacin, independientemente de la configuracin de UpdateType.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 64 de 89
WHERE de actualizacin, independientemente de la configuracin de UpdateType. 494 of 804
l Detecta un conflicto
l Identifica la naturaleza y la ubicacin del conflicto
l Proporciona suficiente informacin para que el usuario pueda resolver el conflicto
correctamente
Para obtener un ejemplo de una rutina de administracin de conflictos, vea la clase del comprobador
de datos en Samples.vcx, ubicado en el directorio ...\Samples\Vfp98\Classes de Visual Studio.
Simplemente agregue la clase a un formulario y llame al mtodo CheckConflicts antes de realizar
cualquier operacin que escriba datos almacenados en bfer en la tabla, por ejemplo, mover el
puntero de registro si est utilizando el almacenamiento de filas en bfer, cerrar una tabla o ejecutar
TABLEUPDATE( ).
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 65 de 89
495 of 804
l Qu datos son aceptables?
l Cmo se escribe cdigo para una aplicacin internacional?
l Qu debe tenerse en cuenta a la hora de disear una interfaz de usuario?
En las secciones siguientes se da respuesta a estas preguntas y se plantean otras que debe tener en
cuenta antes de disear la aplicacin.
Para crear datos internacionales para una aplicacin, deber escribirlos manualmente, importarlos de
otras aplicaciones o anexarlos a archivos y campos memo existentes. Para obtener ms informacin
sobre cmo importar y anexar datos, consulte el captulo 9, Importar y exportar datos, del Manual del
usuario.
Para decidir qu datos son aceptables, determine en primer lugar en qu pas se va a utilizar la
aplicacin. La configuracin propia de cada pas determina el contenido cultural de los datos, as
como los idiomas en los que stos se disean.
Asimismo, los idiomas afectarn a la pgina de cdigos con la que se disean los datos. Una pgina
de cdigos es un juego de caracteres que utiliza el PC para mostrar correctamente los datos, a menudo
para tratar los caracteres internacionales. Los caracteres internacionales incluyen caracteres que
tienen marcas diacrticas. Estas marcas se colocan encima, debajo o entre letras para indicar cambios
de sonido con respecto a la forma sin marca. Las marcas diacrticas ms frecuentes son el acento
grave (` como en ), el acento agudo ( como en ), el acento circunflejo (^ como en ), la tilde (~
como en ), la diresis ( como en ), el anillo ( como en ) y la barra inclinada (/ como en ),
siempre usadas en las vocales.
Normalmente los datos se marcan automticamente con la pgina de cdigos apropiada cuando se
trabaja con ellos. Sin embargo, si asigna manualmente una pgina de cdigos a una tabla o produce
un cambio en la misma, los usuarios podran no reconocer algunos o todos los datos mostrados. Para
obtener detalles sobre las pginas de cdigos, consulte Trabajar con pginas de cdigos ms adelante
en este captulo.
Algunos idiomas, como el chino, el coreano o el japons, usan DBCS (juegos de caracteres
codificados en dos bytes) para representar sus datos. Si la aplicacin pudiera ejecutarse en estos
entornos, podra necesitar funciones de tratamiento de cadenas especiales y secuencias de ordenacin
para que la aplicacin funcionase correctamente. Para obtener ms detalles sobre cmo trabajar en
entornos DBCS, consulte Trabajar con juegos de caracteres codificados en dos bytes ms adelante en
este captulo.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 66 de 89
496 of 804
Una aplicacin consta de un componente de interfaz de usuario y un componente de aplicacin. El
componente de interfaz de usuario contiene grficos, cadenas de texto y opciones relacionadas con la
configuracin propia de cada pas, como fechas, monedas, valores numricos y separadores. El
componente de aplicacin contiene el cdigo que se ejecuta para todas las configuraciones
nacionales, incluido el cdigo que procesa las cadenas y los grficos empleados en la interfaz de
usuario.
Cuando disee una aplicacin, mantenga separados los componentes de aplicacin y de interfaz de
usuario, ya que disponer de componentes independientes facilita la adaptacin y el mantenimiento de
la aplicacin. Por ejemplo, con componentes separados no es necesario examinar el cdigo fuente
para adaptar elementos de la interfaz. Para obtener ms informacin sobre cmo escribir cdigo,
consulte Crear o modificar programas, ms adelante en este mismo captulo.
Los mens, cuadros de dilogo, mensajes, iconos y mapas de bits empleados en la interfaz de usuario
deben ser acordes a la configuracin propia del pas para el que disea la aplicacin. Por ejemplo, si
disea la aplicacin para usuarios de Alemania o Francia, los cuadros de dilogo debern ser lo
bastante grandes para mostrar correctamente las instrucciones, si stas se traducen al alemn o al
francs. Asimismo, las imgenes utilizadas en iconos y mapas de bits deben ser culturalmente
correctas para que sean comprensibles en los pases de destino. Para obtener ms informacin sobre
el diseo de interfaces de usuario, consulte Disear la interfaz, ms adelante en este mismo captulo.
Probar la aplicacin
Para comprobar una aplicacin internacional, debe comprobar las dependencias de pas e idioma de la
configuracin regional para la que est diseada la aplicacin. La comprobacin implica asegurar que
los datos y la interfaz de usuario de la aplicacin presentan conformidad con los estndares de la
configuracin regional en cuanto a la fecha y la hora, los valores numricos, los separadores de lista y
las medidas.
Disear la interfaz
Puesto que el texto tiende a aumentar cuando se adapta una aplicacin a otro pas, tome las debidas
precauciones al disear los siguientes componentes de la interfaz de usuario:
l Mensajes de la aplicacin
l Mens y formularios
l Iconos y mapas de bits
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 67 de 89
497 of 804
Crear mensajes de la aplicacin
Cuando cree mensajes en su aplicacin, tenga en cuenta que la longitud de las cadenas de texto vara
de un idioma a otro. La tabla siguiente muestra el crecimiento medio de las cadenas, a partir de su
longitud inicial.
Al igual que los mensajes, los mens y los cuadros de dilogo pueden aumentar de tamao cuando se
traduce la aplicacin. Por ejemplo, observe los formularios siguientes, que forman parte de una
aplicacin de ejemplo para cajeros automticos. La primera figura muestra el formulario en ingls y
la segunda su equivalente en espaol. Puede ver el espacio adicional que se ha reservado para el
aumento del texto en el formulario.
Sugerencia Si deja espacio para el aumento del texto en una interfaz, los traductores tendrn que
dedicar menos tiempo a reajustar el tamao de los controles y a volver a disear la interfaz.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 68 de 89
498 of 804
En los mens y formularios, evite barras de estado con mucho texto. Asimismo, evite las
abreviaturas, ya que es posible que no existan en otros idiomas.
Si se utilizan correctamente, los iconos y los mapas de bits pueden formar una parte importante de la
interfaz de usuario. Sin embargo, el significado de los iconos y los mapas de bits puede ser ms
ambiguo que el del texto. Por tanto, siga estas directrices cuando utilice iconos y mapas de bits:
l Utilice imgenes universalmente reconocidas. Por ejemplo, utilice un sobre para representar
correo, pero no utilice un buzn porque no es un smbolo universal.
l Utilice imgenes respetuosas con las culturas. Por ejemplo, evite utilizar imgenes de smbolos
religiosos y animales.
l Evite el uso de texto en mapas de bits, ya que el aumento del texto puede representar un
problema, al igual que en otras partes de la interfaz.
l Evite la jerga, el lenguaje vulgar, el humor, el lenguaje extravagante y los estereotipos tnicos.
l Use Informacin sobre herramientas para explicar los iconos, que tienen la ventaja adicional de
poder aumentar de tamao automticamente para adaptarse al texto que muestran.
l Si utiliza imgenes de hombres y mujeres, asegrese de que su sexo y el cargo que desempean
son adecuados, y que los gestos y las imgenes del cuerpo humano son adecuados en la cultura
de destino.
l Utilice el color correctamente. Por ejemplo, evite utilizar combinaciones de colores asociadas a
banderas nacionales o movimiento polticos.
Si no sabe con seguridad si un icono o un mapa de bits resulta apropiado, consulte con un ciudadano
del pas para el que est diseando la aplicacin.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 69 de 89
En las secciones siguientes se tratan estos dos mtodos. 499 of 804
Puede escribir caracteres internacionales en Visual FoxPro mediante el teclado. El mtodo exacto que
debe utilizar depende del idioma en el que est trabajando. En entornos de caracteres de un nico
byte, puede escribir los caracteres directamente o presionar una combinacin de teclas del teclado.
Por otro lado, los entornos DBCS suelen proporcionar un Editor de mtodos de entrada (Input
Method Editor, IME), que es una aplicacin que puede utilizar para escribir caracteres.
Con un teclado internacional, puede mostrar caracteres internacionales presionando simplemente las
teclas dedicadas a esos caracteres. Si su teclado no dispone de teclas para caracteres internacionales,
podr escribirlos empleando el mapa de caracteres de Windows o presionando la tecla alt en
combinacin con las teclas del teclado numrico auxiliar.
Tambin puede escribir un carcter internacional si presiona alt en combinacin con un nmero de
cuatro dgitos que empieza por cero y se introduce desde el teclado numrico.
Nota No puede escribir caracteres internacionales en FoxFont. Por ejemplo, si abre la ventana
Comandos, cambia a FoxFont y presiona una tecla dedicada, el resultado no es el carcter impreso en
la tecla. Para obtener los mejores resultados, evite el uso de FoxFont en aplicaciones internacionales.
O bien
l Mantenga presionada la tecla alt y escriba un cero seguido del cdigo ASCII de tres dgitos.
Por ejemplo, para escribir (cdigo ASCII 246), presione bloq num en el teclado numrico y, a
continuacin, alt+0246. Asegrese de que utiliza una fuente estndar de Windows, no FoxFont o
FoxPrint.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 70 de 89
500 of 804
Escribir caracteres mediante un IME
Si trabaja en un entorno IME, puede usar un Editor de mtodos de entrada para escribir caracteres en
Visual FoxPro. El IME es una aplicacin suministrada con el entorno que permite escribir caracteres
del teclado para mostrar una seleccin de caracteres internacionales y elegir el carcter que desea. Por
ejemplo, un IME para chino podra permitirle escribir una representacin Pinyin de una palabra china
y despus mostrar una lista de caracteres que coinciden con la representacin. Cuando seleccione el
carcter que desee, el IME lo pega en Visual FoxPro.
Puede controlar cundo muestra Visual FoxPro un IME si establece la propiedad IMEMode o llama a
la funcin IMESTATUS( ). Si activa la ventana del IME, Visual FoxPro muestra automticamente el
IME cuando realice operaciones de modificacin en una ventana del sistema, como las ventanas
Examinar y Modificar. Si desactiva la ventana del IME, puede invocar al editor presionando las teclas
apropiadas del teclado.
Si importa o copia datos de archivos delimitados mediante los comandos APPEND FROM o COPY
TO, puede especificar qu carcter se est utilizando en el archivo para separar los campos. Por
ejemplo, es frecuente en muchos pases europeos usar un punto y coma (;) como delimitador de
campos, mientras que los delimitadores ms habituales en Estados Unidos son la coma (,), el
tabulador o el espacio.
Para importar o copiar archivos y especificar un delimitador, agregue la clusula DELIMITED WITH
CHARACTER a los comandos APPEND FROM o COPY TO:
Las pginas de cdigos corresponden aproximadamente a cuatro alfabetos diferentes. Por ejemplo,
Windows suministra pginas de cdigos para los idiomas ingls, alemn, escandinavos, etc. Usando
una pgina de cdigos diferente, las aplicaciones pueden mostrar correctamente caracteres de estos
diferentes alfabetos.
Visual FoxPro muestra datos mediante una nica pgina de cdigos que, como opcin
predeterminada, es la pgina de cdigos utilizada por Windows. Sin embargo, puede anular la pgina
de cdigos de Windows si especifica otra pgina alternativa en el archivo de configuracin (debe
especificar una pgina de cdigos vlida).
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 71 de 89
501 of 804
Las tablas de Visual FoxPro se etiquetan con la pgina de cdigos que estaba en uso cuando se cre la
tabla. Cuando use la tabla, Visual FoxPro comprueba la pgina de cdigos de la tabla con la pgina
de cdigos actual. Si coinciden, Visual FoxPro muestra los datos tal como son. Si no existe ninguna
pgina de cdigos para la tabla (por ejemplo, la tabla se cre en una versin anterior de FoxPro),
Visual FoxPro solicita una pgina de cdigos y marca el archivo con esa pgina.
Si la pgina de cdigos de la tabla no coincide con la del sistema, Visual FoxPro intenta traducir los
caracteres de la primera a la pgina de cdigos actual. Por ejemplo, si est utilizando Visual FoxPro y
la pgina de cdigos actual del sistema es la inglesa, el carcter se representa por el valor ANSI
252. Si la pgina de cdigos de la tabla representa el carcter como el valor ANSI 219, Visual
FoxPro traduce todas las instancias del valor ANSI 219 a ANSI 252 para que se muestren
correctamente.
Las traducciones de las pginas de cdigos no funcionan siempre correctamente porque las pginas
suelen contener caracteres que no se representan uno a uno en otras pginas de cdigos. Por ejemplo,
no puede asignar datos que contienen los caracteres de dibujo de lnea de MS-DOS en Windows,
porque las pginas de cdigos de Windows no contienen estos caracteres. Tampoco puede traducir
datos creados en la pgina de cdigos del ruso en una pgina de cdigos del ingls, porque no existe
una correspondencia mutua entre los alfabetos de estos idiomas. Por ltimo, Visual FoxPro no podra
contener un mapa de traduccin de caracteres para una pgina de cdigos determinada. En ese caso,
los datos se muestran sin traduccin de pgina de cdigos. Visual FoxPro no muestra ningn error
que indique que no se est produciendo traduccin de pginas de cdigos. Cualquiera de las
situaciones anteriores pueden hacer que algunos caracteres se muestren de forma indebida.
Si desea crear una aplicacin para una configuracin regional determinada, puede evitar los
problemas de traduccin de las pginas de cdigos si crea los componentes de la aplicacin con la
pgina de cdigos diseada para esa configuracin regional y ese entorno. Por ejemplo, para crear una
aplicacin destinada a Rusia, deber utilizar la pgina de cdigos 1251 o 866 para los usuarios de
entornos Windows o MS-DOS, respectivamente. Para obtener una lista completa, consulte Pginas de
cdigos compatibles con Visual FoxPro.
Si necesita escribir algunos caracteres no representados por teclas del teclado, puede hacerlo usando
ALT junto con una combinacin de teclas del teclado numrico. Sin embargo, no olvide que la
misma combinacin de teclas usada en diferentes entornos suele presentar resultados distintos. Por
ejemplo, si introduce ALT+0182 con la pgina de cdigos 1252 en Visual FoxPro, ver el smbolo
del prrafo. En contraste, si introduce ALT+0182 con la pgina de cdigos 437 en FoxPro para MS-
DOS, ver un carcter grfico con una doble lnea vertical que se junta con una lnea horizontal
sencilla.
Aunque Visual FoxPro admite muchas pginas de cdigos, slo se suelen utilizar unas pocas. Con
Visual FoxPro para Windows, por ejemplo, los usuarios de habla inglesa utilizan normalmente la
pgina de cdigos 1252. Sin embargo, en FoxPro para MS-DOS, suelen utilizar la pgina de cdigos
437.
Al trabajar con pginas de cdigos, no olvide comprobar que la interfaz de usuario y los datos se
muestran correctamente usando la pgina de cdigos diseada para una configuracin regional
determinada. Si ve caracteres inesperados en la pantalla, compruebe la pgina de cdigos asociada.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 72 de 89
502 of 804
Especificar la pgina de cdigos para archivos .dbf
Al crear archivos .DBF, Visual FoxPro les asigna automticamente marcas de pgina de cdigos para
distinguir qu pgina de cdigos utilizan. Sin embargo, si utiliza archivos .dbf procedentes de
versiones anteriores de FoxPro, es posible que no tengan marcas de pgina de cdigos.
Puede determinar si un archivo .dbf tiene una marca de pgina de cdigos mediante la funcin
CPDBF( ) despus de abrir el archivo o haciendo que Visual FoxPro lo compruebe cuando abra el
archivo.
Si desea guardar esta configuracin para futuras sesiones de Visual FoxPro, elija Establecer
como predeterminado.
Si un archivo no tiene ninguna marca de pgina de cdigos, deber agregarla tal como se describe en
la seccin siguiente.
Si utiliza un archivo .dbf de una versin anterior de FoxPro, posiblemente no tenga marca de pgina
de cdigos. Sin dicha marca, es posible que el archivo no se muestre correctamente. Si est activada
la comprobacin automtica de pginas de cdigos, cuando abra el archivo puede determinar si tiene
o no marca de pgina de cdigos. Si no la tiene, puede agregarla.
2. Abra el archivo.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 73 de 89
503 of 804
Nota Los archivos de texto, como por ejemplo los de programa (.prg) y consulta (.qpr), no
tienen marcas de pgina de cdigos. Esto significa que no es posible distinguir qu pginas de
cdigos utilizan estos archivos. Sin embargo, si los incluye en un proyecto, ste podr mantener
un registro de las pginas de cdigos empleadas. Para obtener ms detalles, consulte
Especificar la pgina de cdigos de un archivo de texto ms adelante en este captulo.
Si un archivo .DBF no se muestra correctamente, puede deberse a que tiene una marca de pgina de
cdigos incorrecta. Para eliminar la marca de pgina de cdigos, utilice el programa CPZERO
ubicado en Tools\Cpzero. Al ejecutar CPZERO se establecer la pgina de cdigos como 0, es decir,
ninguna.
Nota Cuando elimine la marca de pgina de cdigos de un archivo .DBF, los datos del
archivo no cambiarn. Para cambiar la pgina de cdigos de los datos, deber marcar el archivo
con la pgina de cdigos correcta. Para obtener ms informacin al respecto, consulte Agregar
marcas de pgina de cdigos en una seccin anterior en este mismo captulo.
Puede cambiar la pgina de cdigos de un archivo .dbf si quita su marca de pgina de cdigos y le
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 74 de 89
504 of 804
Puede cambiar la pgina de cdigos de un archivo .dbf si quita su marca de pgina de cdigos y le
agrega una nueva, si copia el archivo a otro archivo o si usa el programa CPZERO.
Por ejemplo, para copiar Prueba.dbf a Prueb866.dbf, al tiempo que cambia la pgina de cdigos
a 866, utilice los comandos siguientes:
USE TEST.DBF
COPY TO TEST866.DBF AS 866
Cuando se complete COPY TO, los datos del archivo resultante tendrn la nueva pgina de cdigos.
Si olvida la pgina de cdigos de un archivo de texto que no forma parte de un proyecto, no podr
determinar cul es esta pgina de cdigos, ya que un archivo de texto no tiene marcas de pgina de
cdigos como ocurre con los archivos .DBF. La mejor forma de recordar la pgina de cdigos de un
archivo de texto consiste en agregar el archivo a un proyecto.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 75 de 89
Visual FoxPro mostrar el cuadro de dilogo Pgina de cdigos. 505 of 804
Si sabe cul es la pgina de cdigos de un archivo de texto, puede especificarlo usando la clusula AS
del comando apropiado de Visual FoxPro. Para los archivos que desee importar o anexar, puede
especificar la pgina de cdigos en los comandos IMPORT o APPEND. Para los archivos de
consulta, programa o de texto de otro tipo que ya estn en su PC, puede cambiar la pgina de cdigos
mediante los comandos MODIFY QUERY, MODIFY COMMAND y MODIFY FILE. Para obtener
informacin detallada sobre estos comandos, vea los temas correspondientes de la Ayuda.
Si no sabe con seguridad qu pgina de cdigos debe aplicar, sustituya la funcin GETCP( ) por el
nmero de pgina de cdigos del comando. GETCP( ) mostrar el cuadro de dilogo Pgina de
cdigos para que seleccione la ms adecuada.
Nota Algunos caracteres no pueden traducirse correctamente entre pginas de cdigos. Adems,
algunas traducciones de pginas de cdigos no se admiten en Visual FoxPro. Compruebe siempre los
resultados de un cambio en la pgina de cdigos para garantizar que los datos se han traducido
correctamente.
Despus de agregar un archivo a un proyecto, puede determinar su pgina de cdigos. El mtodo que
debe utilizar depende de si el archivo es una tabla (archivo .dbf) o un archivo de texto.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 76 de 89
506 of 804
Nota Cuando agregue un archivo .dbf a un proyecto, no ser necesario que especifique una pgina
de cdigos para el archivo, ya que Visual FoxPro determina automticamente la pgina de cdigos a
partir de la marca de pgina de cdigos del archivo. Sin embargo, cuando agregue un archivo de texto
a un proyecto, deber especificar una pgina de cdigos para el archivo, ya que Visual FoxPro no
puede determinar automticamente la pgina de cdigos.
Para preparar un programa para que utilice otra pgina de cdigos, especifique la pgina de cdigos
original cuando guarde o compile el programa en la nueva plataforma. Por ejemplo, si desea preparar
un programa creado con Visual FoxPro para Macintosh con el fin de utilizarlo con Visual FoxPro,
especifique la pgina de cdigos apropiada de MS-DOS cuando guarde o compile el proyecto con
Visual FoxPro. Si usa el comando COMPILE, especifique la pgina de cdigos mediante la clusula
AS. Otra alternativa es especificar la pgina de cdigos con SET CPCOMPILE antes de compilar el
programa.
Tal vez desee manipular datos internacionales de una determinada manera. Por ejemplo, podra
traducir los datos de una variable a otra pgina de cdigos o evitar la traduccin de datos de un
campo de tipo Character o Memo.
Si el cdigo de la aplicacin incluye una variable que contiene datos de otra pgina de cdigos, puede
traducir los datos a la pgina de cdigos apropiada mediante la funcin CPCONVERT( ). Por
ejemplo, suponga que la variable x contiene datos creados con la pgina de cdigos de Macintosh
(10000). Para traducir los datos a la pgina de cdigos de Windows (1252), ejecute el comando
siguiente:
cConvert=CPCONVERT(10000,1252,x)
En Windows, los datos convertidos se presentan exactamente igual que en Macintosh. Por ejemplo,
un carcter que se presente como "" en Macintosh tendr el mismo aspecto en Windows.
2. Seleccione la tabla.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 77 de 89
507 of 804
4. Seleccione el campo cuyos datos desee proteger.
5. En la lista Tipo, seleccione Carcter (binario) para un campo del tipo CARCTER o Memo
(binario) para un campo memo.
6. Elija Aceptar y despus S para hacer que los cambios sean definitivos.
Otra alternativa es usar el comando MODIFY STRUCTURE para proteger los campos
apropiados.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 78 de 89
508 of 804
1253 Windows griego xCB
1254 Windows turco xCA
10000 Macintosh estndar x04
10006 Macintosh griego x98
10007 * Macintosh ruso x96
10029 Macintosh de Europa del Este x97
Los distintos tipos de ordenacin incorporan las reglas de ordenacin de la configuracin de los
distintos pases, permitiendo ordenar correctamente los datos en esos idiomas. En Visual FoxPro, el
orden actual determina los resultados de comparaciones entre expresiones de caracteres y el orden en
el que los registros aparecen en tablas indexadas u ordenadas.
Utilice el orden adecuado, ya que cada orden produce resultados distintos, como se muestra en la
tabla siguiente.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 79 de 89
509 of 804
Czech Csar ar ar
ab Strae Char Czech
ar ar Czech Char
a a Strasse Strasse
b b strae strae
l Evite el orden Mquina si desea ordenar correctamente los caracteres internacionales, ya que
Mquina ordena los caracteres internacionales segn el orden ASCII. Por ejemplo ar va
detrs de strae.
l Los caracteres con marcas diacrticas se ordenan de forma distinta que los caracteres sin estas
marcas. Por ejemplo, en los rdenes General y Espaol a se ordena antes que ab pero ab va
antes que b.
l Los caracteres del tipo se ordenan igual que los caracteres ampliados equivalentes. Por
ejemplo, strae se ordena igual que Strasse, y csar igual que Caesar.
l En algunos idiomas, dos caracteres se ordenan como un nico carcter. Por ejemplo, en
Espaol, la Ch de Char se ordena como si fuera un carcter entre C y D.
Especificar la ordenacin
Puede especificar una ordenacin para los campos del tipo CARCTER que emplear en operaciones
posteriores de indexacin y ordenacin.
Para guardar esta configuracin para futuras sesiones de Visual FoxPro, elija Establecer como
predeterminado.
El orden actual no afecta a los ndices creados anteriormente, aunque s afecta a los resultados de
comparaciones y comandos como SEEK y SELECT - SQL. Para obtener ms informacin al
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 80 de 89
510 of 804
comparaciones y comandos como SEEK y SELECT - SQL. Para obtener ms informacin al
respecto, consulte Reconocer los resultados de los mtodos de ordenacin ms adelante en este
mismo captulo.
Puede cambiar el orden en cualquier momento. Por ejemplo, despus de abrir una tabla de clientes,
puede crear etiquetas de ndice que representen distintos mtodos de ordenacin, como se muestra en
el cdigo siguiente. A continuacin, podr cambiar el orden utilizando simplemente una etiqueta
distinta:
USE cliente
SET COLLATE TO "GENERAL"
INDEX ON fnombre TAG migeneral ADDITIVE
SET COLLATE TO "MACHINE"
INDEX ON custid TAG mimquina ADDITIVE
SET COLLATE TO "DUTCH"
INDEX ON lnombre TAG miholands ADDITIVE
La pgina de cdigos actual determina qu rdenes hay disponibles. Si utiliza SET COLLATE para
especificar un orden no admitido por la pgina de cdigos actual, Visual FoxPro generar un error.
Asimismo, si especifica en Config.fpw un orden no admitido en la pgina de cdigos actual, se usar
de forma predeterminada el orden Mquina.
Comprobar rdenes
Para determinar el orden actual, utilice la funcin SET ('COLLATE'). Por ejemplo, puede guardar el
actual, establecer el orden actual en Mquina, realizar los trabajos necesarios y, a continuacin,
restaurar el orden original mediante el cdigo siguiente:
cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
*
* cdigo que requiere el orden Mquina
*
SET COLLATE TO cOrdenActual && vuelve al orden anterior
Adems, puede determinar el orden de un ndice o una etiqueta de ndice utilizando la funcin
IDXCOLLATE( )..
El orden afecta a los resultados de la comparacin de cadenas, SEEK, y SELECT - SQL, como se
describe en las secciones siguientes.
Comparar cadenas
Todos los rdenes, salvo Mquina y Peso nico, ignoran el uso de maysculas o minsculas. Esto
significa que no es necesario utilizar UPPER( ) en las expresiones de ndice.
El orden actual afecta a las comparaciones de cadenas. Por ejemplo, si establece el orden en General,
las instrucciones siguientes devolvern verdadero (.T.):
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 81 de 89
511 of 804
?"A" = "a"
?"Strae"="Strasse"
?"" = "ae"
Sin embargo, cuando utilice el orden Mquina, todas estas instrucciones devolvern falso (.F.) porque
se ha especificado que las cadenas coincidan en una comparacin exacta, byte a byte.
? "Strae" == "Strasse"
Nota Visual FoxPro ignora SET EXACT cuando se utiliza el operador de comparacin de cadenas
de caracteres (= =).
Usar SEEK
Visual FoxPro ignora las marcas diacrticas cuando se realiza una bsqueda parcial. Una bsqueda
parcial se produce cuando la longitud de la expresin es inferior a la de la clave. Si las marcas
diacrticas son importantes, considere la posibilidad de utilizar SCAN FOR...ENDSCAN o LOCATE
FOR...CONTINUE en lugar de SEEK.
Entre las ventajas de utilizar SCAN y LOCATE en lugar de SEEK cabe citar las siguientes:
El comando SELECT - SQL utiliza el orden actual. Por ejemplo, si tiene una etiqueta de ndice
basada en el orden General y el orden actual (devuelto por SET ('COLLATE')) es Mquina, el
resultado de SELECT - SQL se basar en Mquina.
Usar ndices
Los mtodos de ordenacin determinan el orden de los registros de las tablas indexadas. Tenga en
cuenta las siguientes directrices para utilizar ndices con rdenes:
l Vuelva a crear los ndices creados en versiones anteriores de FoxPro si desea que stos utilicen
un orden distinto que Mquina.
l Vuelva a crear los ndices de dBASE para aprovechar los rdenes de Visual FoxPro.
l Utilice el comando REINDEX para volver a generar un ndice, ya que REINDEX no modifica
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 82 de 89
512 of 804
l Utilice el comando REINDEX para volver a generar un ndice, ya que REINDEX no modifica
el orden.
El soporte de DBCS de Visual FoxPro DBCS permite la creacin de aplicaciones internacionales. Por
ejemplo, puede crear una aplicacin en japons con una versin USA de Visual FoxPro si ejecuta la
versin japonesa de Windows. Las funciones de DBCS de Visual FoxPro DBCS operan
correctamente en el juego de caracteres japons y admiten la secuencia de ordenacin en japons.
Nota Visual FoxPro proporciona funciones de programacin especiales para utilizarlas con cadenas
en entornos DBCS. Para obtener ms detalles, consulte Trabajar con cadenas en entornos DBCS ms
adelante en este mismo captulo.
Visual FoxPro permite el uso de caracteres DBCS cuando se asignan nombres a elementos de las
aplicaciones. Al igual que con Visual FoxPro, normalmente los elementos pueden:
l Tener una longitud mxima de 254 caracteres con la combinacin de caracteres codificados en
dos bytes y caracteres nicos. Por ejemplo, si usa caracteres codificados en dos bytes, el
nombre que cree slo puede tener 127 caracteres de longitud.
l Comenzar por una letra, nmero, guin bajo o combinacin de bytes iniciales o finales.
l Contener slo letras, nmeros, guiones bajos o caracteres DBCS.
Estas reglas se aplican a variables, objetos (ventanas, mens, etc.), nombres de funciones y
procedimientos, nombres de clases y subclases, alias y constantes. Tambin puede usar los caracteres
codificados en dos bytes para los nombres de archivos. Para evitar la posibilidad de que los caracteres
del nombre del archivo se traten involuntariamente como delimitadores, es ms seguro incluir
siempre el nombre del archivo entre comillas.
Nota Los lmites de longitud de Visual FoxPro se expresan mediante caracteres de un nico byte. Si
se utilizan caracteres codificados en dos bytes en nombres de campos, expresiones de ndices,
nombres de variables y ventanas, etc., se acorta la longitud del nombre. Por ejemplo, un nombre de
campo puede ser de 10 bytes de longitud como mximo en una tabla libre; por tanto, un nombre de
campo puede constar de diez caracteres de un byte nico pero solamente de 5 caracteres codificados
en dos bytes. Para obtener ms informacin sobre las capacidades del sistema de Visual FoxPro,
consulte Capacidades del sistema.
Para facilitar la tarea de ordenar informacin en entornos DBCS, Visual FoxPro admite secuencias de
ordenacin para el chino simplificado, el chino tradicional, el japons y el coreano. Las secuencias de
ordenacin permiten ordenar correctamente campos del tipo Character de tablas para cada idioma.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 83 de 89
513 of 804
ordenacin permiten ordenar correctamente campos del tipo Character de tablas para cada idioma.
Opciones Idioma
JAPANESE Japons
KOREAN Coreano
PINYIN Chino simplificado
STROKE Chino simplificado y tradicional
Si es importante que la aplicacin pueda determinar en qu idioma se est ejecutando Visual FoxPro,
puede llamar a VERSION( ). Conocer el entorno del idioma puede ayudarle a determinar qu texto
mostrar, cmo dar formato a los datos, etc. Por ejemplo, el cdigo siguiente determina en qu idioma
se est ejecutando Visual FoxPro y despus ejecuta un formulario especfico del idioma:
IF VERSION(3) = 34 THEN
* Ejecutndose en espaol; mostrar formulario espaol
DO FORM CST_SPN.SCX
ELSE
* Mostrar formulario ingls
DO FORM CST_ENU.SCX
ENDIF
Nota La compatibilidad de cadenas de caracteres codificados en dos bytes slo ha estado disponible
en Visual FoxPro desde la versin 3.0b. Si la aplicacin dispone de las funciones de DBCS, tambin
deber llamar a la funcin VERSION(1) para comprobar el nmero de versin de Visual FoxPro.
Usar cadenas
Evite incluir cadenas directamente en el cdigo, ya que dificultan la traduccin. Por ejemplo, no
incluya fechas ni monedas como cadenas en el cdigo. Si es posible, escriba el cdigo de modo que
recupere las cadenas de archivos o tablas independientes del programa.
Nota El rendimiento del programa puede verse afectado si elimina todas las cadenas, por ejemplo, si
busca cadenas mientras est dentro de un bucle.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 84 de 89
514 of 804
Una forma de trabajar con cadenas en una aplicacin que vaya a traducirse es usar constantes de
cadenas en la aplicacin. Despus puede definir el texto de estas constantes en un archivo de texto
diferente al que se hace referencia en los programas mediante la directiva del preprocesador
#INCLUDE. Por ejemplo, en lugar de incrustar el mensaje de error no se encuentra el archivo,
puede usar la constante ERR_FILE_NOT_FOUND. El texto de esta constante podra encontrarse en
un archivo denominado ERR_TEXT.H. Un programa donde se utilice esta tcnica podra asemejarse
a ste:
#INCLUDE ERR_TEXT.H
* procesar aqu
IF ERR THEN
MESSAGEBOX( ERR_FILE_NOT_FOUND )
ENDIF
Cuando la aplicacin se traduzca, el traductor puede crear una versin del archivo de texto de errores
especfica de la configuracin regional y despus volver a compilar la aplicacin.
Visual FoxPro incluye funciones para manipular expresiones de caracteres que contengan cualquier
combinacin de caracteres de un byte o dos bytes. Usando funciones de cadena DBCS, puede
programar aplicaciones sin tener que escribir cdigo adicional que pruebe caracteres de dos bytes al
contar, buscar, insertar o quitar caracteres en una cadena.
La mayor parte de las funciones son equivalentes a sus homlogas de un byte con la excepcin de que
sus nombres tienen un sufijo C para diferenciarse. Puede usar estas funciones con datos de un byte o
de dos bytes; las funciones DBCS devuelven exactamente el mismo valor que sus homlogas de un
byte cuando se les pasan datos de un byte. Otras funciones le ayudan a trabajar con cadenas
especficamente en entornos de dos bytes.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 85 de 89
515 of 804
RATC( ) Devuelve la posicin de una cadena dentro de otra (distingue
maysculas de minsculas), empezando por la derecha.
RIGHTC( ) Devuelve los caracteres de la derecha de una cadena.
STRCONV( ) Convierte caracteres entre representaciones de un byte y dos
bytes.
STUFFC( ) Reemplaza caracteres de una cadena con otra cadena.
SUBSTRC( ) Devuelve una subcadena.
Al trabajar con funciones de cadena de dos bytes, recuerde que el lmite de longitud mximo para
variables, nombres, etctera, se reduce a la mitad. Para obtener informacin sobre las capacidades de
sistema de Visual FoxPro, vea Capacidades de sistema.
Nota Las funciones DBCS de Visual FoxPro no son compatibles con versiones anteriores de Visual
FoxPro y al llamarlas desde estas versiones se pueden producir resultados impredecibles. Si usa
funciones DBCS en su aplicacin, use VERSION(1) para comprobar que la versin de Visual FoxPro
es posterior a la versin 3.0.
Para ayudarle a dar formato a fechas, horas y moneda para que se ajusten a las costumbres de los
usuarios, puede usar varias tcnicas de formato. Puede:
2. Para usar la configuracin establecida en el Panel de control, elija Usar la configuracin del
sistema.
O bien
Elija un idioma o formato para fechas y horas y, a continuacin, elija opciones para dar formato
a moneda y nmeros. Si elige el formato Corta o Larga para el formato de fecha, no puede
especificar ninguna otra opcin para el formato de fecha y se lee la configuracin del Panel de
control de Windows.
3. Elija Aceptar para usar las opciones para esta sesin o establezca Establecer como
predeterminado para hacer que las modificaciones sean la configuracin predeterminada para
esta copia de Visual FoxPro.
Tambin puede crear esta configuracin mediante los comandos SET SYSFORMATS y SET DATE.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 86 de 89
516 of 804
Tambin puede crear esta configuracin mediante los comandos SET SYSFORMATS y SET DATE.
Como regla general, debe ejecutar este comando en la inicializacin de la aplicacin (por ejemplo, en
el archivo de configuracin). El valor predeterminado de SET SYSFORMATS es OFF, por lo que
debe establecerlo explcitamente como ON al iniciar la aplicacin.
Puede crear variantes de la aplicacin para distintas configuraciones propias de un pas mediante
directivas del preprocesador. Estas directivas controlan la compilacin de cdigo en la aplicacin e
incluyen las construcciones #INCLUDE, #DEFINE, #UNDEF y #IF...#ENDIF.
El uso de las directivas del preprocesador puede generar variantes rpidamente. Sin embargo, estas
directivas tienen los siguientes inconvenientes:
l Para usar las directivas del preprocesador debe incluir cdigo entre corchetes y el uso
abundante de los corchetes puede aumentar la complejidad del cdigo.
l Las constantes de tiempo de compilacin slo estn disponibles en el programa que las crea.
A diferencia de los archivos .DBF, los archivos de texto (como los de consulta y programa) no tienen
marcas de pgina de cdigos. Esto significa que debe hacer un seguimiento de las pginas de cdigos
que utilizan los archivos de texto para poder utilizarlos correctamente. Con el Administrador de
proyectos, puede hacer un seguimiento de las pginas de cdigos utilizadas por los archivos de texto.
Para ver detalles, consulte Especificar la pgina de cdigos de un archivo de texto en una seccin
anterior de este captulo.
Si va a distribuir la aplicacin con la versin de tiempo de ejecucin de Visual FoxPro, tiene que
incluir un archivo de recursos especfico de la configuracin regional. Este archivo contiene los
cuadros de dilogo y otros elementos de interfaz de usuario que Visual FoxPro usa para interactuar
con el usuario. Hay un archivo de recursos de tiempo de ejecucin diferente para cada idioma en el
que Visual FoxPro est disponible.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 87 de 89
517 of 804
l Distribuye la aplicacin a usuarios que usan un idioma diferente del utilizado al programarla.
Por ejemplo, si programa en ingls para usuarios de habla inglesa, no tiene que preocuparse de
incluir un archivo de recursos especfico de la configuracin regional. Sin embargo, si usa la
versin inglesa de Visual FoxPro para programar pero va a distribuir la aplicacin de tiempo de
ejecucin en un pas de habla francesa, debe incluir el archivo de recursos de tiempo de
ejecucin.
l La aplicacin muestra cuadros de dilogo de Visual FoxPro, mens o mensajes de error.
Normalmente, si ha diseado y localizado sus propias versiones de estos elementos de interfaz,
no tiene que incluir el archivo de recursos especfico de la configuracin regional.
Para obtener informacin sobre la distribucin de archivos de tiempo de ejecucin con la aplicacin,
consulte el captulo 25, Generar una aplicacin para su distribucin y el captulo 26, Crear discos de
distribucin.
A los archivos de recursos de tiempo de ejecucin se les da nombre con el formato Vfpaaa.dll, en
donde aaa es un cdigo de tres letras que representa el idioma. Por ejemplo, el cdigo ENU
significa Estados Unidos, Ingls, el cdigo DEU significa Alemn y el cdigo FRA significa Francs.
Los archivos de recursos de tiempo de ejecucin para estos idiomas sern Vfpenu.dll, Vfpdeu.dll y
Vfpfra.dll respectivamente.
Siempre debe usar al menos un archivo de recursos, incluso si no pretende usar ninguno de los
elementos de interfaz de usuario de Visual FoxPro como parte de su aplicacin. De forma
predeterminada, Visual FoxPro incluye el archivo de recursos proporcionado con su copia del
programa. Por ejemplo, si programa una aplicacin con la versin de Estados Unidos de Visual
FoxPro, Visual FoxPro incluir automticamente Vfpenu.dll si incluye archivos de tiempo de
ejecucin en la aplicacin. Si no tiene ninguna razn para usar un archivo de recursos especfico de la
configuracin regional, puede distribuir el archivo de recursos predeterminados como parte de la
aplicacin.
Cuando la aplicacin est instalada, los usuarios pueden especificar el archivo de tiempo de ejecucin
creando una entrada en el registro del sistema de Windows o usando un modificador de lnea de
comandos.
Por ejemplo, el siguiente comando especifica el archivo Vfpdeu.dll como archivo de recursos:
O bien
l Configure el registro de Windows del equipo del usuario (mediante cdigo o mediante una
aplicacin como Regedit.exe) de forma que apunte al archivo de recursos que hay que usar. La
entrada del Registro que contiene el nombre del archivo de recursos de tiempo de ejecucin es:
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 88 de 89
518 of 804
HKEY_CLASSES_ROOT\VisualFoxProRuntime.5\RuntimeResource.5
Cuando se inicia la aplicacin de tiempo de ejecucin, Visual FoxPro busca en primer lugar un
archivo de recursos segn el modificador L y despus segn la configuracin del Registro. Si ninguna
de estas configuraciones especifican un archivo de recursos especfico de la configuracin regional,
Visual FoxPro usa la configuracin regional actual del sistema (Windows) para construir de forma
dinmica un nombre de archivo DLL. Por tanto, si el archivo de recursos especfico de la
configuracin regional para la aplicacin coincide con la configuracin regional de la versin de
Windows del usuario, no tiene que especificar de forma explcita el nombre del archivo de recursos.
Sin embargo, siempre es ms seguro no confiar en la configuracin predeterminada del sistema si
quiere estar seguro de que se carga el archivo apropiado.
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 5: Ampliar aplicaciones Pgina 89 de 89
519 of 804
file://C:\temp\~hh1768.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 1 de 80
520 of 804
Las aplicaciones cliente-servidor combinan la funcionalidad de Visual FoxPro en su equipo local con
las ventajas de almacenamiento y seguridad proporcionadas por un servidor remoto. Puede hacer un
prototipo de sus aplicaciones localmente y, a continuacin, usar el Asistente para upsizing para
transformar la aplicacin para un entorno cliente-servidor.
Puede usar la tecnologa de paso a travs de SQL para mejorar la aplicacin a la que ha hecho un
upsizing. Mientras que las vistas remotas proporcionan acceso a datos del servidor, el paso a travs
de SQL le permite enviar comandos directamente al servidor con sintaxis de servidor nativa, lo que
aumenta el control y la flexibilidad.
Despus de hacer el upsizing y la implantacin, puede seguir otros pasos adicionales para optimizar
el rendimiento de su aplicacin. Averige qu puede hacer con Visual FoxPro y el servidor remoto
para optimizar la aplicacin cliente-servidor.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 2 de 80
521 of 804
servidor. Una aplicacin cliente-servidor de Visual FoxPro combina la eficacia, la velocidad, la
interfaz grfica de usuario y las sofisticadas funciones de consulta, informes y proceso de Visual
FoxPro con el acceso multiusuario, almacenamiento masivo de datos, seguridad incorporada, robusto
proceso de transacciones, inicio de sesiones y la sintaxis nativa del servidor de un origen de datos o
servidor ODBC. La sinergia de Visual FoxPro y las ventajas de los servidores proporcionan una
eficaz solucin cliente-servidor para sus usuarios.
El paso ms importante a la hora de generar con xito una aplicacin cliente-servidor es crear un
buen diseo. Este captulo se basa en la informacin para programacin de aplicaciones multiusuario
proporcionada en el Manual del programador. Partiendo de esta base, definimos una metodologa
para la programacin de aplicaciones cliente-servidor.
La mejor forma de satisfacer estos requisitos es disear la aplicacin con estos objetivos en mente.
Vamos a preparar el terreno perfilando las tcnicas que proporcionan el mximo rendimiento cliente-
servidor.
Antes de que pueda hacer uso de las nuevas tcnicas es necesario analizar los sistemas que piensa
utilizar. Al disear una aplicacin local o de servidor de archivos, debe determinar las consultas, los
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 3 de 80
522 of 804
formularios, los mens y los informes que la aplicacin va a utilizar o crear. Cuando se disea una
aplicacin cliente-servidor, se debe llevar a cabo el anlisis habitual del sistema, as como un anlisis
adicional relacionado especficamente con las aplicaciones cliente-servidor. Es necesario plantearse
dnde se ubicarn los datos utilizados por las consultas, los formularios, los mens y los informes, y
cmo se tendr acceso a esta informacin. Por ejemplo, puede plantearse cuestiones tales como:
Uno de los factores ms importantes a la hora de generar una aplicacin cliente-servidor rpida y
eficiente es reducir al mnimo la cantidad de datos que necesita extraer del servidor. Puesto que las
aplicaciones cliente-servidor pueden tener acceso a cantidades de datos muy grandes en un servidor
remoto, el uso de las tcnicas tradicionales de desplazamiento Xbase puede dar como resultado una
aplicacin cliente-servidor lenta. Para acelerar el rendimiento se utilizan tcnicas de acceso a datos
basadas en conjuntos para filtrar la cantidad de datos descargados.
Los datos remotos estn basados en conjuntos: el acceso a datos remotos se realiza seleccionando un
conjunto de datos de un gran almacn de datos mediante instrucciones SELECT - SQL. La diferencia
ms importante entre generar una aplicacin local tradicional y una aplicacin cliente-servidor es el
contraste entre las tcnicas tradicionales de desplazamiento en Visual FoxPro y las tcnicas de acceso
a datos del servidor basados en conjuntos.
En la programacin tradicional Xbase, puede tener acceso a cantidades de datos discretas y, con
frecuencia, de gran volumen, mediante el comando GO BOTTOM, para el cual puede,
posteriormente, realizar una consulta. Puede desplazarse por los datos si ejecuta un comando SET
RELATION para crear una relacin temporal entre dos tablas y, a continuacin, ejecuta un comando
SKIP para moverse por los registros relacionados.
Si bien este mtodo de desplazamiento por los registros podra utilizarse para datos remotos, no sera
eficiente para grandes almacenes de datos remotos. Por ejemplo, si crea una vista remota que tiene
acceso a una tabla grande en un origen de datos remotos y a continuacin ejecuta el comando GOTO
BOTTOM tendr que esperar mientras todos los datos de la vista se recuperan desde el origen de
datos, se envan a travs de la red y se cargan en el cursor de la vista del sistema local.
Un enfoque ms eficaz para el acceso a datos remotos es descargar nicamente los datos que necesita
y entonces volver a consultarlos para obtener registros adicionales especficos o registros nuevos. Se
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 4 de 80
523 of 804
utiliza una instruccin SELECT basada en parmetros para descargar un pequeo conjunto de datos
especfico y despus tener acceso a nuevos registros mediante la funcin REQUERY( ) para solicitar
un nuevo conjunto de datos.
No utilice el comando GO BOTTOM sobre los datos del servidor remoto porque se originara:
l Una carga innecesaria en los recursos de la red al descargar enormes cantidades de datos.
l Disminucin del rendimiento de la aplicacin al tener que manejar datos innecesarios.
l Posible reduccin de la precisin de los datos del cursor local porque los cambios en los datos
remotos no se reflejan en este cursor local hasta que no se ejecuta una nueva consulta.
Por ejemplo, si desea crear una aplicacin cliente-servidor que tenga acceso a los pedidos de un
cliente determinado, cree una vista remota que tenga acceso a la tabla Customer. Cree otra vista
remota que tenga acceso a la tabla Orders, pero parametrice la vista basndose en el campo cust_id. A
continuacin, emplee el registro del cliente actual como parmetro para la vista de la tabla Orders.
Puede utilizar el parmetro para establecer el alcance del conjunto de datos descargado a la cantidad
justa de datos. Si solicita pocos datos, puede perder rendimiento porque necesitar volver a consultar
el servidor remoto ms frecuentemente. Si solicita demasiados datos, puede perder tiempo
descargando datos que no va a utilizar.
Los siguientes ejemplos describen la forma de obtener las ventajas de la tecnologa cliente-servidor y
evitar los inconvenientes de tcnicas de programacin inadecuadas. El primer mtodo utiliza tcnicas
de programacin tradicionales para transferir todos los datos desde un origen de datos remoto hasta
cursores locales, que se relacionan posteriormente con el comando SET RELATION. Los mtodos
segundo, tercero y cuarto adoptan progresivamente tcnicas de recuperacin de datos cada vez ms
inteligentes, que limitan de forma efectiva la cantidad de datos descargados con una metodologa
justo en el momento que proporciona los datos ms actuales y el tiempo de respuesta ms rpido a
travs de una red.
Una aplicacin cliente-servidor sencilla y sin optimizar utiliza con los datos remotos las mismas
tcnicas de desplazamiento que usa para los datos locales. Por ejemplo, si tiene 10 millones de
registros de clientes y 100 millones de registros de pedidos en un origen de datos remoto, puede crear
una aplicacin ineficaz que descargue todos los registros de las tablas Customer y Orders en los
cursores locales. A continuacin puede indexar basndose en 100 millones de registros de pedidos,
crear una relacin temporal entre las tablas Customer y Orders en los cursores locales, y utilizar el
comando SKIP para desplazarse por los registros.
Este mtodo no est optimizado para un gran rendimiento, pero podra ser til si el extremo "uno" es
local y el extremo "varios" es remoto.
Una aplicacin cliente-servidor ligeramente mejorada limita el extremo "varios" de la relacin, pero
transfiere todo el extremo "uno" para que pueda pasar por los registros. En este ejemplo se crea una
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 5 de 80
524 of 804
vista remota del extremo "varios" de la relacin, la tabla Orders, parametrizada segn el ID del
cliente. A continuacin se descarga toda la tabla Customer.
Aunque crear una vista parametrizada sobre la tabla Orders es una mejora con respecto a descargar
todos los pedidos, contina transfiriendo informacin innecesaria al descargar toda la tabla Customer.
Adems, la tabla Customer est cada vez menos actualizada a medida que otros usuarios del sistema
hacen cambios en ella. Este mtodo puede ser adecuado si el extremo "uno" de la relacin contiene
un pequeo conjunto de datos.
Una tcnica de programacin cliente-servidor ms apropiada crea vistas remotas para todos los datos
remotos. El nmero de registros de Customer descargados a la vista remota de la tabla Customer se
limita mediante la instruccin SELECT en esta vista para seleccionar solamente los clientes de una
regin. A continuacin se crea una vista remota del extremo "varios" de la relacin, la tabla Orders,
parametrizada segn el ID del cliente.
Este mtodo transfiere un conjunto de registros ms reducido. El comando SKIP se usa para ir al
extremo "uno" de la relacin (la vista Customer). El comando REQUERY( ) se usa para tener acceso
a nuevos datos en el extremo "varios" (Orders).
En este ejemplo se limita (se filtra) tanto el extremo "uno" como el extremo "varios" de la relacin y
tambin se puede utilizar el comando SKIP para desplazarse por los datos filtrados. Este mtodo
puede ser recomendable si el extremo "uno" de la relacin, an despus de filtrarse, sigue siendo
suficiente para proporcionar informacin para un conjunto de consultas sucesivas antes de volver a
consultar el servidor remoto.
Por ejemplo, podra crear un formulario "uno a varios" en el cual la informacin del cliente
constituyera el extremo "uno" y un control Grid mostrara el extremo "varios" de la relacin. El
control Grid puede estar vinculado al Id. de cliente elegido en el extremo "uno" del formulario.
Entonces puede establecer la propiedad MaxRecords de CURSORSETPROP( ) a 1 y usar el cdigo
siguiente para llenar el lado "uno" del formulario:
Cuando el usuario desea ver el registro de otro cliente distinto, introduce o selecciona un nuevo Id. de
cliente. El formulario vuelve a consultar en el origen de datos los pedidos del nuevo Id. de cliente y
actualiza el control Grid con los nuevos datos de pedido.
Con estas tcnicas, la aplicacin descarga solamente los datos necesarios y en el momento en que se
necesitan. La respuesta a travs de la red se acelera si limita la cantidad de datos transferidos, y se
proporciona al usuario informacin ms actualizada si se vuelve a consultar el origen de datos justo
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 6 de 80
525 of 804
antes de mostrar la informacin solicitada.
Este mtodo se recomienda cuando se desea tener acceso a la relacin uno a varios de manera
aleatoria mediante cualquier valor de clave principal. Quizs desee descargar las claves principales en
un control, como una lista desplegable, al abrir el formulario, y despus ofrecer un control que el
usuario puede elegir para actualizar la lista de valores de clave principal cuando la requiera.
Cuando utilice datos remotos en un formulario o un conjunto de formularios, debe incluir las vistas
en el entorno de datos del formulario o del conjunto de formularios. Puede establecer la propiedad
AutoOpenTables para el entorno de datos como falsa (.F.), de forma que pueda especificar el
momento en que la aplicacin actualiza las vistas con los datos remotos. Establezca la propiedad
ControlSource para los cuadros de texto y otros controles vinculados a datos despus de haber
llamado al mtodo OpenTables del entorno de datos, normalmente en el cdigo asociado con el
evento Init del formulario. Para obtener ms informacin sobre el establecimiento de las propiedades
de formularios, consulte el captulo 9, Crear formularios.
El mximo rendimiento se obtiene cuando los datos y otros atributos de la base de datos se almacenan
en la plataforma ptima. La mejor plataforma para un elemento en concreto depende de la forma en
que se tiene acceso y se actualiza dicho elemento. Por ejemplo, quiz desee almacenar una copia local
de una tabla del servidor, como una gua de cdigos postales, que se utiliza como tabla de bsqueda,
y actualizar esta copia local solamente cuando cambie la tabla original.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 7 de 80
526 of 804
remotas para almacenar en una vista remota
reglas a nivel de campo y de
registro. La aplicacin puede usar
estas reglas locales para comprobar
la validez de los datos antes de
enviarlos a la tabla original como
actualizacin para tablas remotas.
Remota Reglas a nivel de fila
y de columna en
tablas base remotas
Procedimientos Local Procedimientos
almacenados almacenados de
Visual FoxPro
Remota Procedimientos Use la funcin SQLEXEC( ) para
almacenados en el llamar a procedimientos
servidor de apoyo almacenados en el servidor.
Transacciones Local Transacciones de
Visual FoxPro
Remota Transacciones del
servidor
Desencadenantes Vistas locales No hay
desencadenantes en
las vistas
Remota Desencadenantes del
servidor
Para reducir el trfico de la red durante las bsquedas, puede elegir entre almacenar localmente las
tablas de bsqueda que se modifican con frecuencia o las que no cambian casi nunca. Por ejemplo,
podra descargar la lista de clientes de su empresa y actualizarla solamente cuando cambiara la
informacin de los clientes.
Para realizar esta tarea, puede programar la aplicacin para que compare la marca de hora incluida en
la copia local de la tabla con la marca de hora de los datos de apoyo (si el servidor remoto admite
marcas de hora) y actualizar la copia local solamente si la tabla del servidor ha cambiado. Otra
posibilidad es agregar al formulario un botn de comando que obligue a realizar una descarga
inmediata de la tabla, lo que permite a los usuarios actualizar su copia de la tabla local cuando sea
necesario.
Puede utilizar vistas remotas, paso a travs de SQL o ambos para crear su aplicacin cliente-servidor.
La combinacin de ambos mtodos ofrece eficaces resultados: utilice las vistas para la mayora de los
requisitos de administracin de datos y emplee paso a travs de SQL para mejorar la potencia de la
aplicacin.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 8 de 80
527 of 804
Usar vistas
Puede utilizar las vistas como mtodo bsico para programar una eficaz aplicacin cliente-servidor.
Las vistas remotas constituyen una tecnologa de grandes posibilidades, diseada para permitirle
seleccionar nicamente los datos que necesita desde un servidor remoto e incluirlos en un cursor local
de Visual FoxPro, que puede utilizar posteriormente para ver y actualizar datos remotos. Una vista es,
bsicamente, un conjunto de resultados de una instruccin SELECT de SQL.
Las vistas son persistentes: la definicin de la vista se almacena en una base de datos. Las
definiciones de vistas tienen propiedades que usted puede establecer, y personalizar para el cursor de
vista activa. Las vistas son la mejor herramienta para la definicin de datos de un conjunto de
resultados actualizable.
Puede utilizar las vistas locales para generar un prototipo local y posteriormente utilizar el Asistente
para upsizing con el fin de transformar las vistas locales en vistas remotas. Para obtener informacin
sobre el uso del Asistente para upsizing, consulte el captulo 20, Upsizing de bases de datos de Visual
FoxPro
Si los usuarios de la aplicacin quieren usar datos para trabajar cuando estn de viaje, puede utilizar
vistas fuera de lnea. Las vistas fuera de lnea hacen portables los datos, permitiendo a los usuarios de
equipos porttiles trabajar con una copia almacenada de un origen de datos que pueden actualizar
mientras estn de viaje. Cuando el usuario vuelve a conectarse al servidor, la aplicacin puede
combinar fcilmente cambios fuera de lnea en las tablas de origen.
Es posible que tambin desee usar tecnologa de vistas fuera de lnea para permitir a los usuarios
locales trabajar con datos "fuera de lnea", combinando sus actualizaciones posteriormente. Para
obtener informacin sobre trabajo con datos fuera de lnea, consulte el captulo 8, Crear vistas.
La tecnologa de paso a travs de SQL le proporciona acceso directo a un servidor remoto con las
funciones de paso a travs de SQL de Visual FoxPro. Estas funciones facilitan un acceso y un control
adicionales del servidor que superan las capacidades de las vistas. Por ejemplo, puede efectuar
definicin de datos en el servidor remoto, establecer propiedades del servidor y tener acceso a
procedimientos almacenados en el servidor.
El paso a travs de SQL es la mejor herramienta para crear conjuntos de resultados de slo lectura y
para utilizar cualquier otra sintaxis nativa de SQL. A diferencia de las vistas, que son conjuntos de
resultados de instrucciones SELECT de SQL, el paso a travs de SQL le permite enviar al servidor
todo lo que desee mediante la funcin SQLEXEC( ). La tabla siguiente muestra las funciones de paso
a travs de SQL de Visual FoxPro.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 9 de 80
528 of 804
Puede crear cursores personalmente mediante la tecnologa de paso a travs de SQL. Si bien el paso a
travs de SQL proporciona un acceso ms directo al servidor, este acceso es menos persistente que el
de las vistas. A diferencia de las vistas, cuyas definiciones se almacenan en una base de datos, los
cursores creados mediante paso a travs de SQL solamente existen durante la sesin actual. Para
obtener ms informacin sobre el uso de la tecnologa de paso a travs de SQL, consulte el captulo
21, Implementar una aplicacin cliente-servidor
El primer paso de la programacin de una aplicacin cliente-servidor de Visual FoxPro puede ser
crear un prototipo. Al crear un prototipo de la aplicacin, quiz mdulo a mdulo, se descubren
posibles cambios y mejoras en el diseo durante las primeras etapas de la programacin. De esta
forma, es posible ajustar el diseo de manera eficaz sobre pequeos conjuntos de datos antes de
agregar la capa adicional de complejidad inherente al trabajo con grandes conjuntos de datos remotos
y heterogneos. La generacin de prototipos se describe en el captulo 20, Upsizing de bases de datos
de Visual FoxPro
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 10 de 80
529 of 804
Un prototipo local para una aplicacin cliente-servidor es una aplicacin de Visual FoxPro operativa
que utiliza vistas locales para tener acceso a tablas locales. Utilice vistas en su prototipo cliente-
servidor porque la aplicacin cliente-servidor final emplear vistas remotas para tener acceso a datos
remotos. Al definir un prototipo para la aplicacin con vistas locales, se acerca un poco a la
aplicacin final.
Diseo de upsizing
El upsizing es el proceso que crea en el servidor remoto una base de datos con la misma estructura de
tabla, los mismos datos y muchos otros atributos de la base de datos original de Visual FoxPro.
Mediante el upsizing, usted toma una aplicacin existente de Visual FoxPro y la migracin a una
aplicacin cliente-servidor. Para obtener ms informacin sobre el upsizing, consulte el captulo 20,
Upsizing de bases de datos de Visual FoxPro.
Cuando genere una aplicacin en la que en un futuro realizar un "upsizing", elija el diseo de la
arquitectura de la aplicacin y el modelo de programacin con el objetivo de extraer el mximo
rendimiento para un origen de datos remoto. Estas selecciones se han descrito anteriormente en este
captulo, en la seccin Disear para un alto rendimiento.
Si tiene acceso a un origen de datos remoto y desea utilizar los datos remotos directamente a medida
que programa su aplicacin cliente-servidor, puede crear el prototipo con vistas remotas. Cuando se
sigue este procedimiento con vistas remotas, se omite la fase de "upsizing", puesto que los datos se
encuentran en un servidor remoto y ya dispone de vistas remotas para tener acceso a dichos datos.
Puede simplificar las pruebas y la depuracin de su aplicacin si implementa por etapas la aplicacin
cuyo prototipo ha generado. Al implementar por etapas estas aplicaciones, se agregan mejoras
multiusuario, se mueven los datos al origen de datos remoto, y se prueba y depura la aplicacin,
mdulo a mdulo, de forma sistemtica.
Durante la implementacin de la aplicacin puede utilizar la sintaxis nativa del servidor y tener
acceso a la funcionalidad especfica del mismo como, por ejemplo, los procedimientos almacenados
del servidor, con la tecnologa de paso a travs de SQL. Para obtener ms informacin sobre paso a
travs de SQL, consulte el captulo 21, Implementacin de una aplicacin cliente-servidor.
Optimizar la aplicacin
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 11 de 80
530 of 804
Cuando la aplicacin est plenamente implementada para datos remotos y ha completado la fase de
prueba y depuracin, puede ajustar la velocidad y el rendimiento de toda la aplicacin. Para obtener
ms informacin sobre las mejoras que puede incluir en la aplicacin implementada, consulte el
captulo 22, Optimizar el rendimiento cliente-servidor
Puede crear versiones locales de las reglas de validacin del servidor remoto para proporcionar al
usuario mensajes comprensibles, por ejemplo, acerca de las actualizaciones que no se permiten
cuando se envan a la tabla de apoyo ya que los datos introducidos han infringido alguna regla de
validacin de datos o de integridad relacional del servidor.
Usar reglas de Visual FoxPro en una vista remota o en una vista fuera de lnea
En las vistas remotas puede crear reglas a nivel de campo y de registro para validar datos introducidos
localmente antes de enviarlos al origen de datos remoto. Puesto que el objetivo de estas reglas es
impedir que se enve al origen de datos cualquier dato que pueda ser rechazado por las reglas de
integridad del servidor, debe reproducir las reglas del origen de datos en las reglas que usted cree para
la vista remota. La funcin DBSETPROP( ) sirve para crear reglas para las vistas.
Sugerencia Puede crear en una vista remota una regla de validacin local que llame a un
procedimiento almacenado del servidor remoto y que enve al servidor en forma de parmetro el valor
que desea validar. No obstante, el uso de un procedimiento almacenado remoto alarga el perodo de
procesamiento durante la introduccin de datos.
Quiz prefiera basarse en las reglas establecidas en el servidor para la validacin de datos. Si ocurre
un error, la rutina de tratamiento de errores puede llamar a la funcin AERROR( ) para obtener
informacin, incluyendo el nmero del mensaje de error, el texto del mensaje de error remoto y el
controlador de conexin asociado al error.
Aunque es posible crear desencadenantes de Visual FoxPro en tablas locales, no puede crearlos en las
vistas. No obstante, s puede utilizar desencadenantes en el origen de datos remoto. Los
desencadenantes del servidor sirven para procesar actualizaciones secundarias de datos, como
actualizaciones o eliminaciones en cascada. El uso de desencadenantes del servidor para procesar
actualizaciones secundarias es ms eficaz que el envo de mltiples comandos al servidor remoto
desde la aplicacin de Visual FoxPro.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 12 de 80
531 of 804
Visual FoxPro, como la mayora de los orgenes de datos remotos, proporciona capacidades de
registro de transacciones como proteccin frente a prdidas de datos. Para obtener ms informacin
sobre el uso de las transacciones de Visual FoxPro, consulte el captulo 17, Programar para acceso
compartido
Puede utilizar las transacciones de Visual FoxPro para prototipos locales y para proceso de datos
locales. Utilice las transacciones del servidor para actualizaciones, inserciones y eliminaciones de
datos remotos. Para obtener ms informacin acerca del uso de transacciones remotas, consulte el
captulo 22, Optimizar el rendimiento cliente-servidor
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 13 de 80
532 of 804
remotos simplemente para probar el prototipo.
Puesto que el prototipo local reside completamente en su PC, resulta sencillo hacer una demostracin
de un modelo operativo de la aplicacin ante el usuario final en las primeras fases del ciclo de
programacin. Si el cliente ve la aplicacin a medida que avanza, ganar confianza en su capacidad
de proporcionar una solucin que satisfaga sus necesidades. Tambin le ofrece la oportunidad de
obtener la opinin del cliente sobre la interfaz de usuario y los informes antes de invertir recursos en
la implantacin sobre un servidor remoto.
A medida que los usuarios vean e interacten con su prototipo, pueden comenzar a identificar las
reas que les gustara modificar, as como ver las posibilidades de agregar funcionalidad adicional a
la aplicacin. Puede implantar los cambios y volver a hacer demostraciones de la aplicacin en un
proceso iterativo hasta que usted y el cliente estn satisfechos con el diseo y las funciones de la
aplicacin cuyo prototipo se ha realizado. Posteriormente, el prototipo sirve como especificacin
operativa para la aplicacin cliente-servidor final implementada.
Disponer de un modelo operativo aumenta el tiempo previo para que el usuario final se familiarice y
se sienta cmodo con la aplicacin. Tambin proporciona un marco que permite al personal de su
empresa o del cliente disear y desarrollar un plan de formacin para la aplicacin. El prototipo se
puede utilizar incluso para formar a los usuarios finales antes de la entrega de la aplicacin final,
contribuyendo de esta forma al xito en la implementacin de la aplicacin cliente-servidor final.
1. Cree su aplicacin con vistas y tablas locales para representar los datos que desea mover a un
servidor remoto.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 14 de 80
533 of 804
3. Realice un upsizing de las vistas y tablas locales mediante el Asistente para upsizing a SQL
Server o Asistente para upsizing a Oracle:
l En el paso Set Upsizing Options, en el rea Changes to make locally, seleccione
Redirect views to remote data.
Cuando seleccione esta opcin, el Asistente para upsizing copiar al servidor remoto las tablas
locales que usted elija y redirigir las vistas locales para utilizar datos remotos donde sea
pertinente.
Para obtener ms informacin sobre la creacin de vistas, consulte el captulo 8, Crear vistas. Para
obtener ms informacin sobre la creacin de formularios y el uso de un entorno de datos, consulte el
captulo 9, Crear formularios. Para obtener informacin sobre la programacin de una aplicacin,
consulte el captulo 2, Programar una aplicacin.
Nota Aunque el Asistente para upsizing tiene acceso a los servidores SQL Server, puede crear
una aplicacin cliente-servidor para cualquier origen de datos ODBC remoto. Para otros
servidores distintos de SQL Server, puede utilizar las funciones de paso a travs de SQL para
crear tablas remotas y despus usar Visual FoxPro para crear vistas remotas que tengan acceso
a las tablas del servidor. Para obtener ms informacin sobre el uso de las funciones de paso a
travs de SQL, consulte el captulo 21, Implementar una aplicacin cliente-servidor. Para
obtener informacin sobre la creacin de vistas remotas, consulte el captulo 8, Crear vistas.
Antes del upsizing, debe asegurarse de que dispone de los permisos necesarios en el servidor, estimar
el tamao de la base de datos y comprobar que el espacio en disco del servidor es suficiente. Tambin
existen preparativos especiales para un upsizing a mltiples discos o dispositivos.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 15 de 80
534 of 804
Precaucin Si el Asistente para upsizing a SQL Server se queda sin espacio libre en el servidor, se
detendr, dejando en el servidor una base de datos parcial y los dispositivos que haya creado. Puede
eliminar los dispositivos, las bases de datos y las tablas con la herramienta de Administracin de SQL
Server.
Para ejecutar el Asistente para upsizing, tiene que disponer de determinados permisos en el servidor
SQL Server hacia el que desea realizar el upsizing. Los permisos necesarios dependen de las tareas
que desee realizar.
l Para un upsizing hacia una base de datos existente, necesita los permisos CREATE TABLE y
CREATE DEFAULT.
l Para generar una nueva base de datos, necesita los permisos CREATE DATABASE y SELECT
para las tablas del sistema de la base de datos principal.
l Para crear nuevos dispositivos, tiene que ser un administrador del sistema.
Cuando usted crea una nueva base de datos, el Asistente para upsizing a SQL Server le pide que
seleccione dispositivos para la base de datos y el registro. Tambin le solicita que defina el tamao de
la base de datos y de los dispositivos.
Cuando SQL Server crea una base de datos, reserva una cantidad fija de espacio para dicha base de
datos en uno o varios dispositivos. La base de datos no utiliza necesariamente todo este espacio; el
tamao solamente limita el crecimiento mximo de una base de datos grande antes de que se agote su
espacio.
Nota Puede aumentar el tamao de una base de datos de SQL Server despus de haberla creado.
Para obtener ms informacin al respecto, consulte el comando ALTER DATABASE en la
documentacin de SQL Server.
Para estimar el espacio necesario para la base de datos, consulte el tamao de los archivos .dbf de
Visual FoxPro para las tablas en las que desea realizar el upsizing y calcule la velocidad a la que
crecer la nueva base de datos de SQL Server. En general, cada megabyte de datos de Visual FoxPro
requiere por lo menos entre 1,3 y 1,5 megabytes en SQL Server.
Si dispone de mucho espacio en disco en el servidor, multiplique por dos el tamao de las tablas de
Visual FoxPro. Esto le garantiza que el Asistente para upsizing a SQL Server tendr suficiente
espacio para realizar el upsizing de la base de datos y dejar espacio para el crecimiento. Si piensa
agregar gran cantidad de datos a la base de datos, aumente el mltiplo.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 16 de 80
535 of 804
Todas las bases de datos y los registros de SQL Server se sitan en dispositivos. Un dispositivo es
una ubicacin lgica donde se introducen bases de datos y registros, adems de un archivo fsico.
Cuando se crea un dispositivo, SQL Server crea un archivo, reservando de esta forma una cantidad
fija de espacio en disco para su uso propio.
El Asistente para upsizing a SQL Server muestra la cantidad de espacio libre disponible en los
dispositivos de SQL Server existentes. Seleccione un dispositivo que tenga como mnimo suficiente
espacio libre para el tamao estimado de la base de datos.
Si ninguno de los dispositivos existentes tiene espacio libre suficiente, puede crear un nuevo
dispositivo con el Asistente para upsizing a SQL Server. Los dispositivos nuevos deben tener como
mnimo el tamao estimado de su base de datos. Si es posible, defina el dispositivo con un tamao
mayor que el de la base de datos, lo que le permitir ampliarla posteriormente o situar otras bases de
datos o registros en el mismo dispositivo.
En la mayora de los casos, el Asistente para upsizing a SQL Server proporciona un control ms que
suficiente sobre los dispositivos de SQL Server. No obstante, si el servidor tiene mltiples discos o si
desea situar una base de datos o un registro en mltiples dispositivos, quiz desee crear dispositivos
antes de ejecutar el Asistente para upsizing a SQL Server.
Si su servidor tiene dos o ms discos duros fsicos, es posible que desee situar la base de datos en un
disco y su registro en otro disco distinto. En caso de que falle el disco, tendr ms probabilidades de
recuperar la base de datos si el registro y la base de datos estn almacenados en distintos discos
fsicos.
El Asistente para upsizing a SQL Server le permite crear nuevos dispositivos, pero solamente en un
disco fsico: el mismo en el que est situado el dispositivo maestro de base de datos.
Para situar una base de datos y un registro en discos separados, asegrese de que dispone en ambos
discos de dispositivos con el tamao suficiente, creando nuevos dispositivos en caso necesario. A
continuacin, ejecute el Asistente para upsizing a SQL Server.
SQL Server permite que las bases de datos y los registros abarquen varios dispositivos. No obstante,
el Asistente para upsizing solamente le permite especificar un dispositivo para la base de datos y un
dispositivo para el registro.
Para especificar mltiples dispositivos para una base de datos o un registro, convierta dichos
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 17 de 80
536 of 804
dispositivos (y ningn otro) en predeterminados. Posteriormente, ejecute el Asistente para upsizing y
elija Predeterminado para el dispositivo de la base de datos o del registro.
Nota Si el tamao de la nueva base de datos o del nuevo registro de SQL Server no necesita usar
todos los dispositivos predeterminados, SQL Server solamente utilizar los dispositivos necesarios
para alojar la base de datos o el registro.
Preparar el cliente
Antes de realizar el upsizing, debe tener acceso a SQL Server a travs de un origen de datos ODBC o
de una conexin con nombre. Tambin necesita tener una base de datos de Visual FoxPro, de la que
debe realizar una copia de seguridad antes de ejecutar el Asistente para upsizing a SQL Server.
Al crear una nueva base de datos remota, se selecciona un origen de datos ODBC o una conexin con
nombre en la base de datos de Visual FoxPro que tiene acceso al SQL Server al que quiere realizar el
upsizing. Como no puede iniciar el Asistente para upsizing hasta que seleccione una conexin con
nombre o un origen de datos, debe crear la conexin con nombre o el origen de datos adecuado antes
de iniciar el proceso de upsizing.
Para obtener informacin sobre la creacin de una conexin con nombre, consulte el 8, Crear vistas.
Para crear un origen de datos ODBC, ejecute el Administrador de ODBC. Para obtener informacin
sobre la definicin de orgenes de datos ODBC, consulte el captulo 1, Instalar Visual FoxPro, de la
Gua de instalacin e ndice principal.
Es conveniente crear una copia de seguridad de la base de datos (archivos .dbc, .dct y .dcx) antes de
realizar el upsizing. Aunque el Asistente para upsizing no modifica los archivos .dbf, s maneja el
.dbc directamente abrindolo como tabla a veces e indirectamente cambiando el nombre de las tablas
y vistas al crear nuevas vistas remotas. Si realiza una copia de seguridad de la base de datos, podr
revertirla a su estado original previo al upsizing sobrescribiendo los archivos .dbc , .dct y .dcx
modificados con las copias originales de la copia de seguridad, lo que invierte el cambio de nombres
y la creacin de vistas nuevas.
Cerrar tablas
El Asistente para upsizing a SQL Server intenta abrir de forma exclusiva todas las tablas de la base de
datos cuyo upsizing se desea realizar. Si alguna de las tablas ya est abierta y compartida, el asistente
la cierra y la vuelve a abrir de forma exclusiva. Al abrir las tablas de forma exclusiva antes del
upsizing, se protege contra usuarios que intenten modificar los registros de las tablas que se van a
exportar durante la exportacin de datos. Si alguna tabla no se puede abrir de forma exclusiva, el
Asistente para upsizing a SQL Server mostrar un mensaje y estas tablas no estarn disponibles para
el upsizing.
Despus de crear su origen de datos ODBC y de completar los preparativos necesarios en el cliente y
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 18 de 80
537 of 804
el servidor, podr comenzar el upsizing.
2. En el cuadro de dilogo Seleccin de los asistentes, elija Asistente para upsizing a SQL
Server.
3. Siga las indicaciones de las pantallas del asistente, como se describe en las secciones
posteriores.
Puede elegir el botn Cancelar en cualquier momento para salir del asistente; el asistente no
ejecuta ninguna accin en el servidor hasta que usted elija el botn Finalizar.
Tras elegir el botn Finalizar, el Asistente para upsizing a SQL Server comienza a exportar la base de
datos al servidor.
El botn Finalizar est disponible despus de proporcionar la informacin bsica necesaria para el
upsizing. Si elige el botn Finalizar antes de completar todas las pantallas del asistente, el Asistente
para upsizing a SQL Server usar los valores predeterminados para las pantallas restantes.
El Asistente para upsizing a SQL Server hace que la exportacin mediante upsizing de una base de
datos de Visual FoxPro a SQL Server sea casi transparente. Esta seccin explica exactamente lo que
ocurre al elegir el botn Finalizar: la forma en que el Asistente para upsizing exporta los datos y
asigna objetos de Visual FoxPro a objetos de SQL Server.
El Asistente para upsizing a SQL Server exporta los datos utilizando un mtodo entre dos
disponibles. El primer mtodo crea un procedimiento almacenado que ejecuta inserciones de
mltiples filas. Este mtodo puede ser muy rpido, puesto que los procedimientos almacenados se
precompilan y se ejecutan rpidamente.
Si el Asistente para upsizing a SQL Server encuentra errores mientras exporta datos con el mtodo
SQL INSERT y el nmero de errores supera el 10% del nmero de registros de la tabla, o bien es
superior a 100 registros (lo que sea mayor), el asistente cancelar la exportacin de la tabla y guardar
el nmero de errores de exportacin para el informe de errores. No obstante, la tabla de servidor
exportada no se borra y los registros que se lograron exportar sin problemas permanecen en la tabla
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 19 de 80
538 of 804
del servidor.
Para realizar el upsizing de una base de datos de Visual FoxPro hasta un servidor, el Asistente para
upsizing a SQL Server crea objetos de servidor que, en la medida de lo posible, hagan lo mismo que
la base de datos de Visual FoxPro. La asignacin de algunos objetos de Visual FoxPro a objetos del
servidor es muy directa: bases de datos, tablas, campos, valores predeterminados e ndices de Visual
FoxPro se asignan a bases de datos, tablas, campos, valores predeterminados e ndices de SQL Server
de forma directa, uno a uno.
Sin embargo, no todos los objetos locales se asignan directamente a objetos del servidor. Las reglas
de validacin y la integridad referencial de Visual FoxPro forman parte del diccionario de datos y se
exigen a nivel del motor de base de datos. Las reglas de validacin y la integridad referencial de SQL
Server no forman parte del diccionario de datos y se exigen mediante cdigo vinculado a una tabla.
Estas diferencias, as como las decisiones de diseo realizadas por el Asistente para upsizing a SQL
Server, significan que gran parte del diccionario de datos de Visual FoxPro no se puede asignar
directamente a construcciones de SQL Server.
La siguiente tabla resume la forma en que se asignan los objetos desde Visual FoxPro hasta SQL
Server:
Las siguientes secciones tratan cada uno de los objetos de Visual FoxPro y el objeto (o los objetos) de
SQL Server al que se asigna.
A medida que el Asistente para upsizing a SQL Server migra objetos a un origen de datos, crea
objetos con nombre en el servidor. El Asistente utiliza prefijos para los objetos que necesitan
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 20 de 80
539 of 804
nombres nuevos debido a que no exista en Visual FoxPro ningn objeto autnomo de ese tipo (por
ejemplo, valores predeterminados y reglas). Despus del prefijo se incluye un nombre de tabla al que
sigue un nombre de campo, en caso necesario. Esta convencin de nombres permite que todos los
objetos del mismo tipo tengan el mismo prefijo y se ordenen juntos cuando se presenten en pantalla
con las herramientas de administracin del origen de datos. Los objetos creados en la misma tabla
tambin se agrupan cuando se muestran en pantalla.
Una base de datos de Visual FoxPro se asigna directamente a una base de datos de SQL Server. Una
tabla de Visual FoxPro, exceptuando parte de su diccionario de datos, se asigna a una tabla de SQL
Server.
Los nombres de base de datos, tabla, ndice y campo pueden cambiar durante el proceso de upsizing,
en caso de que infrinjan las convenciones de nombres de SQL Server. Los nombres de SQL Server
deben tener 30 caracteres como mximo, y el primero de ellos debe ser una letra o el smbolo @.
Los dems caracteres pueden ser nmeros, letras o los smbolos $, # y _; no se admiten
espacios en blanco. El Asistente para upsizing sustituye los caracteres no vlidos por el smbolo _.
Los nombres que sean idnticos a palabras reservadas de SQL Server reciben el sufijo _. Por
ejemplo, FROM y GROUP se convierten en FROM_ y GROUP_. El Asistente para upsizing tambin
incluye el smbolo _ delante de los nombres de objetos que comienzan por un nmero.
Tablas
El Asistente para upsizing a SQL Server asigna a cada tabla exportada mediante upsizing el mismo
nombre que la tabla local a menos que contenga un espacio o sea una palabra clave para el origen de
datos.
Si selecciona Crear vistas remotas de las tablas, el Asistente para upsizing a SQL Server crear
vistas remotas y les asignar muchas de las propiedades de los campos de la tabla local original.
Asignar nombres de campos y tipos de datos de Visual FoxPro a sus homlogos de SQL Server
Los nombres de campos y los tipos de datos se convierten automticamente en campos de SQL
Server cuando se exporta una tabla de Visual FoxPro mediante el Asistente para upsizing a SQL
Server.
Los tipos de datos de Visual FoxPro se asignan a tipos de datos de SQL Server de la siguiente forma:
Y Currency money
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 21 de 80
540 of 804
D Date datetime
T DateTime datetime
B Double float
F Float float
G General image
I Integer int
L Logical bit
M Memo text
N Numeric float
Las columnas de marca de hora se crean con el tipo de datos marca de hora de Transact-SQL. Cuando
selecciona la casilla de verificacin de la columna Timestamp para una tabla especfica en el paso 4-
Map Field Data Types (Asignar tipos de datos de campos), el Asistente para upsizing a SQL Server
crea un campo de marca de hora para la tabla.
Si la tabla contiene uno o ms campos memo (M) o imagen (P), el Asistente para upsizing a SQL
Server selecciona la casilla de verificacin Timestamp para la tabla de forma predeterminada y crea
un campo de marca de hora en la versin de la tabla resultante del upsizing.
Las columnas de identidad se crean con los campos de la propiedad Transact-SQL IDENTITY.
ndices
Los ndices de SQL Server y los de Visual FoxPro son muy parecidos. La siguiente tabla muestra la
forma en que se convierten los tipos de ndices de Visual FoxPro a tipos de ndices de SQL Server:
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 22 de 80
541 of 804
El Asistente para upsizing a SQL Server utiliza los nombres de etiquetas de Visual FoxPro como
nombres para los ndices de SQL Server. Si el nombre de etiqueta es una palabra reservada en el
servidor, el asistente modificar el nombre de la etiqueta adjuntando el carcter _.
Nota SQL Server no admite ndices en orden ascendente ni descendente, ni permite expresiones
dentro de los ndices del servidor. El Asistente para upsizing a SQL Server elimina las expresiones de
Visual FoxPro de las expresiones de ndice al exportarlo; solamente enva al servidor los nombres de
campos.
Aunque los valores predeterminados de SQL Server y de Visual FoxPro son muy parecidos, existen
algunas diferencias en cuanto a su creacin y comportamiento entre ambos productos. Los valores
predeterminados de SQL Server son objetos autnomos, independientes de cualquier campo o tabla.
Una vez creado un valor predeterminado, se puede utilizar o vincular a cualquier cantidad de campos
distintos.
El Asistente para upsizing a SQL Server asigna nombres a los valores predeterminados mediante el
prefijo Dflt_ ms el nombre de la tabla y el del campo. Por ejemplo, un valor predeterminado para el
campo ordamt de la tabla Customer se puede denominar Dflt_Customer_Ordamt en el servidor. Si
la combinacin del prefijo con los nombres de tabla y campo da como resultado un nombre superior a
30 caracteres, Visual FoxPro truncar los caracteres sobrantes.
Los campos con una expresin predeterminada de cero se vinculan a un valor predeterminado
llamado UW_ZeroDefault. Si dos o ms campos tienen la misma expresin predeterminada distinta
de cero, el Asistente para upsizing a SQL Server crear dos valores predeterminados, con dos
nombres distintos, cuya funcionalidad es idntica.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 23 de 80
542 of 804
Los campos lgicos de SQL Server no aceptan valores nulos, mientras que los campos lgicos de
Visual FoxPro s los admiten. Para solucionar esta diferencia, el Asistente para upsizing a SQL
Server crea y vincula automticamente un valor predeterminado denominado UW_ZeroDefault a cada
campo lgico exportado, aunque usted no elija exportar los valores predeterminados. Este valor
predeterminado establece el valor del campo en el servidor a 0 (o falso (.F.), si muestra el campo en
Visual FoxPro) cuando no se proporciona ningn valor.
Si la tabla local de Visual FoxPro contiene un valor predeterminado para un campo lgico que
establece el campo igual a verdadero (.T.), el Asistente para upsizing a SQL Server no vincular el
valor predeterminado UW_ZeroDefault a la tabla del servidor. En su lugar, el asistente crea un valor
predeterminado que establece el campo igual a 1 y asigna al valor predeterminado un nombre de
acuerdo con las convenciones de nombres descritas anteriormente en este captulo.
Los valores predeterminados de SQL Server se comportan de distinta forma que los de Visual
FoxPro. Para obtener ms informacin al respecto, consulte la seccin Valores predeterminados ms
adelante en este mismo captulo.
Un desencadenante de SQL Server es una serie de instrucciones Transact-SQL asociadas con una
tabla determinada de SQL Server. Cuando elija exportar mediante upsizing reglas de validacin y
relaciones en el paso 8, el Asistente para upsizing a SQL Server convertir las reglas de validacin a
nivel de campo y de registro de Visual FoxPro, as como las relaciones permanentes entre tablas en
procedimientos almacenados que se llaman desde los desencadenantes de SQL Server. Cada
desencadenante del servidor contiene cdigo para emular la funcionalidad de varias reglas de
validacin e integridad referencial.
Nota El Asistente para upsizing a SQL Server no exporta los desencadenantes de Visual FoxPro.
Una tabla del servidor puede tener tres desencadenantes, uno para cada comando que puede modificar
datos en la tabla: UPDATE, INSERT y DELETE. El desencadenante se ejecuta automticamente al
ejecutar el comando asociado.
La siguiente tabla describe los desencadenantes creados por el Asistente para upsizing a SQL Server.
Un desencadenante especfico puede contener cdigo para emular las funciones indicadas de Visual
FoxPro, en su totalidad o en parte.
Integridad referencial
INSERT Reglas de validacin (validacin a nivel de campo y de registro)
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 24 de 80
543 of 804
El Asistente para upsizing asigna nombres a los desencadenantes del servidor combinando un prefijo,
que indica el tipo de desencadenante que se va a crear, con el nombre de la tabla de SQL Server a la
que pertenece el desencadenante. El prefijo (TrigU_ para desencadenantes UPDATE, TrigD_
para desencadenantes DELETE y TrigI_ para desencadenantes INSERT) se sita delante del
nombre de la tabla. Por ejemplo, el desencadenante UPDATE de la tabla Customer se podra
denominar TrigU_Customer.
Reglas de validacin
El Asistente para upsizing puede exportar reglas de validacin a nivel de campo y de registro de
Visual FoxPro, que convierte a procedimientos almacenados en el SQL Server. El asistente asigna
nombres a las reglas a nivel de campo combinando un prefijo vrf (del ingls, regla de validacin,
campo) con los nombres de la tabla y del campo; un ejemplo puede ser vrf_customer_lname. Las
reglas de validacin de tabla se denominan con el prefijo vrt (del ingls, regla de validacin,
tabla) ms el nombre de la tabla, creando as un nombre como vrt_customer.
El Asistente para upsizing a SQL Server utiliza desencadenantes que llaman a procedimientos
almacenados en lugar de reglas de SQL Server para exigir una validacin a nivel de campo porque las
reglas de SQL Server no permiten ver mensajes de error personalizados. Para obtener ms
informacin sobre las reglas de SQL Server, consulte el comando CREATE RULE en la
documentacin de SQL Server.
Integridad referencial
Visual FoxPro admite la integridad referencial a travs de desencadenantes sobre los eventos
UPDATE, DELETE e INSERT en relaciones persistentes de tablas que se exigen a nivel de motor.
Puede elegir implementar restricciones de integridad referencial en SQL Server usando dos mtodos:
O bien
Cuando elige integridad referencial basada en desencadenantes, el Asistente para upsizing a SQL
Server crea desencadenantes que incluyen el cdigo Transact-SQL necesario para duplicar las
restricciones de integridad referencial de Visual FoxPro. Si elige implementar integridad referencial
declarativa, el Asistente para upsizing a SQL Server crea restricciones de SQL Server mediante el
comando ALTER TABLE con la palabra clave CONSTRAINT.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 25 de 80
544 of 804
modificaciones resultantes de las instrucciones DELETE y INSERT.
El Asistente para upsizing a SQL Server crea desencadenantes de SQL Server evaluando los
desencadenantes de Visual FoxPro usados para hacer cumplir la integridad referencial en relaciones
persistentes de la base de datos de Visual FoxPro. La siguiente tabla presenta la asignacin entre las
restricciones de integridad referencial de Visual FoxPro y los desencadenantes de SQL Server
generados por el Asistente para upsizing a SQL Server.
Restriccin de integridad
referencial de Visual FoxPro Desencadenante de SQL Server
Una relacin persistente de Visual FoxPro utilizada en una limitacin de integridad referencial puede
convertirse en hasta cuatro desencadenantes de SQL Server: dos para la tabla primaria y dos para la
tabla secundaria.
Nota Si solamente se exporta mediante upsizing una de las tablas de una relacin o si no se exige la
integridad referencial en Visual FoxPro, la relacin no se exportar.
Tabla primaria
El Asistente para upsizing a SQL Server crea un desencadenante UPDATE que impide que el usuario
cambie la clave principal de la tabla primaria, o bien enva en cascada ese cambio a travs de la tabla
secundaria, dependiendo del tipo de relacin que se cre en Visual FoxPro.
El Asistente para upsizing a SQL Server tambin crea un desencadenante DELETE que impide que el
usuario elimine un registro con registros secundarios relacionados, o que elimina los registros
secundarios, dependiendo siempre del tipo de relacin existente entre las tablas de Visual FoxPro.
Tabla secundaria
El Asistente para upsizing a SQL Server crea un desencadenante UPDATE que impide al usuario
realizar en la clave externa cambios que convertiran el registro en hurfano. De la misma forma, un
desencadenante INSERT se crea para impedir que el usuario agregue un registro nuevo que no tenga
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 26 de 80
545 of 804
tabla primaria.
Cuando se infringe la integridad referencial establecida por el desencadenante creado por el asistente,
el Asistente para upsizing a SQL Server incluye un valor de error personalizado en la variable
@@ERROR. El Asistente para upsizing a SQL Server define valores de errores posibles como parte
del cdigo del desencadenante. El valor depende de la accin que el usuario intentaba realizar:
actualizar, insertar o eliminar.
La siguiente tabla indica los nmeros de error generados para cada accin:
Si elige implementar integridad referencial declarativa, el Asistente para upsizing a SQL Server crea
restricciones de SQL Server mediante el comando ALTER TABLE con la palabra clave
CONSTRAINT. La restriccin de la tabla primaria usa la palabra clave PRIMARY KEY. La tabla
secundaria usa las palabras clave FOREIGN KEY y REFERENCES. La integridad referencial
declarativa es compatible con los niveles RESTRICT, actualizaciones RESTRICT y eliminaciones
RESTRICT.
Puede usar restricciones de SQL Server para proporcionar restricciones a instrucciones UPDATE,
DELETE y INSERT.
Asignar expresiones
A pesar de que Visual FoxPro y Transact-SQL tienen algunas funciones en comn, SQL Server no
admite muchas de las funciones de Visual FoxPro. El Asistente para upsizing a SQL Server intenta
convertir las expresiones de Visual FoxPro en reglas de validacin a nivel de campo y de registro y en
valores predeterminados para Transact-SQL, utilizando para ello la siguiente asignacin de
expresiones.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 27 de 80
546 of 804
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 28 de 80
547 of 804
NTOM( ) CONVERT(float, ...)
RTOD( ) DEGREES( )
SUBSTR( ) SUBSTRING( )
TTOC( ) CONVERT(char, ...)
TTOD( ) CONVERT(datetime, ...)
YEAR( ) DATEPART(yy, ...)
Las siguientes expresiones son iguales para Visual FoxPro y para SQL Server.
Expresiones que se asignan directamente desde Visual FoxPro hasta SQL Server
El Asistente para upsizing a SQL Server crea tablas para su propio uso durante el proceso de
upsizing. Estos archivos se eliminan del disco duro a menos que:
Si se producen algunas de las condiciones anteriores, el Asistente para upsizing a SQL Server crear
un proyecto (denominado Informe, Informe1, Informe2, etc.) y una base de datos (denominada
Upsize, Upsize1, etc.) en un subdirectorio (llamado UPSIZE) del directorio definido por el comando
SET DEFAULT para la sesin de Visual FoxPro. El asistente agrega a la base de datos las tablas
utilizadas para producir el Informe de upsizing, una tabla para almacenar el cdigo SQL generado y
cualquier tabla de error existente. La siguiente tabla indica los archivos que se pueden crear durante el
proceso de upsizing.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 29 de 80
548 of 804
Fields_uw Informacin sobre todas las tablas
exportadas mediante upsizing.
Indexes_uw Informacin sobre todos los ndices
exportados mediante upsizing.
Misc_uw Informacin diversa sobre el proceso
de upsizing.
Relations_uw Informacin sobre todas las
limitaciones de integridad referencial
almacenadas en la base de datos de
Visual FoxPro.
Tables_uw Informacin sobre todas las tablas de
la base de datos que desea exportar
mediante upsizing.
Views_uw Informacin sobre las vistas locales
redirigidas para tener acceso a datos
remotos.
Tabla de archivos SQL_uw Un campo memo que contiene todo
de comandos el cdigo SQL generado por el
Asistente para upsizing a SQL
Server.
Tablas de error de ExportErrors_nombre_tabla Para cada tabla que experimente
exportacin de errores de exportacin de datos
datos durante el upsizing, el Asistente para
upsizing a SQL Server genera una
tabla que contiene los registros que
no se han logrado exportar.
La tabla de archivos de comandos almacenada en el disco duro contiene todo el cdigo SQL generado
por el Asistente para upsizing, ya se ejecute con o sin errores en el servidor. Si desea utilizar este
cdigo, el mejor enfoque es examinar el SQL generado, copiar las partes que desee utilizar, ejecutar
los fragmentos de cdigo extrados y repetir el proceso hasta obtener los resultados deseados. No
puede ejecutar todo el archivo de comandos SQL en lugar del Asistente para upsizing a SQL Server,
puesto que el asistente ejecuta pasos adicionales que no quedan reflejados en el cdigo SQL
generado.
Ahora puede ejecutar diversos pasos adicionales, tanto en el servidor como en la aplicacin de Visual
FoxPro, para asegurarse de que la aplicacin y los datos estn seguros y funcionan de forma
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 30 de 80
549 of 804
apropiada.
Tambin puede utilizar la informacin de esta seccin cuando genere una aplicacin desde vistas
remotas en lugar de mediante upsizing. Independientemente de la forma en que se crearon las tablas
remotas, es posible llevar a cabo determinados pasos para garantizar que el servidor y el cliente estn
preparados para colaborar en la aplicacin cliente-servidor.
l Asegurndose de que las tablas desde Visual FoxPro que desea modificar son actualizables.
l Estableciendo permisos en la base de datos de forma que los usuarios puedan tener acceso a los
objetos que necesitan.
l Protegiendo el trabajo realizado transformando en recuperable la nueva base de datos, por si se
daa o se pierde.
Una tabla remota debe tener un ndice nico para que se considere actualizable en Visual FoxPro. El
Asistente para upsizing a SQL Server puede exportar un ndice nico existente, pero no crea ninguno
cuando no existe. Asegrese de que las tablas que desea modificar desde Visual FoxPro son
actualizables.
Establecer permisos
La nueva base de datos de SQL Server y sus objetos reciben un conjunto de permisos
predeterminados de SQL Server. Establezca en la base de datos remota los permisos necesarios para
que los usuarios puedan tener acceso a los objetos que necesitan.
Los permisos predeterminados de una base de datos nueva la hacen accesible solamente a los
administradores del sistema y al propietario de la base de datos.
Puede agregar nuevos usuarios y grupos mediante el Administrador de seguridad de SQL Server o los
procedimientos del sistema sp_adduser y sp_addgroup.
Para obtener ms informacin sobre la forma de agregar usuarios y grupos, consulte la Ayuda del
Administrador de seguridad de SQL Server y la documentacin de los procedimientos del sistema
sp_adduser y sp_addgroup en Transact-SQL Reference de Microsoft SQL Server.
Permisos de objetos
Todos los objetos creados por el Asistente para upsizing a SQL Server, incluyendo las tablas, los
desencadenantes y los valores predeterminados, en principio solamente son accesibles para el
propietario de la base de datos y para los administradores del sistema. Esto se cumple cuando se
realiza una exportacin mediante upsizing hasta una base de datos nueva o existente. Si sobrescribe
los objetos existentes, tambin sobrescribir todos los permisos de objetos.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 31 de 80
550 of 804
Para conceder permisos para tablas, utilice el Administrador de objetos SQL o los comandos GRANT
y REVOKE. Para obtener ms informacin sobre el establecimiento de permisos de objetos, consulte
la seccin Managing Object Permissions en el Microsoft SQL Server Administrator's Companion y
los comandos GRANT y REVOKE de la Microsoft SQL Server Transact-SQL Reference.
Proteja su trabajo convirtiendo la nueva base de datos en recuperable por si se daa o se pierde.
Cuando se crea una base de datos en un SQL Server, se agregan nuevos registros a las tablas del
sistema de la base de datos maestra. El volcado de esta base de datos maestra le proporciona una
copia de seguridad que incluye todos los cambios ms recientes. Para obtener ms informacin sobre
el volcado de la base de datos maestra, consulte Backing Up the master Database del Microsoft
SQL Server Administrator's Companion, y la instruccin DUMP y Dumping the master Database
de la Microsoft SQL Server Transact-SQL Reference.
Programe copias de seguridad peridicas de la base de datos de forma que pueda restaurarla a partir
de esta copia de seguridad en caso de que surja algn problema grave. Para realizar copias de
seguridad de bases de datos SQL Server, vea Database Maintenance Plan Wizard y Backup and
Recovery en What's New in SQL Server 6.5 y Database Design and Backup Strategy en la
Microsoft SQL Server Transact-SQL Reference.
Duplicar dispositivos
Si prev que se realizarn muchos cambios en una base de datos entre una copia de seguridad y la
siguiente, y no puede permitirse la prdida de tales cambios, piense en la duplicacin de dispositivos.
Este proceso de duplicacin es ms efectivo cuando los dispositivos se encuentran en distintos discos,
puesto que si estn en el mismo disco y ste falla, se perdern ambos dispositivos.
Cuando haya transferido los objetos desde Visual FoxPro hasta un SQL Server, probablemente
necesitar modificar el cdigo de la base de datos de Visual FoxPro original de manera que funcione
adecuadamente con la nueva base de datos de SQL Server.
Optimizar vistas
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 32 de 80
551 of 804
Las vistas creadas por el Asistente para upsizing a SQL Server no estn parametrizadas, por lo que no
estn optimizadas. Para lograr un procesamiento ms eficaz, agregue parmetros a las vistas creadas
por el Asistente para upsizing a SQL Server con el fin de descargar solamente los datos necesarios.
Para obtener informacin sobre la forma de agregar un parmetro a una vista, consulte el captulo 8,
Crear vistas.
SQL Server no admite algunas funciones de Visual FoxPro. Si la vista remota creada por el Asistente
para upsizing utiliza funciones que no se pudieron asignar a funciones de Transact-SQL, la vista no
funcionar. Para obtener ms informacin sobre la asignacin de expresiones de Visual FoxPro a
expresiones de Transact-SQL, consulte la seccin Asignar expresiones anteriormente en este mismo
captulo.
El Asistente para upsizing no exporta mediante upsizing los procedimientos almacenados ni los
desencadenantes de Visual FoxPro. Si desea crear procedimientos almacenados o desencadenantes de
SQL Server, puede utilizar Transact-SQL en el servidor, o bien paso a travs de SQL en Visual
FoxPro. Para obtener ms informacin sobre el uso de Transact-SQL, consulte la documentacin de
SQL Server. Para obtener informacin sobre el uso de paso a travs de SQL, consulte el captulo 21,
Implementar una aplicacin cliente-servidor.
Valores predeterminados
Los valores predeterminados de campo de Visual FoxPro aparecen cuando comienza a modificar un
registro nuevo. Los valores predeterminados generados por SQL Server aparecen solamente despus
de insertar un registro. Necesita cambiar el cdigo que dependa de si hay valores antes de confirmar
el registro, como puede ser el cdigo para bsquedas.
Reglas de validacin
El informe de upsizing indica si se han logrado convertir cada una de las reglas de validacin de
tabla, reglas de validacin de campo y expresiones predeterminadas de Visual FoxPro. Si una
expresin o una regla de validacin predeterminada no se ha convertido, deber volver a escribirla en
Transact-SQL.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 33 de 80
552 of 804
Tambin puede realizar la validacin a nivel de formulario en Visual FoxPro. No obstante, si los
datos del servidor se modifican posteriormente sin utilizar un formulario determinado, la validacin
no se aplicar y quiz se introduzcan datos no vlidos.
Bloquear registros
Visual FoxPro utiliza el bloqueo optimista de forma interna al tener acceso a tablas de un servidor
SQL Server. El bloqueo optimista significa que la fila se bloquea solamente mientras se confirma el
valor modificado y se realiza el proceso de actualizacin, lo que suele ser un intervalo muy breve.
En SQL Server se utiliza el bloqueo optimista en lugar del bloqueo pesimista, porque este ltimo se
realiza en SQL Server bloqueando pginas, lo que puede bloquear gran cantidad de registros
simultneamente. Aunque el bloqueo de pginas impide a otros usuarios realizar cambios en el
mismo registro que se est modificando, tambin puede impedir que los usuarios tengan acceso a
muchos otros registros de la misma pgina (bloqueada). El bloqueo optimista proporciona el mejor
acceso multiusuario para una aplicacin cliente-servidor de Visual FoxPro.
Puede optimizar las actualizaciones y controlar la forma en que se tratan los conflictos de
actualizacin con la propiedad WhereType de SQL. Para obtener ms informacin sobre la forma de
controlar conflictos de actualizacin, consulte el captulo 8, Crear vistas.
Upsizing a Oracle
El Asistente para upsizing a Oracle tiene un comportamiento similar al del Asistente para upsizing a
SQL Server. Para obtener instrucciones paso a paso, vea Asistente para upsizing a Oracle. Para
obtener informacin sobre servidores Oracle, consulte la documentacin de Oracle.
Despus de haber creado una conexin con nombre o un origen de datos ODBC que se conecta a un
servidor Oracle y haber terminado la preparacin necesaria en el cliente y en el servidor, puede iniciar
el upsizing.
2. En el cuadro de dilogo Seleccin de los asistentes, elija Asistente para upsizing a Oracle.
Puede elegir el botn Cancelar en cualquier momento para salir del Asistente; el asistente no
ejecuta ninguna accin en el servidor hasta que usted elija el botn Finalizar.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 34 de 80
553 of 804
Tras elegir el botn Finalizar, el Asistente para upsizing a Oracle comienza a exportar la base de
datos al servidor.
Este captulo trata tcnicas para implementar tecnologa cliente-servidor en una aplicacin que usa
vistas remotas. Si desea saber ms sobre cmo disear y crear una aplicacin cliente-servidor,
consulte el captulo 19, Disear aplicaciones cliente-servidor y el captulo 20, Upsizing de bases de
datos de Visual FoxPro. Para obtener ms informacin sobre cmo crear vistas remotas, consulte el
captulo 8, Crear vistas.
l Vistas remotas
l Paso a travs de SQL
Las vistas remotas proporcionan el mtodo ms comn y ms fcil para tener acceso a datos remotos
y actualizarlos. Los asistentes para upsizing pueden crear automticamente vistas remotas en la base
de datos como parte del upsizing, o puede usar Visual FoxPro para crear vistas remotas despus de
hacer el upsizing. Para obtener ms informacin sobre vistas remotas, consulte el captulo 8, Crear
vistas.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 35 de 80
554 of 804
La tecnologa de paso a travs de SQL ofrece las siguientes ventajas frente a las vistas remotas:
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 36 de 80
555 of 804
Sugerencia Visual FoxPro puede controlar consultas de paso a travs de SQL que devuelven
ms de un conjunto de resultados. Para obtener ms informacin, consulte Procesar mltiples
conjuntos de resultados ms adelante en este mismo captulo.
l De forma predeterminada una consulta de paso a travs de SQL siempre devuelve un snapshot
no actualizable de datos remotos, que se almacena en un cursor de vista activo. Puede convertir
el cursor en actualizable con la funcin CURSORSETPROP( ). En cambio, una vista remota
actualizable normalmente no requiere que establezca propiedades antes de poder actualizar
datos remotos, porque los valores de las propiedades se almacenan en la base de datos con la
definicin de la vista.
l Tiene que escribir comandos SQL directamente en la ventana Comandos o en un programa, en
lugar de usar el Diseador de vistas grfico.
l Es usted quin crea y administra la conexin al origen de datos.
Si usa vistas remotas o paso a travs de SQL, puede consultar y actualizar datos remotos. En muchas
aplicaciones utilizar tanto vistas remotas como paso a travs de SQL.
Para usar el paso a travs de SQL para conectarse a un origen de datos ODBC remoto, debe llamar en
primer lugar a la funcin SQLCONNECT( ) de Visual FoxPro para crear una conexin. Una vez
hecho esto, use las funciones de paso a travs de SQL para enviar comandos al origen de datos
remoto para su ejecucin.
1. Confirme que el sistema puede conectar su equipo al origen de datos. Use una utilidad como
ODBC Test para ODBC.
2. Establezca una conexin con su origen de datos con las funciones SQLCONNECT( ) o
SQLSTRINGCONNECT( ).
Por ejemplo, si est conectando Visual FoxPro al origen de datos de SQL Server sqlremote,
puede iniciar una sesin como administrador del sistema (id de usuario sa) con la contrasea
secret con el siguiente comando:
nConnectionHandle = SQLCONNECT('sqlremote','sa','secret')
Nota Tambin puede usar la funcin SQLCONNECT( ) para conectarse a una conexin con
nombre.
3. Use funciones de paso a travs de SQL de Visual FoxPro para obtener datos en cursores de
Visual FoxPro y procesar la obtencin de datos comandos y funciones estndar de Visual
FoxPro.
Por ejemplo, puede consultar a la tabla authors y examinar el cursor resultante usando este
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 37 de 80
556 of 804
comando:
La siguiente tabla muestra las funciones SQL de Visual FoxPro que admiten el trabajo con orgenes
de datos remotos, agrupados segn la tarea.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 38 de 80
557 of 804
transaccin.
SQLROLLBACK( ) Solicitar que se deshaga una
transaccin.
Informacin de origen SQLCOLUMNS( ) Almacenar una lista de nombres de
de datos columnas e informacin sobre cada
uno en un cursor. Devuelve 1 si la
funcin tiene xito o 0 si la funcin
se sigue ejecutando.
SQLTABLES( ) Almacenar los nombres de tablas
del origen en un cursor. Devuelve 1
si la funcin tiene xito o 0 si la
funcin se sigue ejecutando.
Control variado SQLGETPROP( ) Obtener una propiedad de conexin
de una conexin activa.
SQLSETPROP( ) Establecer una propiedad de una
conexin activa.
Cuando usa las funciones de paso a travs de SQL SQLEXEC( ) o SQLMORERESULTS( ) para
consultar datos, Visual FoxPro le devuelve los datos en uno o muchos conjuntos de resultados. Los
conjuntos de resultados se originan a partir de cursores del origen de datos servidor y se convierten en
cursores de Visual FoxPro. El nombre predeterminado para un conjunto de resultados es
SQLRESULT.
Puede usar la tecnologa de paso a travs de SQL de Visual FoxPro para crear y ejecutar
procedimientos almacenados en un servidor remoto. Los procedimientos almacenados puede mejorar
en gran medida la eficacia y flexibilidad de SQL y mejorar mucho el rendimiento de instrucciones
SQL y lotes. Muchos servidores proporcionan procedimientos almacenados para definir y manipular
objetos de base de datos servidor y para realizar administracin de sistema servidor y de usuarios.
Nota Los ejemplos de este captulo usan la sintaxis de Microsoft SQL Server, a no ser que se
indique lo contrario.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 39 de 80
558 of 804
nConnectionHandle = SQLCONNECT('sqlremote')
? SQLEXEC(nConnectionHandle, 'use pubs')
? SQLEXEC(nConnectionHandle, 'sp_who')
BROWSE
Si ejecuta un procedimiento almacenado que contiene instrucciones SELECT con sintaxis de servidor
nativa, cada conjunto de resultados se devuelve a un cursor de Visual FoxPro distinto. Puede usar
estos cursores para devolver valores o parmetros de un procedimiento almacenado de servidor al
cliente de Visual FoxPro.
Por ejemplo, el cdigo siguiente crea y ejecuta un procedimiento almacenado de servidor SQL,
my_procedure, que devuelve tres cursores de Visual FoxPro: sqlresult, sqlresult1 y
sqlresult2:
Como el servidor compila cada procedimiento almacenado cuando lo crea, recibe los errores de
sintaxis de servidor en tiempo de creacin. Cuando ejecute el procedimiento almacenado, el servidor
ejecuta las instrucciones SQL compiladas secuencialmente (como en un programa de Visual FoxPro)
y Visual FoxPro busca cada conjunto de resultados de cada instruccin SQL en el procedimiento
almacenado de forma independiente, en el orden en que se ejecutan.
Nota Slo puede ejecutar procedimientos almacenados de servidor de Visual FoxPro mediante las
funciones de paso a travs de SQL de Visual FoxPro. Las vistas no admiten procedimientos
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 40 de 80
559 of 804
almacenados de servidor, porque cada vista contiene una instruccin SQL SELECT explcita en su
definicin SQL.
La funcin SQLEXEC( ) le permite enviar una instruccin SQL al origen de datos sin interpretacin.
En el caso ms sencillo, cualquier cadena que escriba en el segundo parmetro de la funcin
SQLEXEC( ) se pasa al origen de datos sin interpretacin. Esto le permite ejecutar cualquier
instruccin mediante el SQL nativo del origen de datos.
Tambin puede usar la funcin SQLEXEC( ) para crear una consulta parametrizada o pasar
extensiones ODBC a SQL al origen de datos.
As como puede crear vistas parametrizadas mediante el Diseador de vistas o el lenguaje, puede
crear una consulta de paso a travs de SQL parametrizada.
El parmetro que suministre se evala como expresin de Visual FoxPro y el valor se enva
como parte de la instruccin SQL de la vista. Si la evaluacin falla, Visual FoxPro le pide el
valor del parmetro.
Por ejemplo, si tiene la tabla customer de la base de datos Testdata en un servidor remoto, el
cdigo siguiente crea una consulta parametrizada que limita la vista a aquellos clientes cuyo
pas coincida con el valor suministrado para el parmetro ?cCountry:
Si desea pedir al usuario el valor de un parmetro, escriba la expresin de parmetro entre comillas.
Para obtener ms informacin sobre la peticin de un valor de parmetro, consulte el captulo 8,
Crear vistas.
Un origen de datos ODBC no aceptar parmetros en las siguientes ubicaciones en las clusulas
WHERE o HAVING de una instruccin SELECT:
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 41 de 80
560 of 804
Puede usar parmetros de entrada-salida para pasar valores entre Visual FoxPro y SQL Server. Los
parmetros de entrada-salida slo estn disponibles mediante paso a travs de SQL; no se pueden
usar en vistas.
La tabla siguiente proporciona un ejemplo del uso de parmetros de entrada-salida para pasar valores
desde Visual FoxPro a un procedimiento almacenado de SQL, devolviendo el resultado a una
variable de Visual FoxPro.
Cdigo Comentarios
resultCode = SQLExec(connHand, Crea un procedimiento
"CREATE PROCEDURE sp_test;
@mult1 int, @mult2 int, @result int; almacenado, sp_test, que
OUTPUT AS SELECT multiplica dos variables (mult1
@result = @mult1 * @mult2") y mult2) y, a continuacin,
almacena la cantidad resultante
en la variable result.
outParam = 0 Crea una variable de Visual
FoxPro para recibir el valor del
parmetro de salida cuando se
pasa desde SQL Server a Visual
FoxPro.
resultCode = SQLExec(connHand, ;" Ejecuta el procedimiento
{CALL sp_test (2, 4, ?@outParam)}")
almacenado en SQL Server,
pasando los valores 2 y 4
para que se multipliquen en el
procedimiento almacenado.
? "outParam =", outParam && el valor es 8 Muestra el valor del parmetro
de salida.
Definir parmetros
?@nombre_de_ parmetro
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 42 de 80
561 of 804
Cuando implemente parmetros de entrada-salida, defina las variables de Visual FoxPro que desee
incluir en su comando de paso a travs de SQL antes de usar las variables en su instruccin SQL.
Para enviar y recibir correctamente informacin con parmetros de entrada-salida, debe definir:
Por ejemplo, si el parmetro del procedimiento almacenado es @result, debe asignar un tipo
de salida, como int, a @result y debe asignar un valor a @result.
Visual FoxPro convierte valores devueltos de variable siguiendo las reglas siguientes:
No puede usar tipos de datos Memo, General, Picture o NULL en parmetros de entrada-salida.
Si la aplicacin usa campos de cursor como parmetros, Visual FoxPro intentar convertir el
resultado otra vez al tipo de datos original.
Los parmetros de entrada-salida slo estn disponibles despus de que se ha buscado el ltimo
conjunto de resultados de una instruccin. Esto significa que los valores de entrada-salida se
devuelven a Visual FoxPro slo despus de que:
O bien
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 43 de 80
562 of 804
Puede usar el paso a travs de SQL para realizar combinaciones externas sobre datos remotos con
sintaxis de servidor nativo, si el servidor no admite combinaciones externas. Una combinacin
externa combina informacin de una o ms tablas independientemente de si se encuentran filas
coincidentes.
Por ejemplo, el cdigo siguiente usa la funcin de paso a travs de SQL de Visual FoxPro SQLEXEC
( ) para mostrar los resultados de una combinacin externa en SQL Server mediante la conexin con
nombre activa sqlremote:
Para obtener ms informacin sobre la sintaxis de combinacin externa y los tipos de combinaciones
externas, consulte la documentacin del servidor. Para obtener informacin sobre la creacin de una
conexin con nombre, consulte "Definir una conexin" en el captulo 8, Crear vistas.
Puede usar SQLEXEC( ) para ejecutar extensiones ODBC de SQL si encierra la instruccin SQL con
sintaxis de escape estndar o extendida de grupo de acceso SQL. Para obtener ms informacin sobre
extensiones ODBC a SQL, consulte el apndice Gramtica SQL de la documentacin de ODBC.
Puede usar paso a travs de SQL para realizar combinaciones externas en datos remotos con la
sintaxis de escape ODBC, si su servidor admite combinaciones externas. Una combinacin externa
combina informacin de una o ms tablas independientemente de si se han encontrado filas
coincidentes.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 44 de 80
563 of 804
FROM {oj employee LEFT OUTER JOIN dept;
ON employee.deptid = dept.deptid};
WHERE employee.projid = 544
Cuando crea una vista remota, debe elegir un nombre de origen de datos ODBC o un nombre de
conexin que posteriormente se utiliza como canalizacin para el servidor remoto, una vez activada
la vista. Para tener acceso a datos remotos directamente con paso a travs de SQL, es necesario
disponer del controlador para una conexin activa. Un controlador es un valor que hace referencia a
un objeto; en este caso, el controlador hace referencia a una conexin de origen de datos. Para obtener
un controlador, debe solicitar una conexin con el origen de datos utilizando la funcin
SQLCONNECT( ) o SQLSTRINGCONNECT( ). Si la conexin se realiza correctamente, la
aplicacin recibir un controlador de conexin para su uso en llamadas posteriores de Visual FoxPro.
La aplicacin puede solicitar mltiples conexiones para un origen de datos. Tambin puede trabajar
con mltiples orgenes de datos ODBC solicitando una conexin con cada origen de datos al que
desea tener acceso. Si desea reducir el nmero de conexiones utilizadas, puede configurar vistas
remotas para compartir la misma conexin. Puede desconectarse de un origen de datos mediante la
funcin SQLDISCONNECT( ).
Sugerencia Visual FoxPro se basa en la definicin del origen de datos ODBC almacenada en el
archivo Odbc.ini de Windows o en el registro de Windows NT para conectarse a un origen de datos.
Si cambia el nombre de la informacin de inicio de sesin para un origen de datos, tenga presente que
estos cambios pueden influir en que una aplicacin que utilice ese origen de datos pueda conectarse o
no al servidor remoto deseado.
El entorno cliente-servidor se establece cada vez que se abre Visual FoxPro. El entorno existe para
esa sesin y desaparece al cerrar Visual FoxPro. El entorno cliente-servidor contiene:
l Propiedades globales que actan como prototipos para las nuevas conexiones.
l Valores de error para los errores que ocurren fuera de una conexin especificada.
l Las propiedades especificadas con uno de los dos valores posibles pueden emplear un valor
lgico (.F. o .T.) para eExpresin.
l Los nombres de propiedad se pueden abreviar hasta la forma ms breve que no d lugar a
ambigedades. Por ejemplo, puede utilizar "Asynchronous", "Asynch" o "A" para especificar
la propiedad Asynchronous. Los nombres de propiedades no distinguen entre maysculas y
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 45 de 80
564 of 804
minsculas.
Cuando se inicia una conexin, sta hereda valores predeterminados para las propiedades de la
conexin. Puede usar SQLSETPROP( ) para modificar estos valores.
Para ver el valor actual de propiedades para una conexin, utilice SQLGETPROP( ) con el
controlador de conexin adecuado. La siguiente tabla indica las propiedades de conexin a las que
puede tener acceso con SQLGETPROP( ).
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 46 de 80
565 of 804
QueryTimeout Controla el tiempo (en segundos) que
hay que esperar antes de devolver un
error general de fin de tiempo de
espera.
Administrar Transactions Determina la forma en que la conexin
transacciones administra las transacciones en la tabla
remota.
Controlar la recopilacin Asynchronous Especifica si los conjuntos de
de conjuntos de resultados se devuelven de forma
resultados en los cursores sncrona (valor predeterminado) o
de presentacin asncrona.
BatchMode Especifica si SQLEXEC( ) devuelve
todos los conjuntos de resultados a la
vez (valor predeterminado), o
individualmente con
SQLMORERESULTS( ).
PacketSize Especifica el tamao del paquete de red
utilizado por la conexin.
Mostrar controladores ODBChdbc2 El controlador interno de conexin
ODBC internos ODBC que pueden utilizar los archivos
de bibliotecas externas (archivos .fll)
para llamar a las funciones API de
ODBC.
2. Si una conexin se desactiva, los valores ODBChdbc y ODBChstmt dejan de ser vlidos. No libere
estos valores en una biblioteca de usuario.
Para obtener ms informacin sobre las propiedades de conexin y su valor predeterminado, vea
SQLSETPROP( ).
Los valores que establezca en el entorno Visual FoxPro con el controlador 0 se usarn como
prototipos o valores predeterminados para todas las conexiones o los adjuntos posteriores.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 47 de 80
566 of 804
El ejemplo siguiente muestra en la pantalla el valor de la propiedad WaitTime del entorno actual:
? SQLGETPROP(0, "WaitTime")
Si establece la propiedad DispWarnings como verdadera (.T.), Visual FoxPro mostrar los errores de
entorno a partir de ese punto y tambin establecer DispWarnings como verdadera (.T.) para las
conexiones recin creadas.
Aunque los valores que establece para el controlador 0 se utilizan como valores prototipo para cada
conexin, tambin puede establecer propiedades personalizadas para una conexin individual si
ejecuta SQLSETPROP( ) para ese controlador de conexin. La excepcin es la propiedad
ConnectTimeout, cuya configuracin hereda la conexin en el momento de realizarse. Si cambia el
valor de la propiedad ConnectTimeout, este nuevo valor no se utilizar hasta que establezca una
nueva conexin.
Puede controlar las conexiones y vistas estableciendo propiedades en el objeto conexin o vista. Las
propiedades que controlan bases de datos, tablas, campos de tablas, definiciones de vistas, campos de
vistas, conexiones con nombre, conexiones activas o cursores de vista activos se llaman propiedades
de motor. Puede mostrar o establecer propiedades de motor con una de las siguientes funciones de
Visual FoxPro:
Para mostrar propiedades de motor use Para establecer propiedades de motor use
CURSORGETPROP( ) CURSORSETPROP( )
DBGETPROP( ) DBSETPROP( )
SQLGETPROP( ) SQLSETPROP( )
La funcin que use depende de si desea establecer propiedades en el objeto 0 (conexin 0 y cursor 0),
la definicin de objeto de una base de datos (conexin con nombre o definicin de vista) o el objeto
activo (conexin activa o cursor de vista activo). La tabla siguiente muestra objetos y las funciones
que se usan para establecer propiedades de cada objeto:
Propiedades de motor
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 48 de 80
567 of 804
La tabla siguiente presenta propiedades de motor ordenadas alfabticamente con los objetos que usan
cada propiedad.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 49 de 80
568 of 804
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 50 de 80
569 of 804
Conexiones activas: vea SQLGETPROP( ).
ConnectTimeout Definiciones de conexiones: vea DBSETPROP( ).
Conexiones activas: vea SQLSETPROP( ).
Database Cursores de vista activa: vea CURSORGETPROP( ).
DataSource Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLGETPROP( ).
DataType Campos de definiciones de vista: vea DBSETPROP( ).
DefaultValue Campos de tablas, campos de definiciones de vista: vea
DBSETPROP( ).
DeleteTrigger Tablas: vea DBGETPROP( ).
DispLogin Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLSETPROP( ).
DispWarnings Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLSETPROP( ).
FetchAsNeeded Definiciones de vista: vea DBSETPROP( ).
Cursores de vista activa: vea CURSORGETPROP( ).
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 51 de 80
570 of 804
Password Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLGETPROP( ).
Path Tablas: vea DBGETPROP( ).
Prepared Definiciones de vista: vea DBSETPROP( ).
PrimaryKey Tablas: vea DBGETPROP( ).
QueryTimeOut Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLSETPROP( ).
RuleExpression Tablas, campos de tablas, definiciones de vista, campos de
definiciones de vista: vea DBSETPROP( ).
RuleText Tablas, campos de tablas, definiciones de vista, campos de
definiciones de vista: vea DBSETPROP( ).
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 52 de 80
571 of 804
Conexiones activas: vea SQLGETPROP( ).
Version Bases de datos: vea DBGETPROP( ).
WaitTime Definiciones de conexin: vea DBSETPROP( ).
Conexiones activas: vea SQLSETPROP( ).
WhereType Definiciones de vista: vea DBSETPROP( ).
Cursores de vista activa: vea CURSORSETPROP( ).
1. Propiedad principalmente til para vistas remotas; el valor no tiene efecto sobre el rendimiento de
vistas locales. Puede configurar esta propiedad en vistas locales si desea preestablecer la propiedad en
la vista local y, a continuacin, hacer un upsizing para crear una vista remota.
2. La propiedad se tiene que establecer para que se enven actualizaciones al origen de datos remoto.
El modo de transaccin que seleccione determina cmo controla Visual FoxPro las transacciones en
su equipo local.
De forma predeterminada, Visual FoxPro ajusta automticamente en una transaccin todos los
comandos que se pueden incluir en una transaccin enviados al servidor remoto. Este tratamiento
automtico de transacciones predeterminado se proporciona cuando la propiedad Transactions est
establecida a 1 o a DB_TRANSAUTO.
O bien
Nota Los comandos de Visual FoxPro BEGIN TRANSACTION y END TRANSACTION crean
una transaccin nicamente para el cursor local de Visual FoxPro. No extienden la transaccin al
servidor remoto.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 53 de 80
572 of 804
Si desea controlar las transacciones de forma manual, puede establecer la propiedad Transactions
como 2 o como DB_TRANSMANUAL. Con el tratamiento manual de las transacciones, Visual
FoxPro inicia automticamente una transaccin cuando se ejecuta la primera instruccin SQL que se
puede incluir en transacciones, pero es necesario ejecutar la funcin SQLCOMMIT( ) o
SQLROLLBACK( ) de Visual FoxPro para finalizar la transaccin.
O bien
Tras confirmar o deshacer la transaccin previa, Visual FoxPro inicia automticamente una nueva
transaccin cuando se ejecuta la siguiente instruccin SQL que puede incluir en transacciones. Para
obtener ms informacin acerca de las transacciones, consulte el captulo 17, Programar para acceso
compartido
Transacciones anidadas
Visual FoxPro admite transacciones anidadas hasta un mximo de cinco niveles. El paso a travs de
SQL incorpora un solo nivel de anidamiento de transacciones.
Si su servidor admite mltiples niveles de transacciones, puede utilizar paso a travs de SQL con el
fin de administrar explcitamente los niveles de transacciones. No obstante, la administracin
explcita de transacciones no es recomendable, ya que puede dificultar el control de la interaccin
entre la transaccin incorporada y la temporizacin de las transacciones del servidor remoto. Para
obtener ms informacin sobre la administracin explcita de transacciones, consulte la
documentacin de ODBC.
Nota Los cursores no son objetos y no estn vinculados al modelo de objetos. No obstante, puede
ver sus propiedades o atributos, con CURSORGETPROP( ) y establecer sus propiedades con
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 54 de 80
573 of 804
CURSORSETPROP( ).
La siguiente tabla indica las propiedades de cursor de Visual FoxPro que permiten trabajar con vistas
y conjuntos de resultados conectados, agrupadas por categoras de tareas.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 55 de 80
574 of 804
buscadas cuando se devuelven los
conjuntos de resultados.
Actualizar datos SendUpdates* Especifica si las actualizaciones del
cursor se envan a las tablas en las que
se basa el cursor.
BatchUpdateCount Especifica el nmero de instrucciones
de actualizacin enviadas al servidor
para tablas almacenadas en bfer.
Tables* Lista delimitada por comas de nombres
de tablas del origen de datos; se usa
para definir el alcance de las
propiedades UpdateNameList y
UpdatableFieldsList.
KeyFieldList* Lista delimitada por comas de campos
de Visual FoxPro que representan la
clave principal del conjunto de
resultados utilizado para las
actualizaciones.
UpdateNameList* Lista delimitada por comas que
combina los campos de Visual FoxPro
del cursor con los nombres de tabla y
columna de los campos a los que desea
enviar las actualizaciones.
UpdatableFieldList* Lista delimitada por comas de los
campos de Visual FoxPro para los que
se envan actualizaciones.
Buffering Especifica el tipo de almacenamiento
en bfer que se ejecuta en el cursor.
UpdateType Especifica si se debe realizar una
actualizacin utilizando clusulas
UPDATE o DELETE, y luego
INSERT.
WhereType Especifica qu se debe incluir en la
clusula WHERE para las
actualizaciones de los datos de la tabla.
Estas propiedades se utilizan para controlar la forma en que la aplicacin interacta con datos
remotos, como el establecimiento del nmero de filas recuperadas durante la bsqueda progresiva y el
control de almacenamiento en bfer y de actualizaciones de datos remotos.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 56 de 80
575 of 804
Algunas propiedades de cursor heredan sus valores iniciales del entorno, mientras que otras
solamente estn disponibles a nivel del cursor. Algunas propiedades estn disponibles para cursores
que representan vistas remotas y tablas conectadas de paso a travs de SQL u ODBC.
Puede controlar algunos valores de conexin y de cursor a travs de la ficha Datos remotos del
cuadro de dilogo Opciones. Al presentar la ficha Datos remotos, los valores del cuadro de dilogo
representan las configuraciones del cursor para la sesin actual y las configuraciones predeterminadas
globales de Visual FoxPro para la conexin. Cuando modifique los valores de la ficha Datos remotos
y elija Aceptar, los nuevos valores se guardarn en la sesin actual del cursor y en la configuracin
predeterminada global de la conexin. Si elige Establecer como predeterminado, los valores se
incluirn en las opciones configurables del sistema en su equipo. El siguiente diagrama ilustra estas
interacciones.
Cuando cree un cursor, ste heredar los valores de sus propiedades, tales como UpdateType y
UseMemoSize, del cursor del entorno o del cursor 0 de la sesin actual. Puede modificar este valor
predeterminado de propiedad utilizando la funcin CURSORSETPROP( ) con el nmero de cursor 0.
Tras crear un cursor de vista con paso a travs de SQL, puede modificar los valores de las
propiedades del cursor activo mediante la funcin CURSORSETPROP( ) para el cursor de vista. Los
cambios que realice con CURSORSETPROP( ) sern temporales: la configuracin temporal para la
vista activa desaparece cuando se cierra dicha vista y la configuracin temporal para el cursor 0 queda
eliminada cuando se cierra la sesin de Visual FoxPro.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 57 de 80
576 of 804
Las conexiones heredan las propiedades de forma similar. Las propiedades predeterminadas para la
conexin 0 se heredan al crear y almacenar una conexin con nombre en una base de datos. Puede
modificar estos valores predeterminados de las propiedades para la conexin 0 con la funcin
SQLSETPROP( ). Una vez creada la conexin y almacenada en una base de datos, puede modificar
las propiedades de la conexin con la funcin DBSETPROP( ). Cuando utilice una conexin, la
conexin activa heredar los valores de las propiedades almacenados en la base de datos. Puede
modificar estas propiedades en la conexin activa mediante la funcin SQLSETPROP( ) para el
controlador de conexin.
Tanto los cursores de vista de paso a travs de SQL como las conexiones con nombre pueden utilizar
un origen de datos ODBC con nombre. Si utiliza un origen de datos ODBC en un cursor de vista de
paso a travs de SQL, la conexin heredar sus propiedades de los valores predeterminados de la
sesin.
El siguiente diagrama ilustra las propiedades heredadas de los cursores y las conexiones creados con
paso a travs de SQL. Las lneas grises representan el flujo de herencia de las propiedades y las lneas
negras representan los comandos de Visual FoxPro.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 58 de 80
577 of 804
Al utilizar funciones de paso a travs de SQL para actualizar datos en un servidor remoto, se controla
si se desean actualizar los datos, as como detalles especficos acerca de las actualizaciones,
estableciendo propiedades en el cursor del conjunto de resultados. Visual FoxPro comprueba estas
propiedades cuando se solicita una actualizacin antes de realizarla.
Para actualizar datos remotos es necesario definir cinco propiedades: Tables, KeyFieldList,
UpdateNameList, UpdatableFieldList y SendUpdates. Puede especificar propiedades adicionales,
tales como Buffering, UpdateType y WhereType, para adecuarse mejor a los requisitos de la
aplicacin.
Sugerencia Los cursores de vista de paso a travs de SQL no admiten actualizaciones hasta
que no especifique propiedades de actualizacin para el cursor de vista. Si desea almacenar los
valores de las propiedades de actualizacin de forma definitiva, cree una definicin de vista.
Visual FoxPro suministra valores predeterminados que preparan la vista para que sea
actualizable cuando se crea mediante el Diseador de vistas o el lenguaje. Puede utilizar la
funcin CURSORSETPROP( ) con el fin de agregar informacin adicional para personalizar o
aumentar la cantidad de valores predeterminados.
Las propiedades de actualizacin que se establecen en el cursor de vista activo tienen nombres
ligeramente distintos que sus correspondientes en DBSETPROP( ). La siguiente tabla incluye los
nombres utilizados para definiciones de vista y para cursores activos.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 60 de 80
l
579 of 804
3, o DB_BUFOPTROW, el valor predeterminado, que bloquea la fila de forma optimista.
l 5, o DB_BUFOPTTABLE, que bloquea la tabla de forma optimista.
Nota Los valores de almacenamiento pesimista en bfer de tabla y fila, 2 y 4, no se aplican a vistas
remotas, porque Visual FoxPro no bloquea los datos del servidor. El valor de la propiedad de
almacenamiento en bfer 1 no se aplica a vistas remotas porque las vistas siempre se almacenan en
bfer.
CURSORSETPROP('buffering', 3, 'titles')
Cuando establece Buffering para el almacenamiento de filas en bfer, dispone de dos mtodos para
enviar actualizaciones al servidor remoto. Puede:
La funcin TABLEUPDATE( ) actualiza el servidor sin mover el puntero de registro. Los comandos
que mueven el puntero de registro envan actualizaciones al servidor remoto como efecto secundario
de su salida del registro actualizado.
Si utiliza el almacenamiento de filas en bfer y desea tener la posibilidad de revertir los cambios
realizados en las filas, debe ajustar los cambios en una transaccin utilizando funciones de
transaccin de paso a travs de SQL.
Si desea que los cambios realizados en una tabla se realicen por lotes, como cuando el usuario hace
clic en un botn Guardar o Aceptar en un formulario, puede establecer la propiedad Buffering con el
valor 5, o DB_BUFOPTTABLE. Es necesario llamar a la funcin TABLEUPDATE( ) para enviar la
actualizacin al servidor.
Cdigo Comentarios
CURSORSETPROP('buffering', 5, 'sqltitles') Establecer en cdigo
Init
* Actualizar cambios en lotes;
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 61 de 80
Para restaurar en una tabla los valores originales e impedir que las actualizaciones se enven al
servidor remoto, llame a TABLEREVERT( ). Puede controlar si se revierte una sola fila o varias
combinando el valor de la propiedad Buffering del cursor con el comando TABLEREVERT( ). El
siguiente ejemplo revierte solamente la fila actual. Quiz le resulte conveniente invocar este cdigo
cuando el usuario haga clic en un botn Cancelar de un formulario:
Si desea revertir todas las filas, por ejemplo cuando el usuario presiona esc para salir de un
formulario, puede utilizar el mismo ejemplo, pero cambiando el valor de la propiedad Buffering y el
comando TABLEREVERT( ) para revertir todas las filas, con toda la tabla almacenada en bfer:
Para obtener ms informacin sobre el almacenamiento en bfer, consulte el captulo 17, Programar
para acceso compartido.
En aplicaciones multiusuario, los conflictos con las actualizaciones de otros usuarios se detectan
mediante la consulta SQL Update, que se genera cuando se intenta realizar una escritura localmente.
El nivel de deteccin depende del valor de la propiedad WhereType. Para obtener ms informacin
sobre los valores de la propiedad WhereType, consulte el captulo 8, Crear vistas.
Imponer actualizaciones
Puede utilizar la funcin TABLEUPDATE( ) para controlar si los cambios realizados en una tabla o
cursor por otro usuario de la red se sobrescriben cuando usted enva sus propias actualizaciones. Si
establece el parmetro Force de TABLEUPDATE( ) como verdadero (.T.) y la propiedad
CURSORSETPROP( ) UpdateType est establecida al valor predeterminado 2, los datos anteriores se
actualizarn con los nuevos datos enviados, siempre y cuando el valor del campo clave del registro en
la tabla remota no se haya modificado. Si el valor del campo clave de la tabla remota ha cambiado o
si la propiedad UpdateType est establecida a 1, Visual FoxPro enviar una instruccin DELETE y
luego una instruccin INSERT a la tabla remota.
La tabla siguiente muestra los mensajes de error de Visual FoxPro y ODBC que se aplican
especficamente a actualizaciones remotas. La columna Accin contiene la accin que debe llevar a
cabo para resolver la condicin de error.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 62 de 80
581 of 804
No especific tablas de La propiedad de cursor Tables no Use la propiedad Tables para
actualizacin. Use la contiene nombres de tablas especificar al menos una tabla
propiedad de cursor remotas. Se necesita al menos una para el cursor.
Tables. tabla para permitir actualizaciones
en el servidor remoto.
No hay columnas clave La clave principal para la tabla Use la propiedad KeyFieldList
especificadas para la remota especificada en el mensaje para especificar la clave principal
tabla de actualizacin de error no est incluida en la para la tabla remota.
nombre_tabla. Use la propiedad KeyFieldList para el
propiedad de cursor cursor; se necesita una clave
KeyFieldList. principal para cada tabla que se va
a actualizar.
No se especific tabla de La propiedad UpdateName para la Establezca el cualificador de tabla
actualizacin vlida para columna nombre_columna tiene un con la propiedad UpdateNameList
la columna cualificador de tabla no vlido. o agregue el cualificador de tabla
nombre_columna. Use al valor de la propiedad Tables, o
las propiedades de cursor ambas cosas.
UpdateNameList y
Tables.
La propiedad de cursor Varios registros remotos tienen la Use la propiedad KeyFieldList
KeyFieldList no define misma clave. para definir una clave nica para
una clave nica. la tabla remota.
De ODBC: objeto ODBC ODBC no encuentra la tabla o Compruebe el nombre del objeto.
no vlido. columna remota porque no existe
con ese nombre. Visual FoxPro
valida los nombres de campos de
Visual FoxPro; los nombres de
tabla y columna remotas solamente
se validan en el servidor remoto.
Para obtener ms informacin sobre control de errores, consulte Controlar errores de paso a travs de
SQL ms adelante en este mismo captulo.
Visual FoxPro proporciona dos modos de procesamiento para recuperar y actualizar datos remotos
mediante paso a travs de SQL: sncrono y asncrono. Si utiliza las funciones de paso a travs de
SQL, puede elegir el mtodo que prefiera. No necesita elegir ningn mtodo para las vistas remotas,
pues Visual FoxPro utiliza automticamente la recopilacin progresiva y administra el modo de
procesamiento para las vistas remotas.
De forma predeterminada, las funciones SQL de Visual FoxPro se procesan de manera sncrona:
Visual FoxPro no devuelve el control a una aplicacin hasta que no termine la llamada a la funcin.
El procesamiento sncrono es til cuando se trabaja con Visual FoxPro de forma interactiva.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 63 de 80
582 of 804
El procesamiento asncrono proporciona mayor flexibilidad que el sncrono. Por ejemplo, cuando su
aplicacin procesa una funcin de forma asncrona, puede generar un indicador que muestre el
progreso de la instruccin en ejecucin, mostrar el movimiento del puntero del mouse, crear bucles y
establecer cronmetros para permitir la interrupcin del procesamiento que tarda demasiado tiempo.
Su aplicacin puede solicitar el procesamiento asncrono para las cuatro funciones que envan
peticiones a un origen de datos y que recuperan datos: SQLEXEC( ), SQLMORERESULTS( ),
SQLTABLES( ) y SQLCOLUMNS( ). El procesamiento asncrono se activa estableciendo la
propiedad Asynchronous de la conexin mediante la funcin SQLSETPROP( ); cuando se establece
la comunicacin asncrona para la conexin, estas cuatro funciones operan de manera asncrona.
? SQLGETPROP(nConnectionHandle,'Asynchronous')
? SQLSETPROP(nConnectionHandle,'Asynchronous', .T.)
En el modo asncrono, es necesario llamar a cada funcin varias veces hasta que devuelve un valor
distinto de 0 (en ejecucin). Mientras la funcin est en ejecucin, podr cancelar el procesamiento
de la funcin si presiona la tecla ESC en caso de que la propiedad SET ESCAPE est definida como
verdadera (.T.).
Hasta que la funcin haya terminado de procesarse, la aplicacin solamente podr utilizar un
controlador de conexin con SQLCANCEL( ) o con la funcin asncrona (SQLEXEC( ),
SQLMORERESULTS( ), SQLTABLES( ) o SQLCOLUMNS( ) asociada originalmente al
controlador. No puede llamar a ninguna de las otras tres funciones asncronas ni a
SQLDISCONNECT( ) con el mismo controlador de conexin hasta que la funcin haya terminado.
Su aplicacin recupera mltiples conjuntos de resultados cuando usted utiliza la funcin SQLEXEC
( ) para ejecutar dos o ms instrucciones SELECT de SQL, o para ejecutar un procedimiento
almacenado que ejecuta mltiples instrucciones SELECT. Los resultados de cada instruccin
SELECT de SQL se devuelven en un cursor de Visual FoxPro distinto.
El nombre predeterminado SQLRESULT se utiliza para el primer cursor; los dems cursores reciben
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 64 de 80
583 of 804
El nombre predeterminado SQLRESULT se utiliza para el primer cursor; los dems cursores reciben
nombres nicos indexando el nombre predeterminado. Por ejemplo, los nombres predeterminados
para los cursores devueltos por una instruccin SQLEXEC( ) que solicita tres conjuntos de resultados
son Sqlresult, Sqlresult1 y Sqlresult2.
En el modo por lotes, si una funcin devuelve mltiples conjuntos de resultados, sus respectivos
nombres de cursor en Visual FoxPro tendrn sufijos nicos y podrn incluir un mximo de 255
caracteres. Por ejemplo, el ejemplo siguiente establece la propiedad BatchMode en el modo por lotes
y despus ejecuta una instruccin SQLEXEC( ) que contiene cuatro instrucciones SELECT de SQL
que generan cuatro conjuntos de resultados:
? SQLSETPROP(nConnectionHandle,'BatchMode', .T.)
? SQLEXEC(nConnectionHandle,'select * from authors ;
select * from titles ;
select * from roysched ;
select * from titleauthor','ITEM')
Cuando termina de procesarse la funcin anterior, Visual FoxPro devuelve los cuatro conjuntos de
resultados como los cursores de Visual FoxPro Item, Item1, Item2 e Item3.
Puede cambiar el nombre predeterminado mediante el parmetro cNombreCursor con las funciones
SQLEXEC( ) o SQLMORERESULTS( ). Si el nombre especificado para un conjunto de resultados
ya se ha utilizado, el nuevo conjunto de resultados sobrescribir el cursor existente.
Cuando la aplicacin recupera mltiples conjuntos de resultados, puede elegir entre el procesamiento
sncrono o asncrono y entre los modos por lotes o sin lotes.
Si utiliza SQLSETPROP( ) para establecer la propiedad BatchMode al valor 0, para el modo sin
lotes, cada conjunto de resultados se devolver de manera individual. La llamada a la funcin
SQLEXEC( ) devuelve el primer conjunto de resultados. A continuacin, la aplicacin debe llamar a
SQLMORERESULTS( ) repetidamente hasta que devuelva un valor de 2, lo que indica que no hay
ms resultados disponibles.
En el modo sin lotes, el nombre del cursor se puede modificar en cada llamada posterior a
SQLMORERESULTS( ). De esta forma, si para el ejemplo anterior el nombre del primer cursor de
una secuencia SQLEXEC( ) es Item, y la segunda llamada a SQLMORERESULTS( ) cambia el
parmetro cCursorName a Otheritem, los cursores resultantes se denominarn Item, Item1, Otheritem
y Otheritem1.
La siguiente seccin describe el procesamiento en modo por lotes y en modo sin lotes, anexando la
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 65 de 80
584 of 804
La siguiente seccin describe el procesamiento en modo por lotes y en modo sin lotes, anexando la
condicin de sncrono y asncrono. El diagrama que se muestra a continuacin proporciona una
representacin de las cuatro combinaciones posibles de procesamiento. Los nmeros 0, 1 y 2
representan los valores devueltos cuando se llama a cada funcin.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 66 de 80
585 of 804
Cuando se ejecuta una instruccin de paso a travs de SQL de forma sncrona en el modo por lotes, el
control no vuelve hasta que no se hayan recuperado todos los conjuntos de resultados. El nombre del
primer cursor se especifica mediante el parmetro cNombreCursor en la funcin original. Si el cursor
especificado ya existe, el conjunto de resultados sobrescribir el cursor existente. Cuando se solicitan
mltiples conjuntos de resultados en el modo sncrono por lotes, Visual FoxPro crea los nombres de
cursores adicionales indexando de forma exclusiva el nombre del primer cursor.
Cuando se ejecuta una instruccin de paso a travs de SQL de manera sncrona en el modo sin lotes,
la primera instruccin recupera el primer conjunto de resultados y devuelve un 1. A continuacin,
debe llamar a la funcin SQLMORERESULTS( ) repetidas veces y, si lo desea, especificar un nuevo
nombre para el cursor. Si no especifica ningn nombre para el cursor, se crearn nombres distintos
para los conjuntos de resultados indexando de forma nica el nombre bsico. Cuando
SQLMORERESULTS( ) devuelve un valor de 2, no hay ms resultados disponibles.
En el modo asncrono, la aplicacin debe continuar llamando a la misma funcin de paso a travs de
SQL hasta que devuelva un valor distinto de 0 (en ejecucin). El nombre predeterminado para el
conjunto de resultados, Sqlresult, se puede cambiar explcitamente con el parmetro
cNombreCursor la primera vez que llama a la funcin. Si el nombre especificado para un conjunto de
resultados ya se ha utilizado, el nuevo conjunto de resultados sobrescribir la informacin del cursor
existente.
Cuando ejecuta el modo por lotes de forma asncrona, cada llamada repetida de la funcin original
devuelve un 0 (en ejecucin) hasta que se devuelven todos los conjuntos de resultados a los cursores
especificados. Una vez recuperados todos los resultados, el valor de retorno es el nmero de cursores
o bien un nmero negativo que indica un error.
Cuando se procesa en modo asncrono sin lotes, SQLEXEC( ) devuelve un valor de 1 al completar la
recuperacin de cada conjunto de resultados. A continuacin, la aplicacin debe llamar a
SQLMORERESULTS( ) repetidas veces hasta que devuelva un valor de 2, indicando que no hay ms
resultados disponibles.
Sugerencia Los conjuntos de resultados remotos se recuperan en dos etapas: primero se prepara el
conjunto de resultados en el servidor; a continuacin, el conjunto de resultados se recopila en un
cursor local de Visual FoxPro. En el modo asncrono, puede llamar a la funcin USED( ) para ver si
Visual FoxPro ha comenzado a recopilar el cursor solicitado.
Al mover datos entre un servidor remoto y Visual FoxPro, pueden surgir diferencias en cuanto a la
cantidad de tipos de datos disponibles en el servidor o en Visual FoxPro, porque raras veces hay una
correlacin exacta entre los tipos de datos disponibles en un origen de datos remoto y los de Visual
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 67 de 80
586 of 804
correlacin exacta entre los tipos de datos disponibles en un origen de datos remoto y los de Visual
FoxPro. Para resolver estas diferencias, Visual FoxPro utiliza los tipos de datos de ODBC para
asignar tipos de datos remotos a tipos de datos locales de Visual FoxPro. Si comprende la forma en
que se asignan los tipos de datos entre ODBC y Visual FoxPro, puede prever la forma en que se
manejarn los datos remotos del servidor en su aplicacin de Visual FoxPro.
Si lo necesita, tambin puede ajustar los tipos de datos utilizados en el servidor o en la aplicacin. El
tipo de datos predeterminado para los campos en Visual FoxPro se puede anular creando una vista
para el conjunto de datos remoto y luego estableciendo la propiedad del campo de presentacin
DataType en la base de datos. La propiedad DataType es una propiedad de tipo carcter que indica el
tipo de datos deseado para cada campo de una vista remota. Para obtener ms informacin sobre la
propiedad DataType, vea DBSETPROP( ).
Cuando se recuperan datos desde un origen de datos ODBC remoto, Visual FoxPro convierte el tipo
de datos de cada campo ODBC en un tipo de datos equivalente de Visual FoxPro para el cursor del
conjunto de resultados. La siguiente tabla indica los tipos de datos disponibles en orgenes de datos
de ODBC y sus equivalentes en Visual FoxPro.
Tipo de datos ODBC del campo remoto Tipo de datos de campo en el cursor de Visual
FoxPro
SQL_CHAR Character o Memo1
SQL_VARCHAR
SQL_LONGVARCHAR
SQL_BINARY Memo
SQL_VARBINARY
SQL_LONGVARBINARY
SQL_DECIMAL Numeric o Currency2
SQL_NUMERIC
SQL_BIT Logical
SQL_TINYINT Integer
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT Character
SQL_REAL Double; el nmero de lugares decimales es el valor
SQL_FLOAT de SET DECIMAL en Visual FoxPro
SQL_DOUBLE
SQL_DATE Date
SQL_TIME DateTime3
SQL_TIMESTAMP DateTime4
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 68 de 80
587 of 804
1 Si el ancho del campo ODBC es menor que el valor de la propiedad del cursor UseMemoSize, se
convertir en un campo de tipo Character en el cursor de Visual FoxPro; de lo contrario, se convertir
en un campo Memo.
2 Si el campo del servidor es del tipo de datos money, se convertir en un tipo de datos Currency en
Visual FoxPro.
3 El da toma el valor predeterminado de 1/1/1900.
4 Si el valor del campo SQL_TIMESTAMP contiene fracciones de segundos, estas fracciones se
truncarn al convertir el valor a un tipo de datos DateTime de Visual FoxPro.
Nota Los valores nulos de los campos del origen de datos ODBC se convierten en valores nulos en
el cursor de Visual FoxPro, sin importar el valor de SET NULL en Visual FoxPro en el momento en
que la aplicacin recupera los datos remotos.
Si hay datos de Visual FoxPro en un cursor que se origin a partir de datos remotos, los datos
volvern a su tipo ODBC original cuando se enven al servidor remoto. Si enva datos originados en
Visual FoxPro al servidor remoto mediante paso a travs de SQL, se aplicarn las siguientes
conversiones.
1. Si la variable de memoria de Visual FoxPro que se asigna a un parmetro crea una expresin cuyo
ancho es menor que 255, se convertir en un tipo SQL_CHAR en el origen de datos ODBC; de lo
contrario, se convertir en un tipo SQL_LONGVARCHAR.
2. Los datos de tipo Fecha de Visual FoxPro se convierten a SQL_DATE para todos los orgenes de
datos ODBC excepto para SQL Server, donde se convierten en SQL_TIMESTAMP.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 69 de 80
588 of 804
Asignar un parmetro de Visual FoxPro a un tipo de datos remoto
Puede asignar un valor de parmetro de Visual FoxPro a un tipo de datos remoto concreto si aplica al
parmetro el formato como una expresin de caracteres que utilice la sintaxis para el tipo de datos
remoto deseado. Por ejemplo, si el servidor proporciona un tipo de datos DateTime, puede crear el
parmetro de Visual FoxPro como una expresin de caracteres en el formato utilizado por el servidor
para representar los datos de tipo DateTime. Cuando el servidor recibe el valor del parmetro, intenta
asignar los datos con formato al tipo de datos DateTime.
Nota Cuando enve un parmetro al servidor remoto, asegrese de que el tipo de datos de la clusula
WHERE coincide con el tipo de datos utilizado para la expresin del parmetro.
En este captulo se explican estrategias para optimizar el rendimiento de las aplicaciones en el cliente,
la red y el servidor. Para obtener informacin acerca de la implementacin de aplicaciones cliente-
servidor, consulte los dems captulos de este manual.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 70 de 80
589 of 804
de su aplicacin.
El nmero de conexiones que utiliza Visual FoxPro depende de si usted fuerza o no el cierre de las
conexiones no usadas y de qu duracin establezca para el tiempo de espera de inactividad de la
conexin.
Puede utilizar conexiones de forma exclusiva o bien compartir una conexin. Cada mtodo presenta
sus ventajas. Cuando use una conexin de forma exclusiva, su aplicacin no experimentar ninguna
contencin en cuanto a recursos de conexin una vez establecida una conexin. Si cada conjunto de
resultados usa una conexin exclusiva, tambin podr entremezclar el proceso asncrono en varios
conjuntos de resultados.
Cuando use una conexin compartida, tendr una conexin para mltiples conjuntos de resultados.
Debe serializar las operaciones de manipulacin de datos sobre los conjuntos de resultados que
comparten la misma conexin y disear la aplicacin para probar el nivel de ocupacin de la
conexin cada vez que pueda producirse un conflicto. Para obtener informacin sobre la manera de
compartir una conexin, consulte el captulo 8, Crear vistas.
Si su aplicacin no realiza ninguna accin durante un periodo de tiempo prolongado, puede reducir el
uso de la conexin si establece la propiedad IdleTimeout de la conexin. La propiedad IdleTimeout
controla el intervalo de tiempo que se permite que las conexiones estn inactivas antes de que Visual
FoxPro las cierre. De forma predeterminada, las conexiones esperan indefinidamente y no se
desactivan hasta que no las cierre especficamente el usuario.
El tiempo de conectividad para una definicin de conexin se establece con la propiedad IdleTimeout
de la funcin DBSETPROP( ); puede establecer la propiedad IdleTimeout para una conexin activa
con la funcin SQLSETPROP( ).
Visual FoxPro cerrar las conexiones aunque las ventanas Examinar y los formularios que muestran
datos remotos sigan abiertos y, despus, volver a conectar automticamente cuando se necesite de
nuevo la conexin. Sin embargo, Visual FoxPro no puede cerrar una conexin si:
Para establecer el modo de transaccin para una definicin de conexin, utilice la propiedad
Transactions de la funcin DBSETPROP( ); puede establecer el modo de transaccin para una
conexin activa mediante la funcin SQLSETPROP( ).
Liberar conexiones
Puede mejorar el rendimiento si cierra las conexiones que su aplicacin ya no utilice. Las conexiones
se cerrarn automticamente cuando cierre una vista. Si la conexin est compartida por mltiples
vistas, Visual FoxPro cerrar la conexin cuando se cierre la ltima vista que usa la conexin.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 71 de 80
590 of 804
vistas, Visual FoxPro cerrar la conexin cuando se cierre la ltima vista que usa la conexin.
Puede cerrar la conexin para una consulta si no desea actualizar los datos de un cursor. Use una
consulta de paso a travs de SQL para seleccionar los datos que necesita en un cursor local y, a
continuacin, cierre la conexin.
Tambin puede usar la propiedad de vista UseMemoSize para devolver campos de caracteres como
campos memo y despus desactivar FetchMemo para permitir a su aplicacin buscar los campos de
caracteres convertidos a campos memo.
Cuando consulta un origen de datos remoto, Visual FoxPro recupera filas completas de datos y
genera un cursor de Visual FoxPro. Para acelerar la recuperacin de datos remotos, Visual FoxPro
emplea la bsqueda progresiva de los cursores de vista y de los creados asncronamente mediante
paso a travs de SQL. En lugar de pedirle a usted o a su aplicacin que espere mientras se recupera un
conjunto entero de datos, Visual FoxPro ejecuta una consulta y busca nicamente un pequeo
subconjunto de las filas del conjunto de resultados en el cursor local. El tamao de este subconjunto
es de 100 filas de forma predeterminada.
Nota Las instrucciones sncronas de paso a travs de SQL no emplean la bsqueda progresiva. Se
recupera todo el conjunto de resultados solicitado por una instruccin SQLEXEC( ) antes de que el
control vuelva a su aplicacin.
A medida que Visual FoxPro recupera filas adicionales de datos, el cursor local contiene cada vez
ms datos consultados. Puesto que las filas se recuperan en distintos momentos desde el origen de
datos, la informacin de las filas no se actualiza automticamente. Si su conexin funciona en modo
asncrono, Visual FoxPro le devolver el control a usted o a su programa en cuanto busque el primer
subconjunto de datos. Durante el tiempo de inactividad, Visual FoxPro realiza una bsqueda en
segundo plano de las filas restantes de los datos consultados, de subconjunto en subconjunto, en el
cursor local. Esta situacin le permite usar los datos ya buscados del cursor sin tener que esperar al
resto de los datos.
Nota El aumento del nmero de filas buscadas aumenta el rendimiento, pero disminuye la respuesta
de la interfaz del usuario. La disminucin del nmero de filas buscadas produce el efecto contrario.
Puede desactivar la bsqueda progresiva y buscar filas nicamente cuando sea necesario si usa de
forma apropiada la propiedad de cursor de vista o de base de datos FetchAsNeeded. Esto produce una
obtencin de datos ms eficiente para vistas remotas o vistas al recuperar conjuntos de datos muy
grandes.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 72 de 80
591 of 804
bsqueda progresiva se utiliza de forma predeterminada. Cuando se establece la propiedad
FetchAsNeeded como verdadero (.T.), slo se busca en las filas cuando sea necesario. Cuando se
establece la propiedad FetchAsNeeded a verdadero, no se puede realizar una actualizacin hasta que
se complete la bsqueda, se llame a la funcin SQLCANCEL( ) en el controlador de conexin actual
o se cierre la vista.
Si desea buscar todo el cursor, puede ejecutar el comando GOTO BOTTOM o cualquier comando
que requiera acceso a todo el conjunto de datos.
Sugerencia Si bien puede usar el comando GO BOTTOM para buscar todo el cursor, normalmente
es ms eficiente generar una vista parametrizada que busque nicamente una sola fila cada vez y
vuelva a ejecutar la consulta a medida que el usuario cambie registros. Para obtener ms informacin
acerca de la generacin de vistas de alto rendimiento, consulte el captulo 8, Crear vistas.
Los programas no ofrecen procesamiento de bucle inactivo. Para buscar en cursores de vista mediante
programacin, use los comandos GO nNmeroRegistro o GOTO BOTTOM. Para buscar cursores
creados mediante paso a travs de SQL en modo asncrono, llame a la funcin asncrona de paso a
travs de SQL una vez por cada subconjunto de fila.
Puede usar la funcin SQLCANCEL( ) para cancelar una instruccin SQLEXEC( ) o una vista en
cualquier momento. Sin embargo, si el servidor ha terminado de generar el conjunto de resultados
remoto y Visual FoxPro ha empezado a buscar el conjunto de resultados remoto en un cursor local, la
funcin SQLCANCEL( ) cancelar la instruccin SQLEXEC( ) y abandonar el cursor local. Si desea
eliminar el cursor local puede ejecutar el comando USE, que cierra el cursor y cancela la bsqueda.
Puede controlar el nmero de filas buscadas de una vez por su aplicacin en un servidor remoto si
establece la propiedad FetchSize de su vista. Esta propiedad especifica el nmero de registros que se
buscan en el cursor local desde el servidor remoto cada vez, mediante la bsqueda progresiva o
llamadas asncronas de paso a travs de SQL. El valor predeterminado es 100 filas.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 73 de 80
En el Diseador de vistas, elija en el men . En el 592
rea of 804
Bsqueda de datos del cuadro de dilogo Opciones avanzadas, use el control numrico para
establecer un valor para el Nmero de registros que se van a buscar cada vez.
O bien
O bien
Por ejemplo, el cdigo siguiente establece la definicin de la vista para buscar progresivamente
50 filas de una vez en Customer_remote_view:
Una aplicacin bien diseada suele utilizar la bsqueda diferida de Memo para acelerar la
transferencia de conjuntos de resultados que contienen campos de tipo Memo o General. La bsqueda
diferida de Memo significa que el contenido de los campos de tipo Memo y General no se transferir
automticamente cuando transfiere una fila. En su lugar, se transfieren rpidamente el resto de los
campos de la fila, y no se busca el contenido de los campos de tipo Memo y General hasta que no lo
pide abriendo el campo Memo o General. La bsqueda diferida de Memo constituye el mtodo ms
rpido de transferencia de filas y permite buscar nicamente el contenido de los campos de tipo
Memo o General, que puede ser muy grande, si lo necesita el usuario.
Por ejemplo, su formulario podra incluir un campo de tipo General que muestre una imagen. Para
acelerar el rendimiento, puede usar la bsqueda diferida de Memo para impedir la transferencia de la
imagen hasta que el usuario elija el botn Vista previa de su formulario. El cdigo subyacente al
botn Vista previa busca en el campo General y lo muestra en el formulario.
Para controlar la bsqueda diferida de Memo, utilice la propiedad FetchMemo de su vista o su cursor.
La propiedad FetchMemo especifica si se debe buscar el contenido de los campos tipo Memo o
General cuando se transfiere la fila. El valor predeterminado es verdadero (.T.), que significa que los
campos de tipo Memo y General se transfieren automticamente. Si sus datos contienen grandes
cantidades de datos de campos tipo Memo o General, quiz observe un mejor rendimiento si
establece como falso (.F.) la propiedad FetchMemo.
Nota La vista debe ser actualizable para permitir la bsqueda diferida de Memo, ya que Visual
FoxPro usa los valores de campos clave establecidos por las propiedades de actualizacin para
encontrar la fila de origen en el servidor cuando recupere el campo de tipo Memo o General. Para
obtener informacin acerca de la creacin de una vista actualizable, consulte el captulo 8, Crear
vistas.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 74 de 80
593 of 804
para establecer la propiedad FetchMemo de un cursor.
Puede usar las siguientes recomendaciones para establecer propiedades de conexin y vista con el fin
de optimizar la bsqueda de datos. La propiedad PacketSize de su conexin es la que tiene ms
influencia en el rendimiento. Adems, puede optimizar el rendimiento de bsqueda mediante
conexiones sncronas.
1. Establezca un valor ms alto para filas que contengan ms datos; debe experimentar para encontrar
el mejor valor.
2. Use conexiones sncronas para mejorar el rendimiento hasta un 50%, a no ser que quiera poder
cancelar instrucciones SQL mientras se ejecutan en el servidor.
3. El efecto de FetchSize es muy dependiente del tamao de registros del conjunto de resultados de
bsqueda. En modo sncrono, no afecta al rendimiento de forma significativa, por que puede
establecerlo como sea necesario para la bsqueda progresiva de vistas de procesamiento asncrono de
paso a travs de SQL. Si se reduce el valor de FetchSize, proporciona mejor respuesta al buscar de
forma progresiva una vista, pero disminuye la velocidad de bsqueda. Si aumenta, mejora el
rendimiento de bsqueda de vista.
Los ndices remotos pueden hacer las consultas mucho ms eficaces. Las consultas de mltiples
tablas son mucho ms rpidas si las tablas estn indexadas segn los campos de combinacin. Tener
ndices en campos incluidos en la clusula WHERE de una consulta tambin puede mejorar el
rendimiento.
Los ndices agrupados consiguen el mximo rendimiento. En SQL Server, cada tabla puede tener un
ndice agrupado. El Asistente para upsizing a SQL Server crea automticamente ndices agrupados en
tablas que tenan una clave principal en Visual FoxPro.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 75 de 80
594 of 804
Sugerencia Si bien los ndices de campos de tablas empleados en consultas pueden acelerar el
proceso, los ndices sobre conjuntos de resultados pueden disminuir el rendimiento. Use con cuidado
los ndices sobre conjuntos de resultados.
Si necesita procesar una combinacin de datos locales y remotos, cree una vista remota que combine
todos los datos remotos en una nica vista. Entonces, puede combinar la vista remota con los datos
locales de una vista local. Como Visual FoxPro hace una bsqueda completa de ambas vistas antes
combinarlas y filtrar la vista combinada, es importante limitar el tamao del conjunto de resultados
de la vista.
Para optimizar el procesamiento remoto, limite el conjunto de resultados remoto a la cantidad mnima
de datos que necesite su aplicacin. Cuando recupere menos datos en un conjunto de resultados
remoto, minimizar el tiempo necesario para transferir datos remotos al cursor de la vista o la
consulta local.
Los parmetros de vistas y de paso a travs de SQL son expresiones de Visual FoxPro y se evalan en
Visual FoxPro antes de enviarse al servidor remoto. El tiempo de evaluacin para la expresin es
importante, ya que aumenta el tiempo de ejecucin de la consulta.
Acelerar formularios
Cuando disee un formulario basado principalmente en datos del servidor, adopte un enfoque
minimalista para un mejor rendimiento. Determine los datos y la funcionalidad necesarios y no pida
al servidor estos datos y esta funcionalidad hasta que no lo solicite el usuario. Solicitar datos al
servidor usa tiempo de procesamiento y crea trfico en la red. Para solicitar menos datos en sus
formularios:
l Solicite el mnimo nmero de registros posibles. Por ejemplo, use un filtro o una consulta para
limitar el tamao del conjunto de registros. Asegrese de que el servidor pueda procesar todas
las restricciones que usted use.
l Use el mnimo nmero de campos remotos posible en las vistas subyacentes a sus formularios.
l Use el menor nmero posible de formularios que tengan acceso a vistas remotas en su conjunto
de formularios. Cuando abra un conjunto de formularios, todos los formularios del conjunto se
abrirn y completarn con los datos aplicables. Si limita el nmero de formularios del conjunto,
especialmente aquellos que deben conectarse a un servidor y recuperar datos remotos, reducir
el tiempo de carga del conjunto de formularios.
l Use menos controles dependientes que tengan acceso a datos remotos. Cada cuadro combinado,
cuadro de lista y cuadrcula que dependa de una tabla o una consulta remota necesita una
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 76 de 80
595 of 804
cuadro de lista y cuadrcula que dependa de una tabla o una consulta remota necesita una
consulta distinta al servidor cuando se abra el formulario. Evite usar controles que contengan
totales o cuadros de lista y cuadros combinados que tengan orgenes de filas grandes.
l Si los usuarios necesitan comparar mltiples conjuntos de datos, considere la posibilidad de
almacenar en tablas locales temporales los datos devueltos por el servidor. Proporcione un
formulario en el cual el usuario pueda usar los datos almacenados previamente o ejecutar una
nueva consulta.
Con frecuencia, una aplicacin contiene varios formularios que usan la misma tabla remota. Si los
datos de la tabla no cambian con frecuencia, puede acelerar la carga del formulario y reducir la carga
del servidor mediante una de las tcnicas siguientes:
l Almacene en la aplicacin de base de datos local Visual FoxPro las tablas que nunca cambian y
que no son demasiado grandes (como los nombres y las abreviaturas de las regiones de su pas).
Si la tabla se combina en consultas o vistas con tablas remotas, tambin debera conservar una
copia de ella en el servidor para evitar combinar datos locales y remotos.
l Almacene en el servidor y en la aplicacin de base de datos local las tablas que cambien con
poca frecuencia (como las listas de edificios de la compaa). Ofrezca un mtodo para que el
usuario transfiera la tabla cuando cambien los datos.
l Almacene en el servidor y en la aplicacin de base de datos local las tablas que cambien
ocasionalmente pero no a diario (como una lista de empleados en una pequea compaa o
departamento). Su aplicacin debe actualizar automticamente la versin local cada vez que se
inicie. Este mtodo emplea tiempo adicional cuando se inicia la aplicacin, pero acelera las
consultas cuando la aplicacin est en ejecucin.
Presente los campos que tardan mucho tiempo en recuperarse del servidor nicamente cuando se
soliciten, como los campos de tipo Memo o General. Puede usar las tcnicas siguientes:
l Si su formulario se basa en una vista, coloque los campos de tipo Memo o General fuera de la
pantalla de otra pgina del formulario. Agregue una etiqueta al formulario, como Avanzar
pgina para ver notas e imgenes, que informen al usuario de cmo ver la informacin.
Establezca la propiedad FetchMemo de la vista o del cursor como falsa (.F.), de forma que
Visual FoxPro no recupere campos de tipo Memo o General hasta que se muestren en la
pantalla.
l Establezca la propiedad Visible como falsa (.F.) para los controles dependientes de los campos
de tipo Memo o General. Agregue un botn de alternar o un botn de comando que establezca
la propiedad como verdadera (.T.), de forma que el usuario pueda elegir ver el contenido de
estos controles.
l Muestre los campos ms importantes en el formulario principal y ofrezca un botn con la
etiqueta Ms informacin que abra otro formulario que contenga otros campos. Base el
segundo formulario en una vista parametrizada por el campo de clave principal del formulario
principal. Por ejemplo, suponga que tiene un formulario principal basado en una vista cuya
instruccin SQL SELECT incluye el cdigo siguiente:
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 77 de 80
596 of 804
FROM customers
Puede mejorar el rendimiento cuando actualice, inserte o elimine datos de una tabla remota que
contenga muchos campos si agrega un campo de marca de hora a la tabla remota, siempre y cuando
su servidor ofrezca el tipo de campo MarcaHora.
La presencia de un campo de tipo MarcaHora en una tabla remota le permite usar la opcin
DB_KEYANDTIMESTAMP de actualizacin WhereType de SQL de Visual FoxPro. Esta opcin
ahorra tiempo de proceso porque Visual FoxPro slo compara dos campos de la vista, el campo de
clave y el campo de marca-hora, contra una tabla remota para detectar conflictos de actualizacin. Al
comparar nicamente dos campos, en lugar de todos los campos actualizables (mediante la opcin
DB_KEYANDUPDATABLE) o todos los campos modificados (mediante la opcin
DB_KEYANDMODIFIED), la opcin DB_KEYANDTIMESTAMP reduce el tiempo necesario para
actualizar datos remotos. Para obtener ms informacin acerca de las opciones de WhereType,
consulte el captulo 8, Crear vistas.
El Asistente para upsizing puede agregar automticamente a las tablas que exporte campos de marca-
hora segn proceda. Para obtener ms informacin al respecto, consulte "Columnas de marca de
hora en el captulo 20, Upsizing de bases de datos de Visual FoxPro.
Sugerencia Si hace algo que modifique la estructura de una tabla base de una vista, como agregar
un campo de marca de hora, quiz tenga que volver a crear la vista. Los campos de una definicin de
vista se almacenan en la base de datos, y todos los cambios realizados a las tablas base para una vista
despus de usarla no quedarn reflejados en la definicin de la vista hasta que no vuelva a crearla.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 78 de 80
597 of 804
despus de usarla no quedarn reflejados en la definicin de la vista hasta que no vuelva a crearla.
Cuando sea apropiado, puede acelerar las actualizaciones evitando que los campos memo (campos de
tipo Memo, General o Picture) se comparen con sus homlogos de tabla de base. De forma
predeterminada, la propiedad CompareMemo se establece como verdadero (.T.), lo cual incluye
automticamente los campos memo en la clusula WHERE de SQL generada al crear una vista
actualizable. Puede establecer la propiedad CompareMemo como falso (.F.) para excluir memos de la
clusula WHERE de SQL.
Usar transacciones
Para conseguir un rendimiento ptimo, use el modo de transaccin manual y administre las
transacciones. El modo de transaccin manual le permite controlar cundo realizar un grupo de
transacciones, lo que permite al servidor procesar ms instrucciones rpidamente.
Puede crear procedimientos almacenados en el servidor, que estn precompilados y, por tanto, se
ejecutan muy rpidamente. Puede ejecutar procedimientos almacenados, enviar parmetros mediante
paso a travs de SQL y mover procesos adicionales al servidor segn sea apropiado para su
aplicacin.
Por ejemplo, quiz desee recopilar localmente la entrada del usuario y ejecutar una consulta de paso a
travs de SQL para enviar los datos al servidor, llamando al procedimiento almacenado apropiado.
Para ello, cree un formulario en un cursor o una matriz local para recopilar los datos y escriba cdigo
que cree una instruccin SQLEXEC( ) mediante el nombre del procedimiento almacenado en el
servidor y los parmetros que se deben proporcionar. Podra agregar este cdigo al evento Click de un
botn de comando cuyo ttulo fuera Aceptar o Realizar. Cuando el usuario elija el botn se
ejecutar la instruccin SQLEXEC( ). Usar procedimientos almacenados en el servidor para
actualizar datos remotos puede ser ms eficiente, ya que los procedimientos almacenados se compilan
en el servidor.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 79 de 80
598 of 804
Si su aplicacin actualiza una serie de registros, quiz desee crear lotes de actualizaciones de modo
que la red y el servidor las gestionen ms eficazmente. Las instrucciones Update o Insert se agrupan
por lotes antes de enviarse al servidor, de acuerdo con el valor de la propiedad BatchUpdateCount de
la vista. El valor predeterminado es 1, que significa que cada registro se enva al servidor con una
instruccin de actualizacin. Puede reducir el trfico de la red si incrementa el valor para empaquetar
mltiples actualizaciones en una instruccin.
Para usar esta caracterstica eficazmente, la conexin de la vista debe establecerse para el modo 5 de
almacenamiento en bfer, para el almacenamiento optimista de tablas en bfer y los cambios deben
confinarse desde el punto de vista ideal a los mismos campos en cada fila del cursor. Puede usar
DBSETPROP( ) para establecer la propiedad BatchUpdateCount para la definicin de la vista; para
cambiar el valor para el cursor de una vista activa, use CURSORSETPROP( ).
Puede usar las siguientes instrucciones para establecer propiedades de vista y conexin para
optimizar el rendimiento de actualizaciones y eliminaciones. La propiedad BatchSize de la vista es la
que tiene ms influencia en el rendimiento.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 6: Crear soluciones cliente-servidor Pgina 80 de 80
599 of 804
1 El mejor valor tambin depende de la velocidad del servidor.
El rendimiento real depende en gran medida de la configuracin del sistema y de los requisitos de la
aplicacin. Pruebe con los valores de la tabla para determinar los mejores valores para su
configuracin. Las recomendaciones anteriores son ptimas para un equipo cliente que ejecuta
Windows NT versin 3.5 con ODBC 2.10 y el controlador ODBC de SQL 2.05; y un equipo servidor
que ejecute Windows NT, Versin 3.5 con Microsoft SQL Server 4.21 y 6.0.
file://C:\temp\~hh8A68.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 1 de 24
600 of 804
Los archivos de Ayuda son un origen de informacin valiosa para los usuarios de la aplicacin. Con
Visual FoxPro, puede elegir crear Winhelp, Ayuda HTML o Ayuda de tipo .DBF.
La Ayuda grfica puede ser Winhelp si desea una apariencia Windows, o una Ayuda HTML si desea
una apariencia de Web.
La Ayuda de tipo .DBF est basada en caracteres y le proporciona flexibilidad para migrar el archivo
de Ayuda a otras plataformas. Este tipo de Ayuda es fcil de crear porque est basada en una tabla de
Visual FoxPro.
Nota Microsoft Visual Studio 6.0 incluye el Microsoft HTML Workshop (Hhw.exe) para crear
archivos de Ayuda HTML. No incluye Microsoft Help Workshop 4.0 (Hcw.exe) para crear archivos
Winhelp. Las versiones anteriores de Microsoft Visual FoxPro incluan Microsoft Help Workshop
4.0.
l Ayuda HTML
l WinHelp 4.0
Ayuda HTML
La Ayuda HTML proporciona muchas de las caractersticas de Winhelp y agrega las siguientes:
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 2 de 24
601 of 804
l Soporte para ActiveX, Java y secuencias de comandos (Javascript y Microsoft Visual Basic
Script).
La Ayuda HTML se crea con Microsoft HTML Help Workshop, que se incluye en Visual Studio y en
Visual FoxPro. HTML Help Workshop proporciona un completo sistema de creacin de Ayuda
HTML e incluye una compatibilidad con versiones anteriores que le permite crear fcilmente
archivos de Ayuda HTML a partir de proyectos Winhelp existentes. Para crear archivos de Ayuda
HTML en su aplicacin, consulte la Ayuda en pantalla de HTML Help Workshop.
Archivo Descripcin
Solution.chm Archivo de Ayuda compilado.
Solution.hhp Archivo de proyecto (un archivo de texto que rene todos los elementos de
un proyecto de Ayuda y contiene informacin acerca de cmo va a aparecer
un archivo de Ayuda compilado).
Solution.hhk Archivo de ndice; contiene las entradas del ndice (palabras clave).
Solution.hhc Archivo de Tabla de contenido.
Solution.ali Archivo de alias para el soporte de Ayuda interactiva. Asocia Id. de producto
con temas de Ayuda.
Solution.hh Archivo de encabezados para el soporte de Ayuda interactiva. Incluye los Id.
de producto.
Solution.chi Archivo de ndice utilizado cuando se suministran archivos .chm que van a
permanecer en un CD-ROM, como en el caso de la biblioteca MSDN. El
archivo .chi permite la instalacin local de cierta informacin de exploracin
en el disco duro que permite tener acceso de forma rpida, mientras que el
contenido principal reside en el CD-ROM. Los archivos .chi no se usan en
entornos sin CD-ROM. Cuando no se utilizan archivos .chi, toda la
informacin que podra almacenar permanece en el propio archivo .chm.
MSDN_ie3.css Hoja con el estilo de cascada.
MSDN_ie4.css Hoja con el estilo de cascada.
Archivo.htm Archivos de contenido.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 3 de 24
602 of 804
Archivo.gif Archivos grficos.
Adems de crear un archivo de Ayuda HTML que contenga informacin til, tiene que proporcionar
un medio para que los usuarios de su aplicacin tengan acceso a dicha Ayuda. Hay tres maneras de
proporcionar Ayuda:
l Un men Ayuda (un men que aparece en la barra del men principal de su aplicacin).
l Ayuda interactiva (Ayuda que aparece cuando el usuario presiona F1, u otra tecla especificada,
mientras est seleccionado un objeto, control o opcin de men determinado).
l Ayuda "Qu es esto?" (Ayuda que aparece cuando el usuario pide Ayuda sobre un objeto o
control determinado).
El men Ayuda suele contener comandos que proporcionan acceso a los temas de su sistema de
Ayuda. Se recomienda que slo un comando del men Ayuda abra su sistema de Ayuda HTML.
Adems de dicho comando, puede incluir otros comandos en el men Ayuda para proporcionar
informacin del sistema o la informacin de derechos de autor y la versin de su aplicacin.
Interactividad
La Ayuda interactiva permite que los usuarios tengan acceso a los temas de Ayuda relacionados con
lo que estn haciendo o viendo en su aplicacin en cualquier momento dado. Por ejemplo, si un
usuario est viendo un formulario de introduccin de datos, la Ayuda interactiva podra proporcionar
un tema relacionado especficamente con dicho formulario.
Se suele llegar a la Ayuda interactiva al presionar F1, pero puede especificar que se active mediante
cualquier tecla con ON KEY LABEL.
Para implementar Ayuda interactiva, tiene que especificar el archivo de Ayuda de su aplicacin y
despus asociar temas de Ayuda determinados con objetos de su aplicacin.
2. Asigne un tema de Ayuda a cada objeto para el que vaya a proporcionar Ayuda interactiva.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 4 de 24
603 of 804
El archivo de Ayuda al que se tiene acceso en su aplicacin se determina al incluir el comando SET
HELP TO archivo en el cdigo, donde archivo es el nombre del archivo de Ayuda. Por ejemplo, si el
archivo de Ayuda es MiAyuda.chm, puede utilizar el siguiente comando:
Este comando suele estar incluido en el cdigo de configuracin del programa principal de su
aplicacin.
1. En modo Diseo, abra el objeto (por ejemplo, un formulario, un control o una barra de
herramientas) al que vaya a asignar Ayuda interactiva.
Para obtener ms informacin acerca de la asociacin de temas de Ayuda HTML con Id. de contexto,
consulte la Ayuda de HTML Help Workshop.
Nota Para asignar temas de Ayuda a ttulos de men o a comandos de men, tiene que incluir el
comando SET TOPIC TO en el procedimiento asociado con el ttulo de men o el comando de men.
La Ayuda "Qu es esto?" es similar a la Ayuda interactiva puesto que proporciona Ayuda
relacionada con el objeto o control especfico que actualmente tiene el enfoque.
Al contrario que en WinHelp, la Ayuda HTML "Qu es esto?" se presenta en la ventana de Ayuda
con su tamao predeterminado.
La Ayuda "Qu es esto?" se asocia con un formulario, control de formulario o barra de herramientas
particular estableciendo su propiedad WhatsThisHelpID al nmero correspondiente al tema asociado
de su archivo de Ayuda.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 5 de 24
604 of 804
Para implementar la Ayuda "Qu es esto?", utilice las siguientes propiedades y mtodos:
Propiedad Descripcin
WhatsThisHelp Establezca esta propiedad a True (.T.) en un formulario para activar la
Ayuda "Qu es esto?" en el formulario y en los controles del
formulario.
WhatsThisButton Establezca esta propiedad a True (.T.) si quiere que aparezca un botn
"Qu es esto?" en la barra de ttulo del formulario.
WhatsThisHelpID En un formulario, control o barra de herramientas, establezca esta
propiedad al ID correspondiente al tema asociado de su archivo de
Ayuda HTML.
WhatsThisMode Utilice este mtodo para mostrar el puntero con la interrogacin para
la Ayuda "Qu es esto?" y activar dicho modo de Ayuda. Al hacer
clic en un objeto se muestra el tema de Ayuda "Qu es esto?"
especificado por la propiedad WhatsThisHelpID del objeto.
1. En modo Diseo, abra el formulario en el que vaya a activar la Ayuda "Qu es esto?".
3. Para mostrar un botn "Qu es esto?" en la barra de ttulo del formulario, establezca la
propiedad WhatsThisButton del formulario a True (.T.).
5. Para asociar un tema de Ayuda "Qu es esto?" con un control concreto del formulario,
seleccione el control y establezca su propiedad WhatsThisHelpID al Id. correspondiente al
tema asociado de su archivo de Ayuda HTML.
Puede programar su aplicacin para que los usuarios tengan acceso a su sistema de Ayuda HTML.
Aunque un sistema de Ayuda HTML puede consistir en uno o varios archivos separados, la Ayuda
aparece ante los usuarios como parte integrante de su aplicacin.
Puede programar su aplicacin de Visual FoxPro para utilizar Ayuda grfica y Ayuda de tipo .dbf con
los comandos SET HELP TO y SET TOPIC TO. SET HELP TO especifica el nombre de un archivo
de Ayuda personalizado para su aplicacin. SET TOPIC TO establece la palabra clave identificativa
de un tema del archivo de Ayuda personalizado.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 6 de 24
605 of 804
Reservar F1
Cuando un usuario presiona F1 dentro de su aplicacin, Visual FoxPro puede mostrar un tema de
Ayuda interactiva. Para hacerlo as, asigne un Id. de contexto con un tema de su tabla de Ayuda y
asigne el mismo valor a la propiedad HelpContextID del formulario o el control. Cuando el
formulario o el control tengan el enfoque y el usuario presione F1, Visual FoxPro muestra el tema
asociado.
Nota De forma predeterminada, F1 est activada para la Ayuda interactiva. Como es un estndar
admitido para la Ayuda, no se recomienda la modificacin de esta tecla.
Si agrega botones de Ayuda a sus formularios, los usuarios pueden tener acceso a la Ayuda con ms
facilidad. Especialmente, debe considerar la inclusin de un botn de Ayuda si sus usuarios no son
muy experimentados.
THIS.SetAll("HelpContextID", 7)
HELP ID THIS.HelpContextID
Sugerencia Guarde el botn de Ayuda como una clase de forma que pueda incluirlo fcilmente en
cualquier otro formulario. Para obtener ms informacin acerca de cmo guardar objetos como
clases, vea el captulo 9, Crear formularios.
Adems del archivo .chm que se crea para el sistema de Ayuda HTML, puede utilizar un programa de
instalacin de uso y distribucin gratuita, Hhupd.exe, que instala y registra los componentes de
ejecucin de la Ayuda HTML mostrados a continuacin. El Explorador de Internet o el motor de
ejecucin del Explorador de Internet tienen que estar instalados en los equipos de los usuarios.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 7 de 24
606 of 804
Componente Descripcin
Hhctrl.ocx Control ActiveX de la Ayuda HTML
Itss.dll Biblioteca de vnculos dinmicos que controla el HTML compilado
Itircl.dll Biblioteca de vnculos dinmicos para bsquedas de texto
Hh.exe Visor de Ayuda HTML
Este programa de instalacin se encuentra en la carpeta Redist de la carpeta de instalacin del Taller
de Ayuda HTML. Puede llamar a dicho programa de instalacin desde otros programas de instalacin
y ejecutarlo en modo 'silencioso' para que no interfiera con el programa de instalacin que haya
creado. Para obtener la lista completa de las opciones de lnea de comandos, ejecute Hhupd.exe/?.
WinHelp 4.0
Utilice Microsoft Help Workshop, proporcionado en las versiones anteriores de Visual FoxPro, para
crear archivos Winhelp. Microsoft Help Workshop incluye una Gua de diseo de Ayudas. La Gua
de diseo de Ayudas (Hcw.hlp) es un archivo de Ayuda grfica que contiene gran parte de la
informacin necesaria para disear sistemas de Ayuda robustos.
Los sistemas WinHelp puede tener algunas o todas las funciones siguientes:
l Una pgina de contenido que proporciona una vista jerrquica de los temas del sistema de
Ayuda.
l Un ndice, basado en las palabras clave que usted proporcione, que gua al usuario hasta una
informacin especfica.
l Funciones de bsqueda de texto que permiten que los usuarios busquen palabras o frases en la
Ayuda.
l Texto con varias fuentes, tamaos de fuente y colores.
l Grficos, incluyendo mapas de bits con varias resoluciones.
l Macros que automatizan o amplan la operacin del sistema de Ayuda.
l Zonas activas (reas sensibles al mouse que se crean para proporcionar a los usuarios saltos que
vinculan temas; ventanas emergentes que muestran texto adicional; y macros incluidas en el
sistema de Ayuda).
l Hipergrficos segmentados: grficos con una o varias zonas activas.
l Ventanas secundarias.
l Mens personalizables.
l Grficos en formato metarchivo de Windows.
l .DLLs.
Adems de crear un archivo WinHelp que contenga la informacin necesaria, tiene que proporcionar
los medios a travs de los cuales los usuarios de su aplicacin van a tener acceso a la Ayuda. Hay tres
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 8 de 24
607 of 804
maneras de proporcionar Ayuda:
l Un men Ayuda (un men que aparece en la barra del men principal de su aplicacin).
l Ayuda interactiva (Ayuda que aparece cuando el usuario presiona F1, u otra tecla especificada,
mientras est seleccionado un objeto, control u opcin de un men determinado).
l Ayuda "Qu es esto?" (Ayuda que aparece como sugerencia emergente cuando el usuario pide
Ayuda sobre un objeto o control especfico).
El men Ayuda suele contener comandos que proporcionan acceso a los temas de su sistema de
Ayuda. WinHelp 4.0 incorpora la ventana Buscador de Ayuda, que es un nico cuadro de dilogo que
proporciona acceso al contenido, al ndice y a la bsqueda de texto.
Se recomienda que slo un comando del men Ayuda abra la ventana Buscador de Ayuda. Adems
de dicho comando, puede incluir otros comandos en el men Ayuda para proporcionar informacin
del sistema o la informacin de derechos de autor y la versin de su aplicacin.
Puede invocar la ventana Buscador de Ayuda desde los programas mediante la funcin WinHelp con
el parmetro HELP FINDER. Para obtener ms informacin, vea "Usar la funcin WinHelp" ms
adelante en este captulo y el tema WinHelp de la Gua de diseo de Ayudas.
Interactividad de la Ayuda
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 9 de 24
608 of 804
La Ayuda interactiva permite que los usuarios tengan acceso a los temas de Ayuda relacionados con
lo que estn haciendo o viendo en su aplicacin en cualquier momento dado. Por ejemplo, si un
usuario est viendo un formulario de introduccin de datos, la Ayuda interactiva podra proporcionar
un tema relacionado especficamente con dicho formulario
Se suele llegar a la Ayuda interactiva al presionar F1, pero puede especificar la activacin de la
Ayuda interactiva mediante cualquier tecla con ON KEY LABEL.
Para implementar Ayuda interactiva, tiene que especificar el archivo de Ayuda de su aplicacin y, a
continuacin, asociar temas de Ayuda especficos a objetos de su aplicacin.
2. Asigne un tema de Ayuda a cada objeto para el que vaya a proporcionar Ayuda interactiva.
El archivo de Ayuda al que se tiene acceso en su aplicacin se determina al incluir el comando SET
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 10 de 24
609 of 804
HELP TO archivo en el cdigo, donde archivo es el nombre del archivo de Ayuda. Por ejemplo, si el
archivo de Ayuda es MiAyuda.hlp, puede utilizar el siguiente comando:
Este comando suele estar incluido en el cdigo de configuracin del programa principal de su
aplicacin.
1. En modo Diseo, abra el objeto (por ejemplo, un formulario, un control o una barra de
herramientas) al que vaya a asignar Ayuda interactiva.
Para obtener ms informacin acerca de la asociacin de temas de Ayuda con Id. de contexto,
consulte la Gua de diseo de Ayuda.
Nota Para asignar temas de Ayuda a ttulos de men o a comandos de men, tiene que incluir el
comando SET TOPIC TO en el procedimiento asociado con el ttulo de men o el comando de men.
La Ayuda "Qu es esto?" es similar a la Ayuda interactiva puesto que proporciona Ayuda
relacionada con el objeto o control determinado que tiene actualmente el enfoque. Sin embargo, en
lugar de invocar el archivo de Ayuda y mostrar el tema de Ayuda en la ventana de Ayuda con su
tamao predeterminado, la Ayuda "Qu es esto?" muestra el tema en una pequea ventana
emergente que desaparece en cuanto el usuario haga clic en cualquier parte de la pantalla. La Ayuda
"Qu es esto?" es til para proporcionar breves descripciones, definiciones o sugerencias sobre
controles concretos.
Sugerencia Los temas de Ayuda "Qu es esto?" deben ser breves y concisos para que la ventana no
sea tan grande como para ocultar el componente que describe.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 11 de 24
610 of 804
Para implementar la Ayuda "Qu es esto?", utilice las siguientes propiedades y mtodos:
Propiedad Descripcin
WhatsThisHelp Establezca esta propiedad a True (.T.) en un formulario para activar la
Ayuda "Qu es esto?" en el formulario y en los controles del
formulario.
WhatsThisButton Establezca esta propiedad a True (.T.) si desea que aparezca un botn
"Qu es esto?" en la barra de ttulo del formulario.
WhatsThisHelpID En un formulario, control o barra de herramientas, establezca esta
propiedad al Id. correspondiente al tema asociado de su archivo de
Ayuda.
WhatsThisMode Utilice este mtodo para mostrar el puntero con la interrogacin para
la Ayuda "Qu es esto?" y activar dicho modo de Ayuda. Al hacer
clic en un objeto se presenta el tema de Ayuda "Qu es esto?"
especificado por la propiedad WhatsThisHelpID del objeto.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 12 de 24
611 of 804
Usar un botn "Qu es esto?"
1. En modo Diseo, abra el formulario en el que vaya a activar la Ayuda "Qu es esto?".
3. Para mostrar un botn "Qu es esto?" en la barra de ttulo del formulario, establezca la
propiedad WhatsThisButton del formulario a True (.T.).
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 13 de 24
612 of 804
Ayuda.
5. Para asociar un tema de Ayuda "Qu es esto?" a un control especfico del formulario,
seleccione el control y establezca su propiedad WhatsThisHelpID al Id. correspondiente al
tema asociado de su archivo de Ayuda.
Puede programar su aplicacin para que los usuarios tengan acceso a su sistema de Ayuda en la
Ayuda de Microsoft. Aunque un sistema de Ayuda puede consistir en uno o varios archivos
separados, la Ayuda aparece ante los usuarios como parte integrante de su aplicacin.
Puede programar su aplicacin Visual FoxPro para utilizar Ayuda grfica y Ayuda de tipo .dbf con
los comandos SET HELP TO y SET TOPIC TO o con la funcin WinHelp, descrita ms adelante en
este captulo. SET HELP TO especifica el nombre de un archivo de Ayuda personalizado para su
aplicacin. SET TOPIC TO establece la palabra clave identificativa de un tema del archivo de Ayuda
personalizado.
Otra forma de programar su aplicacin para utilizar Ayuda es la utilizacin de la funcin WinHelp.
La funcin WinHelp forma parte de la interfaz de programacin de aplicaciones (API) de Windows.
La funcin WinHelp slo est disponible en las plataformas Windows.
Puede utilizar la funcin WinHelp junto con la propiedad HelpContextID, para invocar un segundo
archivo de Ayuda.
Sugerencia Si utiliza SET HELP TO, HELP ID y SET TOPIC TO, no necesita utilizar la funcin
WinHelp.
Para obtener la descripcin de dichos parmetros, vea "El parmetro wCmd", ms adelante en
este mismo captulo.
2. Establezca la biblioteca con SET LIBRARY TO y defina las variables que vaya a utilizar,
normalmente en el cdigo de inicializacin del archivo principal de la aplicacin.
Si quiere abrir un tema de Ayuda enviando su palabra clave K, defina una variable con RegFn
( ), de igual modo que la variable Help del ejemplo anterior. Si desea abrir un tema de Ayuda
asociado a un nmero, define una variable con RegFn de igual modo que la variable Help del
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 14 de 24
613 of 804
ejemplo anterior y utilice un nmero en lugar de una cadena de texto en dwData. Si pasa
nmeros, tiene que asociarlos en la seccin [MAP] del archivo .hpj con cadenas de contexto
nicas definidas con la nota al pie (#).
Por ejemplo, si su archivo de Ayuda es MiAyuda.hlp, utilice CallFn( ) para abrir un tema en
MiAyuda.hlp incluyendo la palabra clave K del tema:
El parmetro hWnd
El parmetro hWnd identifica la ventana que solicita la Ayuda. La Ayuda utiliza este identificador
para saber qu aplicaciones han solicitado Ayuda. En Visual FoxPro, utilice la funcin MainHWND
( ), incluida en la biblioteca Foxtools.fll, para obtener el parmetro hWnd.
El argumento lpzFileName
El argumento lpzFileName representa una cadena de texto que especifica la ruta y el nombre del
archivo de Ayuda que contiene el tema deseado. Se pasa por valor.
El parmetro wCmd
El parmetro wCmd especifica el tipo de bsqueda que la Ayuda utiliza para buscar el tema
especificado o que la aplicacin ya no requiere Ayuda. Puede establecerse a uno de los siguientes
valores.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 15 de 24
614 of 804
HELP_INDEX 0x0003 Muestra el tema de ndice de Ayuda
definido en la seccin [OPTIONS] del
archivo de proyecto de Ayuda (.hpj).
HELP_KEY 0x0101 Muestra el primer tema encontrado
entre los que contienen la palabra
clave especificada en el parmetro
dwData.
HELP_QUIT 0x0002 Informa a la aplicacin de Ayuda que
ya no es necesaria. Si ninguna otra
aplicacin ha solicitado Ayuda,
Windows cierra la aplicacin de
Ayuda.
HELP_SETINDEX 0x0005 Establece un tema especfico como
tema de ndice.
El parmetro dwData
El parmetro dwData representa el tema para el que la aplicacin solicita Ayuda. Su contenido y su
formato dependen del valor de wCmd pasado cuando la aplicacin invoca la funcin WinHelp.
En la mayor parte de las llamadas a Ayuda, el argumento dwData se pasa por valor. Es la forma
predeterminada de Visual FoxPro.
Dependiendo de las circunstancias, dwData puede representar una cadena de texto, indicando la
palabra clave que se busca, o un valor numrico, indicando el nmero de contexto que identifica al
tema concreto.
Como la funcin WinHelp puede especificar un nmero de contexto o una palabra clave, acepta la
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 16 de 24
615 of 804
Ayuda interactiva y la bsqueda de temas en el archivo de Ayuda.
Nota Si un archivo de Ayuda contiene dos o ms ndices, la aplicacin tiene que asignar uno como
ndice predeterminado. Para asegurarse de que el ndice correcto est establecido, la aplicacin tiene
que invocar la Ayuda con wCmd establecido a help_setindex (y dwData especificando el
identificador de contexto adecuado). Todas las llamadas a Ayuda tienen que ir seguidas de un
comando establecido a help_context. Nunca se debe utilizar HELP_index con help_setindex.
Cuando un usuario presiona F1 en su aplicacin, Visual FoxPro puede mostrar un tema de Ayuda
interactiva. Para hacerlo, asigne un Id. de contexto de Ayuda a un tema de su tabla de Ayuda y asigne
el mismo valor a la propiedad HelpContextID del formulario o el control. Cuando el formulario o el
control tiene el enfoque y el usuario presiona F1, Visual FoxPro muestra el tema asociado.
Nota De forma predeterminada, F1 est activada para la Ayuda interactiva. Como es un estndar
admitido para la Ayuda, no se recomienda la modificacin de esta tecla.
Si agrega botones de Ayuda a sus formularios, los usuarios pueden tener acceso a la Ayuda con ms
facilidad. Especialmente, debe considerar la inclusin de un botn de Ayuda si sus usuarios no son
muy experimentados.
THIS.SetAll("HelpContextID", 7)
HELP ID THIS.HelpContextID
Sugerencia Guarde el botn de Ayuda como una clase de forma que pueda incluirlo fcilmente en
cualquier otro formulario. Para obtener ms informacin acerca de cmo guardar objetos como
clases, vea el captulo 9, Crear formularios..
Salir de la Ayuda
La aplicacin de Ayuda es un recurso compartido disponible por todas las aplicaciones Windows.
Como tambin es una aplicacin independiente, el usuario puede ejecutarla como cualquier otra
aplicacin. Como resultado, su aplicacin tiene un control limitado sobre la aplicacin de Ayuda.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 17 de 24
616 of 804
Las aplicaciones que hayan llamado a la Ayuda en algn punto de su ejecucin tienen que llamar a la
Ayuda con el parmetro wCmd establecido a help_quit antes de terminar.
Si una aplicacin abre ms de un archivo de Ayuda, tiene que invocar la funcin WinHelp para salir
de la aplicacin de Ayuda una vez por cada archivo abierto.
Si una aplicacin o una biblioteca de vnculos dinmico (DLL) ha abierto un archivo de Ayuda pero
no quiere seguir manteniendo la asociacin con la instancia de la aplicacin de Ayuda, la aplicacin o
la DLL tiene que invocar WinHelp con el parmetro wCmd establecido a help_quit para salir de dicha
instancia de la aplicacin de Ayuda.
Nota Antes de terminar, las aplicaciones o las DLL tienen que llamar siempre a WinHelp por cada
uno de los archivos de Ayuda abiertos. Un archivo de Ayuda se abre si hace cualquier llamada a la
Ayuda con el nombre del archivo de Ayuda.
La aplicacin de Ayuda no termina hasta que todas las ventanas que hayan solicitado la Ayuda la
hayan invocado con wCmd establecido a help_quit. Si alguna aplicacin no lo hiciera, la aplicacin
de Ayuda seguira ejecutndose, incluso despus de que todas las aplicaciones que solicitaron Ayuda
hubieran terminado.
l Obtener Ayuda interactiva sobre el cuadro de dilogo, el comando de men o el objeto actual al
presionar F1.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 18 de 24
617 of 804
l Saltar a temas relacionados del archivo de Ayuda seleccionando un tema en la lista desplegable
"Vea tambin".
l Seleccionar una palabra o frase clave en medio de un tema y saltar a dicha palabra o frase
haciendo clic en el botn "Buscar".
l Copiar al Portapapeles el texto seleccionado en la ventana de Ayuda.
En Visual FoxPro se incluye un archivo de Ayuda de tipo .DBF, Ttrade.dbf, ubicado en el directorio
...\Samples\Vfp98\Tastrade\Help de Visual Studio. Las secciones siguientes usan el ejemplo
Ttrade.dbf para describir el diseo y el desplazamiento por la ayuda de tipo .DBF.
La ventana de Ayuda .DBF tiene dos modos: Temas y Detalles. El modo Temas muestra una lista de
todos los temas del archivo de Ayuda. Observe que la fuente de la ventana Ayuda .DBF es MS Sans
Serif y no se puede cambiar.
Al hacer doble clic en un tema, el contenido de ese tema aparece en el modo Detalles.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 19 de 24
618 of 804
Las tablas de Ayuda tienen capacidad para un mximo de 32.767 registros y deben contener al menos
dos campos. La tabla puede tener un primer campo opcional para interactividad. El ejemplo siguiente
muestra la configuracin de una tabla de Ayuda tpica:
No hay requisitos para los nombres de campo. Los tipos de campo son, en orden:
Carcter Es el nombre del tema que aparece en el modo Temas de la ventana de Ayuda.
Memo Este campo contiene la informacin que aparece en el modo Detalles de la ventana de
Ayuda.
Aparte de estos requisitos, puede agregar tantos campos adicionales como desee.
Descripcin de Ttrade.dbf
Ttrade.dbf es un buen ejemplo de un archivo de Ayuda de tipo .DBF. Puede disear su archivo de
Ayuda basndose en Ttrade.dbf, o bien puede crear su propio diseo. Puesto que un archivo de Ayuda
es una tabla, puede crear su propio archivo de Ayuda creando una tabla nueva o copiando y
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 20 de 24
619 of 804
modificando una tabla existente.
Para ver o modificar la tabla Ttrade.dbf, brala y examine su contenido como cualquier otra tabla. Si
ha ejecutado anteriormente el comando SET HELP TO TTRADE.DBF, deber utilizar primero el
comando SET HELP OFF antes de abrir la tabla Ttrade.dbf.
Temas de TTRADE
Detalles de TTRADE
Cuando un usuario selecciona un tema en el modo Temas, la ventana de Ayuda muestra el contenido
del campo memo llamado Details.
En la mayora de los temas de Ayuda, las referencias cruzadas de tipo "Vea tambin" aparecen al final
de la informacin de Detalles. Estas referencias se muestran automticamente en el cuadro "Vea
tambin" y actan como vnculos directos a los temas relacionados.
1. Al final del campo memo, escriba Vea tambin seguido de un signo de dos puntos y espacios
opcionales.
2. En la misma lnea, escriba una lista delimitada por comas de los temas deseados.
La distincin entre maysculas y minsculas no importa en la lista "Vea tambin"; Visual FoxPro
elimina los espacios en blanco de cada tema al que se hace referencia. Por ejemplo, las referencias
cruzadas para el tema Introduccin aparecen a continuacin.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 21 de 24
620 of 804
Sugerencia Agregue lneas por encima y por debajo de la seccin "Vea tambin" al final del tema
para separarla visualmente del contenido.
Al buscar un tema en el cuadro "Vea tambin", Visual FoxPro intenta hacer coincidir la seleccin del
usuario con el primer tema de Ayuda que conste o comience por la misma cadena de texto. Si Visual
FoxPro no encuentra ninguna coincidencia, mostrar "No hay Ayuda para tema" en la barra de estado.
Especifique la tabla de Ayuda; para ello, ejecute el comando SET HELP TO nombrearchivo. De este
modo se cerrar la tabla de Ayuda actual, si haba alguna abierta, y se abrir nombrearchivo como
nueva tabla de Ayuda.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 22 de 24
621 of 804
En una situacin tpica de programacin, guarde en una variable el nombre del archivo de Ayuda
actual y especifique el nombre del archivo de Ayuda en el cdigo de inicializacin, como en el
ejemplo siguiente:
cAyudaUsuario = SET("HELP", 1)
SET HELP TO MIAYUDA.DBF
Despus de especificar la tabla de Ayuda, puede especificar los temas que desea mostrar de esta
forma:
l Para seleccionar temas por nombre, utilice los comandos HELP Tema o SET TOPIC TO
cNombreTemaAyuda.
l Para temas de Ayuda interactiva, utilice la propiedad HelpContextID.
l Para mostrar un subconjunto de temas, use el comando SET HELPFILTER.
Para seleccionar temas por nombre, utilice el comando HELP Tema. Cuando utilice este comando,
Visual FoxPro buscar en la tabla de Ayuda el registro cuyo campo de tema coincide con Tema. En la
bsqueda no se distinguen maysculas de minsculas.
Cuando Visual FoxPro encuentre una coincidencia, mostrar el contenido del campo memo Detalles
en el modo Detalles de la ventana de Ayuda. Si Visual FoxPro no encuentra ninguna coincidencia,
mostrar todos los temas de una lista en el cuadro de dilogo Temas de Ayuda con la coincidencia
ms cercana resaltada.
Puede disear la aplicacin de modo que el usuario pueda obtener Ayuda interactiva de dos formas:
Reserva de F1
Cuando un usuario presiona F1 en la aplicacin, Visual FoxPro puede mostrar un tema de Ayuda
interactiva. Para ello, asigne un HelpcontextID a un tema en la tabla de Ayuda y asigne el mismo
valor a la propiedad HelpContextID del formulario o el control. Cuando el formulario o el control
tenga el enfoque y el usuario presione F1, Visual FoxPro mostrar el tema correspondiente.
Nota F1 est activada para Ayuda interactiva de forma predeterminada. Puesto que se trata de un
estndar reconocido para la Ayuda, no se recomienda redefinir esta tecla.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 23 de 24
622 of 804
Si agrega botones Ayuda a los formularios, los usuarios podrn tener acceso a la Ayuda de forma ms
fcil. El botn Ayuda puede resultar especialmente til si el usuario no tiene mucha experiencia.
Ahora ya puede asignar el tema de Ayuda al formulario. Es conveniente asignar un botn Ayuda, el
formulario y sus objetos al mismo tema de Ayuda.
1. En el evento Init del formulario, establezca la propiedad HelpContextID de todos los objetos
del formulario con el mismo valor que haya asignado al tema de Ayuda. Por ejemplo, si el
valor es 7, podr emplear el comando siguiente:
THIS.SetAll("HelpContextID", 7)
HELP ID THIS.HelpContextID
Sugerencia Guarde el botn de Ayuda como una clase de manera que pueda agregarlo
fcilmente a cualquier formulario. En el Diseador de formularios, elija Guardar como en el
men Archivo. Para obtener ms informacin sobre cmo guardar objetos como clases,
consulte el captulo 9, Crear formularios..
Para especificar una ubicacin para la Ayuda, debe crear su propia ventana mediante el comando
DEFINE WINDOW. Utilice este comando en el cdigo de inicializacin para especificar el tamao y
la ubicacin de la ventana. A continuacin, muestre la ventana activndola o mostrndola.
Por ejemplo, los comandos siguientes definen una ventana llamada prueba y muestran la tabla de
Ayuda actual dentro de esa ventana:
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 7: Crear archivos de Ayuda Pgina 24 de 24
623 of 804
Puesto que es posible agregar cualquier nmero de campos a una tabla de Ayuda, y que puede
emplearse cualquier expresin lgica para seleccionar temas de Ayuda, la imaginacin es el nico
lmite para el sistema de Ayuda que puede crear.
l Definir una o muchas variables de programa que controlan el comportamiento del sistema de
Ayuda y, a continuacin, asignar valores a estas variables de acuerdo con el modo operativo del
programa.
l Proporcionar ms detalles en los archivos de Ayuda para los usuarios sin experiencia que para
los usuarios experimentados.
l Permitir que los usuarios tengan acceso a la Ayuda slo si introducen una contrasea
determinada.
file://C:\temp\~hhCCF2.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 1 de 23
624 of 804
Despus de haber programado una aplicacin, puede prepararla para su distribucin con todos los
archivos necesarios y crear discos de distribucin.
Aprenda a personalizar su aplicacin y a asegurarse de que dispone de todos los archivos y recursos
necesarios antes de crear un archivo ejecutable para su distribucin.
La creacin de discos y una rutina de instalacin para los usuarios se convierte en un proceso sencillo
gracias al Asistente para instalacin de Visual FoxPro.
Este captulo describe las modificaciones que necesita efectuar para preparar una aplicacin para su
distribucin, as como algunas sugerencias de cambios que ayudan a lograr que una aplicacin
distribuida tenga una apariencia nica.
l El proceso de distribucin
l Preparar una aplicacin para su distribucin
l Personalizar una aplicacin para su distribucin
l Preparar la creacin de discos de distribucin
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 2 de 23
625 of 804
El proceso de distribucin
La lista siguiente identifica los pasos que necesita seguir para distribuir una aplicacin de Visual
FoxPro.
Antes de que pueda distribuir la aplicacin, debe generar un archivo de aplicacin, con la extensin
.app, o bien un archivo ejecutable, con la extensin .exe. La siguiente tabla muestra las diferencias
entre ambos tipos de generacin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 3 de 23
626 of 804
Al elegir el tipo de generacin, tenga en cuenta el tamao del archivo final de la aplicacin y si los
usuarios disponen o no de una copia de Visual FoxPro.
Debe considerar y probar el entorno mnimo en el que puede funcionar la aplicacin, incluyendo la
cantidad de espacio en disco y la memoria. Los resultados de las pruebas y la resolucin de otros
problemas tratados en este captulo pueden ayudarle a determinar el tipo de generacin que debe
elegir, los archivos que necesita incluir en la aplicacin y la manera de estructurar el directorio de
distribucin.
Las aplicaciones que cree tendrn los mismos requisitos de hardware, memoria y red que Visual
FoxPro. Para obtener ms informacin acerca de estos requisitos, consulte "Requisitos del sistema"
en el captulo 1, Instalar Visual FoxPro, de la Gua de instalacin. Si desea informacin adicional
acerca de la creacin de aplicaciones para entornos multiusuario, consulte el captulo 17, Programar
para acceso compartido.
O bien
l En la ventana Comandos, escriba Ejecutar seguido del nombre del archivo .exe de la
aplicacin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 4 de 23
627 of 804
O bien
l En la lnea de comandos que inicia Visual FoxPro, especifique el modificador E. Por ejemplo,
si su aplicacin se llama MIAPLI, puede ejecutarla con la siguiente lnea de comandos:
MIAPLI.EXE -E
O bien
Algunas aplicaciones de Visual FoxPro se basan en gran medida en los mens de sistema de Visual
FoxPro. En tiempo de ejecucin, algunos mens y comandos no estn disponibles y si no se
proporciona un comando READ EVENTS, las aplicaciones controladas por mens terminarn tan
rpidamente como se iniciaron. Utilice las secciones siguientes para repasar los mens que incluya en
la aplicacin.
Para obtener ms informacin sobre la estructuracin de una aplicacin con el comando READ
EVENTS, consulte "Control del bucle de eventos" y "Ejemplos de cmo estructurar una aplicacin"
en el captulo 13, Compilar una aplicacin.
Opciones de men
Si utiliza el men de sistema de Visual FoxPro, su archivo incluir solamente los siguientes mens y
comandos predeterminados.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 5 de 23
628 of 804
todas las ventanas abiertas
Ayuda ndice, Buscar Ayuda sobre, Asistencia tcnica, Acerca de Visual FoxPro
Puede desactivar o eliminar cualquiera de los mens o comandos predeterminados, as como agregar
sus propios mens y comandos a las aplicaciones de tiempo de ejecucin.
Para obtener informacin adicional acerca de la personalizacin de mens, consulte el captulo 11,
Disear mens y barras de herramientas
Visual FoxPro proporciona varios archivos de recursos que amplan la funcionalidad bsica de las
aplicaciones, entre los que se incluyen archivos de recursos FOXUSER, bibliotecas API y controles
ActiveX. Si utiliza estos archivos, necesitar incluirlos en el rbol del proyecto o de distribucin.
Los archivos de recursos de Visual FoxPro almacenan informacin til para las aplicaciones,
incluyendo las posiciones de las ventanas, las configuraciones de la ventana Examinar y definiciones
de etiquetas. Si su aplicacin utiliza cualquiera de estos elementos de recursos, deber distribuir con
ella la base de datos FOXUSER y los archivos memo o los archivos de recursos que cree
especficamente para su aplicacin. Estos archivos de recursos constan de una tabla de Visual FoxPro
asociada a un archivo memo, normalmente denominados Foxuser.dbf y Foxuser.fpt.
Nota El archivo de recursos FOXUSER no es el mismo que el archivo de recursos que depende de
la configuracin regional que contiene cuadros de dilogo y mensajes de error. El archivo de recursos
FOXUSER almacena informacin de aplicacin como macros definidas por usted; el archivo de
recursos que depende de la configuracin regional almacena cadenas de texto del sistema. Para
obtener ms informacin, consulte Incluir un archivo de recursos que depende de la configuracin
regional, ms adelante en este mismo captulo.
Si su aplicacin incluye archivos de biblioteca externa como controles ActiveX (archivos .ocx) o
bibliotecas de API de Visual FoxPro (archivos .fll), use el Asistente para instalacin para asegurarse
de que se colocan en el directorio apropiado. Puede distribuir el archivo Foxtools.fll de Visual
FoxPro con sus aplicaciones. Para obtener ms informacin sobre la creacin de bibliotecas externas
para tener acceso a la API de Visual FoxPro, consulte la parte 9, Acceso a las API.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 6 de 23
629 of 804
instalan los archivos de soporte necesarios en el equipo del usuario en el directorio System de
Windows. Tenga en cuenta que slo puede distribuir controles ActiveX de los que tenga licencia.
Para los servidores de Automtizacin, tambin debe incluir archivos de registro, como bibliotecas de
tipos (archivos .tlb) y archivos de registro (archivos .vbr) en su aplicacin.
Si usa el Asistente para instalacin para crear los discos de distribucin, puede incluir estos archivos
automticamente. En el Paso 6, asegrese de que la columna ActiveX contiene marcas de verificacin
para los controles ActiveX que va a distribuir. Cuando haga esto, el programa Instalar creado por el
Asistente para instalacin asegurar que los componentes COM se registran correctamente en el
equipo del usuario cuando se instale la aplicacin. Para obtener ms informacin sobre el Asistente
para instalacin, consulte el captulo 26, Crear discos de distribucin.
Todos los usuarios pueden ejecutar formularios que contengan controles ActiveX; sin embargo, su
aplicacin no puede llevar a cabo ciertas tareas si se ejecuta con la versin de tiempo de ejecucin de
Visual FoxPro. Recuerde las siguientes instrucciones:
l La aplicacin se tiene que ejecutar en una versin completa de Visual FoxPro para modificar
formularios, clases o subclases que incluyan controles ActiveX.
l La aplicacin debe ejecutarse bajo una versin completa de Visual FoxPro para agregar
controles ActiveX a formularios en tiempo de ejecucin. Por ejemplo, la versin completa de
Visual FoxPro es necesaria para agregar el control Outline a un formulario ejecutando el
cdigo siguiente:
PUBLIC frmOleNewForm
frmOleNewForm = CREATEOBJECT("form")
frmOleNewForm.Show
frmOleNewForm.ScaleMode = 3
frmOleNewForm.Addobject("NewOutline","OLEControl",;
"MSOutl.Outline")
PUBLIC frmOleNewForm
frmOleNewForm = CREATEOBJECT("form")
frmOleNewForm.Show
frmOleNewForm.ScaleMode = 3
SET CLASSLIB TO CURR() + OLELIB.VCX
frmOleNewForm.Addobject("NewOutline","RedOutline")
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 7 de 23
630 of 804
Si desea que el archivo de configuracin sea de slo lectura, sitelo en el proyecto y mrquelo como
incluido. Si desea que la configuracin sea modificable, incluya el archivo en el proyecto y mrquelo
como excluido. A continuacin, distribuya el archivo de configuracin con el archivo de aplicacin o
con el ejecutable, en forma de archivo independiente. En cualquiera de los casos, es necesario que el
archivo de configuracin se denomine Config.fpw. Sin embargo, puede especificar un nombre de
archivo de configuracin diferente mediante el modificador de lnea de comandos C al iniciar Visual
FoxPro.
Para obtener ms informacin acerca de las opciones que puede establecer en el archivo de
configuracin, consulte el captulo 3, Configurar Visual FoxPro, en la Gua de instalacin.
Puede reproducir y distribuir libremente algunos de los archivos, grficos y programas de Visual
FoxPro con las aplicaciones que cree. Para obtener informacin detallada, consulte Quitar
caractersticas y archivos restringidos de Visual FoxPro ms adelante en este captulo.
Antes de generar una aplicacin, asegrese de que su proyecto incluye los archivos necesarios para la
aplicacin, as como cualquier archivo de recursos adicional, como pueden ser archivos grficos o
plantillas.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 8 de 23
631 of 804
Distribuir un archivo de Ayuda de tipo .dbf El archivo de Ayuda de tipo .dbf
O bien
l Agregue los archivos al directorio de la aplicacin. Para obtener detalles, consulte el captulo
26, Crear discos de distribucin.
Si desea modificar los archivos, sitelos dentro del proyecto y mrquelos como excluidos. A
continuacin, distribyalos con su aplicacin como archivos independientes.
No se permite incluir los siguientes mens de Visual FoxPro, ni sus comandos, en un archivo
ejecutable distribuido.
Mens restringidos
Base de datos Proyecto
Formulario Consulta
Men Tabla
Programa
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 9 de 23
632 of 804
Comandos no disponibles
BUILD APP MODIFY FORM
BUILD EXE MODIFY MENU
BUILD PROJECT MODIFY PROCEDURE
COMPILE MODIFY PROJECT
CREATE FORM MODIFY QUERY
CREATE MENU MODIFY SCREEN
CREATE QUERY MODIFY STRUCTURE
CREATE SCREEN MODIFY VIEW
CREATE VIEW SUSPEND
MODIFY CONNECTION SET STEP
MODIFY DATABASE
Los comandos siguientes se pasarn por alto cuando se utilicen en una aplicacin distribuida.
Visual FoxPro instala en el PC archivos que estn restringidos y no se pueden reproducir ni distribuir.
Entre ellos se incluyen:
l Archivos de asistentes
l Fuentes TrueType
l Archivos de la utilidad SpellCheck
l Archivos de Ayuda
Aunque no se permite distribuir las aplicaciones de ejemplo de Visual FoxPro con sus aplicaciones,
puede hacer referencia a partes del cdigo de estas aplicaciones como ejemplos para generar su
propia aplicacin. Tambin puede incluir en su aplicacin la biblioteca de clases de asistentes
Wizstyle.vcx y las bibliotecas de clases de ejemplos.
License.txt
Visual FoxPro contiene muchos archivos que se conceden en licencia para su uso exclusivamente en
tareas de diseo, programacin y prueba. Vea License.txt, que se encuentra en el directorio Visual
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 10 de 23
633 of 804
FoxPro, para obtener una lista de archivos restringidos.
Si su aplicacin contiene cualquiera de estos archivos, qutelo. Bajo los trminos de Contrato de
licencia de Microsoft que ha recibido con este producto, no puede distribuir estos archivos en su
aplicacin ni en sus discos.
Archivos distribuibles
Puede distribuir cualquier archivo de Visual FoxPro que no est restringido. Segn el Contrato de
licencia que ha recibido con este producto, los archivos se pueden distribuir con la aplicacin
correspondiente. Las instrucciones siguientes se aplican a archivos distribuibles.
El Asistente para instalacin comprueba si hay archivos restringidos y los excluye del conjunto de
discos distribuibles. No asigne estos nombres de archivo a ninguno de los archivos que vaya a
distribuir. El Asistente para instalacin excluir cualquier archivo que tenga un nombre idntico a
alguno de los de la lista.
Se puede distribuir cualquier archivo de los directorios Distrib.src y SETUP de Visual FoxPro
necesarios para una aplicacin. Cuando utilice el Asistente para instalacin para crear discos de
distribucin, ste colocar automticamente los archivos necesarios de estos directorios en los discos
distribuibles, en un formato comprimido. Despus de la instalacin, estos archivos se descomprimen
y se instalan con su nombre en los directorios apropiados del equipo del usuario. No es necesario
copiar estos archivos en su rbol de distribucin.
Ejemplos
Si utiliza cualquiera de los archivos de estos directorios (incluyendo todos los archivos .bmp, .ico y
.cur), debe incluirlos en su proyecto y al generar la aplicacin. No pueden aparecer con su nombre en
los discos distribuibles y no se pueden distribuir independientemente de sus aplicaciones.
Bibliotecas de clases
Puede utilizar sin modificacin en sus aplicaciones cualquier archivo.vcx, incluyendo los de los
directorios Vfp98\Ffc y Vfp98\Gallery. Debe incluir las bibliotecas en su proyecto y en la aplicacin
generada.
Archivos ODBC
Consulte el Contrato de licencia de Microsoft que recibi con este producto para ver restricciones
especficas relativas a la redistribucin de archivos ODBC.
Controles ActiveX
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 11 de 23
634 of 804
Visual FoxPro incluye un conjunto de controles ActiveX (archivos .ocx) que puede agregar a sus
aplicaciones y distribuirlos con ellas.
Para evitar que los usuarios vean o modifiquen el cdigo fuente de su aplicacin, codifique dicho
cdigo y elimine la informacin de depuracin.
Sugerencia Haga siempre una copia de seguridad del cdigo fuente antes de codificarlo.
5. En el cuadro de dilogo Opciones para generar, seleccione Volver a compilar todos los
archivos y elija Aceptar.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 12 de 23
635 of 804
l Definicin de sangras en el cdigo fuente.
l Adicin de encabezados a los archivos, procedimientos y mtodos.
Tambin puede utilizar el Asistente para documentacin para crear referencias cruzadas de los
smbolos que ha utilizado en su aplicacin y para producir un resumen analtico del proyecto.
A veces surgen errores cuando los usuarios ejecutan su aplicacin. Puede llamar a su propia rutina de
tratamiento de errores incluyendo ON ERROR. Normalmente, ON ERROR utiliza un comando DO
para ejecutar una rutina que trata el error, como en este ejemplo:
ON ERROR DO Mi_Error
Para obtener informacin adicional acerca del tratamiento de errores, consulte "Controlar errores en
tiempo de ejecucin" en el captulo 14, Probar y depurar aplicaciones
Para ver una lista completa de los mensajes de error de Visual FoxPro y una explicacin de los
mismos, vea Mensajes de error.
Sugerencia Asegrese de proporcionar documentacin a los usuarios que describa los errores que
sean visibles y que sugiera posibles formas de corregirlos.
ON SHUTDOWN DO Mi_Cierre
Esta rutina suele incluir un cuadro de dilogo que pregunta al usuario si realmente desea salir de la
aplicacin actual. Si el usuario desea salir de la aplicacin, la rutina puede cerrar los archivos abiertos
y limpiar el entorno y posteriormente ejecutar el comando QUIT. Si el usuario no desea salir de la
aplicacin actual, la rutina puede devolver el control a la aplicacin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 13 de 23
636 of 804
Puede integrar Ayuda interactiva en sus aplicaciones, de forma que los usuarios puedan presionar F1
o elegir la Ayuda en un men para obtener ayuda para su aplicacin. La Ayuda que proporciona con
su aplicacin tiene las mismas caractersticas que la Ayuda de Visual FoxPro. Para obtener ms
informacin, consulte la parte 7, Crear archivos de Ayuda.
Si crea Ayuda grfica para su aplicacin, incluya el archivo .chm o .hlp en el directorio de
distribucin de la aplicacin de forma que el Asistente para instalacin lo incluya en sus discos de
distribucin.
Nota No puede distribuir Winhelp.exe o los archivos de Ayuda distribuidos con Visual FoxPro.
Para obtener ms informacin, vea Quitar caractersticas y archivos restringidos de Visual FoxPro,
ms adelante en este captulo
Puede modificar la apariencia de su aplicacin sin necesidad de cambiar su cdigo, mediante los
mtodos siguientes:
Puede agregar sus propios mens y comandos de men a las aplicaciones distribuidas, empleando
para ello el Diseador de mens. Si no crea ningn men propio, el entorno de tiempo de ejecucin
mostrar un men predeterminado de Visual FoxPro.
Para obtener detalles acerca de los mens predeterminados, consulte Asegurar el correcto
comportamiento en tiempo de ejecucin, en una seccin anterior de este captulo. Para obtener ms
informacin acerca del Diseador de mens, consulte el captulo 11, Disear mens y barras de
herramientas.
TITLE = cMiTtulo
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 14 de 23
637 of 804
Para incluir una funcin de Visual FoxPro como parte del ttulo, use la propiedad Caption de la
ventana principal como se ilustra en el siguiente ejemplo.
COMMAND=_SCREEN.Caption=;
"Visual FoxPro " + SUBSTR(VERSION(),25,3)
Si quiere mostrar su propio icono, cree un archivo de icono (.ico) con dos imgenes: una pequea (16
por 16) y una estndar (32 por 32). Cree las dos imgenes como iconos de 16 colores.
Puede cambiar el icono predeterminado de Visual FoxPro en el cuadro de dilogo Informacin del
proyecto. Si usa el Asistente para instalacin para crear discos de distribucin para su aplicacin,
tambin puede especificar un icono de aplicacin en este cuadro de dilogo.
4. Elija Icono y, a continuacin, seleccione un archivo de icono (.ico) para asignar a su proyecto.
Importante Asegrese de conservar copias independientes de los programas originales para su uso
posterior. No es posible volver a crear los programas de origen a partir del cdigo compilado.
Generar la aplicacin
Una vez que el proyecto de aplicacin contenga todos los archivos necesarios, estar en condiciones
de generar un archivo distribuible. Puede generar su proyecto como una aplicacin estndar que
solamente se ejecuta cuando se dispone de Visual FoxPro, o bien como una aplicacin ejecutable que
funcione sin Visual FoxPro.
Nota Tambin puede generar su aplicacin como servidor de Automatizacin OLE. Para ver ms
detalles, consulte, Crear servidores de Automatizacin, en el Captulo 16, "Agregar OLE".
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 15 de 23
638 of 804
Puede generar una aplicacin estndar de Visual FoxPro con el Administrador de proyectos o bien
con el comando BUILD APP. No obstante, el Administrador de proyectos pone a su disposicin ms
opciones para la generacin de aplicaciones.
O bien
Puede generar un archivo ejecutable de Visual FoxPro con el Administrador de proyectos o con el
comando BUILD EXE.
O bien
Si incluye las clusulas STANDALONE o EXTENDED del comando BUILD EXE, Visual
FoxPro generar un mensaje de error "Caracterstica no disponible".
Tambin puede generar un servidor de Automatizacin, que crea una DLL que se puede llamar desde
otros programas para Windows.
O bien
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 16 de 23
639 of 804
que ha generado una aplicacin a partir de sus archivos, siga estos pasos:
El directorio de distribucin contiene copias de todos los archivos del proyecto que constituyen su
aplicacin. La estructura de este rbol de distribucin representa la forma en que la rutina de
Instalacin creada por el Asistente para instalar instalar los archivos en el equipo de un usuario.
1. Cree un directorio con el nombre que desee que aparezca en el equipo del usuario.
Puede utilizar este directorio para comprobar su aplicacin en el entorno de tiempo de ejecucin. Si
es necesario, restablezca temporalmente los valores predeterminados en el equipo en el que ha
programado la aplicacin para reflejar la configuracin mnima de un equipo de destino de usuario.
Cuando todo funcione correctamente, use el Asistente para instalar con el fin de crear imgenes de
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 17 de 23
640 of 804
disco que reproducirn el entorno correcto cuando distribuya copias de la aplicacin.
Para crear los discos de distribucin, utilice el Asistente para instalacin. El Asistente para
instalacin comprime los archivos en el rbol de distribucin y copia los archivos comprimidos al
directorio imagen de los discos, colocndolos en un subdirectorio distinto para cada disco. Despus
de usar el Asistente para instalacin para crear imgenes de sus discos de aplicacin, copie el
contenido de cada directorio imagen de disco a un disco distinto.
Al distribuir el paquete, el usuario puede instalar todos los archivos de la aplicacin al ejecutar
SETUP.EXE desde el disco 1.
Para obtener detalles acerca del uso del Asistente para instalacin, consulte el captulo 26, Crear
discos de distribucin.
Para obtener informacin detallada sobre cmo preparar una aplicacin para su distribucin, consulte
el captulo 25, Generar una aplicacin para su distribucin. Para obtener ms informacin sobre cmo
crear una aplicacin, consulte el captulo 13, Compilar una aplicacin.
Con el Asistente para instalacin, cree uno o ms conjuntos de discos distribuibles que contienen una
rutina de instalacin para la aplicacin. Para simplificar la tarea de crear una rutina de instalacin, el
Asistente para instalacin le hace una serie de preguntas sobre la aplicacin y qu apariencia le
gustara que tuviera la rutina de instalacin. Cuando responda a las preguntas, el Asistente para
instalacin crear una rutina de instalacin personalizada.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 18 de 23
641 of 804
Cada vez que ejecuta el Asistente para instalacin, se registran las opciones que seleccione para el
rbol de distribucin. De esta forma, la prxima vez que ejecute el Asistente para instalacin, el
proceso es an ms sencillo.
Nota Si slo copia los archivos de aplicacin al equipo de un usuario, es posible que la aplicacin
no funcione de forma apropiada. Las rutinas de instalacin de Windows, como la creada por el
Asistente para instalacin, requiere la comprobacin de versiones y el registro de varios archivos
DLL y ActiveX. Para asegurar una instalacin correcta, use el Asistente para instalacin. Para obtener
ms informacin, consulte El asistente para instalacin, ms adelante en este mismo captulo.
El rbol de distribucin
Antes de crear discos con el Asistente para instalacin, tiene que crear una estructura de directorios o
rbol de distribucin, que contenga todos los archivos de distribucin como le gustara que
apareciesen en el disco duro del usuario. Coloque en el rbol de distribucin todos los archivos que
quiera que estn en los discos de distribucin.
El rbol de distribucin puede adoptar casi cualquier formato. Sin embargo, el archivo de aplicacin
o ejecutable debe estar en el directorio raz del rbol.
Muchas aplicaciones de Visual FoxPro requieren archivos de recursos adicionales. Por ejemplo, es
posible que desee incluir un archivo de configuracin o un archivo de Ayuda. Si tiene que agregar un
archivo de recursos y no lo ha incluido en su proyecto, coloque el archivo en la estructura de
directorios de la aplicacin.
La tabla siguiente muestra algunos archivos tpicos que se colocan en el directorio de la aplicacin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 19 de 23
642 of 804
Cuando ejecuta el Asistente para instalacin, crea un directorio de distribucin independiente para
cada formato de disco que especifique. Estos directorios contienen todos los archivos necesarios para
las imgenes de disco.
Por ejemplo, si especifica imgenes de discos de 1,44 MB y 1,2 MB, el Asistente para instalacin
crea dos subdirectorios llamado DISK144 y NETSETUP. Si su aplicacin requiere cuatro discos de
distribucin, el Asistente para instalacin crea cuatro subdirectorios llamados DISK1, DISK2, DISK3
y DISK4 en el directorio DISK144.
Importante Como el Asistente para instalacin crea dos subdirectorios nuevos en el disco duro,
asegrese de tener espacio de disco suficiente para tres copias comprimidas de la aplicacin.
El Asistente para instalacin crea una rutina de instalacin para la aplicacin, que incluye un archivo
Instalar.exe, algunos archivos de informacin, y los archivos comprimidos o descomprimidos de la
aplicacin (guardados en archivos .cab). El resultado final es un conjunto de archivos que puede
copiar en disquetes, en la red o en un sitio web. Entonces los usuarios pueden instalar la aplicacin de
la misma forma que instalan cualquier aplicacin para Windows. Mientras estn instalando la
aplicacin, los usuarios vern opciones que usted especifica al usar el Asistente para instalacin.
Despus de crear el rbol de distribucin, use el Asistente para instalacin para crear un conjunto de
subdirectorios de imgenes de disco que contengan todos los archivos necesarios para instalar la
aplicacin. Copie los archivos de estos subdirectorios para crear discos de distribucin para la
aplicacin.
1. Crea un archivo llamado Wzsetup.ini que contiene sus elecciones de Asistente para
instalaciones para este rbol de distribucin.
2. Se asegura de que todos los archivos necesarios para ejecutar su aplicacin distribuida estn
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 20 de 23
643 of 804
incluidos en la aplicacin.
3. Si el Asistente para instalacin le pide que cree o busque el directorio Distrib.src, confirme que
desea crearlo o elija Buscar y especifique la ubicacin del directorio.
Para obtener detalles sobre las opciones disponibles en cada pantalla del Asistente para instalacin,
haga clic en el botn Ayuda de la pantalla o presione F1.
Para especificar el rbol de distribucin, use el Paso 1 del Asistente para instalacin. Debera
identificar el directorio del rbol de distribucin que cre para modelar la instalacin por parte del
usuario de sus archivos de aplicacin.
El Asistente para instalacin espera que el directorio especificado contenga todos los archivos y
subdirectorios que desea crear en un entorno de usuario. El Asistente para instalacin usa este
directorio como origen para archivos que comprimir en el directorio imagen de disco.
El Asistente para instalacin registra las opciones que establezca para cada rbol de distribucin y los
usa como valores predeterminados la prxima vez que desee crear una rutina de instalacin a partir
del mismo rbol de distribucin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 21 de 23
644 of 804
Para especificar los componentes opcionales que su aplicacin usa o con los que es compatible, use el
Paso 2 del Asistente para instalacin. Por ejemplo, si desea distribuir su aplicacin con la versin de
tiempo de ejecucin (run-time) de Visual FoxPro, elija Visual FoxPro Runtime de forma que el
Asistente para instalacin incluya el archivo de soporte runtime (Vfp6r.dll). Si distribuye su
aplicacin como servidor de Automatizacin, elija esa opcin.
Para especificar los distintos tipos de disco desde los que se puede cargar su aplicacin, use el Paso 3
del Asistente para instalacin.
El Asistente para instalacin le pide que especifique los distintos tipos de disco desde los que se
puede cargar la aplicacin. Puede elegir cualquiera de las siguientes opciones:
Si selecciona la opcin Netsetup, el Asistente para instalacin crea un nico directorio que contendr
todos los archivos.
Para personalizar los cuadros de dilogo de instalacin distribuida, use el Paso 4 del Asistente para
instalacin.
El Asistente para instalacin le pedir que especifique los ttulos de los cuadros de dilogo de la
rutina de instalacin y el contenido del copyright.
El Asistente para instalacin crea cuadros de dilogo de instalacin con los ttulos especificados.
Para especificar un programa o accin que Instalar debera ejecutar cuando la instalacin est
terminada, use el Paso 4 del Asistente para instalacin. Las acciones tpicas postinstalacin pueden
ser mostrar un archivo lame o ejecutar el proceso de instalacin para un producto relacionado.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 22 de 23
645 of 804
El Asistente para instalacin le pide que especifique el nombre del ejecutable. Escriba la lnea de
comandos completa necesaria para ejecutar el ejecutable, incluyendo la ruta de acceso completa del
ejecutable, el nombre de los archivos que hay que pasar al programa y cualquier cambio de lnea de
comandos.
Nota El programa que especifique debe existir en el sistema del usuario o se producir un error.
Para identificar los destinos predeterminados para los archivos de la aplicacin, use el Paso 5 del
Asistente para instalacin.
Para mostrar los resultados de todas sus elecciones, use el Paso 6 del Asistente para instalacin.
El Asistente para instalacin muestra un resumen de los archivos y el resultado de todas las
elecciones y le permite modificar los nombres de los archivos, los destinos de archivos y otras
especificaciones.
Para empezar a crear la rutina de instalacin para la aplicacin, elija Terminar en el Paso 7 del
Asistente para instalacin. En este paso tambin puede crear un archivo de dependencias (.dep) que le
permitir usar otras utilidades de instalacin para instalar su aplicacin.
Cuando elija Finalizar, el Asistente para instalacin realizar los pasos siguientes:
l Registrar la configuracin para usar la prxima vez que cree discos de distribucin a partir del
mismo rbol de distribucin.
l Iniciar el proceso de crear las imgenes de los discos de aplicacin.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 8: Distribuir aplicaciones Pgina 23 de 23
646 of 804
Cuando el Asistente para instalacin haya creado las imgenes de disco especificadas, puede
copiarlas a discos maestros y, a continuacin, copiar y combinar los discos con el resto del paquete de
distribucin. Despus de crear un conjunto de discos maestros, puede eliminar los directorios de las
imgenes de los discos.
file://C:\temp\~hh9816.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 1 de 31
647 of 804
Si su aplicacin exige requisitos que no pueden cumplir las caractersticas integradas en Visual
FoxPro, puede ampliar el programa con bibliotecas externas, controles ActiveX o bibliotecas de
vnculos dinmicos (DLL). Gracias a las bibliotecas externas podr agregar objetos a su aplicacin,
desde cuadros de texto mejorados hasta calendarios y otras aplicaciones completas, y tambin
aprovechar la funcionalidad ofrecida por otros programas (como Windows) a travs de sus interfaces
de programacin de aplicaciones (API).
Puede agregar fcilmente controles ActiveX (archivos .ocx) a su aplicacin, lo que le ofrece nuevos
objetos que puede usar en formularios para crear subclases y administrar su forma de trabajar con
controles nativos de Visual FoxPro. Adems, puede vincular una biblioteca externa como una DLL y
llamar a las funciones de la biblioteca para usarlas en sus propios programas. Si ya tiene bibliotecas
externas de Visual FoxPro (archivos .fll), tambin las puede vincular y llamar a sus funciones.
Si no encuentra una biblioteca externa adecuada, puede escribir su propio control ActiveX o
biblioteca de vnculos dinmicos (archivo .fll) especficos de Visual FoxPro. Puede llamar a las
funciones disponibles en la API de Visual FoxPro y crear controles o bibliotecas muy integradas con
Visual FoxPro y optimizadas para su uso.
Si la funcionalidad necesaria no est an disponible en una biblioteca externa, puede crear su propio
control ActiveX en C++ mediante un compilador de 32 bits como Visual C++ versin 4.0 o
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 2 de 31
648 of 804
posterior o con Microsoft Visual Basic Control Creation Edition versin 5.0. Para obtener detalles,
consulte el captulo 28, Acceso a la API de Visual FoxPro.
l Controles ActiveX (archivos .ocx). Los controles y objetos ActiveX son programas que
incluyen objetos diseados para realizar tareas especficas. La mayor parte de los controles y
objetos ActiveX agregan nuevos objetos a Visual FoxPro, todo desde un nuevo tipo de cuadro
de texto hasta un calendario, una calculadora u otro objeto complejo. Algunos controles y
objetos ActiveX tambin incorporan funcionalidades adicionales, como acceso al sistema de
correo electrnico o al puerto de comunicaciones de su equipo. Como regla, despus de
incorporar un control u objeto ActiveX a Visual FoxPro, puede usar los objetos que contienen
igual que lo hara con cualquier clase de base de Visual FoxPro.
l Bibliotecas de vnculos dinmicos (archivos .dll). Un archivo .dll es una biblioteca de
funciones que puede llamar desde programas de Visual FoxPro de la misma manera que
cualquier funcin definida por el usuario de Visual FoxPro. Muchos programas para Windows
y el mismo Windows, ofrecen su funcionalidad mediante archivos .dll. Por ejemplo, puede
tener acceso a la configuracin de colores del sistema para Windows vinculndose a un archivo
.dll del sistema y llamando a funciones del mismo.
l Bibliotecas externas de Visual FoxPro (archivos .fll). Un archivo .fll es como un archivo
.dll, pero usa un protocolo especial para compartir datos con Visual FoxPro y, a menudo, llama
a funciones internas de Visual FoxPro. Como consecuencia, los archivos .fll son especficos de
Visual FoxPro, a diferencia de los archivos .dll, que se pueden llamar desde cualquier
programa para Windows. Puede llamar a las funciones de un .fll igual que a cualquier funcin
definida por el usuario de Visual FoxPro.
Antes de usar cualquier biblioteca, tiene que estar familiarizado con las convenciones usadas para
tener acceso a sus controles o funciones. Por ejemplo, si desea incluir un control ActiveX en un
formulario, debe saber qu propiedades, eventos y mtodos puede usar para administrar el control.
Para un control ActiveX, puede usar un Explorador de clases de Visual FoxPro para determinar las
propiedades, eventos y mtodos que puede utilizar. De forma similar, si desea llamar a una funcin
de un archivo .dll, tiene que saber el nombre de funcin, el nmero y el tipo de datos del parmetro
que requiere, y el tipo de datos del valor devuelto. En general, puede obtener este tipo de informacin
de la documentacin que acompaa a una biblioteca, ya sea un libro o un sistema de Ayuda. Para
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 3 de 31
649 of 804
obtener informacin sobre archivos .DLL del sistema para Windows, puede consultar el Software
Development Kit (SDK) apropiado para su versin de Windows.
Puede crear un control ActiveX mediante cdigo de la misma forma que creara cualquier control de
Visual FoxPro. Sin embargo, antes de crear el control debe determinar el nombre de la biblioteca de
clases del control, que est almacenada en el Registro de Windows. Si no tiene otra forma de
determinar el nombre de la biblioteca de clases, use el Diseador de formularios para crear el control
(como se describe en la seccin anterior) y, a continuacin, obtenga la propiedad OLEClass del
control.
Los objetos ActiveX se pueden crear directamente con CREATEOBJECT( ) y no requieren una
instancia de un formulario.
2. Llame al mtodo AddObject del nuevo formulario para agregar el control, especificando
olecontrol como la clase. Debe pasar el nombre de la biblioteca de clases del control como
tercer parmetro del mtodo AddObject.
Por ejemplo, el programa siguiente crea un formulario nuevo y le agrega un control de esquema:
oMiFormulario = CREATEOBJECT("form")
oMiFormulario.AddObject("oleOutline","olecontrol", ;
"MSOutl.Outline")
Despus de crear el formulario y el control, puede mostrar el formulario llamando a su mtodo Show
y mostrar el control estableciendo su propiedad Visible a verdadero:
oMiFormulario.oleOutline.Visible = .T.
oMiFormulario.Show
Algunos controles ActiveX no estn diseados principalmente para su uso de forma interactiva por
parte de un usuario. Por ejemplo, un control cronmetro no admite mtodos para la interaccin con el
usuario. Incluso en este caso, an puede crear el control en un formulario porque el control
normalmente ofrecer un componente visible predeterminado, como un icono. Frecuentemente no
podr cambiar o redimensionar el icono.
Si no desea que la aplicacin muestre el icono para controles que no interactan, puede ocultar el
control si establece la propiedad Visible de su control contenedor OLE a falso o establece su
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 4 de 31
650 of 804
propiedad Left a un valor negativo (como 100) que lo saca de la parte visible de la pantalla. De
forma alternativa, puede colocar el control en un formulario que nunca se hace visible (es decir, para
el que nunca se llama el mtodo Show). En todos los casos, an puede llamar a los mtodos del
control como si ste fuese visible.
En Visual FoxPro, slo puede usar bibliotecas DLL que se hayan programado para un entorno de 32
bits. Sin embargo, si necesita acceso a una DLL de 16 bits, puede llamarlas mediante funciones
disponibles en Foxtools.fll. Para obtener ms detalles, vea la Ayuda para Foxtools (Foxtools.chm).
1. Registre la funcin de DLL mediante el comando DECLARE - DLL. Los nombres de funcin
distinguen maysculas de minsculas.
Nota Si especifica WIN32API como nombre de biblioteca, Visual FoxPro busca la funcin de
la DLL de Windows de 32 bits en Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll y Advapi32.dll.
2. Llame a la funcin de igual forma que llamara a una funcin de Visual FoxPro.
Por ejemplo, el siguiente programa registra la funcin GetActiveWindow( ) de la DLL del sistema
USER de Windows, que muestra el controlador de la ventana principal de Visual FoxPro.
GetActiveWindow( ) no requiere parmetros y devuelve un valor entero:
La DLL que contiene la funcin que registra debe estar disponible en el directorio predeterminado, en
los directorios Windows o System, o en la ruta de acceso de DOS.
Si la funcin que desea llamar tiene el mismo nombre que otra funcin ya disponible en Visual
FoxPro (una funcin nativa o una funcin de DLL declarada previamente), puede asignar un alias a la
funcin con el nombre duplicado y, a continuacin, llamarla con el alias.
Las funciones de DLL vinculadas permanecern disponibles hasta que salga de Visual FoxPro, por lo
que slo tiene que declararlas una vez por sesin. Si no pretende volver a llamar a las funciones de
una DLL, puede ejecutar el comando CLEAR DLLS para quitarla de la memoria y liberar recursos.
Nota Ejecutar CLEAR DLLS borra de la memoria todas las funciones de DLL declaradas.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 5 de 31
651 of 804
Cuando registra una funcin de DLL, tiene que especificar el nombre y el tipo de datos de sus
parmetros. De forma predeterminada, los datos se pasan por valor. Puede hacer que un parmetro se
pase por referencia si incluye un signo at (@) delante del parmetro.
En general, las funciones siguen las convenciones de tipos de datos usadas en C, que son diferentes
de las usadas en Visual FoxPro. Por ejemplo, las funciones de DLL no admiten un tipo de datos para
date (fecha) o currency (moneda). Si los datos que pasa a una funcin de una DLL estn en un tipo de
datos no admitido por la funcin, tiene que convertirlos a un tipo de datos apropiado antes de
pasarlos. Por ejemplo, puede convertir una fecha a un formato numrico de fecha Juliana con
comandos como el siguiente:
Para pasar datos entre Visual FoxPro y la funcin GetSystemTime( ), tiene que crear un bfer de
cadena de 40 bytes (formado inicialmente por espacios) y, a continuacin, pasar la direccin de esta
cadena a la funcin para llenarla. Cuando se devuelve la cadena, debe dividirla en trozos de 2 bytes
para extraer los campos individuales de la estructura. El siguiente fragmento demuestra cmo podra
extraer tres de los campos de la estructura:
tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * ;
256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * ;
256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) * ;
256 + ASC(SUBSTR(cBuff,5))))
Para obtener ms informacin, puede examinar el formulario de ejemplo Systime.scx del directorio ...
\Samples\Vfp98\Solution\Winapi de Visual Studio. Para ver otros ejemplos de cmo pasar
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 6 de 31
652 of 804
parmetros a funciones de DLL, vea el programa Registry.prg que se encuentra en el directorio ...
\Samples\Vfp98\Classes de Visual Studio.
Si los datos con los que est trabajando en Visual FoxPro son una matriz, debe recorrer varias veces
la matriz y concatenarlos en una nica cadena que representa una matriz de tipo C antes de pasarlos a
la funcin de DLL. Si la funcin de Windows espera valores de 16 bits o de 32 bits, tiene que
convertir los valores a sus equivalentes hexadecimales antes de concatenarlos en una cadena. Cuando
pasa la cadena que contiene los datos de la matriz, Visual FoxPro pasa la direccin de la variable de
tipo cadena a la DLL, que puede manipularla como matriz. Para ver un ejemplo de esto, vea el
formulario de ejemplo Syscolor.scx que se encuentra en el directorio ...\Samples\Vfp98
\Solution\Winapi de Visual Studio.
Para usar una biblioteca de Visual FoxPro, se especifica el nombre del archivo .fll y, a continuacin,
se llama a la funcin normalmente. A diferencia del registro de funciones de DLL, no tiene que
registrar las funciones individuales del archivo .fll, ni tiene que especificar informacin sobre los
parmetros o los tipos de datos usados por la funcin.
Nota Si quiere usar una biblioteca .fll de una versin anterior de Visual FoxPro, hay que recompilar
la biblioteca de modo que funcione con Visual FoxPro versin 5.0.
2. Llame a cualquiera de las funciones de la biblioteca de la misma manera en que lo hara para
cualquier funcin.
Por ejemplo, el siguiente programa llama a una funcin de la biblioteca Foxtools.fll para determinar
qu tipo de unidad es la unidad C:.
Si tiene que registrar ms de un archivo .fll, incluya la palabra clave ADDITIVE en el comando SET
LIBRARY. Si no lo hace, se borrar el archivo .fll previamente registrado y se reemplazar por el
ltimo registro.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 7 de 31
653 of 804
Las funciones de un archivo .fll permanecen disponibles hasta que salga de Visual FoxPro, por lo que
slo tiene que registrarlas una vez por sesin. Si no pretende volver a llamar a las funciones de un
archivo .fll, ejecute RELEASE LIBRARY, RELEASE ALL, o SET LIBRARY TO para eliminarlas
de la memoria y liberar recursos.
Nota Si usa Visual C o C++ versin 2.x para programar un control ActiveX necesita el Control
Development Kit. Los procedimientos de este captulo son para la versin 4.0 de Visual C++.
Para obtener informacin sobre cmo usar controles ActiveX o bibliotecas FLL, consulte el captulo
27, Extender Visual FoxPro con bibliotecas externas.
Puede crear tres tipos de programas que tengan acceso a la API de Visual FoxPro:
l Se puede utilizar mediante tcnicas orientadas a objetos estndar, como establecer sus
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 8 de 31
654 of 804
propiedades y llamar a sus mtodos.
l Se puede convertir en subclase y se puede pasar por alto sus mtodos.
l Est encapsulado y se puede llamar (crear instancias) varias veces sin administracin compleja
del entorno para conservar estados de usuarios.
l Tiene un paso de parmetros simple.
l Tambin se puede llamar desde otros programas para Windows, si lo programa para esto.
l Puede tener acceso a los mismos mediante tcnicas estndar orientadas a objetos, como
establecer sus propiedades y llamar a sus mtodos.
l No se pueden pasar por alto sus mtodos.
l Estn encapsulados y se pueden llamar (crear instancias) mltiples veces sin administracin
compleja del entorno para conservar los estados de usuarios.
l La transferencia de parmetros es ms sencilla.
l Tambin se pueden llamar desde otros programas para Windows, si lo programa para esto.
Nota Si quiere usar una biblioteca .fll de una versin de Visual FoxPro anterior a la 5.0, la
biblioteca se tiene que volver a compilar para que funcione con Visual FoxPro versin 6.0.
Puede crear objetos COM con la ActiveX Template Library proporcionada con Microsoft Visual C++
5.0. Para obtener ms informacin acerca de cmo crear objetos COM con Visual C++ 5.0, busque
"ATL" en Microsoft Developer's Network.
Los controles ActiveX especficos de Visual FoxPro se crean de la misma manera que cualquier
control similar. La mayor parte de los compiladores de C++ le permiten crear la estructura del control
y tambin se pueden utilizar con Microsoft Visual Basic Control Creation Edition versin 5.0.
La seccin siguiente describe los pasos para crear un control ActiveX con Microsoft Visual C++ para
utilizarlo con Visual FoxPro.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 9 de 31
655 of 804
6. Elija Create y, a continuacin, siga los pasos del Asistente.
Cuando el asistente haya terminado puede generar inmediatamente el control ActiveX. Sin embargo,
tambin tendr que definir propiedades y mtodos para el control.
4. Escriba el nombre, el parmetro y dems informacin necesaria para el elemento que est
creando y, a continuacin, elija OK.
5. Elija Edit Code para mostrar el editor y, a continuacin, escriba el cdigo que define la
propiedad o mtodo que est creando.
Por ejemplo, para crear una propiedad Version que devuelva la versin del archivo .ocx como un
nmero entero (como 101), se crea la propiedad con un tipo devuelto long y se agrega cdigo similar
al siguiente:
long CPyCtrl::GetVersion()
{
// establecer el nmero de versin aqu
return VERSION;
}
Como el nmero de versin suele ser de slo lectura, no tiene que crear una funcin SetVersion( ).
Como una biblioteca FLL es esencialmente una DLL que llama a la API de Visual FoxPro, puede
crear una biblioteca FLL siguiendo los pasos siguientes en el entorno de programacin para crear una
DLL.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 10 de 31
656 of 804
Despus de crear la estructura bsica de la DLL, agregue las funciones que desee llamar desde Visual
FoxPro. Las siguientes secciones proporcionan estructuras para crear funciones en C y C++.
Cada biblioteca de funciones que cree tiene la misma estructura bsica. Usando una plantilla para la
estructura, todo lo que tiene que hacer es rellenar los trozos en blanco apropiados para su rutina de
biblioteca especfica.
1. Instruccin #include
2. Definicin de funcin
3. Cdigo de funcin
4. Estructura FoxInfo
5. Estructura FoxTable
#include <Pro_ext.h>
FoxInfo myFoxInfo[] = {
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
Para rutinas en C++, puede usar la siguiente plantilla. Esta plantilla se diferencia de la plantilla en C
porque declara la estructura FoxTable como externa:
#include <Pro_ext.h>
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 11 de 31
657 of 804
FoxInfo myFoxInfo[] = {
{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},
};
extern "C" {
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
}
Usar la plantilla
l El archivo de encabezado Pro_ext.h. Puede imprimir este archivo para ver las declaraciones de
funcin, typedefs y structs utilizados en la API de Visual FoxPro.
l El archivo Winapims.lib.
Estos dos archivos se instalan en el subdirectorio API cuando instala Visual FoxPro.
Adems de los archivos que se han mostrado, los nicos elementos necesarios de una biblioteca de
Visual FoxPro son las estructuras FoxInfo y FoxTable.
Sus funciones de biblioteca se comunican con Visual FoxPro a travs de la estructura FoxInfo. De
esta estructura, Visual FoxPro determina el nombre de funcin y el nmero y tipo de parmetros. La
estructura FoxTable es una lista vinculada que sigue las estructuras FoxInfo. Vea Pro_ext.h en el
directorio API de Visual FoxPro para las definiciones struct FoxInfo y FoxTable.
Estructura FoxInfo
FoxInfo arrayname[ ] = {
{funcName1, FPFI function1, parmCount1, parmTypes1}
{funcName2, FPFI function2, parmCount2, parmTypes2}
...
{funcNameN, FPFI functionN, parmCountN, parmTypesN}
};
arrayname
Variable de tipo FoxInfo. Observe que puede incluir varias lneas de estructura FoxInfo en esta
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 12 de 31
658 of 804
matriz.
funcName
Contiene el nombre (en maysculas y de longitud igual o inferior a 10 caracteres) que el usuario de
Visual FoxPro llama para usar la funcin.
function
parmCount
Especifica el nmero de parmetros descrito en la cadena parmTypes o uno de los siguientes valores
de indicadores.
Valor Descripcin
INTERNAL Especifique que la funcin no se puede llamar directamente desde
Visual FoxPro.
CALLONLOAD Especifica que la rutina se llama cuando se carga la biblioteca.
CALLONLOAD no puede llamar a ninguna rutina que devuelva
resultados a Visual FoxPro.
CALLONUNLOAD Especifica que la rutina se llama cuando la biblioteca se descarga o
cuando se ejecuta el comando QUIT de Visual FoxPro.
CALLONUNLOAD no puede llamar a ninguna rutina que devuelva
resultados a Visual FoxPro.
parmTypes
Describe el tipo de datos de cada parmetro. La tabla siguiente muestra los valores vlidos para
parmTypes.
Valor Descripcin
"" Ningn parmetro
"?" Se puede pasar cualquier tipo. En el cuerpo de la funcin, tendr que comprobar el
tipo del parmetro pasado
"C" Parmetro de tipo Character
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 13 de 31
659 of 804
"R" Referencia
Incluya un valor de tipo para cada parmetro transferido a la biblioteca. Por ejemplo, si crea una
funcin que acepta un carcter y un parmetro numrico, sustituya "CN" por parmType.
Nota Para indicar que un parmetro es opcional, ponga como prefijo un punto. Slo se pueden
omitir los parmetros de la derecha.
La siguiente estructura FoxInfo define una biblioteca con una funcin (llamada internamente dates
y la que se tiene acceso como DATES) que acepta un parmetro de tipo Character:
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
Cuando haya compilado la biblioteca con esta estructura FoxInfo y la haya cargado en Visual FoxPro
con el comando SET LIBRARY TO, puede llamar a esta funcin en Visual FoxPro con la siguiente
lnea de cdigo:
=DATES("01/01/95")
Estructura FoxTable
La estructura FoxTable es una lista vinculada que hace un seguimiento de todas las estructuras
FoxInfo que tiene para una biblioteca determinada:
nextLibrary
infoCount
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 14 de 31
660 of 804
infoPtr
La direccin del primer elemento de una matriz de estructuras FoxInfo. Este nombre tiene que
coincidir con el nombre presentado en la instruccin FoxInfo.
FoxTable _FoxTable = {
(FoxTable *) 0,
sizeof( myFoxInfo) / sizeof( FoxInfo ),
myFoxInfo
};
La tabla siguiente muestra las categoras generales de llamadas a la API disponibles en Visual
FoxPro. Para obtener detalles sobre funciones de la API, consulte Rutinas A-Z de la biblioteca API o
Rutinas por categoras de la biblioteca API,
Para usar las rutinas de la API de Visual FoxPro, tiene que incluir el archivo Pro_ext.h, disponible en
el directorio API de Visual FoxPro. Este archivo incluye los prototipos para las funciones y
estructuras que le permiten compartir informacin con Visual FoxPro.
Si est programando un control ActiveX, tambin tiene que agregar llamadas para inicializar y borrar
la API.
1. Use #INCLUDE para incluir el archivo Pro_ext.h junto con otros archivos de encabezado
necesarios.
2. En el Constructor (mtodo Init) del control, llame a _OCXAPI( ) para inicializar la interfaz a
Visual FoxPro mediante este cdigo:
_OCXAPI(AfxGetInstanceHandle(),DLL_PROCESS_ATTACH);
4. En el Destructor (mtodo Destroy) del objeto, vuelva a llamar a _OCXAPI( ) para liberar el
proceso creado en el Constructor, mediante este cdigo:
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 15 de 31
661 of 804
_OCXAPI(AfxGetInstanceHandle(),DLL_PROCESS_DETACH);
Para ver un ejemplo de archivo .ocx que incluya llamadas a la API de Visual FoxPro, vea
Foxtlib.ocx. Para ver un ejemplo de biblioteca .fll que incluya llamadas a la API de Visual FoxPro,
vea los programas de ejemplo que se encuentran en el directorio Vfp98\Api\Samples y que tengan la
extensin C: EVENT.C, HELLO.C, etc.
Si usa llamadas a la API de Visual FoxPro en su control ActiveX, su objeto COM o su biblioteca
.FLL, el cdigo que contiene las llamadas es incompatible con otras aplicaciones. Es posible que
entonces desee generar una o ms pruebas en el programa para determinar si Visual FoxPro puede
llamar al objeto.
Por ejemplo, cuando crea un control ActiveX con Microsoft Foundation Classes, puede cambiar el
cdigo del constructor del control para que incluya una prueba y avise al usuario si se ha llamado al
control desde un programa distinto de Visual FoxPro:
if (!_OCXAPI(AfxGetInstanceHandle(),DLL_PROCESS_ATTACH))
{
::MessageBox(0,"Este OCX slo se puede alojar en Visual Foxpro","",0);
//Aqu puede hacer lo que desee cuando el host no es VFP:
// es posible que no quiera cargarlo
// o puede que desee establecer una propiedad
// que diga que el host no es VFP y que el control utilizar
// otros medios para lograr su objetivo.
}
Si crea un control ActiveX con Microsoft ActiveX Template Library, utilice el cdigo siguiente:
if (!_OCXAPI(_Module.GetModuleInstance(),DLL_PROCESS_ATTACH))
{
::MessageBox(0,"Este OCX slo se puede alojar en Visual Foxpro","",0);
//Aqu puede hacer lo que desee cuando el host no es VFP:
// es posible que no quiera cargarlo
// o puede que desee establecer una propiedad
// que diga que el host no es VFP y que el control utilizar
// otros medios para lograr su objetivo.
}
En este ejemplo, el control no sale y seguir ejecutndose despus de que el usuario haya recibido el
mensaje. La estrategia que elija depender de cmo crea que se va a usar el control. Por ejemplo, si
detecta que se est usando el control fuera de Visual FoxPro, puede establecer un indicador que
prueba en cada punto del control dnde llama a la API de Visual FoxPro. Si el indicador indica que el
control est fuera de Visual FoxPro, puede ramificar la llamada de la API como forma alternativa de
realizar la misma tarea.
Visual FoxPro puede transferir parmetros a su programa por valor o por referencia. De forma
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 16 de 31
662 of 804
predeterminada, los parmetros respetan la configuracin realizada con SET UDFPARMS. Otras
variables (como matrices o campos) y expresiones se pasan por valor.
Para obligar a que un parmetro se pase por referencia, tiene que usar como prefijo de la variable el
operador @. Para forzar la transferencia por valor de un parmetro, entre parntesis.
Nota En Visual FoxPro, los elementos de matriz individuales siempre se pasan por valor. Cuando
SET UDFPARMS se establece a VALUE y no se especifica ningn elemento de matriz, el nombre de
matriz se refiere al primer elemento de la matriz (a no ser que tenga el prefijo @).
Como los controles ActiveX y los objetos COM son programas estndar para Windows, no es
necesario ningn mecanismo especial para transferir parmetros entre Visual FoxPro y su programa.
Puede escribir el programa como si estuviera recibiendo programas desde cualquier programa escrito
en C o C++.
En contraste, las funciones de una biblioteca FLL usan la estructura FoxInfo para recibir datos desde
Visual FoxPro. La estructura FoxInfo muestra sus funciones de biblioteca y el nmero y tipo de
parmetros que esperan. Por ejemplo, la siguiente estructura FoxInfo pertenece a una biblioteca con
una funcin, internamente llamada dates, que acepta un parmetro Character:
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
Las funciones que defina en sus bibliotecas reciben actualmente un nico parmetro, un puntero al
bloque de parmetros. Este bloque de parmetros, definido en la estructura ParamBlk, guarda toda la
informacin sobre los parmetros que se pasaron en la llamada de funcin de Visual FoxPro. La
declaracin de funcin sigue el siguiente formato:
El parmetro typedef incluido en la estructura ParamBlk es una unin de una estructura Value y una
estructura Locator. La llamada por valor la controla la estructura Value; la llamada por referencia la
controla la estructura Locator. Estas estructuras se usan para tener acceso a parmetros pasados a su
funcin cuando Visual FoxPro la llama.
La siguiente informacin sale del archivo Pro_ext.h y muestra la definicin del tipo Parameter:
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 17 de 31
663 of 804
Si se pasa un parmetro a la funcin por valor, use la estructura Value para tener acceso al mismo. La
siguiente definicin de estructura Value se extrae del archivo Pro_ext.h:
La siguiente tabla es una gua para los valores que puede pasar a y recibir en la estructura Value para
distintos tipos de datos. Slo los campos de la estructura mostrados para un tipo de datos se usan para
ese tipo de datos.
Numeric ev_type N
Integer ev_type I
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 18 de 31
664 of 804
Date ev_type D
ev_real Date1
Currency ev_type Y
ev_currency
Value2 de tipo Currency
Logical ev_type L
ev_length 0o1
Memo ev_type M
ev_wdith FCHAN
General ev_type G
ev_wdith FCHAN
Object ev_type O
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 19 de 31
665 of 804
1. La fecha est representada como un nmero de da Juliano de coma flotante de doble precisin
calculado mediante el algoritmo 199 de Collected Algorithms de la ACM.
2. El valor de tipo currency es un entero largo, con una coma decimal implcita delante de los cuatro
ltimos dgitos.
Nota ev_length es el nico indicador de la longitud de una cadena. La cadena no puede tener un
terminador nulo porque no puede contener caracteres nulos incrustados.
Use la estructura Locator para manipular parmetros pasados por referencia. La siguiente definicin
de estructura Locator se extrae del archivo Pro_ext.h.
typedef struct {
char l_type;
short l_where, /* Nmero de base de datos o -1 para memoria */
l_NTI, /* Desplazamiento de tabla de nombre de variable*/
l_offset, /* ndice en la base de datos */
l_subs, /* # subndices especificados por 0 <= x <= 2 */
l_sub1, l_sub2; /* valores enteros de subndice */
} Locator;
l_where Nmero de tabla que contiene este campo, o 1 para una variable.
l_NTI Name Table Index (ndice de tabla de nombres). Uso interno de Visual
FoxPro.
l_offset Nmero de campo de tabla. Uso interno de Visual FoxPro.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 20 de 31
666 of 804
Nota Es una buena prctica de programacin comprobar el tipo de parmetro de ev_type para
ayudarle a determinar a qu campos se tiene acceso desde la estructura Value.
El siguiente ejemplo usa StrCpy( ) para devolver a Visual FoxPro un tipo Character que es la
concatenacin de sus dos parmetros Character. Observe que aunque el controlador de la estructura
Value de cada parmetro se usa como memoria de trabajo para realizar la concatenacin, los cambios
a esta asignacin de memoria no afectan al argumento de Visual FoxPro que se ha pasado por valor.
Para ver un ejemplo que usa la estructura Locator para administrar un parmetro pasado por
referencia, consulte Devolver un valor de una biblioteca FLL ms adelante en este mismo captulo.
#include <Pro_ext.h>
Example(ParamBlk *parm)
{
// simplificar la estructura paramBlk
// para administrar mediante mtodos abreviados #define
#define p0 (parm->p[0].val)
#define p1 (parm->p[1].val)
FoxInfo myFoxInfo[] = {
{"STRCAT", Example, 2, "CC"},
};
FoxTable _FoxTable = {
(FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 21 de 31
667 of 804
};
Para devolver un valor desde un control ActiveX a Visual FoxPro, use la instruccin RETURN en el
control, pasando un nico valor, como en el siguiente ejemplo:
// ms cdigo aqu
long CPyCtrl::GetVersion()
{
// establecer el nmero de versin aqu en la
// variable fVersion
return VERSION;
}
Para devolver valores desde una biblioteca FLL, use funciones de la API, no comandos nativos de C
o C++. Las siguientes funciones le permiten devolver valores a Visual FoxPro.
Nota No use la siguiente funcin de la API para devolver un valor desde un archivo .ocx; use la
instruccin RETURN. Las funciones de devolucin de la API slo deben usarse en bibliotecas FLL.
Funcin Descripcin
_RetChar(char *string) Establece el valor devuelto de la funcin a una
cadena que termina en carcter nulo.
_RetCurrency(CCY cval, int width) Establece el valor devuelto de la funcin a un
valor de tipo currency.
_RetDateStr(char *string) Establece el valor devuelto de la funcin a una
fecha. La fecha se especifica en el formato
dd/mm/aa[aa].
_RetDateTimeStr(char *string) Establece el valor devuelto de la funcin a una
fecha y una hora especificadas en el formato
mm/dd/aa[aa] hh:mm:ss.
_RetFloat(double flt, int width, int dec) Establece el valor devuelto de la funcin a un
valor de tipo float.
_RetInt(long ival, int width) Establece el valor devuelto de la funcin a un
valor numrico.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 22 de 31
668 of 804
_RetLogical(int flag) Establece el valor devuelto de una funcin a un
valor logical. Cero se considera FALSE.
Cualquier valor distinto de cero se considera
TRUE.
_RetVal(Value *val) Pasa una estructura Value completa de Visual
FoxPro; se puede devolver cualquier tipo de
datos de Visual FoxPro excepto memo. Tiene
que llamar a _RetVal( ) para devolver una
cadena que contiene incrustados caracteres
nulos o para devolver un valor .NULL.
Nota Para devolver el valor de un tipo de datos objeto, use la funcin _RetVal(), rellenando el
campo ev_object de la estructura Value.
El siguiente ejemplo, Sum, acepta una referencia a un campo numrico de una tabla y usa _RetFloat
para devolver la suma de los valores del campo:
#include <Pro_ext.h>
Sum(ParamBlk *parm)
{
// declarar variables
double tot = 0, rec_cnt;
int i = 0, workarea = -1; // -1 es el rea de trabajo actual
Value val;
// GO TOP
_DBRewind(workarea);
// Get RECCOUNT( )
rec_cnt = _DBRecCount(workarea);
Suponiendo que hay un campo llamado amount en la tabla abierta actualmente, la siguiente lnea de
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 23 de 31
669 of 804
cdigo de un programa de Visual FoxPro llama a la funcin:
? SUM(@amount)
Los siguientes tipos de datos se usan en las rutinas de la API de Visual FoxPro.
Nota Como los punteros FAR no son apropiados para compiladores de 32 bits, las instrucciones
#define de Pro_ext.h redefinen FAR, _far y __far como valores nulos.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 24 de 31
670 of 804
Las estructuras de datos principales usadas en la biblioteca de la API de Visual FoxPro se muestran
en la tabla siguiente.
Estructura Descripcin
EventRec Estructura usada para describir qu est haciendo el sistema en un
instante determinado.
FoxInfo Se usa en las bibliotecas FLL para comunicarse entre Visual FoxPro y su
programa; no se usa en los archivos .ocx. Se trata en Usar las estructuras
FoxInfo y FoxTable en una seccin anterior de este captulo.
FoxTable Se usa en bibliotecas FLL para comunicarse entre Visual FoxPro y su
programa; no se usa en archivos .ocx. Se trata en Usar las estructuras
FoxInfo y FoxTable en una seccin anterior de este captulo.
Locator Una estructura usada para tener acceso a valores de parmetros (FLL) o
variables o campos de Visual FoxPro (FLL y .ocx).
ParamBlk Se usa en bibliotecas FLL para comunicarse entre Visual FoxPro y su
programa; no se usa en archivos .ocx. Se trata en Usar las estructuras
FoxInfo y FoxTable en una seccin anterior de este captulo.
Parameter Se usa en bibliotecas FLL para comunicarse entre Visual FoxPro y su
programa; no se usa en archivos .ocx. Se trata en Usar las estructuras
FoxInfo y FoxTable en una seccin anterior de este captulo.
Point Una estructura que define las coordenadas verticales y horizontales de un
punto nico de la pantalla. Las coordenadas se especifican en filas y
columnas.
Rect Una estructura que define las coordenadas de un rectngulo en la pantalla.
La esquina superior izquierda del rectngulo se define por (top,left) y la
esquina inferior derecha por (bottom-1,right-1). Las coordenadas se
especifican en filas y columnas.
Value Una estructura usada para tener acceso a valores de parmetros (FLL) o
variables o campos de Visual FoxPro (FLL y .ocx).
Las variables y los campos estn disponibles en Visual FoxPro en una tabla de nombres, que es una
matriz que contiene los nombres de todas las variables y todos los campos definidos actualmente.
Puede tener acceso a un elemento individual de la matriz mediante un ndice de tabla de nombres
(Name Table Index, NTI). Una funcin especial de la API, NameTableIndex( ), devuelve el ndice de
una variable o un campo existente en base al nombre proporcionado. Despus de haber determinado
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 25 de 31
671 of 804
el NTI para una variable dada, puede leerla mediante la funcin _Load( ) de la API o establecerla
mediante la funcin _Store( ) de la API. Para crear una variable nueva, puede llamar a la funcin
_NewVar( ) de la API.
Para tener acceso a las variables o campos de Visual FoxPro, se usan las estructuras Value y Locator
definidas en Pro_ext.h. Si est creando una biblioteca FLL, puede usar la misma tcnica que ha usado
para tener acceso a parmetros transferidos a sus funciones. Para obtener detalles sobre las estructuras
Value y Locator, consulte Transferir y recibir parmetros en una seccin anterior de este captulo.
El ejemplo siguiente, extrado del programa Foxtlibctl.cpp que se encuentra en el directorio Vfp98
\Api\Samples\Foxtlib de Visual FoxPro, ilustra cmo puede usar las estructuras Value y Locator de
un control ActiveX para tener acceso a las variables de Visual FoxPro:
//1 = Guid
StringFromGUID2(lpTypeAttr->guid, (LPOLESTR )&szGuid,sizeof(szGuid));
OLEOleToAnsiString(szGuid,&szBuff);
val.ev_type = 'C';
val.ev_length = strlen(szBuff);
val.ev_handle = _AllocHand(val.ev_length);
_HLock(val.ev_handle);
_MemMove((char *) _HandToPtr( val.ev_handle ), szBuff, val.ev_length);
OLEFreeString((void **)&szBuff);
_HUnLock(val.ev_handle);
loc.l_sub1 = 1;
_Store(&loc,&val);
_FreeHand(val.ev_handle);
//2 = LCID
loc.l_sub1 = 2;
val.ev_type = 'I';
val.ev_long = lpTypeAttr->lcid;
_Store(&loc,&val);
Administrar la memoria
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 26 de 31
672 of 804
Nota Las tcnicas descritas en esta seccin para administrar la memoria con la API de Visual
FoxPro se aplican tanto a controles API ActiveX como a bibliotecas FLL.
Usar identificadores
Nota Para evitar la corrupcin de archivos memo, no escriba en un archivo memo antes de
llamar a _AllocMemo( ).
Para tratar la memoria asignada, las rutinas de la API deben convertir el identificador en un puntero
llamando a la rutina _HandToPtr( ). Incluso si el administrador de memoria de Visual FoxPro tiene
que reorganizar la memoria para obtener ms memoria contigua para sucesivas solicitudes de
memoria, el identificador sigue siendo el mismo. Tambin se proporcionan rutinas que aumentan,
reducen, liberan y bloquean asignaciones de memoria.
Cuando est creando rutinas externas, intente minimizar el uso de memoria. Si crea una rutina
externa que asigna memoria de forma dinmica, intente usar la menor cantidad posible de memoria.
Sea especialmente cuidadoso al bloquear grandes asignaciones de memoria durante largos perodos
de tiempo. No se olvide de desbloquear los identificadores de memoria con _HUnLock( ) cuando ya
no tienen que estar bloqueados, porque el rendimiento de Visual FoxPro puede verse afectado
negativamente por identificadores de memoria bloqueados.
Precaucin El uso excesivo de memoria dinmica priva a Visual FoxPro de memoria para bferes,
ventanas, mens, etc., y disminuye el rendimiento, porque la memoria dada para las solicitudes de la
API la administra el administrador de memoria de Visual FoxPro. Asignar grandes identificadores y
conservarlos puede causar que la memoria de Visual FoxPro se agote y el programa termine de forma
anmala.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 27 de 31
673 of 804
El entorno de Visual FoxPro no tiene proteccin de memoria. La rutina de la API externa no puede
proporcionar toda la validacin inherente a un programa estndar de Visual FoxPro. Si daa la
memoria, recibir mensajes como "Identificador transgredido", "Error de coherencia interna" y "Nodo
transgredido durante la compactacin".
La siguiente funcin de una biblioteca FLL ilustra la asignacin de memoria. El ejemplo usa
_RetDateStr( ) para devolver un tipo Date de Visual FoxPro (asumiendo que el parmetro Character
es una fecha adecuada):
#include <Pro_ext.h>
El control o biblioteca que crea no tiene pila propia. En lugar de ello, usa la pila del programa que lo
llama, en este caso la pila de Visual FoxPro. No puede controlar el tamao de la pila de Visual
FoxPro o modificar la cantidad de espacio disponible para un control ActiveX o un archivo .fll.
l Los usuarios pueden liberar todos los identificadores que asignen, incluyendo los
identificadores asignados por funciones como _Load().
l _Load() slo crea un identificador cuando la variable que est creando es una cadena de
caracteres (es decir, ev_type = 'C'). Todos los dems tipos de datos almacenan sus valores
en la misma estructura Value, mientras que al cargar una cadena de caracteres se coloca un
MHANDLE en el ev_handle de la estructura Value.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 28 de 31
674 of 804
l En la biblioteca FLL, Visual FoxPro asume la responsabilidad de liberar todos los
identificadores devueltos por _RetVal( ). Los usuarios no pueden liberar estos identificadores,
incluso si los asignan.
l Los usuarios no deben liberar identificadores que se les han transferido a su ParamBlk.
Precaucin Cuando escribe una rutina externa que llama a funciones, asegrese de seguir
todas las reglas y compruebe los resultados devueltos. Un puntero perdido o una referencia de
identificador podra daar las estructuras de datos internas de Visual FoxPro, provocando el
final inmediato o problemas a posteriori, lo cual podra producir prdida de datos.
Generar el proyecto
Antes de generar, tiene que establecer las opciones del proyecto. Algunas de las opciones que elige
dependen de si desea crear una versin de depuracin o una versin final del control o biblioteca. Por
norma, puede crear versiones de depuracin del programa hasta que est satisfecho de su
funcionamiento y, a continuacin, crear una versin final.
2. Elija si va a crear una versin de depuracin o una versin final del control.
3. Elija OK.
2. En Settings For, elija si va a crear una versin de depuracin o final del programa.
l Si est generando un .fll, agregue WINAPIMS.LIB del directorio API de Visual FoxPro.
5. Desactive Ignore all default libraries.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 29 de 31
675 of 804
6. Elija OK.
8. Agregue el directorio que contiene OCXAPI.LIB del directorio API de Visual FoxPro (al crear
un control) o agregue WINAPIMS.LIB del directorio API de Visual FoxPro (al crear un FLL).
Cuando compile y enlace el archivo .OCX, Visual C++ registrar automticamente el control en el
equipo en el que se gener. Si por alguna razn tiene que registrar el control de otra forma, puede
hacerlo mediante el siguiente procedimiento.
O bien
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 30 de 31
676 of 804
Microsoft Visual C++ versin 4.0 o posterior ofrece un entorno integrado de depuracin que facilita
el establecimiento de puntos de interrupcin para ejecutar el cdigo paso a paso. Puede incluso
ejecutar Visual FoxPro desde Visual C++.
3. en el cuadro de texto Executable for debug session, escriba la ruta de acceso seguida por
Vfp6.exe.
4. Elija OK.
7. Cuando Developer Studio muestra un mensaje que dice "Vfp6.exe does not contain debugging
information", elija Yes para continuar.
Debera poder depurar un control o biblioteca con cualquier depurador que controle correctamente un
INT 3 (_BreakPoint( )) incrustado en su programa. Puede usar cualquier depurador para depuracin
simblica siempre que pueda hacer lo siguiente:
3. Llame al depurador.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 9: Acceso a las bibliotecas API Pgina 31 de 31
677 of 804
7. Cuando se alcance el punto de interrupcin, realice ajustes a la base de smbolos para alinear
los smbolos con la ubicacin actual en la que se carg la biblioteca.
8. Incremente el registro del puntero de instruccin (IP) en una unidad para saltar la instruccin
INT 3.
Nota Elimine siempre todos los puntos de interrupcin especificados en el depurador antes de
distribuir el producto.
file://C:\temp\~hh598B.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 1 de 35
678 of 804
Con las caractersticas de Visual FoxPro puede extender sus esfuerzos de programacin para crear
aplicaciones complejas orientadas a mltiples usos. Puede crear sus aplicaciones con un equipo de
programadores, lo que le permite trabajar ms rpidamente y programar aplicaciones que difcilmente
puede crear un slo programador. Tambin puede combinar la eficacia de Visual FoxPro con la de
otros programas para crear soluciones eficaces a nivel empresarial para los requisitos de su
aplicacin.
Para trabajar en equipo con xito, los programadores deben coordinar sus esfuerzos y evitar la
duplicacin del esfuerzo o sobrescribir el trabajo de otros. Para ayudarle a administrar la
programacin en equipo, Visual FoxPro le permite integrar software de control de cdigo de origen
en el Administrador de proyectos, de forma que pueda desproteger y proteger archivos de Visual
FoxPro, combinar modificaciones, ver diferencias y ms. Tambin puede trabajar simultneamente
con otros programadores en la misma base de datos.
Adems de crear completamente sus aplicaciones en Visual FoxPro, puede extender Visual FoxPro
para usarlo como cliente de otros orgenes de datos y como origen de datos de otros programas para
Windows. Tambin puede usar Visual FoxPro de otras formas innovadoras, como motor de bsqueda
para el World Wide Web o como herramienta de almacenamiento de datos.
Este captulo proporciona estrategias que puede seguir para hacer que la programacin en equipo sea
un xito. Se supone que ya est familiarizado con la creacin de aplicaciones de Visual FoxPro, como
se ha tratado en captulos anteriores de este libro.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 2 de 35
679 of 804
l Permitir a varios programadores trabajar con los mismos proyectos y bases de datos a la vez.
l Coordinar las modificaciones que se realizan en los mismos programas, formularios u otros
elementos de la aplicacin, de forma que las modificaciones de un programador no
sobrescriban las de otro programador.
l Permitir a los programadores mejorar los elementos existentes de la aplicacin (por ejemplo,
programas o bibliotecas de clases) sin que afecte al trabajo de los otros programadores que
usan actualmente estos elementos.
Por ejemplo, suponga que su equipo est programando una aplicacin compleja. Como la aplicacin
es grande, Visual FoxPro debe permitir a varios programadores que trabajen simultneamente en
distintos componentes de la aplicacin. Sin embargo, quiere estar seguro de que slo trabaja un
programador a la vez en un elemento individual, como un formulario, de forma que un programador
no sobrescriba las modificaciones realizadas por otro programador.
Ms an, quiere que el programador pueda escribir cdigo, probar y depurar un formulario sin que
afecte a los otros programadores (y usuarios) que siguen trabajando con una versin anterior del
formulario. Cuando el primer programador haya terminado el nuevo formulario, las mejoras se
pueden integrar en la aplicacin.
Puede seguir los mtodos recomendados en este captulo para coordinar el trabajo de varios
programadores. Por ejemplo, este captulo proporciona informacin sobre cmo trabajar con
proyectos y bibliotecas de clases en un entorno de varios programadores. Para obtener detalles,
consulte Integrar control de cdigo fuente en proyectos de Visual FoxPro y Programar bibliotecas de
clases en equipo ms adelante en este captulo.
Visual FoxPro proporciona varias caractersticas que dan soporte a la programacin en equipo. Una
caracterstica importante de la programacin en equipo es el uso de un sistema de control de cdigo
fuente para coordinar quin puede tener acceso y modificar los archivos de un proyecto.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 3 de 35
680 of 804
Control de cdigo fuente es el trmino genrico para herramientas que administran archivos en un
entorno de varios programadores. La mayor parte de las herramientas de control de cdigo funcionan
como una biblioteca pblica tradicional, manteniendo un depsito central de archivos (documentos,
programas u otros archivos) en una ubicacin accesible a todos los programadores. Adems, las
herramientas de control de cdigo fuente incluyen la capacidad de seguir las modificaciones que los
programadores hacen en los archivos y volver a versiones anteriores si es necesario.
En general, las herramientas de control de cdigo fuente proporcionan algunas o todas estas
caractersticas:
Para usar el control de cdigo fuente, los usuarios deben combinar un proyecto con control de cdigo
fuente (a veces se llama "agregar un usuario" a un proyecto). Cuando los usuarios se han unido a un
proyecto, pueden desproteger y proteger los archivos que pertenecen al proyecto.
Nota Tiene que activar el sistema de control de cdigo fuente para desproteger varias veces el
mismo archivo, para que varios programadores puedan trabajar simultneamente en un proyecto. Para
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 4 de 35
681 of 804
obtener ms detalles, consulte la documentacin del software de control de cdigo fuente.
Visual FoxPro ayuda a su equipo a administrar los archivos de sus proyectos permitindole integrar
un sistema de control de cdigo fuente en el Administrador de proyectos de Visual FoxPro. As,
puede administrar archivos de proyecto en un entorno de programacin en equipo y asegurarse de que
los esfuerzos de programacin se llevan a cabo correctamente.
Visual FoxPro admite herramientas de control de cdigo fuente permitindole integrar sofware de
control de cdigo fuente disponible comercialmente en sus proyectos. Puede usar muchos de los
sistemas de control de cdigo de versiones disponibles actualmente. (Pngase en contacto con el
proveedor de software para averiguar si el software se puede integrar con las herramientas de
programacin de Microsoft). Por ejemplo, si su equipo de programadores ya usa Microsoft Visual
SourceSafe, puede especificarlo como el software de control de cdigo fuente que va a usar con
Visual FoxPro.
Todo el control de cdigo fuente en Visual FoxPro se administra a travs del Administrador de
proyectos. Cuando configura un proyecto en Visual FoxPro, tiene la opcin de crear un proyecto de
control de cdigo fuente, lo que se suele llamar "poner el proyecto bajo control de cdigo fuente".
Despus de haber puesto un proyecto bajo control de cdigo fuente, Visual FoxPro le ayuda a
administrar los archivos del proyecto con control de cdigo fuente. Cuando desee modificar un
archivo (por ejemplo, si modifica un programa o un formulario) Visual FoxPro le pedir que
desproteja el archivo.
En Visual FoxPro, el control de cdigo fuente se usa para administrar archivos de todos los tipos, no
slo archivos .prg, sino tambin archivos .scx, .frx, .lbx, .mnx y .vcx, entre otros. Aunque los
archivos individuales se pueden compartir entre distintos proyectos de Visual FoxPro, todas las
operaciones de control de cdigo fuente se realizan en archivos dentro del contexto de un proyecto
concreto.
Nota Visual FoxPro no le pide que coloque tablas de datos como archivos .dbf y .dbc bajo control
de cdigo fuente al crearlas, pero puede agregarlas manualmente al proyecto con control de cdigo
fuente.
Cuando trabaja en el Administrador de proyectos con un proyecto que tiene control de cdigo fuente,
Visual FoxPro muestra iconos junto a los archivos que estn bajo control de cdigo fuente para
indicar su estado.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 5 de 35
682 of 804
La tabla siguiente resume los iconos usados en el Administrador de programas para indicar el estado
de control de cdigo fuente.
Icono Significado
El archivo est desprotegido para usted.
El archivo est desprotegido para usted y para uno o ms programadores adems
de usted.
El archivo est desprotegido para otro programador.
El archivo no est desprotegido; no puede modificarlo hasta que lo haya
desprotegido.
Se ha combinado el archivo. Despus de examinar las modificaciones, puede
proteger el archivo.
Se ha combinado el archivo y hay que resolver conflictos.
Visual FoxPro no puede determinar el estado de control de cdigo fuente del
archivo.
Si un archivo no est bajo control de cdigo fuente, no aparece ningn icono asociado.
Nota Para obtener detalles sobre la combinacin de archivos y conflictos de combinacin, consulte
Proteger archivos de texto ms adelante en este captulo.
Para activar el control de cdigo fuente, instale en primer lugar el programa de control de cdigo
fuente de acuerdo con la documentacin suministrada con l. Tpicamente, se instalar una versin
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 6 de 35
683 of 804
administrador en un servidor en el que se guarda el cdigo fuente y se instalan versiones cliente del
producto en los equipos locales.
Nota Todos los programadores de un proyecto tienen que usar el mismo software de control de
cdigo fuente.
Despus de instalar el software de control de cdigo fuente, puede establecer opciones de modo que
Visual FoxPro lo reconozca y especifique valores predeterminados para sus proyectos.
3. En el rea Opciones del control de cdigo fuente, seleccione el nombre del programa de
control de cdigo fuente en la lista Activar el proveedor de control de cdigo.
4. Para que Visual FoxPro le pida que agregue nuevos proyectos al control de cdigo fuente,
seleccione Agregar automticamente nuevos proyectos al control de cdigo fuente.
Cada vez que inicie Visual FoxPro, ste comprobar si hay un proveedor de control de cdigo fuente.
Si encuentra uno, puede colocar o administrar proyectos bajo control de cdigo fuente.
Para coordinar las modificaciones que los programadores individuales realizan a un proyecto bajo
control de cdigo fuente, Visual FoxPro guarda una lista de archivos de proyecto (o archivo .pjm,
abreviatura de "metarchivo de proyecto"). El archivo que contiene la lista de archivos de proyecto es
un archivo de texto que almacena la misma informacin que los archivos .pjx y .pjt, como los
archivos que estn incluidos actualmente en el proyecto.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 7 de 35
684 of 804
El software de control de cdigo fuente guarda una lista de archivos de proyecto central almacenada
con los otros archivos en el depsito central. Adems, cada programador tiene una copia local de la
lista de archivos de proyecto desprotegida que refleja su versin actual del proyecto.
Suponga que est trabajando en un proyecto y que va a agregar un programa nuevo (archivo .prg).
Cuando agregue el nuevo archivo (y suponiendo que coloca este archivo bajo control de cdigo
fuente), Visual FoxPro actualizar la copia local del proyecto y mostrar el archivo cuando use el
Administrador de proyectos en el equipo. Los otros programadores no conocen al principio la
modificacin, y sus copias locales del proyecto no muestran el archivo que ha agregado. Incluso si no
ha actualizado la lista de archivos de proyecto, puede proteger el nuevo archivo por seguridad y
desprotegerlo cuando sea necesario.
Cuando haya terminado de trabajar con el nuevo archivo, por ejemplo, cuando haya terminado de
probar el nuevo programa, puede actualizar la lista de archivos de proyecto. Cuando lo haga, Visual
FoxPro combina la informacin de la lista de archivos de proyecto local con la lista de archivos de
proyecto central.
A cambio, Visual FoxPro actualiza su lista de archivos de proyecto local con las modificaciones que
encuentre en la lista de archivos del proyecto central. Si otros programadores han agregado archivos
al proyecto, se actualiza su lista de archivos de proyecto local, se colocan copias locales de los nuevos
archivos en su equipo, Visual FoxPro vuelve a generar el proyecto (archivos .pjx y .pjt) y el
Administrador de proyectos muestra los archivos agregados para que trabaje con ellos.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 8 de 35
685 of 804
Nota La lista de archivos de proyecto slo hace un seguimiento de los archivos de proyecto que
estn explcitamente bajo control de cdigo fuente. Si su proyecto incluye archivos que no estn bajo
control de cdigo fuente, no aparecern en la lista de archivos de proyecto y Visual FoxPro no
agregar estos archivos a los proyectos de otros programadores cuando actualicen sus propias listas
de proyecto.
Tiene que especificar que un proyecto de Visual FoxPro va a estar bajo control de cdigo fuente antes
de poder usar el software de control de cdigo fuente. Esto se hace agregando un proyecto al sistema
de control de cdigo fuente.
Si el software de control de cdigo fuente est activado, puede especificar que cualquier proyecto
nuevo que cree estar automticamente bajo control de cdigo fuente.
Despus de haber dado un nombre al proyecto nuevo, Visual FoxPro le pedir que cree el
nuevo proyecto con control de cdigo fuente. El nombre predeterminado para el nuevo
proyecto ser el mismo que el nombre del proyecto de Visual FoxPro.
Despus de haber creado el nuevo proyecto con control de cdigo fuente, Visual FoxPro termina de
crear el nuevo proyecto. Antes de que otros programadores puedan usar este archivo, tiene que
agregarlos al proyecto. Para obtener detalles, consulte Unirse a un proyecto existente con control de
cdigo fuente ms adelante en este captulo.
Si est trabajando con un proyecto existente que no est an bajo control de cdigo fuente, puede
crear un nuevo proyecto con control de cdigo fuente y, a continuacin, colocar sus archivos bajo
control de cdigo fuente.
Visual FoxPro muestra el cuadro de dilogo para el sistema de control de cdigo fuente que le
permite crear un proyecto nuevo. De forma predeterminada, el nombre del proyecto con control
de cdigo fuente es el mismo que el del proyecto de Visual FoxPro.
3. Cree el proyecto con control de cdigo fuente de la misma forma que lo hace normalmente con
el software de control de cdigo fuente.
Cuando agregue un proyecto existente al control de cdigo fuente, Visual FoxPro le pedir que
agregue los archivos del proyecto al proyecto con control de cdigo fuente. Para obtener detalles,
consulte Agregar archivos a un proyecto con control de cdigo fuente en la siguiente seccin.
Despus de poner un proyecto de Visual FoxPro bajo control de cdigo fuente, puede agregar
archivos individuales al proyecto bajo control de cdigo fuente. Si el proyecto de Visual FoxPro ya
contiene archivos cuando lo pone bajo control de cdigo fuente, podr agregarlos al proyecto bajo
control de cdigo fuente.
Nota Si el software de control de cdigo fuente lo admite, Visual FoxPro le permite mantener el
archivo desprotegido cuando lo agregue al proyecto con control de cdigo fuente. Si no es as, se
protege el archivo y tiene que volver a desprotegerlo para trabajar con l. Para obtener detalles sobre
desproteccin y proteccin de archivos cuando se agregan al proyecto, consulte Administrar archivos
en un proyecto con control de cdigo fuente ms adelante en este mismo captulo.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 10 de 35
687 of 804
1. En el men Proyecto, elija Control de cdigo fuente y, a continuacin elija Agregar archivos
al control de cdigo.
2. En el cuadro de dilogo Agregar archivos al control de cdigo, seleccione los archivos que
desea agregar.
3. Elija Aceptar.
Visual FoxPro genera los archivos de control necesarios para el software de control de cdigo
fuente y, a continuacin, agrega los archivos al proyecto. Si ha seleccionado muchos archivos,
este proceso puede durar cierto tiempo.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 11 de 35
688 of 804
Puede configurarlo de forma que cuando agregue un archivo a un proyecto, Visual FoxPro le pedir
que lo ponga bajo control de cdigo fuente.
Para especificar que Visual FoxPro le pida que coloque archivos nuevos bajo control de cdigo
fuente
Para hacer que esta opcin sea predeterminada, elija Establecer como predeterminado y, a
continuacin, elija Aceptar.
Tras agregar archivos a un proyecto, tiene que actualizar la lista de proyectos antes de que otros
programadores puedan trabajar con los nuevos archivos. Para obtener detalles, consulte Actualizar la
lista de proyectos ms adelante en este captulo.
Si es un programador nuevo de un proyecto que ya est bajo control de cdigo fuente, debe unirse al
proyecto antes de poder desproteger y proteger archivos. Cuando se une a un proyecto, Visual FoxPro
crea un archivo lista de proyecto local y genera un archivo de proyecto actual (archivo .PJX) para
usted.
Incluso despus de haber agregado los archivos al proyecto con control de cdigo fuente, otros
programadores no podrn trabajar con ellos. Los programadores podrn usar manualmente su sistema
de control de cdigo fuente para desproteger y proteger archivos si lo necesitan, pero los archivos
agregados no se mostrarn en el Administrador de proyectos para cualquier programador excepto
para el programador que ha agregado los archivos. Para poner los archivos a la disposicin de otros
programadores, actualice la lista de proyecto.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 12 de 35
689 of 804
programadores, actualice la lista de proyecto.
l En el men Proyecto, elija Control de cdigo fuente y, a continuacin, elija Actualizar lista
de proyecto.
Como parte de los procedimientos de actualizacin, Visual FoxPro le pedir que obtenga las
versiones ms recientes de los archivos. Si ya tiene un archivo desprotegido, como regla general no
debe obtener la versin ms reciente, porque su versin es con seguridad ms actual que una de la
red.
Cuando haya terminado, los otros programadores tambin deberan actualizar su lista de proyecto
(con el mismo procedimiento) para poder trabajar con los archivos que usted haya agregado.
Si ya no quiere controlar los archivos de un proyecto, puede quitar el proyecto del control de cdigo
fuente. Cuando lo haga, los archivos permanecern en el proyecto con control de cdigo fuente de
forma que otros programadores puedan seguir usndolos y para que usted pueda examinar su historial
o usarlos en otros proyectos.
Si tiene archivos de proyecto en su equipo etiquetados como de slo lectura, es decir, si tiene copias
de los archivos pero stos no estn desprotegidos, puede quitarles el atributo de slo lectura cuando
se quitan del proyecto del control de cdigo fuente.
Nota Cuando usted quita un proyecto del control de cdigo fuente, rompe el vnculo entre sus
archivos de proyecto locales y el proyecto con control de cdigo fuente, y sus archivos se convierten
en archivos de lectura-escritura. Asegrese de aplicar procedimientos de control manual de versiones
despus de quitar un proyecto o correr el riesgo inherente al trabajo con archivos que no estn bajo
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 13 de 35
690 of 804
despus de quitar un proyecto o correr el riesgo inherente al trabajo con archivos que no estn bajo
control de cdigo fuente.
Puede quitar archivos individuales del control de cdigo fuente si ya no quiere que formen parte de su
proyecto con control de cdigo fuente. Podra hacer esto, por ejemplo, si un programa o formulario se
convierte en innecesario y ya no forma parte del proyecto.
2. En el men Proyecto, elija Control de cdigo fuente y, a continuacin, elija Quitar archivos
de control de cdigo.
3. En el cuadro de dilogo Quitar archivos de control de cdigo fuente, seleccione los archivos
que desea quitar y, a continuacin, haga clic en Aceptar.
Si quita un archivo de un proyecto de Visual FoxPro que tiene control de cdigo fuente, Visual
FoxPro le pedir como siempre si slo desea quitar el archivo del proyecto o si desea eliminarlo del
disco. Una opcin del cuadro de dilogo Opciones determina si Visual FoxPro tambin le pide que
quite el archivo del proyecto con control de cdigo fuente.
l Si Quitar archivos del control de cdigo fuente al quitarlos del proyecto est activada,
Visual FoxPro tambin le pedir que quite el archivo del proyecto con control de cdigo fuente.
l Si Quitar archivos del control de cdigo fuente al quitarlos del proyecto no est activada,
no se le pide lo anterior y el archivo se deja bajo control de cdigo fuente.
Despus de quitar un archivo del control de cdigo fuente, es posible que an existan copias del
mismo en los equipos de otros programadores. Si es as, el archivo se tratar como un archivo local
slo para estos programadores.
Puede configurar un archivo de forma que forme parte de dos o ms proyectos con control de cdigo
fuente a la vez. Esto es til si usa archivos comunes, como programas estndar, bibliotecas o cuadros
de dilogo en ms de un proyecto. Cuando comparte archivos entre proyectos, las modificaciones que
proteja en un archivo se reflejan en todos los archivos que compartan el archivo.
El mtodo especfico para compartir archivos entre proyectos con control de cdigo fuente depende
del software de control de cdigo fuente. Si las opciones para compartir no estn incorporadas en su
proveedor de control de cdigo fuente, los comandos para compartir archivos no estarn disponibles
en el men.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 14 de 35
691 of 804
en el men.
El primer paso del procedimiento siguiente se aplica a todos los sistemas de control de cdigo fuente
que admiten la posibilidad de compartir archivos. Los pasos sucesivos pueden variar, en funcin de
su software de control de cdigo fuente.
2. En el cuadro de dilogo que aparece, indique qu archivos desea compartir con el proyecto
actual y a qu proyecto pertenecen actualmente.
Las opciones especficas disponibles en este comando de men dependen del sistema de
control de cdigo fuente. Para obtener detalles, elija Ayuda en el cuadro de dilogo Compartir
o consulte la documentacin de su sistema de control de cdigo fuente.
Algunos componentes de proyecto de Visual FoxPro estn formados en realidad por varios archivos:
un archivo principal y uno o ms archivos implcitos. Por ejemplo, cuando cree un formulario, Visual
FoxPro crear un archivo .scx (el archivo principal) y un archivo .sct (el archivo implcito). Los
siguientes componentes tienen varios archivos:
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 15 de 35
692 of 804
Nota Si genera y compila un men, tambin crea archivos .MPR y .MPX. Estos no estn
inicialmente bajo control de cdigo fuente, pero puede agregarlos como archivos a su proyecto y, a
continuacin, ponerlos bajo control de cdigo fuente igual que lo hara con otros archivos.
Desproteger archivos
Cuando trabaja en un proyecto con control de cdigo fuente, Visual FoxPro puede pedirle que
desproteja archivos cuando los modifique abriendo el editor adecuado. Por ejemplo, si selecciona un
formulario y elige Modificar para abrir el Diseador de formularios, Visual FoxPro puede pedirle que
desproteja los archivos del formulario. (Si no desprotege los archivos, el formulario se muestra en el
Diseador de formularios, pero es de slo lectura).
Sin embargo, tambin puede desproteger los archivos manualmente, lo cul es til si desea acceso
exclusivo al archivo, pero de momento no quiere abrir el editor para el archivo. Podra hacer esto, por
ejemplo, si desea trabajar con un archivo fuera de la oficina.
Para especificar que Visual FoxPro le pida que desproteja archivos que se estn modificando
l En la ficha Proyectos del cuadro de dilogo Opciones, asegrese de que la opcin Desproteger
los archivos al modificarlos est activada y, a continuacin, elija Aceptar.
Para hacer que este valor sea el predeterminado, elija Establecer como predeterminado y, a
continuacin, elija Aceptar.
3. En el cuadro de dilogo Desproteger archivos, seleccione los archivos con los que desea
trabajar y, a continuacin, haga clic en Aceptar.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 16 de 35
693 of 804
Proteger archivos
Siempre tiene que proteger los archivos manualmente. Visual FoxPro no protege automticamente un
archivo; por ejemplo, no protege un formulario cuando cierra el Diseador de formularios. En lugar
de ello, deja el archivo desprotegido de forma que pueda seguir modificndolo, llevrselo fuera de la
oficina o trabajar con l de otra forma.
El resultado exacto del proceso de proteccin depende del archivo que est protegiendo y del
software de control de cdigo fuente. Para formularios, mens, etiquetas, bibliotecas de clases y otros
tipos de archivos, el archivo se trata como un archivo binario y el software de control de cdigo
fuente convierte su nueva versin del archivo en la actual para que la desprotejan los otros
programadores.
Sugerencia No olvide proteger siempre los archivos cuando termine de modificarlos. Si los deja
desprotegidos durante largos perodos de tiempo, puede impedir que otros programadores trabajen
con ellos e impedir que se haga una copia de seguridad de la ltima versin del archivo cuando se
realice la copia de seguridad a travs de la red.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 17 de 35
694 of 804
Cuando proteja un archivo de texto, como un archivo .prg, y si hay varias versiones del archivo
desprotegidas, el software de control de cdigo fuente no se limita a sobrescribir la versin central.
En lugar de ello, comprueba si se han realizado modificaciones al archivo desde la ltima vez que lo
desprotegi. Si es as, intenta combinar las modificaciones con su archivo. Para ello, agrega, elimina
y modifica lneas de cdigo en su copia del archivo.
Cuando haya terminado la combinacin, el software de control de cdigo fuente tambin podra darle
la oportunidad de proteger el archivo. No proteja el archivo inmediatamente, pruebe la aplicacin con
la nueva versin del archivo que incorpore sus modificaciones y las de los otros programadores. Slo
cuando est satisfecho con el funcionamiento de la aplicacin deber proteger el archivo. Si otros
programadores han realizado modificaciones posteriores al archivo, es posible que tenga que
combinar, probar y proteger de nuevo.
Para resolver el conflicto de combinacin, tiene que volver a modificar el archivo, implementar sus
cambios y quitar las marcas de conflicto de combinacin. Cuando haya terminado las modificaciones,
Visual FoxPro le pedir que confirme que ha resuelto todos los conflictos. Entonces el archivo se
marcar con el icono de combinacin:
Pruebe su aplicacin para asegurarse de que las modificaciones funcionan correctamente. Entonces
podr intentar proteger el archivo de nuevo. Si no ocurren ms conflictos de combinacin, su archivo
se convierte en la versin actual.
Descartar modificaciones
Si ha desprotegido un archivo, pero decide descartar las modificaciones realizadas, puede deshacer la
desproteccin. Esto hace que se vuelva a proteger el archivo (es decir, otros usuarios pueden
desproteger el archivo), pero no actualiza sus modificaciones. Por ejemplo, si ha desprotegido por
error un archivo en lugar de simplemente obtener la ltima versin, deshaga la desproteccin en lugar
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 18 de 35
695 of 804
error un archivo en lugar de simplemente obtener la ltima versin, deshaga la desproteccin en lugar
de volver a proteger el archivo. Esto impide que el sistema de control de cdigo fuente tenga que
crear otra versin del archivo, ahorrando tiempo y espacio.
Sugerencia Si quiere ver un archivo pero no tiene que desprotegerlo, puede obtener su ltima
versin. Para obtener detalles, consulte Obtener la ltima versin de los archivos en la siguiente
seccin.
3. En el cuadro de dilogo Deshacer desproteger archivos, asegrese de que el archivo que quiere
est seleccionado y, a continuacin, haga clic en Aceptar.
Si desea ver la versin ms reciente de un archivo, puede desprotegerlo. Sin embargo, si el archivo ya
est desprotegido o si slo desea ver el archivo (no modificarlo), puede obtener la ltima versin de
un archivo. Cuando lo haga, Visual FoxPro copia la versin desprotegida ms actual de un archivo de
slo lectura. Puede obtener la ltima versin de un archivo incluso si actualmente est desprotegido.
Si el archivo que obtiene es un archivo de texto, el software de control de cdigo fuente combinar el
ms reciente con su versin en lugar de simplemente sobrescribirla.
Nota Para combinar archivos al obtener la ltima versin, es posible que tenga que activar esto
como opcin en el software de control de cdigo fuente. Para obtener detalles, consulte la
documentacin de su software de control de cdigo fuente.
Cuando trabaja con archivos de un proyecto, es posible que tenga que comparar la copia local actual
de su directorio de trabajo con la copia maestra actual del proyecto con control de cdigo fuente. Esto
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 19 de 35
de su directorio de trabajo con la copia maestra actual del proyecto con control de cdigo696 of 804
fuente. Esto
puede ayudarle a determinar si otro usuario ha modificado un archivo o puede ayudarle a precisar en
dnde se han realizado las modificaciones desde que desprotegi el archivo.
La mayor parte de los sistemas de control de cdigo fuente slo pueden comparar y mostrar las
diferencias entre archivos si estn en formato de texto. Cuando Visual FoxPro compara formularios,
informes, etiquetas y bibliotecas de clases, usa las representaciones de texto de estos archivos. Para
obtener detalles, consulte Comprobar diferencias en formularios, informes y otros archivos de tabla
en la siguiente seccin.
2. Para un nico archivo, elija Control de cdigo fuente en el men Proyecto y, a continuacin,
elija Mostrar diferencias. Para la lista de proyecto, elija Control de cdigo fuente en el men
Proyecto y, a continuacin, elija Mostrar diferencias de lista de proyectos.
En Visual FoxPro, el software de control de cdigo fuente slo trata como archivos de texto algunos
tipos de archivo. Entre estos estn archivos de cdigo fuente de programa (.prg) y la lista de archivos
del proyecto (archivo .pjm). Los formularios, informes y otros tipos de archivos se almacenan
realmente como tablas de informacin sobre sus componentes. Por ejemplo, un archivo .scx de un
formulario es una tabla de los controles del formulario, junto con informacin sobre el mismo
formulario. Los archivos de tipo tabla se usan para almacenar informacin sobre formulario (archivos
.scx), informes (archivos .frx), mens (archivos .mnx), etiquetas (archivos .lbx) y bibliotecas de
clases (archivos .vcx).
Como estos archivos se almacenan como tablas de Visual FoxPro, los sistemas de control de cdigo
fuente no pueden tratarlos como archivos de texto (el sistema de control de cdigo fuente los trata
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 20 de 35
fuente no pueden tratarlos como archivos de texto (el sistema de control de cdigo fuente 697
losof 804
trata
como archivos "binarios"). Como resultado, las herramientas para ver diferencias entre versiones de
estos archivos no pueden precisar las diferencias, ni puede ver un historial de las modificaciones.
Para permitirle usar el control de cdigo fuente para ver diferencias en formularios, informes y
archivos similares, Visual FoxPro crea representaciones de los mismos. Entonces, cuando coloque
uno de estos archivos bajo control de cdigo fuente, Visual FoxPro crear una versin de texto del
archivo, que mantendr automticamente mientras usted realiza modificaciones.
Para admitir la posibilidad de generar representaciones de texto de archivos de tipo tabla, Visual
FoxPro incluye el programa de utilidad Scctext.prg o puede usar un programa diferente que obtenga
de otro origen o escriba usted mismo.
Visual FoxPro llama automticamente al programa de conversin de texto siempre que agregue un
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 21 de 35
698 of 804
Visual FoxPro llama automticamente al programa de conversin de texto siempre que agregue un
formulario, un informe, un men, una etiqueta o un archivo a un proyecto con control de cdigo
fuente. La utilidad genera un archivo de texto que tiene el mismo nombre que el archivo principal,
pero usa "A" como letra de la extensin. Por ejemplo, para un formulario llamado Miform.scx, la
utilidad genera un archivo de texto llamado Miform.sca. Cuando proteja el formulario (u otro
archivo) despus de modificarlo, el software de control de cdigo fuente crea automticamente y
protege el archivo de texto.
Si especifica una utilidad de conversin de texto cuando ya tenga formularios, informes y archivos
similares en su proyecto con control de cdigo fuente, tiene que quitarlos temporalmente del proyecto
y, a continuacin, volver a agregarlos con la generacin de texto activada.
1. Haga una copia de seguridad de todos los archivos que se vern afectados: formularios,
informes, mens, etiquetas y bibliotecas de clases.
3. En el men Proyecto, elija Control de cdigo fuente y, a continuacin, elija Quitar los
archivos del control de cdigo fuente.
4. Seleccione los archivos que desea quitar del proyecto y, a continuacin, elija Aceptar.
Al poner cada archivo bajo control de cdigo fuente, Visual FoxPro tambin crear la
correspondiente representacin de texto para el archivo.
Puede mostrar informacin sobre archivos individuales y sobre el proyecto como un todo. Por
ejemplo, puede mostrar la historia de desprotecciones para un archivo individual o para el archivo
lista de proyectos. La informacin disponible incluye normalmente:
l El nmero de versin, que indica cuntas veces se ha protegido una nueva versin del archivo o
la lista de proyecto.
l Quin ha protegido el archivo o archivo de proyecto cada vez.
l La fecha y la hora en que se protegi.
l Los comentarios que el programador agreg al proteger el archivo o lista de proyecto.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 22 de 35
1. Si est viendo el historial de un nico archivo, seleccione en el Administrador de699 of 804
proyectos
el archivo para el que desea ver el historial.
Las opciones especficas disponibles en este comando de men dependen del sistema de
control de cdigo fuente. Para obtener detalles, elija Ayuda en el cuadro de dilogo mostrado o
consulte la documentacin de su sistema de control de cdigo fuente.
Tambin puede ver la informacin sobre un usuario o sobre el proyecto que mantiene el sistema de
control de cdigo fuente. Normalmente incluye informacin sobre el estado de desproteccin del
archivo o la lista de proyecto, si el archivo es un archivo de texto o un archivo binario (que determina
si puede combinar sus modificaciones con el archivo almacenado), etc.
Para ver informacin de control de cdigo fuente para un archivo o una lista de proyecto
Las opciones especficas disponibles en este comando de men dependen del sistema de
control de cdigo fuente. Para obtener detalles, elija Ayuda en el cuadro de dilogo mostrado o
consulte la documentacin de su sistema de control de cdigo fuente.
Para que varios programadores trabajen simultneamente con una base de datos, tienen que poder
compartir el archivo de la base de datos (.dbc). En Visual FoxPro, el archivo .dbc se puede compartir
entre programadores como tabla de datos normal. El archivo .dbc debe almacenarse centralmente con
las tablas que forman la base de datos. Los programadores no deben guardar copias locales de un
archivo .dbc porque las modificaciones que realicen a la base de datos no se reflejarn en las
versiones del archivo de los otros programadores.
Si no tiene que modificar el archivo .dbc, tenga en cuenta las siguientes restricciones:
l Los programadores no pueden modificar el mismo elemento de base de datos (como una
estructura de tabla, una vista o una conexin) simultneamente. Cuando el programador
modifica un elemento de base de datos, Visual FoxPro bloquea su entrada en el archivo .dbc;
otros usuarios pueden leer la entrada (es decir, pueden ejecutar un comando USE), pero no
pueden modificarla (MODIFY STRUCTURE).
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 23 de 35
700 of 804
pueden modificarla (MODIFY STRUCTURE).
l Si se est usando un elemento de base de datos, no puede modificar su estructura. Por ejemplo,
si un programador tiene una tabla abierta, los otros programadores no pueden modificar su
estructura.
l Si llama a la funcin DBSETPROP( ) para modificar las propiedades de una base de datos, la
funcin coloca un bloqueo de escritura en el objeto que se est actualizando. Si hay un
conflicto de bloqueo, DBSETPROP( ) sigue las reglas establecidas en SET REPROCESS.
Las vistas y las conexiones funcionan de forma diferente que las tablas. Cuando define por primera
vez la vista, Visual FoxPro usa las tablas de una base de datos, pero no las bloquea. Sin embargo,
como las tablas estn en uso, los otros programadores no pueden modificar sus estructuras.
Desde que guarda por primera vez una nueva vista o definicin de conexin, Visual FoxPro la
bloquea exclusivamente hasta que cierre el Diseador de vistas o el Diseador de conexiones. En
otras palabras, mientras tenga la vista o conexin abierta en un diseador, estar bloqueada de forma
exclusiva. Mientras la vista est bloqueada, nadie podr modificarla.
Cuando usa una vista, su estructura se almacena localmente. Esto asegura que si la vista se modifica
mientras la utiliza (por ejemplo, si llama a REFRESH( ) o REQUERY( )) su formulario o informe
seguir ejecutndose correctamente.
l Las modificaciones realizadas a las clases se propagan no slo a las aplicaciones que usan las
clases, sino a todas las subclases que se deriven de ellas.
l Se suelen almacenar varias clases en un nico archivo de biblioteca, la unidad bsica que puede
administrar un sistema de control de cdigo fuente.
Como ocurre con formularios y programas complejos, es una buena prctica aislar la programacin
en una biblioteca de clases, de forma que un programador puede realizar modificaciones en la
biblioteca sin que afecte a los otros programadores. De forma ideal, el equipo de programadores
puede trabajar con una biblioteca de clases mientras la est mejorando otro programador, sin tener
que preocuparse de si las modificaciones realizadas a la biblioteca afectarn a la aplicacin.
Cuando se usa una clase, Visual FoxPro la almacena localmente en el equipo del usuario, incluso
despus de liberar un formulario que usa la clase. Debe liberar explcitamente la clase antes de que
Visual FoxPro note que ya no se est utilizando. Si ha usado una clase en la sesin actual (y por lo
tanto est almacenada localmente), pero desea cargar una versin nueva de la clase, asegrese de
liberar la clase para obligar a Visual FoxPro a volver a cargarla de la biblioteca modificada.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 24 de 35
701 of 804
Aplicar el control de cdigo fuente a bibliotecas de clases
Al aplicar control de cdigo fuente a una biblioteca de clases, slo un programador puede desproteger
la biblioteca cada vez. La biblioteca pasa a ser de slo lectura para los otros programadores. Como
regla general, esto no interfiere con la programacin de la aplicacin, porque los programadores
pueden usar una biblioteca y crear subclases incluso si la biblioteca es de slo lectura. Mientras los
programadores de la aplicacin trabajan con la versin de slo lectura de la biblioteca, el
programador de la biblioteca de clases puede modificar todas las clases de la biblioteca.
Si usa esta aproximacin, el programador que est actualizando la biblioteca no debera proteger el
archivo hasta que haya terminado y se haya probado. Si no es as, otros programadores obtendrn la
versin incompleta del archivo cuando actualicen sus listas de archivos de proyecto u obtengan las
ltimas versiones de los archivos.
Como cada aproximacin tiene sus ventajas, debera examinar los requisitos de su equipo de
programadores y elegir la estrategia que mejor se aplique a su mtodo de trabajo.
Este captulo proporciona una introduccin a dnde y cmo puede usar Visual FoxPro como parte de
sus esfuerzos de programacin a nivel empresarial. No incluye informacin sobre procedimientos
para llevar a cabo tareas concretas; en lugar de ello, este captulo es un recorrido que destaca las
caractersticas de Visual FoxPro que lo convierten en nico para soluciones empresariales.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 25 de 35
702 of 804
clientes, sino tambin herramientas para recibir pedidos, crear facturas, etc. Puede crear todas las
caractersticas necesarias para la aplicacin con las herramientas disponibles en Visual FoxPro,
incluyendo el motor de base de datos, las herramientas visuales de diseo y las posibilidades para
crear informes.
Pero tambin puede usar Visual FoxPro como parte de una aplicacin a mayor escala que incluya dos
o ms herramientas de programacin. Usar Visual FoxPro de esta manera, que se llama
"programacin empresarial", le permite aprovechar las posibilidades nicas de cada producto. La
programacin empresarial puede ser tan sencilla como mantener una base de datos de clientes en
Visual FoxPro y crear una carta de combinacin de correspondencia en Microsoft Word, o crear una
aplicacin compleja con bases de datos cliente-servidor, servidores de Automatizacin, correo
electrnico y ms componentes.
Visual FoxPro es una herramienta ideal para crear soluciones de negocios a nivel empresarial por sus
caractersticas:
Estas caractersticas le permiten programar con Visual FoxPro en varias funciones de una aplicacin
a nivel empresarial. Puede usar Visual FoxPro:
l Como interfaz de usuario para otras aplicaciones. En este escenario, trabaja fundamentalmente
con Visual FoxPro; por ejemplo, puede crear la interfaz de usuario para la aplicacin en Visual
FoxPro. Posteriormente puede tener acceso a otras aplicaciones que contienen datos necesarios
para la aplicacin o que pueden proporcionar servicios que mejoran los ya disponibles en
Visual FoxPro. Tambin puede hacer un upsizing de los datos de Visual FoxPro o moverlos a
otra plataforma.
l Como origen de datos para otras aplicaciones. Para ello, debe crear la interfaz de usuario con
otro programa y, a continuacin, tener acceso a los datos de Visual FoxPro cuando sea
necesario.
La estrategia que elija depende de los objetivos de su aplicacin y de los programas que desee
utilizar.
Las siguientes secciones proporcionan ideas y escenarios que ilustran cmo usar Visual FoxPro en
cada una de las formas descritas anteriormente. Sin embargo, no piense que las aplicaciones
presentadas aqu son los nicos tipos que puede crear; use las ideas que se presentan aqu para
inventar y disear sus propias soluciones empresariales.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 26 de 35
703 of 804
Adems, cuando programa aplicaciones en Visual FoxPro, pensar almacenar los datos de la
aplicacin en tablas de Visual FoxPro.
Una forma de integrar Visual FoxPro en una aplicacin a nivel empresarial es usar sus herramientas
visuales de diseo, pero mejorndolas con las posibilidades de otros productos. Otra forma consiste
en crear la apariencia de la aplicacin con Visual FoxPro, pero extendiendo las posibilidades de
almacenamiento de datos aprovechando las posibilidades de otros programas o de opciones de
almacenamiento de datos externas a Visual FoxPro. Tambin puede hacer un upsizing de los datos de
Visual FoxPro movindolos a un servidor de base de datos.
Las clases de base de controles de Visual FoxPro se disearon para incorporar la inmensa mayora de
necesidades de interfaz de aplicacin. Visual FoxPro proporciona todos los controles bsicos y los
elementos de interfaz necesarios para crear una aplicacin para Windows estndar. Sin embargo, a
menudo ver que su aplicacin requiere objetos o controles con otras funcionalidades que no poseen
los proporcionados por las clases de Visual FoxPro. Si es as, puede extender las herramientas
visuales de diseo creando subclases y usando controles ActiveX.
Crear subclases
Una caracterstica enormemente eficaz de Visual FoxPro es la capacidad de crear subclases de los
controles de base. Creando una o ms subclases puede personalizar los controles bsicos de Visual
FoxPro de casi cualquier manera requerida por su aplicacin. Esta capacidad incluso permite crear
nuevos objetos o controles que combinen las caractersticas de otros controles. Por ejemplo, el
control cuadrcula de Visual FoxPro no slo contiene sus propiedades, mtodos y contenedor, sino
tambin aquellos objetos que aparecen en la cuadrcula, como botones, cuadros de texto, etc.
Asimismo, creando subclases de controles de base, puede extender las posibilidades de Visual
FoxPro creando objetos que agreguen nuevas caractersticas a clases de base existentes, o que
combinen las posibilidades de varios objetos. Por ejemplo, puede agregar caractersticas visuales
como marcos o efectos tridimensionales a un cuadro de texto. O puede combinar un control imagen,
botones y un cuadro de texto para crear una control para ver mapas de bits con el que los usuarios
pueden moverse por varios archivos .bmp. Crear clases personalizadas de esta forma puede ayudarle
a administrar la programacin a nivel de empresa permitindole crear controles estandarizados que
aparecen en todas las aplicaciones. Para obtener ms informacin sobre la creacin de subclases,
consulte el captulo 3, Programacin orientada a objetos.
Una forma alternativa de crear un control nuevo con subclases de Visual FoxPro es usar un control
ActiveX (archivo .ocx). Estos controles se crean independientemente de Visual FoxPro y se pueden
integrar no slo en Visual FoxPro, sino tambin en muchas otras aplicaciones para Windows.
En efecto, los controles ActiveX son componentes externos que puede integrar perfectamente en su
aplicacin. El uso de controles ActiveX proporciona varios beneficios:
l Ahorra el tiempo y esfuerzo necesarios para crear, probar y mantener un control especfico de
Visual FoxPro para realizar las mismas tareas. Cuanto ms eficaz sea el control ActiveX, ms
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 27 de 35
704 of 804
Visual FoxPro para realizar las mismas tareas. Cuanto ms eficaz sea el control ActiveX, ms
tiempo ahorrar.
l Muchos controles ActiveX ya estn disponibles de terceros para responder a requisitos
comunes de aplicaciones. Por ejemplo, si la aplicacin pide que muestre un calendario y que
permita a los usuarios elegir fechas en l, probablemente puede encontrar un control ActiveX
(tal vez varios) que ya realiza esta tarea.
l Se puede usar el mismo control en varios programas. Por ejemplo, si tiene sentido, puede usar
el mismo control ActiveX en Visual FoxPro y en Visual Basic. Se usan las mismas propiedades
y mtodos en cada caso para administrar el control, y el control tendr la misma apariencia en
todos los programas, facilitando su uso por parte de los usuarios.
l Los controles ActiveX proporcionan a menudo acceso a la funcionalidad de Windows que de
otro modo puede ser difcil o requerir mucho tiempo para incluir usando exclusivamente las
herramientas de Visual FoxPro. Por ejemplo, puede buscar controles ActiveX que
proporcionen acceso a correo electrnico (usando funciones de la MAPI de Windows),
funciones grficas de Windows de bajo nivel, etc. Al incluir un control ActiveX, puede agregar
estos tipos de caractersticas a su aplicacin en una forma fcil de controlar con las
propiedades, los mtodos y los eventos de los controles ActiveX.
En resumen, usar los controles ActiveX le permite extender sus aplicaciones no slo integrando la
funcionalidad de Windows, sino tambin agregando una apariencia comn entre sus aplicaciones y
otras de la misma empresa. Para obtener ms informacin sobre el uso de controles ActiveX, consulte
el captulo 16, Agregar OLE. Para obtener informacin sobre la creacin de sus propios controles
ActiveX, consulte el captulo 28, Acceso a la API de Visual FoxPro.
Es posible que al programar una aplicacin se de cuenta de que otros programas son apropiados para
llevar a cabo ciertas tareas. Por ejemplo, Microsoft Word tiene posibilidades nicas para combinacin
de correspondencia, mientras que Microsoft Excel est optimizado para calcular frmulas complejas
y crear fcilmente grficos a partir de ellas.
En lugar de emular estas posibilidades en Visual FoxPro, puede convertir su aplicacin en una
solucin a nivel empresarial integrndolas en ella. As puede resolver las necesidades de su
aplicacin usando la mejor aplicacin para llevarlas a cabo.
Puede integrar la funcionalidad de otras aplicaciones en Visual FoxPro de las formas siguientes:
l Ejecute un asistente de Visual FoxPro que ponga los datos de Visual FoxPro a la disposicin de
otra aplicacin.
l Escriba programas de Visual FoxPro que usen Automatizacin para comunicarse y compartir
datos con otros programas para Windows y controlarlos.
Las siguientes secciones proporcionan detalles sobre estos mtodos de extender las posibilidades de
Visual FoxPro.
Usar asistentes
Varios asistentes de Visual FoxPro le permiten integrar datos de Visual FoxPro con la funcionalidad
de otros programas para Windows. Por ejemplo, puede enviar cartas modelo a sus clientes con el
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 28 de 35
de otros programas para Windows. Por ejemplo, puede enviar cartas modelo a sus clientes 705
conofel804
Asistente para combinar correspondencia. Cuando ejecute el asistente, puede especificar una tabla o
vista que contenga datos de Visual FoxPro para usar y, a continuacin, exportar los datos a un
formato de archivo apropiado (como delimitado por comas, por ejemplo) o especificar que el
programa procesador de textos use el controlador ODBC de Visual FoxPro para tener acceso a los
datos. Si usa Microsoft Word, el asistente incluso iniciar el programa procesador de textos, crear el
documento de combinacin en blanco y mostrar la barra de herramientas Combinar correspondencia
para que vincule campos con los datos de Visual FoxPro.
Asimismo, con Microsoft Excel y Microsoft Query, puede analizar sus datos mediante una tabla
dinmica, que resume datos en columnas y le permite reorganizarlos para mostrarlos de distintas
maneras. Con el Asistente para tablas dinmicas de Visual FoxPro, puede usar los datos de su
aplicacin como origen de datos para Microsoft Excel y generar la tabla dinmica en Microsoft
Excel.
Usar la Automatizacin
Una forma ms eficaz de interactuar con otras aplicaciones es usar la Automatizacin. Con
programas de Visual FoxPro, puede tener acceso a los objetos expuestos por otras aplicaciones y
despus controlarlos estableciendo sus propiedades y llamando a sus mtodos. Por ejemplo,
Microsoft Excel expone un objeto Application as como hojas, columnas, filas y celdas del objeto
Application. Puede manipular directamente cualquiera de estos objetos, obteniendo datos de ellos o
estableciendo datos en ellos. Adems, normalmente puede controlar el objeto Application con todos
los comandos disponibles en el programa. Por ejemplo, administrando el objeto Application en
Microsoft Excel puede abrir, guardar o imprimir hojas, llamar al Asistente para grficos de Microsoft
Excel, etc.
La Automatizacin es una forma particularmente atractiva y eficaz de unir programas para Windows
por varias razones:
l Tiene acceso directo al otro programa, incluyendo todos sus objetos y comandos.
l Puede compartir datos directamente con el otro programa sin tener que exportarlos o
convertirlos a otro formato.
l Puede controlar el otro programa con el modelo familiar de propiedades y mtodos.
l El otro programa no tiene que estar visible necesariamente cuando lo llame. Por ejemplo,
puede llamar a Microsoft Excel, colocar algunos datos en celdas, ejecutar un clculo complejo
en los datos, leer el resultado y, a continuacin, mostrarlo en Visual FoxPro, todo sin mostrar
Microsoft Excel. El usuario seguira viendo exclusivamente Visual FoxPro, a menos que
quisiera mostrar Microsoft Excel explcitamente.
l Los comandos (mtodos y propiedades) para controlar el otro programa estn incrustados en
programas de Visual FoxPro familiares. No tiene que aprender un lenguaje de programacin
diferente para poder controlar el otro programa.
La Automatizacin es particularmente eficaz porque es un mtodo ilimitado para trabajar con otros
programas. En esencia, la Automatizacin simplemente pone a su disposicin los datos y comandos
de otras aplicaciones, para que las use de la forma ms apropiada para su aplicacin.
Un simple escenario ilustra cmo puede integrar varios programas para Windows. Suponga que
almacena los datos de clientes y ventas en Visual FoxPro. Le gustara crear un informe de ventas que
resuma las ventas trimestrales.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 29 de 35
706 of 804
Una solucin sera usar la Automatizacin para copiar los datos de ventas de Visual FoxPro a celdas
de una hoja de Microsoft Excel. Entonces puede llamar el asistente para grficos de Microsoft Excel
para crear un grfico de los datos y copiarlos al Portapapeles de Windows. An usando
Automatizacin, puede llamar a Microsoft Word y crear o abrir un documento de informe de ventas
(si lo crea como un documento nuevo, puede insertar texto estndar almacenado en Visual FoxPro) y,
a continuacin, pegarlo en el grfico creado en Microsoft Excel.
Esto es slo una de las formas de usar la Automatizacin para convertir Visual FoxPro en parte de
una solucin a nivel empresarial. Familiarizndose con los objetos y mtodos disponibles en
programas que usa tpicamente, se le pueden ocurrir muchas ms formas de hacer que cada programa
mejore las posibilidades de los otros. Para obtener detalles sobre la Automatizacin, consulte
"Manipular objetos con la Automatizacin" en el captulo 16, Agregar OLE.
Las posibilidades de tablas de datos e indexado de Visual FoxPro son generalmente ms apropiadas
para los requisitos de una aplicacin si le importan la velocidad y el tamao de bases de datos. Sin
embargo, a veces desear extender Visual FoxPro con datos almacenados en otros formatos. Esto
puede ocurrir si:
l La aplicacin tiene que tener acceso a datos heredados que crea y mantiene una aplicacin
existente. Por ejemplo, suponga que, como parte de su aplicacin de ventas, necesita acceso a
datos que mantiene una aplicacin de contabilidad que se program con un lenguaje diferente,
tal vez incluso en una plataforma diferente.
l Puede optimizar el acceso a datos con un servidor de base de datos, que puede acelerar el
acceso a datos, particularmente para bases de datos muy grandes.
l Desea compartir datos con otros programas y, por lo tanto, desea almacenar los datos en un
formato accesible a todos los programas.
l Los datos se ajustan mejor al formato de un programa concreto (como una hoja de clculo).
Esto puede ser verdad, por ejemplo, si su aplicacin slo requiere accesos ocasionales a datos
que mantenidos por el otro programa.
Si los datos que necesita estn en formato de hoja de clculo, documento de procesador de textos u
otro programa para Windows, puede tener acceso a los mismos a travs de la Automatizacin. Por
ejemplo, puede hacer esto si su aplicacin requiere un conjunto de cartas modelo. En ese caso, las
cartas pueden estar almacenadas como documentos de Microsoft Word y su aplicacin usara
Automatizacin para llamar a Word, abrir la carta apropiada e insertar o reemplazar texto cuando sea
necesario.
Una aproximacin ms comn al uso de datos externos a Visual FoxPro es usar ODBC para tener
acceso a los mismos. Los controladores ODBC le permiten conectarse a los datos en el formato de
otros programas, tpicamente otros programas de base de datos y consultarlos o modificarlos
mediante comandos SQL estndar.
Por ejemplo, podra decidir que las posibilidades de seguridad y procesamiento de transacciones son
una parte vital de su aplicacin, por lo que desea almacenar los datos con Microsoft SQL Server. Para
tener acceso a los datos, defina una conexin a SQL Server mediante el controlador ODBC. Entonces
podr ejecutar consultas normales (y otros comandos SQL) como si los datos estuvieran en formato
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 30 de 35
707 of 804
podr ejecutar consultas normales (y otros comandos SQL) como si los datos estuvieran en formato
de Visual FoxPro.
Otras aplicaciones pueden tener acceso a los mismos datos y aprovechar las mismas caractersticas.
Por ejemplo, una hoja de Microsoft Excel puede obtener sus datos de la misma base de datos de SQL
Server. La hoja no slo se beneficiar de las mismas ventajas de rendimiento que su aplicacin,
tambin puede aprovechar las caractersticas de seguridad y procesamiento de transacciones del
servidor, que no estn disponibles de otro modo en una hoja Microsoft Excel.
En algunos casos, es posible que desee llegar ms lejos y usar comandos SQL especficos del origen
de datos al que tiene acceso con ODBC. Por ejemplo, Microsoft SQL Server le permite crear y
ejecutar procedimientos almacenados, que pueden manipular datos en el servidor (en lugar de en su
aplicacin). Para beneficiarse de los procedimientos almacenados, puede enviar instrucciones SQL
"nativas" al servidor de base de datos. los comandos de paso a travs de SQL tambin le permiten
realizar tareas de administracin del sistema en el servidor y en algunos casos se ejecutarn ms
rpido que comandos SQL similares ejecutados en Visual FoxPro.
Para obtener ms detalles sobre cmo extender las posibilidades de almacenamiento de datos de
Visual FoxPro, consulte la documentacin indicada en la tabla siguiente.
Puede elegir guardar sus datos en tablas de Visual FoxPro o en otra plataforma, como un servidor de
base de datos. O puede hacer ambas cosas: guardar los datos en tablas de Visual FoxPro mientras
programa o hasta que la base de datos se haga muy grande y despus mover los datos (hacer un
upsizing) a otra plataforma.
Por ejemplo, puede modelar su aplicacin conservando todos los datos en tablas locales de Visual
FoxPro. Esto le proporciona la flexibilidad de modificar sus tablas, vistas e ndices cuando programa
la aplicacin sin la complejidad de administrar tablas en un servidor de base de datos. Puede guardar
datos de ejemplo en las tablas locales para probar los formularios, informes y otros programas.
Cuando la estructura de la base de datos est terminada, puede hacer un upsizing de los datos a un
servidor de base de datos y enviar a produccin la aplicacin.
Otra forma de trabajar es guardar los datos en tablas de Visual FoxPro slo mientras sea prctico.
Cuando la base de datos se hace grande, puede hacer un upsizing y aprovechar el rendimiento
optimizado proporcionado por un servidor de base de datos. El punto en el que tiene sentido hacer un
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 31 de 35
708 of 804
optimizado proporcionado por un servidor de base de datos. El punto en el que tiene sentido hacer un
upsizing de la base de datos depende de muchos factores, incluyendo la complejidad de la base de
datos, el rendimiento de su equipo local o de la red y las exigencias de la aplicacin.
Finalmente puede modelar la base de datos en Visual FoxPro y, a continuacin, hacer un upsizing
para compartir los datos con otras aplicaciones que tambin pueden tener acceso a un servidor de
base de datos. De forma similar, puede hacer un upsizing de la base de datos para aprovechar la
seguridad y las posibilidades de procesamiento de transacciones por parte del servidor del servidor de
base de datos.
Para obtener ms detalles sobre el upsizing de bases de datos, consulte el captulo 20, Upsizing de
bases de datos de Visual FoxPro.
Visual FoxPro funciona bien en este papel porque puede ofrecer su motor de base de datos, que
proporciona acceso rpido a datos a otras aplicaciones. Adems, puede ofrecer sus objetos y
comandos a otros programas, incluyendo objetos personalizados que puede crear.
Una forma de que una aplicacin a nivel empresarial aproveche Visual FoxPro es usar el motor de
base de datos de Visual FoxPro para almacenar y administrar datos. Esto proporciona
almacenamiento de alto rendimiento y posibilidad de consulta para otros programas.
Los programas pueden conectarse a datos de Visual FoxPro mediante el controlador ODBC de Visual
FoxPro. Este controlador ofrece el motor de bases de datos de Visual FoxPro para comandos SQL
estndar.
Por ejemplo, una aplicacin podra usar Microsoft Excel como herramienta de clculo para anlisis
de datos complejos. Si los datos que hay que manipular son muy flexibles, es posible que haga ms
sentido almacenarlos en una base de datos en lugar de en una hoja de clculo. Entonces la hoja se
podra crear de modo que use el controlador ODBC de Visual FoxPro para conectarse a la base de
datos, extraer la informacin relevante y mostrarla en una hoja para su procesamiento posterior.
Otro ejemplo podra ser una aplicacin quiosco, como un stand de informacin en un aeropuerto o un
centro de convenciones. Podra crear la presentacin de informacin mediante un programa de
creacin multimedia. Pero si algunos de los datos de la aplicacin cambian a menudo, sera incmodo
cambiar pginas de la presentacin. En lugar de ello, el programa de presentacin podra conectarse a
una base de datos de Visual FoxPro mediante el controlador ODBC y extraer los datos en tiempo de
ejecucin.
Para obtener ms informacin, vea la Ayuda Controlador ODBC de Visual FoxPro (Drvvfp.hlp)
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 32 de 35
709 of 804
Para obtener ms informacin, vea la Ayuda Controlador ODBC de Visual FoxPro (Drvvfp.hlp)
instalada en el directorio ...\Vfp98\Distrib\Src\System. Tambin est disponible en el grupo de
programas ODBC si instal ODBC durante la instalacin de Visual FoxPro.
Adems de poner los datos de Visual FoxPro a la disposicin de otros programas como parte de una
solucin empresarial, puede ofrecer los objetos y comandos de Visual FoxPro. Otras aplicaciones
pueden llamar a los mtodos y propiedades de conjunto de los objetos de Visual FoxPro; incluyendo
no slo los objetos de base, sino tambin los objetos definidos en clases personalizadas.
Por ejemplo, puede crear una aplicacin en Microsoft Excel que almacene datos en una base de datos
de Visual FoxPro. Adems, para simplificar la lectura y escritura de datos, Microsoft Excel puede
llamar a los comandos de Visual FoxPro para mostrar un formulario como un cuadro de dilogo. Una
posible utilizacin es reunir datos para una vista parametrizada.
Otra forma de ofrecer objetos Visual FoxPro es crear un servidor de Automatizacin. Esto le permite
crear objetos especficos de la aplicacin que pueden realizar casi cualquier funcin que pueda
programar en Visual FoxPro, con la ventaja de que puede distribuir el servidor.
Un uso para un servidor personalizado es crear un objeto que incluya un conjunto de reglas de
negocios que aseguren la integridad de los datos que le pase otra aplicacin. Por ejemplo, puede crear
un objeto en Visual FoxPro para almacenar informacin de empleados que no slo valide que la
aplicacin ha pasado informacin de empleados vlida, sino que compruebe el nivel de acceso del
usuario para asegurar que el usuario tiene acceso de seguridad para hacer los cambios de empleado.
Un servidor personalizado tambin puede ofrecer un objeto que incorpore lgica compleja para
actualizar o leer informacin. Por ejemplo, es posible que un objeto de entrada de pedidos pueda no
slo almacenar el pedido, sino tambin mantener un registro de transacciones de pedidos, un
inventario de actualizaciones, calcular una comisin de ventas, etc.
Este tipo de servidor de Automatizacin es ideal para crear la "capa intermedia" de una aplicacin
empresarial de tres niveles. En este modelo, los datos forman el nivel ms bajo y la aplicacin forma
el ms alto. La funcionalidad est en el medio, y proporciona una vista especfica independiente de la
aplicacin de los datos que incorpora reglas de negocios (u otras posibilidades de proceso de datos)
que no pertenecen exactamente a los datos ni a la aplicacin.
Adems de crear la aplicacin en Visual FoxPro, puede usar el programa para crear y mantener un
almacn de datos o una versin de sus datos optimizada para informes. Para crear un almacn de
datos hace una copia de los datos necesarios para realizar informes y, a continuacin, los pone a
disposicin de los usuarios que los necesiten. Manteniendo estos datos separados de los datos
actuales puede:
l Estructurarlos para hacer que la elaboracin de informes sea ms fcil y ms rpida que si los
usuarios crearan informes a partir de los datos actuales.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 33 de 35
710 of 804
usuarios crearan informes a partir de los datos actuales.
l Colocar datos para informes en una ubicacin distinta que los datos actuales, lo cual reduce el
contenido de datos, mejora el rendimiento y pone los datos a disposicin de usuarios que no
deberan ver los datos actuales por motivos de seguridad.
Un almacn de datos es un "snapshot" de los datos obtenido cuando los crea. Usted actualiza los
datos del almacn peridicamente, programando la actualizacin de acuerdo con las necesidades de
informe de su aplicacin.
Por ejemplo, suponga que est creando una aplicacin para administrar una biblioteca, incluyendo un
inventario de materiales. Durante el da, el sistema se usa constantemente a medida que los clientes
sacan e introducen material, y consultan el sistema para buscar o reservar libros. Adems de
administrar estas transacciones individuales, los bibliotecarios desean poder analizar su biblioteca
para determinar hechos como qu libros son ms populares, que libros estn con atraso, etc.
Para obtener el mayor beneficio de un almacn de datos, lo crea en un servidor distinto de los datos
actuales. Si los datos actuales y el almacn de datos estn en el mismo servidor, an puede
beneficiarse de tener los datos optimizados en el almacn. Sin embargo, a medida que los usuarios
hacen consultas al almacn, pueden generar una gran cantidad de trfico de red que podra afectar al
rendimiento del sistema actual.
Cuando crea el almacn de datos, puede simplemente copiar los archivos actuales sobre los archivos
paralelos del almacn de datos. De forma alternativa, puede reestructurar los datos del almacn para
optimizarlos con el fin de hacer informes. Por ejemplo, puede querer crear ndices para el almacn
que reducen la sobrecarga de informes.
Como otro ejemplo, los datos de una aplicacin deberan normalizarse para evitar la duplicacin de
datos. Sin embargo, podra ser til combinar tablas en el almacn de datos que de otro modo seran
independientes; esto puede eliminar la necesidad de combinar tablas, facilitando la creacin de
informes para usuarios menos experimentados.
Tambin puede ajustar el nivel de detalle del almacn de datos a los requisitos de creacin de
informes de su aplicacin. Para mayor flexibilidad, debera almacenar el mismo nivel de detalle en el
almacn de datos que el que tiene en los datos actuales. Sin embargo, si los usuarios quisieran crear
slo informes resumen (como hojas electrnicas o grficos), podra eliminar los datos detallados de la
aplicacin y almacenar nicamente datos resumidos en el almacn de datos.
Usar Visual FoxPro como motor de bsqueda del World Wide Web
Si su solucin empresarial incluye la creacin de un servidor World Wide Web para Internet, puede
incorporar Visual FoxPro a la aplicacin como motor de bsqueda. Esto le permite poner la eficacia
de su base de datos de Visual FoxPro a la disposicin de cualquiera que pueda tener acceso a su
servidor Web a travs de Internet o a travs de intranet en la empresa.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 34 de 35
711 of 804
servidor Web a travs de Internet o a travs de intranet en la empresa.
Por ejemplo, suponga que como parte de su intranet a nivel de empresa quiere hacer que est
disponible un directorio de empleados. Los empleados podran apuntar con sus exploradores a una
pgina "Buscar el empleado", que mostrara una pgina con la apariencia de un formulario de Visual
FoxPro, con cuadros de texto para introducir criterios. Para realizar una bsqueda, los usuarios
escribiran el nombre del empleado, la extensin de telfono, el departamento, el cargo o cualquier
otra informacin disponible y, a continuacin, elegiran un botn Buscar ahora. En unos instantes
veran un listado de los empleados que cumplen los criterios de bsqueda. Podran guardar la lista
como archivo de texto que podra importar otro programa, como un procesador de textos.
En general, para usar Visual FoxPro como servidor de informacin para el Web, necesitar estos
componentes:
l Un servidor Web con servicio HTTP, que ejecute el sistema operativo Microsoft Windows NT.
l Una aplicacin de Visual FoxPro que se pueda llamar como servidor de automatizacin. Esta
aplicacin se puede ejecutar en cualquier servidor al que tenga acceso el servidor Web.
l Un medio que muestre resultados de bsqueda, que normalmente consiste en una plantilla de
pgina Web en la que puede insertar datos.
La secuencia usual de eventos que implica una bsqueda de Visual FoxPro en el Web es:
2. El usuario elige un botn "Buscar ahora". Los datos de un formulario cumplimentado se envan
a un servidor Web para ser procesados, junto con el nombre de la aplicacin de bsqueda de
pginas Web.
3. El servidor Web llama a su aplicacin mediante el protocolo ISAPI (Internet Server API),
pasndole un parmetro que contiene la informacin de bsqueda.
4. La aplicacin busca la base de datos. Cuando obtiene resultados, los inserta en una plantilla de
pgina Web y, a continuacin, enva la pgina Web al servidor otra vez como una secuencia de
caracteres.
Si ha creado pginas Web, la mayor parte de los pasos de este proceso le resultarn familiares. Por
ejemplo, es posible que ya sepa cmo crear pginas Web. Incluso si an no est familiarizado con el
diseo de pginas Web, probablemente encontrar bastante fcil el proceso de crear ests pginas.
Para ver un ejemplo de cmo usar Visual FoxPro como motor de bsqueda de Web, vea el ejemplo
Foxisapi.dll del directorio ...\Samples\Vfp98\Servers\Foxisapi de Visual Studio. Lea el archivo
README.TXT de ese directorio para obtener detalles sobre cmo ejecutar el ejemplo.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 10: Crear soluciones empresariales Pgina 35 de 35
712 of 804
README.TXT de ese directorio para obtener detalles sobre cmo ejecutar el ejemplo.
file://C:\temp\~hh11EF.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 1 de 92
713 of 804
Los captulos siguientes describen las caractersticas nuevas de Visual FoxPro 6.0. Estas
caractersticas aceleran y facilitan ms que nunca la creacin de aplicaciones de Visual FoxPro y le
permiten crear aplicaciones para Internet e intranets.
Use arrastrar y colocar de OLE para programar aplicaciones que le permitan mover datos entre
aplicaciones para Windows y dentro de una aplicacin de Visual FoxPro. Cree aplicaciones y
servidores de Visual FoxPro para su uso con Internet.
Adems, Visual FoxPro 6.0 facilita la creacin de aplicaciones para su uso con Internet y otros
programas para Windows, como Microsoft Excel y Microsoft Visual Basic. Visual FoxPro 6.0
permite crear documentos activos que pueden alojarse en contenedores de documentos activos, como
exploradores de Internet.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 2 de 92
714 of 804
Visual FoxPro 6.0 proporciona servidores de Automatizacin mejorados para trabajar con Internet,
Microsoft Transaction Server y Active Desktop.
Tenga en cuenta que las versiones anteriores de Visual FoxPro admitan la funcionalidad de arrastrar
y colocar para los controles mediante programacin, lo que permita mover los controles en un
formulario. Esta forma de arrastrar y colocar se mantiene en Visual FoxPro 6.0. Sin embargo, si elige
implementar la tcnica de arrastrar y colocar en sus aplicaciones, debe usar slo una de las dos
tcnicas, arrastrar y colocar controles mediante programacin o la tcnica arrastrar y colocar de OLE,
sin mezclar ambos tipos.
Para arrastrar y colocar datos entre aplicaciones y controles se utiliza el mouse (ratn). Por ejemplo,
puede seleccionar un conjunto de archivos en el Explorador de Windows. A continuacin, puede
mantener presionado el botn del mouse mientras los arrastra y despus liberarlo para colocar los
archivos en el Administrador de proyectos de Visual FoxPro; o bien, puede seleccionar texto en un
documento de Word y colocarlo en un cuadro de texto de un formulario de Visual FoxPro. Durante la
operacin arrastrar y colocar de OLE, el cursor del mouse cambia de forma para indicar que la
operacin est en curso.
Origen de arrastre
La aplicacin o control desde el que se mueven los datos se denomina origen de arrastre.
En la siguiente tabla se indican las propiedades, eventos y mtodos disponibles para un origen de
arrastre OLE.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 3 de 92
715 of 804
La aplicacin o control al que se mueven los datos se denomina destino para colocar.
En la tabla siguiente se indican las propiedades, eventos y mtodos disponibles para un destino para
colocar OLE.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 4 de 92
716 of 804
colocacin.
Propiedad OLEDropMode Especifica la forma en que un destino para colocar
administra las operaciones colocar de OLE.
Mover datos
Para realizar una operacin de arrastrar y colocar con el fin de mover datos con el botn
predeterminado del mouse (principal), seleccione los datos que desee mover en el origen de arrastre.
Una vez seleccionados los datos, mantenga presionado el botn del mouse mientras desplaza el
puntero hasta el destino de colocacin. Suelte el botn del mouse para colocar los datos en el destino.
Durante la operacin arrastrar y colocar de OLE, el cursor del mouse cambia de forma para indicar
que la operacin est en curso.
Tambin puede hacer clic con el botn no predeterminado del mouse (secundario) en los datos del
origen de arrastre y arrastrarlos hasta un destino de colocacin. En funcin del destino, al colocar los
datos puede aparecer un men contextual con un conjunto de opciones que permiten elegir la forma
en que se van a procesar los datos en el destino de colocacin.
Copiar datos
Tambin puede copiar datos desde un origen de arrastre y pegarlos en un destino para colocar.
Presione la tecla Ctrl mientras hace clic con el mouse en los datos seleccionados en el origen de
arrastre. En el cursor del mouse aparecer un signo ms (+) mientras se arrastran los datos, para
indicar que se est realizando una copia.
Slo se puede mover o copiar datos desde un origen de arrastre compatible con la tcnica arrastrar y
colocar de OLE hasta un destino de colocacin que tambin admita dicha caracterstica. Tenga en
cuenta que aunque un destino de colocacin admita la tcnica arrastrar y colocar de OLE, ello no
implica que acepte los datos que desee colocar en l. Por ejemplo, es posible que los datos que desea
mover o copiar tengan un formato que no es compatible con el destino de colocacin. En las
operaciones de arrastrar y colocar, el cursor se transforma en el smbolo No colocar (un crculo
tachado) para indicar que el mouse se encuentra en una rea de una aplicacin o de un control en el
que no se pueden colocar los datos.
Para cancelar una operacin arrastrar y colocar de OLE, presione ESC mientras la efecta.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 5 de 92
717 of 804
Propiedades.
En la tabla siguiente se indican las caractersticas de tiempo de diseo de Visual FoxPro que admiten
la tcnica arrastrar y colocar de OLE, junto con una descripcin de su uso.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 6 de 92
718 of 804
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 7 de 92
719 of 804
Existen dos tcnicas arrastrar y colocar de OLE disponibles para los controles de Visual FoxPro: el
modo intrnseco y el modo manual. En el primero, Visual FoxPro controla intrnsecamente la
operacin arrastrar y colocar de OLE. En el modo manual, las operaciones arrastrar y colocar de OLE
se controlan mediante programacin. Los eventos que se producen estn determinados por el modo
utilizado. Si desea obtener ms informacin, vea la seccin "Modos intrnseco y manual Arrastrar y
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 8 de 92
720 of 804
colocar de OLE".
En las versiones anteriores de Visual FoxPro se utilizaba la tcnica de arrastrar y colocar mediante
programacin para los controles, lo que permita mover los controles de un formulario. Este modo de
arrastrar y colocar sigue siendo compatible. Si utiliza los valores predeterminados de las propiedades
OLEDragMode y OLEDropMode, podr ejecutar las aplicaciones existentes como antes, sin ningn
cambio.
El objeto DataObject
El objeto DataObject es un contenedor para los datos que se transfieren desde un origen de arrastre
OLE hasta un destino para colocar OLE y slo existe mientras se realiza la operacin arrastrar y
colocar de OLE. El objeto DataObject no se puede crear mediante programacin y las referencias al
mismo dejan de ser vlidas al finalizar la operacin de arrastrar y colocar. El objeto DataObject se
pasa como parmetro oDataObject en los eventos OLEStartDrag, OLEDragOver, OLEDragDrop y
OLESetData.
El objeto DataObject puede almacenar varios conjuntos de datos, cada uno con un formato distinto.
Puede usar el mtodo GetFormat para determinar si existe un formato especfico en el objeto
DataObject. Consulte Mtodo GetFormat para ver una lista con los formatos que admite el objeto
DataObject.
El objeto DataObject tiene mtodos que permiten manipular mediante programacin los datos que se
arrastran y colocan. En la tabla siguiente se indican los mtodos disponibles en tiempo de ejecucin
para el objeto DataObject.
Mtodo Descripcin
ClearData Borra todos los datos y formatos del objeto DataObject de la operacin
arrastrar y colocar de OLE.
GetData Recupera los datos del objeto DataObject de la operacin arrastrar y colocar
de OLE.
GetFormat Determina si hay datos con el formato especificado disponibles en el objeto
DataObject de la operacin arrastrar y colocar de OLE.
SetData Establece los datos y el formato de los mismos en el objeto DataObject de
la operacin arrastrar y colocar de OLE.
SetFormat Establece un formato de datos, sin los datos, en el objeto DataObject de la
operacin arrastrar y colocar de OLE.
Visual FoxPro admite dos modos de arrastrar y colocar de OLE para los controles: el modo intrnseco
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 9 de 92
721 of 804
y el modo manual. En el primero, las operaciones arrastrar y colocar de OLE las controla Visual
FoxPro. En el modo manual, las operaciones se controlan mediante programacin.
El modo intrnseco arrastrar y colocar de OLE se puede implementar en una aplicacin para
proporcionar compatibilidad con la tcnica arrastrar y colocar de OLE sin necesidad de programacin
adicional.
1. Asigne el valor 1 Automtico a la propiedad OLEDragMode del control para permitir que
ste acte como origen de arrastre OLE.
2. Asigne el valor 1 Activado a la propiedad OLEDropMode del control para permitir que ste
acte como destino para colocar OLE.
En las operaciones intrnsecas de arrastrar y colocar de OLE, Visual FoxPro determina si el destino
para colocar admite el formato de los datos que se intentan colocar en l. Slo se colocarn los datos
si el destino es compatible.
En la tabla siguiente se indican los controles de Visual FoxPro con los formatos de datos que admiten
como orgenes de arrastre en el modo intrnseco. Tenga en cuenta que CF_TEXT es texto, como el
que escribe en un cuadro de texto, y CFSTR_VFPSOURCEOBJECT es una referencia a tipo de
objeto para un control u objeto de Visual FoxPro. En el caso de los controles que admiten el formato
de datos CF_TEXT, puede arrastrar texto desde la parte de texto del control.
En la tabla siguiente se indican los controles de Visual FoxPro con los formatos de datos que admiten
como destinos para colocar en el modo intrnseco. En el caso de los controles, puede colocar texto en
la parte de texto del control. El texto se sita en el punto de insercin.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 10 de 92
722 of 804
Es posible que en algunos casos desee controlar el tipo de datos que se pueden colocar en un destino
para colocar o proporcionar una funcionalidad adicional a una operacin de arrastrar y colocar. Por
ejemplo, puede convertir los datos a un formato que el destino para colocar admita o puede mostrar
un cuadro de dilogo que pregunte al usuario si desea colocar los datos en el destino. En estos casos,
puede prescindir el modo intrnseco de arrastrar y colocar de OLE para lograr un mayor control sobre
las operaciones de arrastrar y colocar.
Para implementar el modo manual de arrastrar y colocar de OLE para un control, anule los eventos o
mtodos de arrastrar y colocar que desee controlar; para ello, escriba su propio cdigo para cada
evento o mtodo. Incluya la palabra clave NODEFAULT en el cdigo del evento o mtodo para pasar
por alto el comportamiento intrnseco de Visual FoxPro al arrastrar y colocar.
La compatibilidad con aplicaciones existentes de versiones anteriores (sin arrastre OLE) se consigue
cuando el valor de OLEDragMode es 0 (valor predeterminado) y no se incluye cdigo adicional para
operaciones arrastrar y colocar de OLE.
Documentos activos
Visual FoxPro 6.0 permite crear documentos activos. Los documentos activos permiten ver
documentos con formato distinto de HTML en un contenedor explorador de Web, como Microsoft
Internet Explorer. La tecnologa de documentos activos permite ver varios tipos de documentos de
diversos orgenes en un mismo contenedor de documentos activos.
Un documento activo es un tipo especfico de documento OLE que se puede incrustar. Se muestra en
todo el rea cliente de un contenedor de documentos activos y sus mens se combinan con los del
contenedor. El documento activo ocupa todo el marco y est siempre activo en contexto.
l Los comandos de mens y de barras de herramientas del documento activo se pueden dirigir al
contenedor de documentos activos.
l Los documentos activos proporcionan integracin directa con otras pginas Web cuando se ven
en Internet Explorer.
l Los documentos activos suponen un paso adelante en la evolucin desde las aplicaciones
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 11 de 92
723 of 804
clientes puras de Visual FoxPro a las aplicaciones Active Platform que utilizan una interfaz de
cliente basada en HTML.
Los documentos activos de Visual FoxPro se crean fcilmente. Un documento activo de Visual
FoxPro, como cualquier otra aplicacin de Visual FoxPro, puede manipular datos, ejecutar
formularios, informes y etiquetas, crear instancias de clases y ejecutar cdigo.
Un documento activo de Visual FoxPro es una aplicacin (.app) creada desde un proyecto de Visual
FoxPro. Las versiones anteriores de Visual FoxPro ya permitan crear aplicaciones, por lo que es
posible que est familiarizado con el proceso. Si desea obtener ms informacin sobre la creacin de
aplicaciones, consulte el captulo 13, Compilar una aplicacin, en el Manual del programador.
Puede ejecutar cualquier aplicacin en Internet Explorer. Sin embargo, slo las aplicaciones basadas
en la clase de base ActiveDoc, descrita ms adelante, admiten las propiedades, eventos y mtodos que
permiten la comunicacin con el contenedor de documentos activos.
Los documentos activos de Visual FoxPro son ligeramente diferentes de otras aplicaciones (.app). La
diferencia ms destacada es que el archivo principal de un documento activo debe ser una clase
basada en la clase base ActiveDoc. Otros tipos de aplicaciones requieren que el archivo principal sea
un programa o un formulario.
Una clase basada en la clase de base ActiveDoc se crea con el Diseador de clases y sirve como base
para todos los documentos activos de Visual FoxPro. La clase de base ActiveDoc proporciona las
propiedades, eventos y mtodos para un documento activo, as como la comunicacin con el
contenedor de documentos activos. Por ejemplo, el evento ContainerRelease se produce cuando un
contenedor libera un documento activo. Puede incluir cdigo en este evento para cerrar archivos,
completar transacciones y realizar otras tareas de limpieza antes de liberar el documento activo.
Para establecer como archivo principal una clase basada en la clase de base ActiveDoc
1. Agregue al proyecto la biblioteca de clases visuales (.vcx) que contiene la clase basada en la
clase de base ActiveDoc.
2. Expanda la jerarqua de la biblioteca de clases visuales (.vcx); para ello, haga clic en el cuadro
ms (+) situado a la izquierda del nombre de la biblioteca o haga clic con el botn secundario
del mouse en la biblioteca y elija Expandir todo en el men contextual.
3. Seleccione la clase basada en la clase de base ActiveDoc. Haga clic con el botn secundario del
mouse en la clase y elija Establecer principal en el men contextual.
El objeto ActiveDoc
Cuando se ejecuta un documento activo de Visual FoxPro Active en Internet Explorer, se crea un
objeto ActiveDoc a partir de la clase de base ActiveDoc. Este objeto responde a los eventos y
llamadas a mtodos de la clase de base ActiveDoc.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 12 de 92
724 of 804
En las tablas siguientes se indican las propiedades, eventos y mtodos que admite el objeto
ActiveDoc.
Propiedades
Eventos
Mtodos
Cuando se abre una aplicacin de tipo documento activo en Internet Explorer, se ejecuta el
documento activo y se produce su evento Init. A continuacin, se produce el evento ShowDoc del
documento activo. Cuando Internet Explorer aloja correctamente el documento activo, se produce el
evento Run del mismo. En general, el cdigo del programa de documento activo debe situarse en este
evento. Normalmente, el evento Run contiene cdigo que ejecuta los mens, ejecuta el formulario
principal de la aplicacin y contiene READ EVENTS para iniciar el procesamiento de los eventos,
como en una aplicacin Visual FoxPro estndar.
Puede incluir cdigo de configuracin en el evento Init del documento activo, pero si tarda demasiado
tiempo en ejecutarse, es posible que el contenedor del documento activo genere un error de tiempo de
espera. Si incluye cdigo de configuracin en el evento Init, no debe requerir interaccin del usuario
ni crear una interfaz de usuario.
El evento HideDoc ocurre al desplazarse desde un documento activo y el evento ShowDoc se produce
al volver al mismo.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 13 de 92
725 of 804
Si se cierra Internet Explorer cuando aloja el documento activo, se producir el evento HideDoc y, a
continuacin, el evento ContainerRelease. Este ltimo evento tambin se produce si el documento
activo queda fuera de la memoria cach de Internet Explorer 3.0.
Cuando se produce el evento ContainerRelease, el cdigo de programa del evento puede realizar las
siguientes acciones:
l Cerrar archivos, limpiar su rastro y ejecutar QUIT para cerrar el documento activo.
Se han agregado a Visual FoxPro dos nuevas funciones, GETHOST( ) e ISHOSTED( ), para
proporcionar informacin sobre el contenedor de un documento activo. GETHOST( ) devuelve la
referencia de un objeto al contenedor de un documento activo. ISHOSTED( ) devuelve un valor
lgico que indica si un documento activo se encuentra en un contenedor.
La interfaz de usuario de un documento activo de Visual FoxPro est definida por su cdigo de
programa. En general, un formulario de Visual FoxPro debe mostrarse como interfaz de usuario
inicial. Las siguientes propiedades, eventos y mtodos de formulario se han agregado a Visual
FoxPro para que los formularios funcionen correctamente con documentos activos.
Propiedades
AlwaysOnBottom ContinuousScroll HscrollSmallChange
Scrollbars TitleBar ViewPortHeight
ViewPortLeft ViewPortTop ViewPortWidth
VscrollSmallChange
Eventos
Scrolled
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 14 de 92
726 of 804
Mtodos
SetViewPort
Los formularios de un documento activo se muestran en el rea cliente que ofrece Internet Explorer.
Para hacer que un formulario se muestre completamente en el rea cliente de Internet Explorer,
asigne los siguientes valores a las propiedades de formulario que se indican a continuacin:
Adems, si se van a mostrar barras de desplazamiento cuando el rea de cliente de Internet Explorer
sea ms pequea que el rea de visualizacin del documento activo (el rea determinada por un
rectngulo que incluye todos los controles del formulario), debe asignar el siguiente valor a la
propiedad Scrollbars:
Si se ejecuta cdigo de mens en un documento activo de Visual FoxPro, los mens se combinan con
los mens de Internet Explorer, conforme a unas reglas de combinacin de mens especficas.
Cuando se hayan combinado los mens del documento activo con los de Internet Explorer, los
primeros se vern como en una aplicacin normal de Visual FoxPro.
Negociar mens
Cuando se abre un documento activo en Internet Explorer, el espacio para mens de Internet Explorer
se comparte y los mens se combinan. Los mens combinados se dividen en seis grupos y cada uno
de ellos pertenece a Internet Explorer, al documento activo, o a ambos.
Grupo Propietario
Grupo Archivo Internet Explorer
Grupo Edicin Documento activo
Grupo Contenedor Internet Explorer
Grupo Objeto Documento activo
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 15 de 92
727 of 804
Grupo Ventana Internet Explorer
Grupo Ayuda Documento activo o Internet Explorer
El documento activo comparte su men Ayuda con Internet Explorer. Si Internet Explorer tiene un
men Ayuda, el documento activo puede agregar el suyo al final del men Ayuda de Internet
Explorer.
Se ha mejorado la clusula DEFINE PAD NEGOTIATE para permitir especificar la forma en que se
produce la negociacin de los mens en un documento activo. Una nueva segunda opcin,
cPosicinObjeto, especifica la ubicacin del ttulo de un men en la barra de mens de Internet
Explorer.
Se ha mejorado el cuadro de dilogo Opciones de la accin del Diseador de mens para permitir
especificar la negociacin de los mens creados en el Diseador de mens e incluidos en documentos
activos. Se ha agregado un cuadro desplegable Objeto, que especifica la forma de negociar el ttulo
del men cuando Internet Explorer acta como contenedor de un documento activo de Visual FoxPro.
La informacin sobre la negociacin de mens se almacena en el campo Location del archivo .mnx
de cada men. En la tabla siguiente se indican los valores de este campo y el tipo de negociacin que
representa cada uno. Para obtener ms informacin sobre cPosicinContenedor y cPosicinObjeto,
vea DEFINE PAD.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 16 de 92
728 of 804
8 Ninguna Centro
9 Izquierda Centro
10 Centro Centro
11 Derecha Centro
12 Ninguna Derecha
13 Izquierda Derecha
14 Centro Derecha
15 Derecha Derecha
Tenga en cuenta que el tamao del campo Location se ha aumentado de 1 a 2 dgitos en Visual
FoxPro 6.0. ste es el nico cambio en Visual FoxPro 6.0 en las estructuras de las tablas, incluidas
las tablas de bases de datos (.dbc), de formularios (.scx), de etiquetas (.lbx), de proyectos (.pjx), de
informes (.frx) y bibliotecas de clases visuales (.vcx).
Para ejecutar los documentos activos de Visual FoxPro son necesarios los archivos Vfp6.exe y
Vfp6run.exe, o Vfp6run.exe, Vfp6r.dll y Vfp6res.dll (es indica que se trata de la versin en espaol).
Estos archivos deben estar instalados y registrados en el equipo en el que est instalado Internet
Explorer. Cuando se instala Visual FoxPro, Vfp6.exe se instala en el directorio de Visual FoxPro y
los archivos restantes en el directorio Windows\System de Windows 95 o en el directorio
WinNT\System32 de Windows NT.
El men Herramientas de Visual FoxPro contiene el comando Ejecutar documento activo que
muestra el cuadro de dilogo Ejecutar documento activo, en el que puede especificar cmo se va a
ejecutar un documento activo. Estn disponibles las siguientes opciones:
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 17 de 92
729 of 804
Opcin Descripcin
En el explorador El documento activo se ejecuta en Internet Explorer en el entorno
(Predeterminada) de tiempo de ejecucin de Visual FoxPro.
Independiente El documento activo se ejecuta como una aplicacin independiente
con el entorno de tiempo de ejecucin de Visual FoxPro.
En el explorador (Depuracin) El documento activo se ejecuta en Internet Explorer con el
ejecutable de Visual FoxPro (Vfp6.exe). Estarn disponibles las
herramientas de depuracin, la ventana Comandos y todas las
caractersticas del entorno de programacin de Visual FoxPro.
Independiente (Depuracin) El documento activo se ejecuta como una aplicacin independiente
con el ejecutable de Visual FoxPro (Vfp6.exe). Estarn
disponibles las herramientas de depuracin, la ventana Comandos
y todas las caractersticas del entorno de programacin de Visual
FoxPro.
Tambin puede ejecutar un documento activo si lo abre en el cuadro de dilogo Abrir archivo de
Internet Explorer o si se desplaza hasta el documento activo desde otra pgina Web que contenga un
vnculo al mismo.
Desde Visual FoxPro puede ejecutar un documento activo si hace doble clic en el icono del mismo en
el Explorador de Windows. Tambin puede ejecutar un documento activo desde una aplicacin en el
entorno de tiempo de ejecucin de Visual FoxPro. El entorno de tiempo de ejecucin de Visual
FoxPro consta de dos archivos, Vfp6run.exe y Vfp6r.dll. Ambos deben estar instalados y registrados
para poder ejecutar documentos activos. Tambin se puede utilizar el entorno de tiempo de ejecucin
para ejecutar otros archivos Visual FoxPro distribuibles, como programas de Visual FoxPro
compilados (archivos .fxp), por ejemplo.
Una vez registrado, puede utilizar Vfp6run.exe para ejecutar directamente documentos activos (y
otros archivos Visual FoxPro distribuibles).
Sintaxis de Vfp6run.exe
Argumentos
/embedding
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 18 de 92
730 of 804
Carga Vfp6run.exe como un servidor de documentos activos. En este modo, Vfp6run.exe se registra
como servidor COM capaz de crear un objeto de tipo documento activo de Visual FoxPro
("Visual.FoxPro.Application.6"). Sin este argumento, Vfp6run.exe no acta como servidor COM.
/regserver
Registra Vfp6run.exe.
/unregserver
/security
/s
/version
NombreArchivo
Regsvr32 Vfp6r.dll
La opcin /security del entorno de tiempo de ejecucin de Visual FoxPro Vfp6run.exe permite
establecer niveles de seguridad para los documentos activos y para otros archivos de aplicacin
(.app). Al ejecutar Vfp6run.exe /security aparece el cuadro de dilogo Configuracin de
seguridad de aplicaciones, en el que puede establecer niveles de seguridad para los documentos
activos y para otros archivos .app.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 19 de 92
731 of 804
Alojado
Elija esta opcin de modo de aplicacin para especificar el nivel de seguridad de un documento
activo o de una aplicacin (.app) que se ejecute desde un contenedor de documentos activos, como
Internet Explorer.
No alojado
Elija esta opcin de modo de aplicacin para especificar el nivel de seguridad de un documento
activo o de una aplicacin (.app) que se ejecute desde el Explorador de Windows al hacer doble clic
en su icono o que se ejecute con el entorno de tiempo de ejecucin de Visual FoxPro, Vfp6run.exe.
Elija esta opcin para impedir que se ejecute un documento activo o una aplicacin (.app).
Elija esta opcin para que aparezca una advertencia antes de que se ejecute un documento activo o
una aplicacin (.app). sta es la opcin predeterminada para los documentos activos y aplicaciones
que no se ejecutan en un contenedor.
Elija esta opcin para ejecutar un documento activo o una aplicacin (.app) sin que aparezca ninguna
advertencia. sta es la opcin predeterminada para los documentos activos y aplicaciones que se
ejecutan en un contenedor.
Restablecer
Aceptar
Con el fin de aumentar el rendimiento, Internet Explorer 3.0 guarda en memoria cach las cuatro
ltimas pginas visitadas. Esto significa que un documento activo puede quedar fuera de la memoria
cach de Internet Explorer 3.0 y se producir el evento ContainerRelease. Internet Explorer 4.0 no
mantiene una memoria cach de pginas, de forma que el evento ContainerRelease se produce en
cuanto abandona el documento activo.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 20 de 92
732 of 804
La aplicacin de ejemplo Solutions de Visual FoxPro incluye un ejemplo llamado Crear documentos
activos para el Web que ilustra muchas de las caractersticas de los documentos activos.
DO (HOME(2) + 'solution\solution')
o bien
1. Despus de iniciar Solution.app, haga doble clic en Nuevas caractersticas de Visual FoxPro
6.0.
2. Haga clic en Crear documentos activos para el Web y, a continuacin, haga clic en el botn
Ejecutar ejemplo.
El ejemplo Crear documentos activos para el Web permite abrir un proyecto que contiene todos los
archivos necesarios para crear un documento activo desde un proyecto. Cuando el proyecto est
abierto, puede examinar el cdigo de la clase Actdoc para ver cmo se administran los eventos de
documentos activos y cmo se ejecutan los formularios. Tenga en cuenta que Actdoc, una clase
basada en la clase de base ActiveDoc, es el archivo principal del proyecto. Un documento activo debe
tener como archivo principal una clase basada en la clase de base ActiveDoc.
Tambin puede generar un documento activo desde el proyecto; para ello, elija Generar en el
Administrador de proyectos. Una vez generado el documento activo, elija Ejecutar documento
activo en el men Herramientas para ejecutarlo.
Visual FoxPro permite crear servidores de Automatizacin: aplicaciones de componentes que ofrecen
funcionalidad que otras aplicaciones pueden usar y reutilizar a travs de Automatizacin. Por
ejemplo, con Visual FoxPro puede crear un servidor de Automatizacin que muestre formularios
reutilizables (en un ejecutable fuera de proceso) o que empaquete una rutina compleja en un
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 21 de 92
733 of 804
componente simple disponible para otros programadores. Adems, puede crear una o ms clases para
controlar las normas de negocios de toda una compaa. Una aplicacin cliente que utilice los objetos
de normas de negocios pasar los parmetros de entrada de una llamada a un mtodo y el servidor de
Automatizacin realizar numerosas operaciones para recuperar o almacenar datos de diversas
fuentes y realizar clculos complejos antes de devolver los resultados.
En los temas siguientes se describen las caractersticas nuevas y mejoradas de los servidores de
Automatizacin en Visual FoxPro 6.0.
Los servidores de Automatizacin de Visual FoxPro son compatibles ahora con el modelo de
subprocesamiento controlado. Microsoft Transaction Server aprovecha la funcionalidad de los
servidores marcados como servidores de subprocesamiento controlado y ofrece una mejor proteccin
y escalabilidad de subprocesos.
En cada objeto del modelo controlado (por ejemplo, un servidor de Automatizacin de Visual
FoxPro) slo puede entrar el subproceso que lo cre (por ejemplo, con la llamada a CoCreateInstance
en Microsoft Visual C++). Sin embargo, un servidor de objetos, como Microsoft Transaction Server,
puede admitir mltiples objetos, en cada uno de los cuales entran simultneamente subprocesos
diferentes. Los datos comunes que mantiene el servidor de objetos se deben proteger contra
colisiones entre subprocesos. El servidor de objetos crea un objeto del modelo de subprocesamiento
controlado en el mismo subproceso que llam a CoCreateInstance. Las llamadas al objeto desde el
subproceso controlado no estn resueltas.
La nueva caracterstica del modelo de subprocesamiento controlado requiere que los servidores de
Automatizacin .dll en proceso no tengan interfaces de usuario. En Visual FoxPro 5.0 era posible
(aunque no recomendable) crear un servidor de Automatizacin .dll en proceso con una interfaz de
usuario, como un formulario. El formulario slo se poda mostrar ya que los eventos del formulario
no eran compatibles. En Visual FoxPro 6.0, cualquier intento de crear una interfaz de usuario en un
servidor de Automatizacin .dll en proceso producir un error.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 22 de 92
734 of 804
Por el contrario, un servidor de Automatizacin .exe fuera de proceso s puede tener una interfaz de
usuario. Se ha agregado una nueva funcin a Visual FoxPro 6.0, SYS(2335), que permite desactivar
los eventos modales de un servidor de Automatizacin .exe fuera de proceso de forma que se pueda
ejecutar de forma remota sin intervencin del usuario. Los eventos modales se crean mediante
formularios modales definidos por el usuario, cuadros de dilogo del sistema, la funcin
MESSAGEBOX( ), el comando WAIT, etc.
Visual FoxPro 6.0 permite ahora el enlace en tiempo de compilacin (vtable) adems de la interfaz
IDispatch existente (lo que se conoce conjuntamente como interfaz dual). El enlace en tiempo de
ejecucin (vtable) mejora el rendimiento de los controladores de Automatizacin que admiten esta
tcnica, como Visual Basic y Microsoft Transaction Server.
Ya no hay un nico entorno de tiempo de ejecucin de Visual FoxPro 6.0, Vfp6r.dll, que d servicio a
mltiples servidores de Automatizacin .dll en proceso. Cada .dll en proceso utiliza ahora una
instancia independiente del entorno de tiempo de ejecucin Vfp6r.dll. Las reglas siguientes
determinan la forma en que las .dll en proceso utilizan el entorno de tiempo de ejecucin Vfp6r.dll:
l La .dll en proceso que se llam en primer lugar tiene el uso exclusivo de la biblioteca del
entorno de tiempo de ejecucin Vfp6r.dll (normalmente instalada en la carpeta System de
Windows 95 o en la carpeta System32 de Windows NT).
l Si una .dll en proceso ya tiene el uso exclusivo de Vfp6r.dll, por cada nueva .dll en proceso que
se llame se crear en el disco y se cargar en memoria una copia de Vfp6r.dll con un nombre
diferente. El nombre asignado al entorno de tiempo de ejecucin Vfp6r.dll se basa en el
nombre de la biblioteca .dll en proceso. Por ejemplo, si se llama a una .dll en proceso
denominada Miservidor.dll, se asignar a la copia de Vfp6r.dll el nombre Miservidorr.dll
(observe la r anexada al nombre), y se cargar en memoria para dar servicio a la .dll en
proceso.
l Los entornos de tiempo de ejecucin de Visual FoxPro slo cambian de nombre para las .dll en
proceso que se ejecutan en el mismo proceso. Esto significa que dos clientes independientes,
cada uno ejecutndose en su propio proceso, pueden cargar dos .dll en proceso diferentes de
Visual FoxPro sin cambiar el nombre del entorno de tiempo de ejecucin. En este caso, ambas
.dll en proceso de Visual FoxPro utilizarn Vfp6r.dll ya que los clientes se cargan en procesos
separados.
Bibliotecas de tipos
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 23 de 92
735 of 804
Visual FoxPro 6.0 admite ahora propiedades, eventos y mtodos intrnsecos (de Visual FoxPro) en
bibliotecas de tipos de servidores de Automatizacin. Solamente las propiedades declaradas como
Public se incluyen en la biblioteca de tipos. Las propiedades protegidas y ocultas no aparecen en la
biblioteca. Tenga en cuenta que el mtodo Release de Visual FoxPro no est incluido en la biblioteca
de tipos, pues ya existe como mtodo COM.
Tanto los mtodos como las propiedades PUBLIC personalizadas definidas por el usuario aparecen
en las bibliotecas de tipos de Visual FoxPro, siempre que estn marcadas como Public. Para los
mtodos, Visual FoxPro incluye tambin un tipo de valor de retorno (de tipo variant) y una lista de
parmetros (de tipo variant) que se analizan a partir de la definicin del mtodo original.
Tenga en cuenta que en Visual FoxPro 6.0 slo puede designarse un archivo de Ayuda como
biblioteca de tipos.
Tratamiento de excepciones
Los servidores de Automatizacin de Visual FoxPro son ahora ms robustos, por lo que pueden
terminar una operacin con menos problemas cuando se produce una excepcin. Cuando ocurre una
excepcin en un servidor de Automatizacin de Visual FoxPro 6.0, el servidor establece el objeto
COM ErrorInfo (a travs de IErrorInfo) y cancela el mtodo actual. El cliente de Automatizacin
tiene la opcin de liberar el servidor de Automatizacin de Visual FoxPro o tratar la excepcin,
dependiendo de la informacin del objeto COM ErrorInfo (y el cliente tiene acceso al objeto COM
ErrorInfo).
Una nueva funcin agregada a Visual FoxPro 6.0, COMRETURNERROR( ), permite tratar los
errores que se producen en un servidor de Automatizacin. COMRETURNERROR( ) se puede usar
en el mtodo Error; rellena la estructura de la excepcin COM con informacin que los clientes de
Automatizacin pueden utilizar para determinar el origen de los errores de servidor de
Automatizacin. Para obtener ms informacin, consulte COMRETURNERROR( ) en la Referencia
del lenguaje.
Pasar matrices
Visual FoxPro 5.0 pasa por valor las matrices a los objetos COM (por ejemplo, los servidores de
Automatizacin creados con Visual FoxPro, Visual Basic o Visual C); los elementos de las matrices
son los mismos despus de una llamada a un mtodo y los cambios en el objeto COM no se propagan
a los elementos del cliente. Esta restriccin evita el paso de grandes cantidades de datos entre Visual
FoxPro 5.0 y los objetos COM.
Adems, se asume que la matriz pasada al objeto COM hace referencia al primer elemento, fila y
columna con el nmero uno (por ejemplo, Mimatriz[1]). Sin embargo, algunos objetos COM
requieren que la matriz pasada haga referencia al primer elemento, fila y columna con el nmero cero,
como Mimatriz [0].
Una nueva funcin de Visual FoxPro 6.0, COMARRAY( ), permite especificar la forma de pasar una
matriz a un objeto COM y si est basada en cero o en uno. Para obtener ms informacin, consulte
COMARRAY( ) en la Referencia el lenguaje.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 24 de 92
736 of 804
Tenga en cuenta que COMARRAY( ) slo se utiliza cuando se pasan matrices a objetos COM con la
sintaxis siguiente:
oObjetoCom.Metodo(@MiMatriz)
Debido a que los servidores de Automatizacin .dll en proceso y .exe fuera de proceso se invocan a
travs de la creacin de instancias de clases, no es necesario especificar un archivo principal para los
mismos. En Visual FoxPro 6.0 puede generar un servidor de Automatizacin .dll en proceso o .exe
fuera de proceso sin tener que especificar primero un archivo principal en el Administrador de
proyectos.
Lenguaje
En la tabla siguiente se muestran las propiedades y funciones que se han agregado a Visual FoxPro
6.0 para facilitar la administracin de clientes y servidores de Automatizacin. Para obtener ms
informacin, consulte los temas indicados.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 25 de 92
737 of 804
servidor de Automatizacin mtodo de un servidor Automation de Visual FoxPro.
SYS(2335) Modo de servidor sin Activa o desactiva el uso de estados modales en los
supervisin servidores de Automatizacin .exe distribuibles de Visual
FoxPro.
El objeto Application
Visual FoxPro 6.0 incluye dos servidores de Automatizacin ISAPI de ejemplo, FoxWeb y FoxIS.
Estos ejemplos administran el envo de registros seleccionados de datos de Visual FoxPro con
formato HTML a un explorador de Internet. Para obtener ms informacin sobre estos ejemplos, vea
FoxISAPI: ejemplo de servidor OLE.
Galera de componentes
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 26 de 92
738 of 804
Galera de componentes
La Galera de componentes es un contenedor de catlogos de objetos de software tales como
bibliotecas de clases, formularios, botones, etctera. Tambin contiene nuevas clases de Visual
FoxPro. Puede utilizar la Galera de componentes para organizar los componentes por objetos,
proyectos, aplicaciones u otros agrupamientos. Estos agrupamientos visuales pueden personalizarse
dinmicamente de forma que pueda utilizar, duplicar o reorganizar los componentes de varias
clasificaciones en la Galera de componentes. Puede tener acceso a un elemento especfico desde
cualquier punto de la Galera de componentes en el que coloque una referencia al mismo. Tambin
puede tener varias referencias a un mismo objeto en distintos catlogos o carpetas. Por ejemplo, un
botn puede aparecer en una o ms categoras de proyecto de la Galera de componentes
(representadas como carpetas), pero tambin puede ser visible en una categora llamada
"Herramientas" que contenga referencias a todos los botones que utilice.
Puede utilizar la Galera de componentes con todas las funciones que proporcionan los componentes
independientes Administrador de proyectos, Examinador de clases y la barra de herramientas
Controles de formularios. Cada uno de los restantes componentes de Visual FoxPro proporciona un
enfoque muy especfico de los proyectos o clases desde el entorno especial del archivo de proyecto o
de la biblioteca de clases. La Galera de componentes permite administrar las relaciones entre los
componentes y muchos de sus comportamientos, desde un nivel abstracto de diseo y tambin desde
una perspectiva de programacin ms concreta.
La Galera de componentes puede contener cualquier elemento visual de Visual FoxPro, como
documentos locales y remotos, archivos o carpetas, servidores de Automatizacin del tipo Microsoft
Excel y Word, y ubicaciones y archivos HTML. Tambin puede incluir archivos .prg con cdigo de
miniprogramas, clases, asistentes, generadores o elementos grficos.
- O bien -
Puede utilizar la Galera de componentes para crear proyectos y aplicaciones, y tambin para
administrar su desarrollo. La Galera de componentes permite organizar los componentes que
contiene y puede utilizar sus plantillas, generadores y asistentes para crear el proyecto o la aplicacin
deseados.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 27 de 92
739 of 804
En el caso de los catlogos y carpetas, seleccione las fichas y opciones para realizar el cambio que
desee. Si desea ms informacin, vea el cuadro de dilogo Opciones de la Galera de componentes.
Puede mover los elementos del panel derecho (Objeto) de la ventana de la Galera de componentes
hasta el escritorio o hasta un proyecto o formulario abierto. El Administrador de proyectos reconoce
el elemento al que se refiere la Galera de componentes y lo coloca en el lugar apropiado. Los
elementos de la Galera de componentes colocados en el escritorio no son funcionales. No hay
ninguna representacin en el escritorio para las bases de datos, carpetas y elementos de la Galera de
componentes que representan archivos no visuales.
En la tabla siguiente se identifican los elementos de galera incluidos en Visual FoxPro, as como sus
comportamientos predeterminados.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 28 de 92
740 of 804
Vdeo (_VideoItem) 3
ActiveX (_ActiveXItem)
Datos (_DataItem) 4
Plantilla (_TemplateItem) 5
Catlogo (_CatalogItem) 8
Ejemplo (_SampleItem)
Proyecto (_ProjectItem) 11
Puede hacer clic con el botn secundario en un elemento seleccionado del panel derecho (Objeto)
para que aparezca un men contextual de elemento con todas las acciones correspondientes, como
Agregar al proyecto o Agregar al formulario. Puede utilizar el men contextual para modificar o,
en algunos casos, ejecutar el elemento de galera. Los mens contextuales son caractersticos de cada
tipo de elemento de la galera. Puede cambiar algunas de las propiedades del elemento seleccionado
con la opcin Propiedades del men contextual, que abrir el cuadro de dilogo Propiedades de
elemento.
Organizar los componentes de Visual FoxPro o Windows en grupos definidos por el usuario
Al representar los elementos de la Galera de componentes elementos reales que pueden ser objetos o
clases, para revisarlos o modificarlos puede lograr el acceso al objeto original a travs de la Galera
de componentes.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 29 de 92
741 of 804
Se abrir el Examinador de clases, en el que puede ver las propiedades y mtodos de la clase
seleccionada.
Puede utilizar la Galera de componentes para duplicar o modificar formularios y para agregar
formularios y otros elementos de galera a un proyecto.
l Haga doble clic en cualquier plantilla, o bien seleccione Nuevo formulario en el men
contextual de cualquier plantilla de la carpeta Formularios de la Galera de componentes.
- O bien -
- O bien -
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 30 de 92
742 of 804
incluido en la Galera de componentes. Un catlogo es una representacin visual de los elementos que
pertenecen a un grupo de Visual FoxPro o a un grupo definido por el usuario. Dentro de cada
catlogo, puede crear carpetas para organizar con ms detalle subgrupos de elementos. Los elementos
pueden ser formularios, consultas, programas, plantillas, archivos grficos, archivos de sonido u otros
objetos. El catlogo predeterminado de Visual FoxPro en la Galera de componentes incluye
elementos agrupados en varias categoras, como formularios y controles, entre otros. Tambin
incluye una carpeta vaca llamada Favoritos, que puede utilizar para crear o copiar en ella elementos
de la galera. Puede copiar y cambiar el nombre del catlogo predeterminado, o crear los suyos
propios.
Catlogo Descripcin
VFPGLRY Contiene componentes que utilizan otros catlogos de la galera.
Contiene todos los catlogos incluidos con Visual FoxPro.
Catlogo predeterminado y global.
Visual FoxPro Contiene las clases Visual FoxPro Foundation Classes.
Catlogo predeterminado.
Favoritos Carpeta vaca.
Catlogo global.
Mis clases de base Contiene clases derivadas de las clases de base de Visual FoxPro.
Catlogo predeterminado.
ActiveX Catlogo dinmico que contiene una lista de todos los controles
ActiveX registrados, o bien una lista de todos los controles
ActiveX de Visual FoxPro.
Catlogo predeterminado.
World Wide Web Coleccin de direcciones URL de sitios Web.
Multimedia Diversos elementos con imgenes, sonidos y vdeos que puede
utilizar en sus aplicaciones.
Ejemplos Referencias a los ejemplos Solutions, Tastrade, servidores
ActiveX y cliente-servidor.
Al hacer clic en un catlogo en la vista de lista, el panel derecho (Objeto) muestra su contenido.
Puede abrir otros catlogos si hace doble clic en ellos en uno de los dos paneles. En la carpeta Galera
se incluyen varios catlogos.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 31 de 92
743 of 804
5. La Galera de componentes agregar el catlogo al rbol para que pueda empezar a utilizarlo
como lo hara con cualquier otro catlogo existente.
Vistas de Web
Puede especificar direcciones URL o archivos como catlogos o elementos de galera. Al configurar
un elemento como carpeta de galera, se abrir automticamente como vista de Web en el panel
Objeto (derecho) al seleccionarlo en el panel Catlogo.
2. En el campo Carpeta dinmica, especifique el nombre de la pgina Web o del archivo como
se hace en los ejemplos siguientes:
http:\\www.microsoft.com\
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 32 de 92
744 of 804
archivo:\\c:\mis documentos\paginatest.htm
archivo:\\c:\mis documenotss\archword.doc
Al resaltar el icono de vista Web en el panel Catlogo, la barra de herramientas se modifica para
incluir los botones de navegacin por el Web. La vista de Web reflejar la configuracin del
Explorador de Windows.
Puede especificar un directorio como carpeta o catlogo de galera que tiene las caractersticas del
Explorador de Windows.
C:\Mis documentos\
Nota Esta especificacin crea una vista de archivos reales, a diferencia de otras vistas de la Galera
de componentes. En esta vista s puede eliminar archivos del disco.
Para crear una vista a nivel de explorador que mantenga la proteccin de los archivos mostrados,
especifique el destino con una designacin de comodn, como en el ejemplo siguiente:
C:\Mis documentos\*.*
Evite el uso de comodines para crear carpetas dinmicas cuando prevea encontrar ms de 512
elementos, a no ser que disponga de un equipo rpido con gran cantidad de RAM.
La Galera de componentes consta de una interfaz, cuyas clases estn contenidas en Vfpglry.vcx y de
elementos que hacen referencia a las clases Visual FoxPro Foundation Classes siguientes:
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 33 de 92
745 of 804
operaciones con matrices que no realizan
las funciones de matrices nativas.
Cancel Button Libera un formulario y descarta los datos _miscbtns.vcx
que queden almacenados en bfer.
Clock Control de reloj simple para un formulario _datetime.vcx
o contenedor.
Conflict Catcher Cuadro de dilogo para resolver los _dataquery.vcx
conflictos de filas que aparezcan al
modificar con almacenamiento optimista
en bfer.
Cookies Class Clase simple de Web para el tratamiento _internet.vcx
de cookies entre pginas Web.
Cross Tab Genera una tabla de referencias cruzadas. _utility.vcx
Data Edit Buttons Conjunto completo de botones de Wizbtns.vcx
modificacin (como los que utilizan los
Asistentes para formularios).
Data Navigation Buttons Grupo de botones de exploracin Top, _datanav.vcx
Next, Prev, Bottom y clase DataChecker
para comprobar si hay conflictos al mover
registros.
Data Navigation Object Objeto de exploracin no visual que otras _table.vcx
clases pueden utilizar.
Data Session Manager Administra sesiones de datos y se ocupa _app.vcx
de las actualizaciones.
Data Validation Intercepta conflictos de datos _datanav.vcx
almacenados en bfer.
DBF -> HTML Convierte un cursor de Visual FoxPro _internet.vcx
(.dbf) a HTML.
Distinct Values Combo Realiza una bsqueda de valores nicos en _dataquery.vcx
el campo origen del control para rellenar
un cuadro combinado.
Error Object Tratamiento genrico de errores que _app.vcx
funciona con cdigo de objeto y tambin
con cdigo procedimental.
Field Mover Cuadro de lista supermover que carga _movers.vcx
automticamente campos del origen de
datos actual.
File Registry Proporciona un conjunto de funciones de Registry.vcx
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 34 de 92
746 of 804
registro que devuelven informacin
especfica de la aplicacin.
File Version Recupera informacin de los datos de _utility.vcx
versin de un archivo.
Filter Button Muestra un cuadro de dilogo en el que _table2.vcx
especificar un filtro de datos para un
campo determinado.
Filter Dialog Cuadro de dilogo que permite especificar _table.vcx
condiciones de filtrado de los datos.
Filter Expression Dialog Crea un cuadro de dilogo para _table.vcx
expresiones de filtro avanzadas.
Find (Findnext) Buttons Conjunto de botones Buscar/Buscar _table.vcx
siguiente genrico.
Find Button Busca un registro que satisfaga criterios _table.vcx
especficos.
Find Dialog Cuadro de dilogo Buscar con opciones _table.vcx
simples, tales como eleccin de campos.
Find Files/Text Utiliza el objeto COM Filer.DLL para _utility.vcx
buscar archivos.
Find Object Crea un objeto genrico que busca un _table.vcx
registro con criterios especficos.
Font Combobox Cuadro combinado que contiene las _format.vcx
fuentes disponibles. Tambin lo utilizan
las clases tbrEditing y rtfControls.
Fontsize Combobox Cuadro combinado que contiene los _format.vcx
tamaos de fuente disponibles. Tambin
lo utilizan las clases tbrEditing y
rtfControls.
Format Toolbar Proporciona una barra de herramientas _format.vcx
para aplicar formato de fuente al texto del
control activo.
FRX -> HTML Convierte el resultado de un informe de _internet.vcx
Visual FoxPro (.frx) al formato HTML.
GetFile and Directory Recupera un nombre de archivo y de _controls.vcx
carpeta.
Goto Dialog Button Crea un botn que muestra el cuadro de _table2.vcx
dilogo Ir a.
Goto Dialog Crea un cuadro de dilogo Ir a registro. _table.vcx
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 35 de 92
747 of 804
Graph By Record Object Grupo de botones de exploracin que _utility.vcx
permite actualizar un nuevo grfico por
cada registro instantneamente.
Graph Object Genera un grfico con el motor del Autgraph.vcx
Asistente para grficos.
Help Button Muestra el archivo de Ayuda mientras _miscbtns.vcx
comienza a buscar el HelpContextID
especificado.
Hyperlink Button Inicia un explorador de Web desde un _hyperlink.vcx
botn.
Hyperlink Image Inicia un explorador de Web desde una _hyperlink.vcx
imagen.
Hyperlink Label Inicia un explorador de Web desde una _hyperlink.vcx
etiqueta.
INI Access Conjunto de funciones de registro que Registry.vcx
permiten el acceso a las configuraciones
de archivo del antiguo tipo INI.
Item Locator Este botn abre un cuadro de dilogo con _dialogs.vcx
el que puede buscar un registro.
Keywords Dialog Crea un cuadro de dilogo similar al _dialogs.vcx
cuadro de palabras clave de la Galera de
componentes.
Launch Button Inicia una aplicacin con un documento _miscbtns.vcx
opcional.
Locate Button Muestra un cuadro de dilogo con el que _table2.vcx
buscar un registro.
Lookup Combobox Realiza una bsqueda de valores en un _dataquery.vcx
campo para rellenar un cuadro combinado.
Mail Merge Object Genera una combinacin de Word Mail Mailmerge.vcx
con el motor del Asistente para combinar
correspondencia.
Messagebox Handler Envoltura simple de la funcin _dialogs.vcx
MessageBox.
MouseOver Effects Resalta un control cuando pasa el mouse _ui.vcx
sobre l.
Mover Proporciona una clase sencilla de cuadro _movers.vcx
de lista con movimiento y botones
mover/quitar.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 36 de 92
748 of 804
Navigation Shortcut Menu Men contextual que puede colocarse en _table2.vcx
un formulario.
Navigation Toolbar Conjunto de botones de navegacin en _table2.vcx
una barra de herramientas.
Object State Determina el estado de un objeto y guarda _app.vcx
o restablece la configuracin de sus
propiedades.
ODBC Registry Conjunto de funciones de registro que Registry.vcx
devuelven informacin especfica de
ODBC.
Offline Switch Proporciona una vista de datos con _dataquery.vcx
conexin para su uso sin conexin.
OK Button Realiza una liberacin simple de _miscbtns.vcx
formulario.
Output Control Muestra un cuadro de dilogo complejo _reports.vcx
que solicita al usuario una opcin de
resultado de informe.
Output Dialog Muestra un cuadro de dilogo que solicita _reports.vcx
al usuario una opcin de resultado de
informe.
Output Object Diversas opciones de resultado de _reports.vcx
informe.
Password Dialog Sencillo cuadro de dilogo Contrasea _dialogs.vcx
para aplicaciones personalizadas.
Pivot Table Genera una tabla dinmica de Microsoft Pivtable.vcx
Excel con el motor del Asistente para
tablas dinmicas.
Preview Report Botn genrico para ejecutar un informe. _miscbtns.vcx
QBF Proporciona un conjunto de botones para _dataquery.vcx
consultas de tipo Consulta por formulario.
Registry Access Proporciona acceso a la informacin del registry.vcx
Registro de Windows.
Resize Object Hace que los objetos de un formulario _controls.vcx
cambien de tamao y posicin cuando se
produce el evento Resize del objeto Form.
RTF Controls Proporciona un conjunto de botones para _format.vcx
aplicar formato al texto del control activo.
Run Form Button Botn que ejecuta un formulario. _miscbtns.vcx
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 37 de 92
749 of 804
SCX -> HTML Convierte un formulario .scx al formato _internet.vcx
HTML.
SendMail Buttons Utiliza el control ActiveX de MAPI _miscbtns.vcx
ActiveX para enviar un mensaje de correo
desde un formulario.
Shell Execute Proporciona el comportamiento de doble _environ.vcx
clic del Explorador de Windows.
Shortcut Menu Class Esta clase de envoltura crea _menu.vcx
dinmicamente mens contextuales
emergentes.
Simple Edit Buttons Proporciona sencillos botones Agregar, Wizbtns.vcx
Modificar, Eliminar, Duplicar, Guardar y
Cancelar (como los de los Asistentes para
formularios).
Simple Navigation Buttons Proporciona un conjunto de botones de _table.vcx
exploracin Siguiente y Anterior.
Simple Picture Navigation Conjunto de botones de exploracin con _table2.vcx
Buttons imgenes sencillas.
Sort Button Muestra un cuadro de dilogo que permite _table2.vcx
ordenar los datos de un campo
determinado de forma ascendente o
descendente.
Sort Dialog Permite realizar una ordenacin _table2.vcx
ascendente o descendente de los datos de
un campo determinado.
Sort Mover Esta subclase de la clase cuadro de lista _movers.vcx
supermover se ocupa de la ordenacin de
los datos.
Sort Object Realiza una ordenacin de un origen de _table.vcx
datos.
Sort Selector Realiza una ordenacin ascendente o _table2.vcx
descendente, basada en el control actual.
Sound Player Esta clase carga y reproduce un archivo de _multimedia.vcx
sonido.
Splash Screen Proporciona una sencilla pantalla de inicio _dialogs.vcx
para aplicaciones personalizadas.
SQL Pass Through Proporciona paso a travs de SQL y _dataquery.vcx
permite ejecutar procedimientos
almacenados en la base de datos host.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 38 de 92
750 of 804
Stop Watch Proporciona un control de detencin de _datetime.vcx
inspeccin para un formulario o
contenedor.
String Library Realiza diversas conversiones de cadenas. _utility.vcx
Super Mover Proporciona los botones Mover, Quitar, _movers.vcx
Mover todos y Quitar todos.
System Toolbars Clase administrativa que maneja y hace un _app.vcx
seguimiento de las barras de herramientas
del sistema.
Table Mover Esta subclase de la clase cuadro de lista _movers.vcx
supermover carga automticamente tablas
y campos desde el origen de datos actual.
Text Preview Proporciona un visor del texto resultante. _reports.vcx
Thermometer Proporciona una clase termmetro _controls.vcx
estndar.
Trace Aware Timer Utilidad de aplicacin que determina si la _app.vcx
ventana de seguimiento est abierta.
Type Library La rutina principal ExportTypeLib crea un _utility.vcx
archivo de texto con el resultado Typelib.
URL Combo Crea un cuadro combinado para escribir _internet.vcx
en una direccin URL de Web. Inicia
Microsoft Internet Explorer y se sita en
el sitio correspondiente.
URL Open Dialog Proporciona un cuadro de dilogo que _internet.vcx
crea una lista desplegable con el historial
de direcciones URL.
VCR Buttons Grupo de botones de exploracin Top, _table.vcx
Next, Prev y Bottom.
VCR Picture Navigation Conjunto de botones de exploracin de _table2.vcx
Buttons imagen VCR.
Video Player Carga y reproduce un archivo de vdeo _multimedia.vcx
mediante comandos MCI.
Web Browser control Subclase de control Browser de Internet _webview.vcx
Explorer 4.0, que proporciona enganches
con el cdigo de Visual FoxPro.
Window Handler Realiza diversas operaciones comunes de _ui.vcx
ventanas habituales en las aplicaciones.
Si desea ms detalles sobre estas bibliotecas de clases, vea el tema Visual FoxPro Foundation Classes
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 39 de 92
751 of 804
. Puede obtener informacin sobre cmo utilizar estas clases en el tema Directivas para usar las
Visual FoxPro Foundation Classes.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 40 de 92
752 of 804
Informe (_ReportItem) Tipo para informes de Visual FoxPro (.frx).
Men (_MenuItem) Tipo para mens de Visual FoxPro (.mnx).
Programa (_ProgramItem) Tipo para programas de Visual FoxPro (.prg).
Proyecto (_ProjectItem) Tipo para proyectos de Visual FoxPro (.pjx).
Puede utilizar el Examinador de clases para examinar los detalles de cualquiera de las clases
anteriores.
Si desea ms informacin sobre otras clases utilizadas en la Galera de componentes, vea el tema
Visual FoxPro Foundation Classes o bien utilice el Examinador de clases para examinar las
bibliotecas de la carpeta Ffc.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 41 de 92
753 of 804
18 VIEWS Memo 4 No
19 KEYWORDS Memo 4 No
20 SRCALIAS Memo 4 No
21 SRCRECNO Numeric 6 No
22 UPDATED DateTime 8 No
23 COMMENT Memo 4 No
24 USER Memo 4 No
El analizador de trayecto de Visual FoxPro se divide en dos partes: un motor de trayecto que puede
utilizar o personalizar y una aplicacin multiventana que puede utilizar para analizar los programas y
proyectos.
La aplicacin Analizador de trayecto ofrece distintas formas de ver los datos que proporciona el
motor de trayecto. Coverage.app es una subclase del motor de trayecto. Puede automatizar el trayecto,
modificar la interfaz de usuario para adaptarla a sus necesidades, ejecutar el Analizador de trayecto en
modo no supervisado y no mostrar la ventana de la aplicacin o utilizar las caractersticas del motor
sin usar la interfaz.
Al iniciarse, la aplicacin de trayecto suspende el registro de trayecto activado con un comando SET
COVERAGE TO. Al liberar el objeto trayecto, la aplicacin permite elegir si se desea restablecer el
valor de SET COVERAGE.
El Analizador de trayecto utiliza un archivo de registro que genera Visual FoxPro al utilizar la opcin
Trayecto del men Herramientas del depurador o al utilizar SET COVERAGE TO como en el
comando siguiente:
Un archivo de registro de trayecto consta de registros dispuestos en lneas delimitadas por comas. En
la lista siguiente se describe la estructura de cada registro.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 42 de 92
754 of 804
Elemento Descripcin
1 tiempo de ejecucin
2 clase que ejecuta el cdigo
3 objeto, mtodo o procedimiento en el que se encuentra o se invoca el cdigo
4 nmero de lnea dentro del mtodo o procedimiento
5 archivo definido completamente
6 nivel de pila de llamada (slo Visual FoxPro 6.0)
Una vez especificado el nombre del archivo de registro, ejecute el programa o aplicacin que desee
examinar. Cuando termine el programa, puede utilizar el comando SET COVERAGE TO para
detener el flujo de datos hacia el registro de trayecto.
Para utilizar el Analizador de trayecto con el fin de examinar el trayecto de una aplicacin
1. Utilice la opcin Registro de trayecto del men Herramientas del depurador, o bien ejecute
el comando SET COVERAGE para iniciar el flujo de datos de trayecto y abrir el archivo para
registrar los datos.
Para utilizar el Analizador de trayecto con el fin de examinar el perfil de una aplicacin
1. Utilice el comando SET COVERAGE para iniciar el flujo de datos de trayecto y abrir el
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 43 de 92
755 of 804
archivo en el que va a registrar los datos.
4. Haga clic en el botn Modo perfil del cuadro de dilogo Analizador de trayecto.
Ejecute la aplicacin de trayecto con la opcin WITH y el nombre del archivo de registro como en el
ejemplo siguiente:
Ejecute la aplicacin de trayecto con la opcin WITH y especifique "verdadero" (.T.) para utilizar el
modo no supervisado, como en el ejemplo siguiente.
Ejecute la aplicacin de trayecto con la opcin WITH y el nombre del archivo de complemento, como
en el ejemplo siguiente:
Adems de ver la informacin de perfil, puede insertar en ella comentarios o marcas, y guardarla en
un archivo para utilizarla posteriormente.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 44 de 92
756 of 804
Tambin puede utilizar el cuadro de dilogo Opciones del Analizador de trayecto para modificar
las siguientes caractersticas del Analizador de trayecto:
Caracterstica Descripcin
Complementos Especifica si se deben registrar los complementos en el Analizador de
trayecto cuando se utilizan. Si desea ms informacin, vea la seccin
"Complementos del Analizador de trayecto".
Marcas de trayecto Especifica si el Analizador de trayecto debe marcar el cdigo que se
ejecuta o el que no se ejecuta.
Especifica los caracteres empleados para marcar el cdigo.
Especifica cundo se debe marcar el cdigo.
Fuentes Especifica las fuentes que utiliza el Analizador de trayecto para el
cdigo y las presentaciones.
Bsqueda inteligente Especifica si el Analizador de trayecto debe buscar automticamente
archivos en las ubicaciones especificadas anteriormente.
Modo inicial Especifica si el Analizador de trayecto se debe abrir en el modo
trayecto o en el modo perfil.
Para ayudar a asegurar que los archivos que procesa el Analizador de trayecto son los correctos:
l Establezca el directorio del proyecto como predeterminado antes de iniciar el registro del
trayecto, de forma que los archivos a los que haga referencia sean relativos a ese directorio.
l Evite el uso de archivos de origen cuyos nombres tengan exactamente la misma raz, incluso
cuando las extensiones sean distintas. Internamente, el Analizador de trayecto no puede
distinguirlos.
l Asegrese de que el proyecto slo contiene las versiones correctas de los archivos modificados
con frecuencia.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 45 de 92
757 of 804
distintos.
l Utilice RECOMPILE o Generar todo para obligar a compilar todo el cdigo fuente.
Algunas lneas del cdigo, como los comentarios, las instrucciones DEFINE CLASS y ELSE, as
como las lneas comprendidas entre TEXT y ENDTEXT no aparecen en los registros de trayecto, ya
que no son ejecutables ni siquiera potencialmente. Adems, las lneas interrumpidas por smbolos de
continuacin (caracteres punto y coma) se consideran como una sola lnea de cdigo y slo se marca
la ltima lnea que las forma.
Los complementos son archivos de cdigo (normalmente .prg o .scx) que proporcionan un mtodo
sencillo para reajustar el Analizador de trayecto. La subclase cov_standard del motor de trayecto que
engloba la interfaz de usuario de Coverage.app slo muestra una pequea parte de lo que puede hacer
con el motor. El motor analiza el registro de trayecto; mientras que cov_standard simplemente
muestra el resultado en una de las numerosas formas en que puede obtenerse.
Puede crear una subclase de cov_engine distinta con una presentacin muy diferente. Por ejemplo,
esa subclase podra mostrar un cuadro de dilogo que ejecutase consultas sobre las estadsticas de
trayecto reunidas por el motor. Las opciones de presentacin podran ofrecer una vista del cdigo
marcado para un conjunto filtrado de entradas del registro o nicamente un grfico con los resultados
del perfil.
Es posible que no encuentre conveniente usar otra subclase de cov_engine para crear una nueva
interfaz desde cero, ya que la clase cov_engine permite un proceso ms sencillo: puede agregar
funcionalidad a cov_standard o a cualquier otra subclase de cov_engine mediante complementos.
Cov_standard expone esta caracterstica a travs de un botn del cuadro de dilogo principal del
Analizador de trayecto. Al ejecutar un complemento en una instancia de cov_standard, como por
ejemplo el Analizador de trayecto, el complemento puede manipular la funcionalidad de cov_engine,
las tablas de trayecto y tambin cov_standard. Los complementos podran adems agregar nuevos
cuadros de dilogo y otras caractersticas a la interfaz visual de cov_standard.
Escribir complementos
Puede escribir complementos para mejorar la interfaz estndar o bien puede usar una subclase de
cov_standard para crear su propia interfaz, completamente nueva.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 46 de 92
758 of 804
l Mostrar un cuadro de dilogo aparte para tener acceso a una caracterstica del motor de trayecto
(observe ms abajo la limitacin sobre la forma de asegurarse de que el cuadro de dilogo
aparezca en el lugar correcto).
l Proporcionar una interfaz de consultas que utilice la tabla de origen y presente una lista con
todas las lneas que satisfagan los criterios, y que filtre y ordene el resultado.
l Agregar nombres de archivo al cursor IgnoredFiles para eliminarlos del anlisis, lo que puede
ahorrar tiempo.
l Registrar los complementos para recuperarlos y tener acceso a los mismos fcilmente desde
una lista.
El objeto Motor de trayecto mantiene en la propiedad aAddIns una lista con todos los
complementos registrados.
l Utilizar la informacin de los campos del archivo final coverage.log, la pila de llamadas, para
disear su propia interfaz o su propia vista del registro de trayecto.
l Puede utilizar cualquiera de los tipos de archivo admitidos como complementos. Los tipos de
archivo admitidos son .qpr, .qpx, .mpr, .mpx, .app, .exe, .scx, .fxp, .prg y los procedimientos (si
ya estn disponibles en una biblioteca de procedimientos abierta).
l El conjunto de formularios del Motor de trayecto tiene una barra de herramientas "invisible". Si
un complemento no es visual, puede utilizar esta barra de herramientas para que lo contenga. Si
el complemento es un control visual, probablemente el cuadro de dilogo principal de la
subclase estndar es el lugar ms adecuado para ubicarlo. De este modo su posicin y tamao
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 47 de 92
759 of 804
se sincronizar automticamente con el resto del cuadro de dilogo al cambiar el tamao de
ste.
l Todos los mtodos del motor que utilizan las tablas de origen y destino tienen argumentos
opcionales que permiten apuntarlos desde los alias correspondientes al trabajar con ellos.
Tambin puede cambiar el contenido actual de las propiedades cSourceAlias y cTargetAlias
para hacerlo coincidir con el par de cursores que le interesen. As podr comparar diversas
ejecuciones del registro de trayecto entre s desde la misma interfaz.
l Limitaciones:
l Los complementos deben aceptar un parmetro (el Motor de trayecto pasa una referencia
a s mismo).
l Los complementos deben ser de uno de los tipos de archivo permitidos indicados
anteriormente.
l Los procedimientos que utilice como complementos deben estar disponibles en una
biblioteca de procedimientos que se encuentre cargada (vea SET PROCEDURE). El
Motor no utiliza la sintaxis IN NombreArchivo y no llama a los procedimientos ni a los
archivos .prg como funciones, ni obtiene sus valores con RETURN. Tampoco utiliza las
palabras clave NAME o LINK en el comando DO FORM, por lo que puede administrar
usted mismo la referencia o hacer que el formulario sea miembro del conjunto de
formularios del Motor para que ste lo alcance automticamente.
l Si utiliza .RunAddIn desde la ventana Comandos, asegrese de que el marco del trayecto
sea el marco MDI activo antes de instanciar los formularios.
Puede crear una subclase del motor de trayecto, su subclase estndar. En la lista siguiente se describe
la estructura del conjunto de archivos de origen del proyecto COVERAGE.
Archivo Descripcin
Coverage.prg "Envoltura" del objeto trayecto, que instancia el objeto.
Coverage.vcx Todas las clases del motor y su subclase estndar.
Coverage.vct
Cov_short.mnx Men contextual.
Cov_short.mnt
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 48 de 92
760 of 804
Cov_pjx.frx Mecanismo predeterminado para obtener resultados a nivel de
Cov_pjx.frt proyecto.
Coverage.h Archivo de encabezado para todo el cdigo de trayecto, que
incorpora los elementos siguientes:
#INCLUDE COV_CHAR.H
#INCLUDE COV_LOCS.H
#INCLUDE COV_DLGS.H
#INCLUDE COV_SPEC.H
#INCLUDE COV_REGS.H
#INCLUDE COV_TUNE.H
El conjunto de archivos de origen del proyecto COVERAGE tambin incluye otros archivos .ico
.bmp y .msk.
Como el uso de complementos est gobernado por la superclase del motor de trayecto, cualquier otra
subclase de trayecto que cree podr utilizar complementos de la misma forma en que lo hace la
subclase estndar.
Si escribe su propia subclase del motor de trayecto, asegrese de que pueda utilizar la misma clase de
cuadro de dilogo modal (cov_AddInDialog) para tratar los complementos como lo hace la aplicacin
trayecto estndar. El cuadro de dilogo no se apoya en ninguna caracterstica de la subclase estndar.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 49 de 92
761 of 804
Puede llamar a un cuadro de dilogo modal distinto, establecer el nombre de archivo directamente en
la propiedad cAddIn o anular el contenido de esta propiedad al pasar el nombre del archivo de
complemento que desea ejecutar al mtodo RunAddIn( ).
Independientemente del modo en que logre el acceso a un complemento para ejecutarlo en una
subclase, puede observar la lista de complementos registrados en Coverage.app si busca los nombres
de los archivos en la propiedad aAddIns del motor de trayecto.
Si desea informacin sobre las propiedades, eventos y mtodos del motor de trayecto, vea Objeto
Motor de trayecto.
Las siguientes son algunas de las acciones que pueden realizarse sobre un proyecto mediante
programacin:
l Agregar archivos del proyecto a aplicaciones de control de cdigo fuente (como por ejemplo
Microsoft Visual SourceSafe) y proteger o desproteger archivos con control de cdigo fuente.
l Cambiar las propiedades de los servidores Automation (bibliotecas de vnculo dinmico, .dll o
archivos ejecutables .exe) generados desde el proyecto.
l Volver a generar el proyecto o generar archivos .app, .exe o .dll a partir del mismo.
Con los nuevos enganches del Administrador de proyectos, los programadores avanzados pueden
crear sus propios administradores de proyectos con interfaces de usuario nicas y personalizadas.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 50 de 92
762 of 804
Coleccin Proyectos
Al igual que ocurre con otras colecciones OLE, es posible obtener informacin sobre un proyecto a
partir de la coleccin Proyectos. Por ejemplo, el cdigo siguiente utiliza las propiedades Count e Item
de la coleccin Proyectos para mostrar los nombres de todos los proyectos de la coleccin y a
continuacin utiliza el comando FOR EACH para mostrar la misma informacin:
nProjectCount = Application.Projects.Count
Esta lnea de cdigo utiliza la propiedad ActiveProject para agregar un programa, Main.prg, al
proyecto activo actualmente:
Application.ActiveProject.Archivos.Add('Main.prg')
Esta lnea de cdigo agrega Main.prg al primer proyecto agregado a la coleccin Proyectos:
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 51 de 92
763 of 804
Application.Proyectos[1].Archivos.Add('Main.prg')
Propiedades
Count
Mtodos
Item
Objeto Project
El objeto Project se instancia siempre que se abre un proyecto desde el men Archivo o con los
comandos CREATE PROJECT, MODIFY PROJECT, BUILD APP, BUILD DLL, BUILD EXE o
BUILD PROJECT. El objeto Project permite manipular el proyecto mediante programa y es posible
el acceso al mismo a travs del objeto Application de Visual FoxPro. Observe que el objeto
Application cuenta con la nueva propiedad ActiveProject, que proporciona una referencia de objeto al
proyecto abierto en el Administrador de proyectos activo actualmente.
Propiedades
Application AutoIncrement
BaseClass BuildDateTime
Debug Encrypted
HomeDir Icon
MainClass MainFile
Name Parent
ProjectHook ProjectHookClass
ProjectHookLibrary SCCProvider
ServerHelpFile ServerProject
TypeLibCLSID TypeLibDesc
TypeLibName VersionComments
VersionCompany VersionCopyright
VersionDescription VersionLanguage
VersionNumber VersionProduct
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 52 de 92
764 of 804
VersionTrademarks Visible
Mtodos
Build CleanUp
Refresh SetMain
Objeto ProjectHook
Un objeto ProjectHook es una clase de base de Visual FoxPro que se instancia de forma
predeterminada siempre que se abre un proyecto asignado al objeto ProjectHook. (Puede incluir la
clusula NOPROJECTHOOK en CREATE PROJECT y MODIFY PROJECT para evitar que se
instancie un objeto ProjectHook para el proyecto.)
El objeto ProjectHook permite el acceso mediante programacin a los eventos que ocurren en un
proyecto. Por ejemplo, puede ejecutar cdigo siempre que agregue un archivo al proyecto.
Puede especificar una clase ProjectHook predeterminada para los nuevos proyectos en la ficha
Proyectos del cuadro de dilogo Opciones. Si no se especifica una clase ProjectHook predeterminada
en la ficha Proyectos, no se asignar ninguna a los proyectos nuevos. Puede especificar una clase
ProjectHook para un proyecto individual (anulando la predeterminada) en el cuadro de dilogo
Informacin del proyecto. En tiempo de ejecucin, puede utilizar la propiedad ProjectHook para
especificar una clase ProjectHook para un proyecto. Si cambia la clase ProjectHook de un proyecto,
la nueva no tendr efecto hasta que cierre el proyecto y lo abra de nuevo.
Propiedades
BaseClass Class
ClassLibrary Comment
Name OLEDropEffects
OLEDropHasData OLEDropMode
Parent ParentClass
Tag
Eventos
AfterBuild BeforeBuild
Destroy Error
Init OLEDragDrop
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 53 de 92
765 of 804
OLEDragOver OLEGiveFeedBack
QueryAddFile QueryModifyFile
QueryRemoveFile QueryRunFile
Mtodos
AddProperty ReadExpression
ReadMethod ResetToDefault
SaveAsClass WriteExpression
Al abrir el Administrador de proyectos desde el men Archivo o con los comandos CREATE
PROJECT o MODIFY PROJECT, aparecer la ventana del Administrador de proyectos y se
instanciar un objeto Project con su objeto ProjectHook asociado. Los comandos de generacin de
proyectos (BUILD PROJECT, BUILD APP, BUILD DLL y BUILD EXE) tambin instancian los
objetos Project y ProjectHook.
Coleccin Archivos
La coleccin Archivos proporciona acceso directo al objeto archivo, lo que permite manipular los
objetos archivo de un proyecto mientras ste est abierto. Al igual que ocurre con otras colecciones
OLE, es posible obtener informacin sobre un archivo de un proyecto a partir de la coleccin
Archivos. Por ejemplo, en el cdigo siguiente se utilizan las propiedades Count e Item de la coleccin
Archivos para mostrar los nombres de todos los archivos de la coleccin y, a continuacin, se utiliza
el comando FOR EACH para mostrar la misma informacin:
nFileCount = Application.ActiveProject.Archivos.Count
Esta lnea de cdigo utiliza la propiedad ActiveProject para agregar un archivo, Main.prg, al proyecto
activo actualmente:
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 54 de 92
766 of 804
Application.ActiveProject.Archivos.Add('Main.prg')
Esta lnea de cdigo agrega Main.prg al primer proyecto agregado a la coleccin Proyectos:
Application.Proyectos[1].Archivos.Add('Main.prg')
Propiedades
Count
Mtodos
Add
Item
Objeto archivo
Propiedades
CodePage Description
Exclude FileClass
FileClassLibrary LastModified
Name ReadOnly
SCCStatus Type
Mtodos
AddToSCC CheckIn
CheckOut GetLatestVersion
Modify Remove
RemoveFromSCC Run
UndoCheckOut
Coleccin Servidores
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 55 de 92
767 of 804
La coleccin Servidores ofrece acceso directo al objeto servidor, lo que permite manipular los
servidores que contiene un proyecto. A la coleccin Servidores se le agrega un objeto servidor
siempre que se genera una biblioteca de vnculos dinmicos (.dll) o un archivo ejecutable (.exe) desde
el proyecto. Si desea ms informacin sobre la creacin de servidores de Automatizacin, vea Crear
servidores de Automatizacin en el Captulo 16, Agregar OLE, del Manual del programador.
Propiedades
Count
Mtodos
Item
Objeto servidor
El objeto servidor permite determinar informacin (incluida informacin de biblioteca de tipos) sobre
los servidores de Automatizacin contenidos en un proyecto. Esta informacin tambin est
disponible en la ficha Servidores del cuadro de dilogo Informacin del proyecto. Observe que el
objeto servidor no se crea hasta que se genera el proyecto que contiene la clase OLEPUBLIC
(especificada en el comando DEFINE CLASS).
Propiedades
CLSID Description
HelpContextID Instancing
ProgID ServerClass
ServerClassLibrary
El objeto Project de Visual FoxPro expone una interfaz IDispatch para que los clientes de
Automatizacin, los controles ActiveX y otros objetos COM tengan acceso a l a travs de interfaces
OLE estndar. Al exponer el objeto Project una interfaz IDispatch, los errores que puedan generarse
al manipular proyectos sern errores OLE.
Existen dos nuevas clusulas para los comandos CREATE PROJECT y MODIFY PROJECT. La
primera, NOPROJECTHOOK, evita que se instancie el objeto ProjectHook de un proyecto. La
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 56 de 92
768 of 804
segunda, NOSHOW, abre el proyecto sin mostrarlo en el Administrador de proyectos, lo que permite
manipularlo mediante programacin sin mostrarlo. Puede utilizar la propiedad Visible para mostrar
posteriormente el Administrador de proyectos. Si desea ms informacin sobre estas nuevas
clusulas, vea CREATE PROJECT y MODIFY PROJECT.
Eventos de proyecto
En las secciones siguientes se describen los eventos que ocurren cuando se crean proyectos, se
modifican, cierran, generan, etctera; y tambin el orden en que se producen.
Los eventos siguientes se producen al ejecutar CREATE PROJECT, al crear un nuevo proyecto desde
el men Archivo o al hacer clic en el botn Nuevo de la barra de herramientas y especificar la
creacin de un proyecto nuevo:
3. Se produce el evento Init del objeto ProjectHook. Si el evento Init devuelve "verdadero" (.T.),
que es el valor predeterminado, el proyecto se crea y se muestra en el Administrador de
proyectos.
Si el evento Init devuelve "falso" (.F.), el proyecto no se crea, se liberan los objetos Project y
ProjectHook y no se muestra el Administrador de proyectos.
1. Se crea el objeto Project. El objeto Project obtiene sus valores del archivo .pjx del proyecto.
3. Se produce el evento Init del objeto ProjectHook. Si el evento Init devuelve "verdadero" (.T.)
(el valor predeterminado), el proyecto se abre para su modificacin en el Administrador de
proyectos.
Si el evento Init devuelve "falso" (.F.), el proyecto no se abre para su modificacin, se liberan
los objetos Project y ProjectHook, y no se muestra el Administrador de proyectos.
Cerrar un proyecto
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 57 de 92
769 of 804
Los eventos siguientes se producen cuando se ejecuta BUILD APP, BUILD DLL o BUILD EXE:
1. Se crea el objeto Project. El objeto Project obtiene sus valores del archivo .pjx del proyecto.
3. Se produce el evento Init para el objeto ProjectHook. Si el evento Init devuelve "verdadero"
(.T.), que es el valor predeterminado, se produce el evento BeforeBuild del objeto ProjectHook.
Si se ha especificado NODEFAULT en el evento BeforeBuild, el archivo .app, .dll o .exe no se
genera. En caso contrario, el proceso de generacin contina.
Si el evento Init devuelve "falso" (.F.), el archivo .app, .dll o .exe se genera, y se liberan los
objetos Project y ProjectHook.
Los eventos siguientes se producen al ejecutar BUILD PROJECT con la clusula FROM. Si se omite
la clusula FROM, los eventos se producen en el orden descrito anteriormente para la ejecucin de
BUILD APP, BUILD DLL o BUILD EXE.
1. Se crea el objeto Project. El objeto Project obtiene sus valores del archivo .pjx del proyecto.
3. Se produce el evento Init del objeto ProjectHook. Si el evento Init devuelve "verdadero" (.T.),
que es el valor predeterminado, los archivos especificados en la clusula FROM se agregan
individualmente al proyecto. El evento QueryAddFile del objeto ProjectHook se produce antes
de agregar cada uno de los archivos. Si se ha especificado NODEFAULT en el evento
QueryAddFile, los archivos no se agregarn al proyecto. En caso contrario, s se agregan.
Si el evento Init del objeto ProjectHook devuelve "falso" (.F.), el proyecto no se genera. En tal
caso se liberan los objetos Project y ProjectHook, y no se crea un nuevo archivo .pjx.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 58 de 92
770 of 804
Los eventos siguientes se producen al arrastrar un archivo o un conjunto de archivos sobre la seccin
de esquema (rbol) del Administrador de proyectos:
1. Cuando el puntero del mouse se sita sobre la seccin de esquema del Administrador de
proyectos, se produce el evento OLEDragOver del objeto ProjectHook, con el valor 0
(DRAG_ENTER en Foxpro.h) en el parmetro nEstado. A continuacin se produce el evento
OLEDragOver repetidamente con el valor 2 (DRAG_OVER en Foxpro.h) en el parmetro
nEstado. Si el puntero del mouse sale de la seccin de esquema del Administrador de
proyectos, se produce el evento OLEDragOver con el valor 1 (DRAG_LEAVE en Foxpro.h) en
el parmetro nEstado.
2. El evento OLEDragDrop del objeto ProjectHook se produce al soltar el botn del mouse
cuando el puntero se encuentra sobre la seccin de esquema del Administrador de proyectos.
De forma predeterminada, Visual FoxPro agrega al proyecto todos los archivo colocados en el
Administrador de proyectos. Antes de agregar cada archivo, se produce el evento
QueryAddFile del objeto ProjectHook.
Los eventos siguientes se producen al agregar un archivo a un proyecto con el botn Agregar del
Administrador de proyectos:
3. Se produce el evento QueryAddFile del objeto ProjectHook y se pasa al evento el nombre del
objeto archivo. Si se ha especificado NODEFAULT en el evento QueryAddFile, el archivo no
se agrega. En caso contrario, el archivo se agrega al proyecto.
Los eventos siguientes se producen al agregar un archivo nuevo a un proyecto con el botn Nuevo del
Administrador de proyectos:
2. Cuando se guarda el nuevo archivo, aparece el cuadro de dilogo Guardar como. Al hacer clic
en Guardar se crea un objeto archivo para el nuevo archivo.
3. Se produce el evento QueryAddFile del objeto ProjectHook y se le pasa el nombre del objeto
archivo. Si se ha incluido NODEFAULT en el evento QueryAddFile, el archivo no se agrega.
En caso contrario, el archivo se agrega al proyecto.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 59 de 92
771 of 804
Los eventos siguientes se producen al modificar un archivo de un proyecto con el botn Modificar
del Administrador de proyectos:
2. Se pasa como parmetro al evento QueryModifyFile el objeto archivo del archivo a modificar.
Si se ha incluido NODEFAULT en el evento QueryModifyFile, no se muestra el diseador o
editor correspondiente al archivo y ste no se modifica. En caso contrario, el archivo se abre
con el diseador o editor correspondiente para su modificacin.
Los eventos siguientes se producen al quitar un archivo de un proyecto con el botn Quitar del
Administrador de proyectos:
Los eventos siguientes se producen al ejecutar un archivo de un proyecto con el botn Ejecutar del
Administrador de proyectos:
Los eventos siguientes se producen al volver a generar un proyecto, o al generar un archivo .app, .dll
o .exe desde un proyecto con el botn Generar del Administrador de proyectos:
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 60 de 92
772 of 804
La aplicacin de ejemplo Solutions de Visual FoxPro incluye un ejemplo llamado Seguir actividades
de un proyecto que ilustra muchos de los nuevos enlaces del Administrador de proyectos.
DO (HOME(2) + 'solution\solution')
O bien
1. Una vez iniciado Solution.app, haga doble clic en Nuevas caractersticas de Visual FoxPro
6.0.
El ejemplo Seguir actividades de un proyecto permite abrir un proyecto para despus manipularlo
de diversas formas. Los cambios realizados en el proyecto se almacenan en una tabla. Al cerrar el
proyecto, podr ver los cambios realizados en l en una ventana Examinar.
1. Una vez iniciado Solution.app, haga doble clic en Nuevas caractersticas de Visual FoxPro
6.0.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 61 de 92
773 of 804
en el directorio \Samples\Vfp98\Solution\Tahoe.
El Asistente para aplicaciones de Visual FoxPro 6.0 admite el Marco de trabajo de aplicacin
mejorado y el nuevo Generador de aplicaciones. Puede ejecutar el Asistente para aplicaciones desde
la Galera de componentes o desde el men Herramientas de Visual FoxPro, al hacer clic en
Asistentes y luego en Aplicacin.
Nota El Asistente para aplicaciones (5.0) de Visual FoxPro 5.0 est disponible en el cuadro de
dilogo Seleccin de asistente por motivos de compatibilidad con versiones anteriores.
Los Asistentes para conexin incluyen el Asistente para generacin de cdigo y el Asistente para
ingeniera inversa. Estos asistentes permiten administrar fcilmente las transferencias entre las
bibliotecas de clases de Visual FoxPro y los modelos de Microsoft Visual Modeler.
El Asistente para bases de datos de Visual FoxPro utiliza plantillas para crear bases de datos y tablas.
Tambin puede usar este asistente para crear ndices y relaciones entre las tablas de una nueva base
de datos.
El Asistente para documentacin de Visual FoxPro ofrece ahora una versin para utilizar los
Analizadores de cdigo mientas se crea la documentacin.
El Asistente mejorado para formularios de Visual FoxPro proporciona mscaras de entrada, formatos
y una clase de asignacin de campos para campos especficos almacenados en una base de datos. Este
asistente incluye tambin ms opciones de estilo de formularios, como por ejemplo, si son
desplazables.
El Asistente para grficos de Visual FoxPro crea un grfico a partir de una tabla de Visual FoxPro
mediante Microsoft Graph. Este asistente actualizado admite el componente Graph 8.0 de Microsoft
Office 97, que incluye la automatizacin de la hoja de datos y la serie por la opcin fila/columna.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 62 de 92
774 of 804
El Asistente mejorado para importar de Visual FoxPro admite Office 97 y el tratamiento de mltiples
hojas de Microsoft Excel y proporciona la opcin de importar una tabla en una base de datos.
El Asistente para etiquetas de Visual FoxPro permite ahora un mayor control de las fuentes de las
etiquetas y proporciona acceso directo al Asistente para agregar etiquetas.
El Asistente para Combinar correspondencia de Visual FoxPro crea un origen de datos con un
documento combinado de Microsoft Word o con un archivo de texto que puede abrir cualquier
procesador de texto. Este asistente admite el componente Microsoft Word 8.0 de Office 97, permite
una autntica automatizacin VBA con el objeto Application y utilizar colecciones.
El Asistente para tablas dinmicas de Visual FoxPro ayuda a crear tablas de hoja de clculo
interactivas que resumen y analizan los datos de dos o ms campos. Este asistente actualizado admite
el componente Microsoft Excel 8.0 de Office 97. Puede elegir guardar una tabla dinmica
directamente en Excel o agregar una tabla dinmica como un objeto a un formulario.
El Asistente para informes de Visual FoxPro incluye ahora funcionalidad avanzada de agrupamiento
y resumen que permite personalizar ms fcilmente los informes dentro del propio asistente. Tambin
incorpora ms estilos de informes entre los que elegir.
El Asistente para vistas remotas de Visual FoxPro proporciona acceso a las tablas de sistema, lo que
le permite utilizar la funcionalidad de los controladores ODBC que las admitan.
El Asistente para ejemplos de Visual FoxPro muestra en pasos sencillos cmo crear su propio
asistente. El resultado es un archivo HTML creado a partir de los registros del origen de datos
especificado.
El Asistente para instalacin de Visual FoxPro permite un mejor uso de los controles ActiveX y
tambin anular el lmite en el nmero de archivos que puede utilizar Windows para las instalaciones
en NT. Tambin permite agregar .DLL externas a la aplicacin a travs de la instalacin y crear
instalaciones basadas en Web.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 63 de 92
775 of 804
El Asistente para tablas de Visual FoxPro ofrece ahora nuevas plantillas de tablas, configuraciones de
estilo opcionales, uso de los tipos de datos binarios Character y Memo y acceso a las bases de datos.
Puede agregar una tabla a una base de datos, y tambin utilizar la configuracin de la base de datos
para determinar los formatos de los campos que se van a agregar a la tabla. Tambin puede establecer
relaciones entre las tablas de la base de datos.
El Asistente para publicacin en Web de Visual FoxPro genera un archivo HTML creado a partir de
los registros del origen de datos que especifique.
l Un men principal.
l El objeto Marco de trabajo de Visual FoxPro para ejecutar el men principal, las barras de
herramientas de los formularios y la administracin de informes, el control de errores y la
administracin de las sesiones de datos.
El marco de trabajo de Visual FoxPro 6 utiliza un objeto Application mejorado, y proporciona los
elementos adicionales siguientes:
l Uso de la clase ProjectHook para el control de los eventos relacionados con el proyecto.
l Metatabla de aplicacin para mantener la informacin que utilizan la clase ProjectHook y los
generadores de aplicaciones para crear formularios en el nuevo proyecto.
Puede iniciar el Generador de aplicaciones desde el men Herramientas de Visual FoxPro o desde la
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 64 de 92
776 of 804
Galera de componentes.
Tambin puede iniciar el Generador de aplicaciones con el botn secundario del mouse en la ventana
Administrador de proyectos, pero al hacerlo de este modo el Generador de aplicaciones slo crea
metatablas para la aplicacin y slo ver tres fichas en l. La nica forma de obtener el marco de
trabajo de aplicacin mejorado completo es a travs del Asistente para aplicaciones o con el elemento
Nueva aplicacin de la Galera de componentes.
Para obtener detalles sobre el contenido y el uso del marco de trabajo mejorado y el Generador de
aplicaciones, vea Programar aplicaciones con el marco de trabajo de aplicaciones en la Ayuda.
Archivos
Este archivo #INCLUDE comn lo utilizan los componentes con configuraciones y cadenas. Tambin
incluye el valor APP_GLOBAL, el nombre que utilizan los componentes como referencia.
Archivo de configuracin
Archivo Config.fpw opcional utilizado en aplicaciones tales como formularios de alto nivel, para
implementar configuraciones tales como SCREEN=OFF.
Clase ProjectHook
Controla los eventos relacionados con el proyecto, tales como agregar nuevos archivos. Tambin
tiene acceso al Generador de aplicaciones para establecer acciones y propiedades de la interaccin de
los archivos con la aplicacin.
Metatabla de aplicacin
Contiene informacin tal como la configuracin de proyecto, establecida o utilizada por el Generador
de aplicaciones y los objetos ProjectHook.
Generador de aplicaciones
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 65 de 92
777 of 804
Un marco de trabajo de aplicacin incluye el archivo de proyecto como biblioteca de clases inicial,
una subclase de las clases de base de Visual FoxPro lista para rellenarse con tablas y documentos
nuevos o ya existentes.
El marco de trabajo le permite especificar si desea crear una aplicacin completa o slo un marco de
trabajo de aplicacin. Si elige crear una aplicacin completa, puede incluir en ella una base de datos y
formularios o informes ya creados. O bien puede crear una nueva aplicacin desde cero con una
plantilla de base de datos. Si elige crear un marco de trabajo, podr volver atrs posteriormente y
agregarle componentes.
Puede crear un marco de trabajo de aplicacin con el Asistente para aplicaciones o con el elemento
Nueva aplicacin de la Galera de componentes. Al utilizar la Galera de componentes, se agrega un
nuevo elemento carpeta de proyecto a la carpeta Favoritos.
Independientemente del mtodo que utilice, Visual FoxPro mostrar un Generador de aplicaciones en
el que podr agregar la informacin a almacenar en una metatabla.
- o bien -
l Elija las opciones para Crear estructura de directorios del proyecto (predeterminado)
y Agregar al catlogo Favoritos (predeterminado)
Para obtener detalles sobre el contenido y el uso del marco de trabajo mejorado, y el Generador de
aplicaciones, vea Programar aplicaciones con el marco de trabajo de aplicaciones en la Ayuda.
Puede utilizar tambin la Galera de componentes para agregar formularios, informes, datos y objetos
de servicio al marco de trabajo de la nueva aplicacin, y para agregar controles a los formularios.
Al utilizar la Galera de componentes para agregar un formulario a una aplicacin, puede crear un
nuevo formulario o crear una subclase a partir de una clase existente.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 66 de 92
778 of 804
El cdigo del mtodo Access se ejecuta cuando se consulta el valor de una propiedad, normalmente
con la propiedad en una referencia de objeto, al almacenar el valor de la propiedad en una variable o
al mostrar el valor de la propiedad con un signo de interrogacin (?).
El cdigo del mtodo Assign se ejecuta cuando se intenta modificar el valor de una propiedad,
normalmente mediante los comandos STORE o = para asignar un nuevo valor a la propiedad.
Los mtodos Access y Assign slo se ejecutan cuando se consultan o modifican los valores de las
propiedades en tiempo de ejecucin. La consulta o modificacin de los valores de las propiedades en
tiempo de diseo no hace que se ejecuten los mtodos Access y Assign.
Nota Como el valor que intenta asignar a la propiedad se pasa al mtodo Assign, debe incluir una
instruccin PARAMETERS o LPARAMETERS en el mtodo Assign para aceptar el valor.
Puede crear independientemente los mtodos Access y Assign (puede crear un mtodo Access sin un
mtodo Assign o un mtodo Assign sin un mtodo Access).
Puede crear mtodos Access y Assign para propiedades creadas mediante programacin en una
instruccin DEFINE CLASS o de forma interactiva para un formulario o una clase con el Diseador
de formularios y el Diseador de clases.
Nota Tambin se pueden crear mtodos Access y Assign para todas las propiedades nativas de
Visual FoxPro. Por ejemplo, puede crear un mtodo Access para la propiedad Left de un formulario,
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 67 de 92
779 of 804
lo que le permitir ejecutar cdigo siempre que se consulte la propiedad Left del formulario. Puede
crear un mtodo Assign para una propiedad nativa de slo lectura de Visual FoxPro (por ejemplo, la
propiedad ParentClass), pero el mtodo nunca se ejecutar.
l Puede crear una interfaz pblica para una clase o un objeto que separe la interfaz de la
implementacin.
l Puede implementar fcilmente la validacin de las propiedades.
l Puede proteger fcilmente las propiedades en controles ActiveX que derivan de clases.
Las mejoras del comando DEFINE CLASS y de los Diseadores de formularios y de clases le
permiten crear mtodos Access y Assign mediante programacin y de forma interactiva.
Se han agregado dos sufijos, _ACCESS y _ASSIGN, al comando DEFINE CLASS para crear
mtodos Access y Assign. Si anexa una de estas palabras clave al nombre de una funcin o un
procedimiento, se crear un mtodo Access o Assign para una propiedad que tenga el mismo nombre
que la funcin o el procedimiento.
Por ejemplo, el siguiente ejemplo de cdigo utiliza DEFINE CLASS para crear una clase
personalizada llamada MiClase. Se crea una propiedad definida por el usuario, MiPropiedad, para la
clase. A continuacin se crea un mtodo Access para MiPropiedad con la instruccin PROCEDURE.
Observe el uso de la instruccin LPARAMETERS para aceptar el valor pasado al mtodo Assign.
Este ejemplo tambin muestra cmo puede crear propiedades de slo lectura.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 68 de 92
780 of 804
El ejemplo siguiente muestra cmo puede agregar un mtodo Assign a una propiedad nativa de
Visual FoxPro y realizar una sencilla validacin del valor de la propiedad que intenta establecer.
Observe que en este ejemplo se crea un mtodo Assign sin un mtodo Access correspondiente.
Se usa DEFINE CLASS para crear una clase Form llamada frmMiForm. Se crea un mtodo Assign
llamado Left_ASSIGN con una instruccin PROCEDURE. El cdigo del mtodo Assign se ejecuta
siempre que se intente asignar un valor a la propiedad Left del formulario.
DO CASE
CASE tAssign < 0 && valor de Left negativo
WAIT WINDOW 'El valor tiene que ser mayor que 0'
OTHERWISE && valor de Left no negativo
THIS.Left = tAssign
ENDCASE
ENDPROC
ENDDEFINE
Para obtener ms informacin sobre la sintaxis utilizada para crear mtodos Access y Assign, vea
DEFINE CLASS.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 69 de 92
781 of 804
Mtodo Assign (o ambas).
3. Elija Agregar para crear la propiedad del formulario y para crear los mtodos Access y Assign
de la propiedad.
Para crear un mtodo Access o Assign para una propiedad intrnseca de Visual FoxPro en el
Diseador de formularios
3. Elija Agregar para crear mtodos Access o Assign para la propiedad intrnseca.
Nota En el Diseador de formularios slo puede crear propiedades con mtodos Access y Assign
para un formulario o un conjunto de formularios. Para crear propiedades con mtodos Access y
Assign para un control o un objeto, utilice el Diseador de clases para crear la clase de control o de
objeto. En el Diseador de clases, agregue propiedades con mtodos Access y Assign al control o al
objeto y despus agregue la clase de control u objeto al formulario en el Diseador de formularios.
Para crear un mtodo Access o Assign para una clase en el Diseador de clases
3. Elija Agregar para crear una propiedad para la clase y crear los mtodos Access o Assign de la
propiedad.
Para obtener ms informacin acerca de la creacin de mtodos Access y Assign, vea el tema Nueva
propiedad (Nueva propiedad).
Mtodo THIS_ACCESS
Se ha agregado a Visual FoxPro 6.0 un nuevo mtodo global de clase, THIS_ACCESS. El cdigo de
un mtodo THIS_ACCESS se ejecuta siempre que se intente modificar el valor de un miembro de un
objeto o siempre que se intente consultar un miembro de un objeto.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 70 de 92
782 of 804
Normalmente se devuelve la referencia de objeto THIS. El mtodo THIS_ACCESS tambin debe
incluir un parmetro para aceptar el nombre del miembro del objeto que se modifica o consulta.
CLEAR
oTempObj = CREATEOBJECT('MiForm') && Crea una instancia del formulario
oTempObj.Caption = 'abc' && Asigna un valor y desencadena THIS_ACCESS
? oTempObj.Caption && Consulta un valor y desencadena THIS_ACCESS
IF cMemberName = 'caption'
? cMemberName && Muestra el nombre del miembro del objeto
ENDIF
RETURN THIS
ENDPROC
ENDDEFINE
Observe que THIS_ACCESS no pretende ser un sustituto global de los mtodos Access y Assign
(slo proporciona informacin acerca del miembro del objeto al que se tiene acceso o se consulta). A
diferencia de los mtodos Access y Assign, THIS_ACCESS no proporciona control sobre los valores
devueltos a miembros de objeto especficos.
Las secciones siguientes describen la informacin de programacin para mtodos Access y Assign.
Alcance
Los mtodos Access y Assign estn protegidos de forma predeterminada (no puede tener acceso a un
mtodo Access o Assign ni modificarlo desde fuera de la clase en la que se cree el mtodo Access o
Assign).
Incluya la palabra clave HIDDEN cuando cree un mtodo Access o Assign para impedir el acceso y
las modificaciones a las propiedades desde fuera de la definicin de clase. Slo los mtodos y los
eventos de la definicin de la clase pueden tener acceso a las propiedades ocultas. Mientras que las
subclases de la definicin de clase pueden tener acceso a las propiedades protegidas, slo la
definicin de la clase puede tener acceso a las propiedades ocultas.
Nota Si no incluye la palabra clave HIDDEN, puede crear subclases con los mtodos Access y
Assign.
Depuracin
Puede ver el cdigo de los mtodos Access y Assign en la ventana Seguimiento de la ventana
Depurador. Sin embargo, los mtodos Access y Assign no se pueden ejecutar en las ventanas
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 71 de 92
783 of 804
Inspeccin y Locales de la ventana Depurador.
Se pasan matrices a los mtodos Access y Assign de la misma forma en que se pasan a
procedimientos estndar de Visual FoxPro.
Controles ActiveX
Las propiedades, los eventos o los mtodos nativos de los controles ActiveX no admiten las
propiedades Access y Assign. Sin embargo, las propiedades, los eventos y los mtodos del
Contenedor OLE que contiene al control ActiveX s admite los mtodos Access y Assign.
Mtodo ResetToDefault
Si ejecuta el mtodo ResetToDefault para un mtodo Access o Assign se modifica el cdigo del
mtodo Access o Assign al miniprograma predeterminado. El resultado es que el cdigo heredado del
mtodo, si lo hubiera, no se ejecuta. La tcnica utilizada para asegurar que el cdigo heredado de la
clase primaria se ejecuta vara segn el tipo de mtodo.
Coloque el cdigo siguiente en la subclase de un mtodo Access para ejecutar el cdigo en la clase
primaria:
RETURN DODEFAULT( )
Coloque el cdigo siguiente en la subclase de un mtodo Access para ejecutar el cdigo de la clase
primaria:
LPARAMETERS vnewval
DODEFAULT(vnewval)
THIS.<propiedad> = vnewval
LPARAMETERS cmember
RETURN DODEFAULT(cmember)
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 72 de 92
784 of 804
En general, las reas que aceptaban el formato .bmp (mapa de bits) en versiones anteriores de Visual
FoxPro aceptan ahora los formatos de archivos grficos.
Nota En Visual FoxPro se pueden usar los archivos de cursores, cursores animados e iconos como
archivos grficos. Por ejemplo, puede especificar un cursor animado para la propiedad Picture del
control Imagen (sin embargo, el control Imagen muestra la representacin esttica del cursor).
Visual FoxPro proporciona la compatibilidad con grficos en tres reas: lenguaje, controles y objetos,
y la interfaz.
Se han mejorado los siguientes comandos y funciones para admitir los nuevos formatos de archivos
grficos.
GETPICT( )
Se ha mejorado el cuadro de dilogo Abrir imagen que se muestra al ejecutar la funcin GETPICT( )
en la ventana Comandos, lo que le permitir encontrar rpidamente todos los archivos grficos
admitidos por Visual FoxPro. Ahora el cuadro de lista desplegable Archivos de tipo incluye los
siguientes elementos.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 73 de 92
785 of 804
Icono *.ico
JPEG *.jpg
GIF *.gif
Active la casilla de verificacin Vista previa para mostrar el archivo grfico seleccionado
actualmente. En versiones anteriores de Visual FoxPro era necesario elegir el botn Vista previa
cada vez que se seleccionaba un nuevo archivo grfico. Tambin se ha aumentado el tamao del rea
Imagen.
CLEAR RESOURCES
Ahora el comando CLEAR RESOURCES de Visual FoxPro borra todos los archivos grficos
almacenados localmente, como los archivos .gif y .jpg.
La tabla siguiente muestra los controles y objetos de Visual FoxPro que tienen propiedades para las
que puede especificar archivos grficos. Ahora puede especificar archivos grficos de tipo .gif, .jpg,
cursores, cursores animados e iconos para estas propiedades, adems de los archivos grficos de tipo
.bmp y .dib admitidos en las versiones anteriores de Visual FoxPro.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 74 de 92
786 of 804
La interfaz de Visual FoxPro
Varios de los diseadores de Visual FoxPro le permiten especificar archivos grficos con el cuadro de
dilogo Abrir. Los cuadros de dilogo Abrir de los siguientes diseadores se han mejorado para
incluir los nuevos formatos de archivos grficos.
En la ventana Propiedades, si hace doble clic en la propiedad o elige el botn del cuadro de dilogo
de la propiedad, puede mostrar el cuadro de dilogo Abrir para las propiedades que admiten archivos
grficos.
Administrador de proyectos
Puede agregar archivos grficos a un proyecto desde las fichas Todos y Otros del Administrador de
proyectos. Cuando est seleccionada la ficha Todos o la ficha Otros, seleccione el elemento Otros
archivos y, a continuacin, elija Agregar. Se muestra el cuadro de dilogo Abrir, que le permitir
agregar un archivo de grficos al proyecto.
Diseador de informes
Adems, se han agregado a Visual FoxPro muchas de las funciones de manipulacin de nombres de
archivo disponibles en Foxtools.fll, una biblioteca API de Visual FoxPro. Ya no es necesario utilizar
SET LIBRARY TO FOXTOOLS.FLL para llamar a estas funciones de Foxtools; puede llamarlas
directamente desde sus programas de Visual FoxPro.
En esta seccin tambin se describen las mejoras de rendimiento, solidez y facilidad de uso de Visual
FoxPro.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 75 de 92
787 of 804
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 76 de 92
788 of 804
documento activo est alojado en un contenedor de
documentos activos.
Mtodo NavigateTo Explora en un contenedor de documentos activos a una
ubicacin especificada.
Evento Run Se produce cuando un documento activo termina de
coordinarse con su contenedor y con COM y est listo para
ejecutar el cdigo de usuario.
Variable del sistema Especifica la aplicacin que inicia un documento activo.
_RUNACTIVEDOC
Propiedad ScrollBars Disponible ahora para formularios. Si un formulario est
en un documento activo, las barras de desplazamiento se
muestran automticamente cuando el tamao del
contenedor de documentos activos sea menor que el
tamao del formulario.
Evento Scrolled Disponible ahora para formularios. Le permite determinar
si se hace clic en las barras de desplazamiento horizontal o
vertical o si se mueve una barra de desplazamiento.
Mtodo SetViewPort Establece los valores de las propiedades ViewPortLeft y
ViewPortTop de un formulario.
Evento ShowDoc Se produce al explorar hasta un documento activo.
SYS(4204) Depuracin de Activa o desactiva el soporte para la depuracin de
documentos activos documentos activos en el depurador de Visual FoxPro.
Propiedad ViewPortHeight Contiene el alto de la vista de un formulario.
Propiedad ViewPortLeft Contiene la coordenada izquierda del formulario visible en
la vista.
Propiedad ViewPortTop Contiene la coordenada superior del formulario visible en
la vista.
Propiedad ViewPortWidth Contiene el ancho de la vista de un formulario.
Propiedad VscrollSmallChange Especifica la cantidad de desplazamiento vertical de un
formulario cuando hace clic en una flecha de
desplazamiento.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 77 de 92
789 of 804
Mtodo AddToSCC Agrega un archivo de un proyecto al control de cdigo
fuente.
Evento AfterBuild Se produce despus de que se vuelva a generar un
proyecto o de que se cree en un proyecto un archivo de
aplicacin (.app), una biblioteca de vnculos dinmicos
(.dll) o un archivo ejecutable (.exe).
Propiedad AutoIncrement Especifica si la versin generada de un proyecto se
incrementa automticamente cada vez que se genere un
archivo .exe o .dll en proceso distribuible.
Evento BeforeBuild Se produce antes de que se vuelva a generar un proyecto o
de que se cree en un proyecto un archivo de aplicacin
(.app), una biblioteca de vnculos dinmicos (.dll) o un
archivo ejecutable (.exe).
Mtodo Build Vuelve a generar un proyecto o crea un archivo de
aplicacin (.app), una biblioteca de vnculos dinmicos
(.dll) o un archivo ejecutable (.exe) a partir de un proyecto.
Propiedad BuildDateTime Contiene la fecha y la hora en que se gener por ltima
vez un proyecto.
Mtodo CheckIn Protege las modificaciones realizadas a un archivo de
proyecto bajo control de cdigo fuente.
Mtodo CheckOut Desprotege un archivo que est bajo control de cdigo
fuente y le permite hacer modificaciones en el archivo.
Mtodo CleanUp Limpia una tabla del proyecto; para ello, quita los registros
marcados para eliminacin y empaqueta los campos
memo.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 78 de 92
790 of 804
cdigo fuente compilado de un proyecto.
Propiedad Description En un objeto archivo es la descripcin del archivo. En un
objeto servidor es la descripcin de la clase del servidor.
Propiedad Encrypted Especifica si se va a cifrar el cdigo fuente compilado de
un proyecto.
Propiedad Exclude Especifica si se va a excluir un archivo de una aplicacin
(.app), una biblioteca de vnculos dinmicos (.dll) o un
archivo ejecutable (.exe) cuando se genere a partir de un
proyecto.
Propiedad FileClass Contiene el nombre de la clase de formulario en la que se
basa un formulario de un proyecto.
Propiedad FileClassLibrary Contiene el nombre de la biblioteca de clases que contiene
la clase en la que se basa un formulario de un proyecto.
Objeto File Proporciona referencias a archivos especficos de un
proyecto.
Coleccin Files Una coleccin de objetos archivo.
Mtodo GetLatestVersion Obtiene la versin ms reciente de un archivo de un
proyecto que est bajo control de cdigo fuente y copia
una versin de slo lectura en su unidad local.
Propiedad HomeDir Especifica el directorio de inicio de un proyecto.
Propiedad Instancing Especifica cmo se puede crear una instancia de un
servidor de un proyecto.
Mtodo Item Devuelve una referencia de objeto al elemento
especificado en una coleccin de proyectos.
Propiedad LastModified Contiene la fecha y la hora de la ltima modificacin
realizada a un archivo de un proyecto.
Propiedad MainClass Contiene el nombre de una clase ActiveDoc establecida
como programa principal de un proyecto.
Propiedad MainFile Contiene el nombre y la ruta del archivo establecido como
programa principal de un proyecto.
Mtodo Modify Abre un archivo de un proyecto para su modificacin en el
editor o diseador apropiado.
Comando MODIFY PROJECT Mejorado en Visual FoxPro 6.0. Admite dos nuevas
opciones, NOSHOW y NOPROJECTHOOK, para su
utilizacin con los nuevos enganches del Administrador de
proyectos.
Propiedad ProgID Contiene el PROGID registrado (Identificador
programtico) de un servidor de un proyecto.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 79 de 92
791 of 804
Objeto Project Se crea una instancia cuando se crea o se abre un proyecto.
Objeto ProjectHook Se crea una instancia cuando se abre un proyecto y
proporciona acceso mediante programacin a eventos de
proyecto.
Propiedad ProjectHook Una referencia de objeto al objeto ProjectHook que se crea
para un proyecto.
Propiedad ProjectHookClass La clase ProjectHook predeterminada de un proyecto.
Propiedad ProjectHookLibrary La biblioteca de clases visuales .vcx que contiene la clase
ProjectHook predeterminada de un proyecto.
Coleccin Projects Una coleccin de objetos proyecto.
Evento QueryAddFile Se produce justo antes de que se agregue un archivo a un
proyecto.
Evento QueryModifyFile Se produce justo antes de que se modifique un archivo en
un proyecto.
Evento QueryRemoveFile Se produce justo antes de que se elimine un archivo de un
proyecto.
Evento QueryRunFile Se produce justo antes de que se ejecute un archivo o de
que se realice una vista previa de un informe o una
etiqueta en un proyecto.
Mtodo Remove Quita un archivo de su coleccin de archivos y del
proyecto.
Mtodo RemoveFromSCC Elimina un archivo del proyecto del control de cdigo
fuente.
Mtodo Run Ejecuta o muestra una vista previa de un archivo de un
proyecto.
Propiedad SCCProvider El nombre del proveedor de control de cdigo fuente para
un proyecto.
Propiedad SCCStatus Contiene un valor numrico que indica el estado de
control de cdigo fuente de un archivo de un proyecto.
Objeto Server Una referencia de objeto a un servidor del proyecto.
Coleccin Servers Una coleccin de objetos servidor.
Propiedad ServerClass Contiene el nombre de una clase servidor de un proyecto.
Propiedad ServerClassLibrary Contiene el nombre de la biblioteca de clases o de
programa que contiene una clase de servidor.
Propiedad ServerHelpFile El archivo de Ayuda de la biblioteca de tipos creada para
las clases de servidor de un proyecto.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 80 de 92
792 of 804
Propiedad ServerProject El nombre del proyecto que contiene las clases de
servidor.
Mtodo SetMain Establece el archivo principal de un proyecto.
Propiedad Type El tipo de archivo de un archivo del proyecto.
Propiedad TypeLibCLSID El CLSID de registro (Identificador de clase) para una
biblioteca de tipos creada para las clases de servidor de un
proyecto.
Propiedad TypeLibDesc La descripcin de una biblioteca de tipos creada para las
clases de servidor de un proyecto.
Propiedad TypeLibName El nombre de una biblioteca de tipos creada para las clases
de servidor de un proyecto.
Mtodo UndoCheckOut Descarta las modificaciones realizadas en un archivo y
vuelve a protegerlo.
Propiedad VersionComments Los comentarios del proyecto.
Propiedad VersionCompany El nombre de la compaa del proyecto.
Propiedad VersionCopyright La informacin de copyright del proyecto.
Propiedad VersionDescription La descripcin del proyecto.
Propiedad VersionLanguage La informacin de idioma del proyecto.
Propiedad VersionNumber El nmero de versin del proyecto.
Propiedad VersionProduct El nombre del producto del proyecto.
Propiedad VersionTrademarks La informacin de marcas registradas del proyecto.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 81 de 92
793 of 804
se cancela la operacin arrastrar y colocar de OLE.
Mtodo OLEDrag Inicia una operacin arrastrar y colocar de OLE.
Evento OLEDragDrop Se produce cuando se colocan datos en el destino y la
propiedad OLEDropMode del destino es 1 - Activado.
Propiedad OLEDragMode Especifica cmo se inicia una operacin de arrastre.
Evento OLEDragOver Se produce cuando se arrastran datos a su destino y la
propiedad OLEDropMode del destino es 1 Activado.
Propiedad OLEDragPicture Especifica la imagen que se muestra bajo el puntero del
mouse durante una operacin arrastrar y colocar de OLE.
Puede especificar un archivo de imagen del tipo .bmp,
.dib, .jpg, .gif, .ani, .cur e .ico.
Propiedad OLEDropEffects Especifica el tipo de operaciones arrastrar y colocar de
OLE que admite un destino.
Propiedad OLEDropHasData Especifica cmo se controla una operacin colocar.
Propiedad OLEDropMode Especifica cmo controla un destino de colocar las
operaciones colocar de OLE.
Propiedad OLEDropTextInsertion Especifica si puede colocar texto en medio de una palabra
en la parte de cuadro de texto de un control.
Evento OLEGiveFeedBack Se produce despus de cada evento OLEDragOver.
Permite que el origen de arrastre especifique el tipo de
operacin arrastrar y colocar de OLE y la informacin
visual.
Evento OLESetData Se produce en un origen de arrastre cuando un destino para
colocar llama al mtodo GetData y no hay datos con el
formato especificado en el objeto DataObject con arrastrar
y colocar de OLE.
Evento OLEStartDrag Se produce cuando se llama al mtodo OLEDrag.
Mtodo SetData Coloca datos en el objeto DataObject con arrastrar y
colocar de OLE.
Mtodo SetFormat Coloca un formato de datos en el objeto DataObject con
arrastrar y colocar de OLE.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 82 de 92
794 of 804
COM como un servidor de automatizacin de Visual
FoxPro.
Funcin COMRETURNERROR( ) Llena la estructura de excepciones de COM con
informacin que los clientes de COM pueden utilizar para
determinar el origen de los errores de Automatizacin.
Funcin CREATEOBJECTEX( ) Crea una instancia de un objeto COM registrado (como un
servidor de automatizacin de Visual FoxPro) en un
equipo remoto.
Propiedad ServerName Contiene la ruta completa y el nombre de archivo de un
servidor de automatizacin.
Propiedad StartMode Contiene un valor numrico que indica cmo se inici la
instancia de Visual FoxPro.
SYS(2335) Modo de servidor Activa o desactiva los estados modales en los servidores
desatendido de automatizacin .exe distribuibles de Visual FoxPro.
SYS(2334) Modo de invocacin de Devuelve un valor que indica cmo se invoc el servidor
servidor de automatizacin de automatizacin de Visual FoxPro o si se est
ejecutando una aplicacin independiente (.exe).
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 83 de 92
795 of 804
Propiedad DisplayCount Especifica el nmero de elementos mostrados en la parte
de lista de un control ComboBox.
Funcin FILETOSTR( ) Devuelve el contenido de un archivo como una cadena de
caracteres.
Variable del sistema _GALLERY Especifica el programa que se ejecuta cuando elige Galera
de componentes en el men Herramientas.
Variable del sistema _GENHTML Especifica un programa de generacin de HTML
(Lenguaje de marcado de hipertexto) que crea un archivo
de texto que contiene la versin HTML de un formulario,
men, informe o tabla.
Variable del sistema _GETEXPR Especifica el programa que se ejecuta cuando se ejecute el
comando GETEXPR o cuando se muestre el cuadro de
dilogo Generador de expresiones.
Mtodo GridHitTest Devuelve, como parmetros de resultados, los
componentes de un control cuadrcula correspondientes a
las coordenadas horizontal (X) y vertical (Y)
especificadas.
Variable del sistema _INCLUDE Especifica un archivo de encabezado predeterminado
incluido en las clases, formularios o conjuntos de
formularios definidos por el usuario.
Funcin INDEXSEEK( ) Sin mover el puntero de los registros, busca en una tabla
indexada la primera ocurrencia de un registro cuya clave
de ndice coincida con una expresin especificada.
Funcin NEWOBJECT( ) Crea una nueva clase u objeto directamente desde una
biblioteca de clases visuales .vcx o desde un programa.
Mtodo NewObject Agrega una nueva clase u objeto a un objeto directamente
desde una biblioteca de clases visuales .vcx o desde un
programa.
Variable del sistema _SAMPLES Contiene la ruta del directorio en el que se instalan los
ejemplos de Visual FoxPro.
Comando SET BROWSEIME Especifica si se abre el Editor de mtodos de entrada
cuando se llega a un cuadro de texto en una ventana
Examinar.
Comando SET STRICTDATE Especifica si constantes ambiguas de tipo Date y
DateTime generan errores.
Funcin STRTOFILE( ) Escribe el contenido de una cadena de caracteres en un
archivo.
SYS(3055) Complejidad de las Establece el nivel de complejidad de las clusulas FOR y
clusulas FOR y WHERE WHERE en los comandos y las funciones que las admiten.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 84 de 92
796 of 804
SYS(3056) Leer la configuracin del Hace que Visual FoxPro vuelva a leer su configuracin y
Registro la actualice con la configuracin del Registro del sistema.
Propiedad TitleBar Especifica si se muestra una barra de ttulo en la parte
superior de un formulario.
Funcin VARTYPE( ) Devuelve el tipo de datos de una expresin.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 85 de 92
797 of 804
Objeto DataEnvironment Ahora admite las propiedades Comment y Tag y los
mtodos ReadExpression, ReadMethod, SaveAsClass y
WriteExpression.
Funcin DATE( ) Ahora admite argumentos numricos opcionales que le
permiten crear valores de fechas compatibles con el
milenio.
Funcin DATETIME( ) Ahora admite argumentos numricos opcionales que le
permiten crear valores de fechas compatibles con el
milenio.
Comando DEFINE CLASS Admite nuevos mtodos Access y Assign, que le permiten
ejecutar cdigo siempre que consulte una propiedad o que
intente cambiar el valor de una propiedad.
Funcin FDATE( ) Ahora admite un argumento opcional que le permite
determinar la hora de la ltima modificacin de un archivo
sin tener que utilizar funciones de manipulacin de
caracteres.
Objeto Form Ahora admite la propiedad Scrollbars y el evento Scrolled.
Objeto FormSet Ahora admite las propiedades Parent y Tag.
Funcin GETDIR( ) Se ha mejorado el cuadro de dilogo Seleccionar
directorio para que pueda mostrar ms informacin.
Funcin GETFILE( ) Admite una nueva opcin cTtuloBarraTtulo que le
permite especificar el ttulo del cuadro de dilogo Abrir.
Funcin GETFONT( ) Le permite especificar la fuente, el tamao y el estilo de la
fuente seleccionados inicialmente cuando se muestra el
cuadro de dilogo Fuente.
Objeto Header Ahora admite las propiedades Comment y Tag y el mtodo
SaveAsClass.
Funcin HOME( ) Ahora le permite determinar los directorios de los
ejemplos, las herramientas, los grficos y los directorios
comunes de Visual FoxPro y Visual Studio.
Control Image Ahora admite la propiedad ToolTipText.
Comando IMPORT Admite una nueva opcin XL8 para importar datos desde
una hoja de clculo de Microsoft Excel 97.
Control Label Ahora admite la propiedad ToolTipText.
Comando MODIFY MEMO Ahora la sintaxis con colores en las ventanas de edicin de
campos memo est desactivada en las aplicaciones de
tiempo de ejecucin distribuidas.
Funcin OS( ) Ahora admite una opcin que le permite determinar si el
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 86 de 92
798 of 804
sistema operativo acepta DBCS (juegos de caracteres de
dos bytes).
Objeto Page Ahora acepta la propiedad Tag y el mtodo SaveAsClass.
Control PageFrame Ahora admite la propiedad Tag.
Funcin PEMSTATUS( ) PEMSTATUS( ) admite una nueva opcin 6 para
nAtributo que le permite determinar si se ha heredado de
otro objeto o clase una propiedad, evento o mtodo.
Funcin PROGRAM( ) Ahora admite 1 como argumento y le permite determinar
el nivel del programa actual.
Mtodo Refresh Ahora le permite actualizar la presentacin visual del
Administrador de proyectos y admite un nuevo parmetro
para actualizar el estado de control de cdigo fuente de los
archivos de un proyecto.
Objeto Relation Ahora admite las propiedades Comment y Tag, los eventos
Destroy, Error e Init y los mtodos ReadExpression,
ReadMethod y WriteExpression.
Comando REPORT Ahora admite una clusula PREVIEW IN SCREEN, que
le permite colocar una ventana de vista previa en la
ventana principal de Visual FoxPro.
Objeto Separator Ahora admite las propiedades Comment y Tag y los
mtodos ReadExpression, ReadMethod, SaveAsClass y
WriteExpression.
SET BELL Ya no es necesaria la duracin del sonido.
SET('PRINTER') Acepta una nueva opcin 3 que le permite determinar la
impresora predeterminada actual de Visual FoxPro
establecida en los cuadros de dilogo Impresora o
Configurar impresin de Visual FoxPro.
SET('BELL') Ahora se puede utilizar para determinar el tipo de sonido
que se va a reproducir.
Funcin STRCONV( ) Admite un nuevo argumento nIdLocale que le permite
especificar el Id. de configuracin regional que se va a
utilizar en la conversin.
SYS(2333) Compatibilidad con Ahora le permite determinar el valor actual y el valor de
interfaz ActiveX dual inicio predeterminado de la compatibilidad para interfaz
ActiveX dual se ha cambiado de habilitada en Visual
FoxPro 5.0 a deshabilitada en Visual FoxPro 6.0.
Funcin TABLEUPDATE( ) Si al actualizar registros se produce un error distinto a un
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 87 de 92
799 of 804
simple error de confirmacin, el primer elemento de la
matriz de errores contendr 1 y despus podr utilizar
AERROR( ) para determinar por qu no se han podido
confirmar las modificaciones.
Objeto ToolBar Ahora admite la propiedad Tag y el mtodo Release.
Funcin TRANSFORM( ) El cdigo de formato cCdigosFormato ahora es opcional.
Se utiliza una transformacin predeterminada si se omite
el cdigo de formato cCdigosFormato.
Funcin VERSION( ) Admite dos nuevas opciones de nExpresin, 4 y 5, para
devolver el nmero de versin de Visual FoxPro en
formatos que se puedan analizar con facilidad.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 88 de 92
800 of 804
extensin) de una ruta completa y un nombre de archivo.
Ahora Visual FoxPro 6.0 detecta errores de proteccin general (General Protection Faults, GPF) en
los controles ActiveX colocados en un formulario o en instancias de objetos COM creadas en Visual
FoxPro. Ahora se trata un GPF de control ActiveX o de objeto COM como errores detectables de
Visual FoxPro (Error 1440 - El objeto OLE puede estar daado).
Puede especificar la cadena de comentario del editor de Visual FoxPro en el Registro de Windows.
Abra la carpeta Options de Visual FoxPro 6.0 con el Editor del Registro de Windows (RegEdit) y
haga clic con el botn secundario del mouse en la carpeta. Elija Nuevo y, a continuacin, Valor de la
cadena. Escriba el nombre EditorCommandString para el nuevo valor de la cadena. Haga clic con
el botn secundario del mouse en la cadena y elija Modificar. Escriba la cadena de comentario del
editor (*!* es el valor predeterminado que se utiliza cuando esta entrada no existe en el Registro).
Ahora puede tener acceso al men Formulario desde la ventana de cdigo del formulario. Adems,
puede ejecutar un formulario con el mtodo abreviado de teclado CTRL+E, incluso desde una
ventana de cdigo de un formulario.
SET CENTURY TO
La documentacin de Visual FoxPro 5.0 indica que si ejecuta el comando SET CENTURY TO sin
argumentos adicionales establece el siglo al siglo actual. Esto slo es cierto en el siglo 20, porque el
siglo se establece a 19 independientemente de cul sea el siglo actual. En Visual FoxPro 6.0, SET
CENTURY TO establece el siglo al siglo actual. Adems, el valor de SET CENTURY TO en nuevas
sesiones de datos se inicializa al siglo actual.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 89 de 92
801 of 804
Adems, en Visual FoxPro 6.0, se ha modificado el valor predeterminado de ROLLOVER para SET
CENTURY con los dos dgitos del ao actual ms 50 aos (si el ao actual es 1998, nAo es 48, los
dos ltimos dgitos de 2048 (1998 + 50). En Visual FoxPro 5.0 , el valor predeterminado es 0.
Normalmente, las constantes o expresiones de tipo Date y DateTime se interpretan en funcin de los
valores actuales de SET DATE y SET CENTURY en el momento en el que las constantes o las
expresiones se compilan o evalan. Esto significa que muchas constantes de fecha son ambiguas
puesto que se pueden evaluar como valores diferentes en funcin de cundo se compilaron y el valor
de fecha del momento de la compilacin.
Todo depende de los valores actuales de SET DATE y SET CENTURY TO. Esto puede introducir
errores en el cdigo existente de Visual FoxPro siempre que se compilen o evalen en tiempo de
ejecucin constantes o expresiones de tipo Date o DateTime, como expresiones de informe u objeto.
Esto puede producir incompatibilidad con el milenio cuando el valor de SET CENTURY pase al ao
2000 y no se especifiquen fechas de cuatro dgitos.
Para evitar esta incompatibilidad, ahora se dispone de un formato de fecha estricto en Visual FoxPro
6.0 (y en Visual FoxPro 5.0). Las fechas estrictas siempre se evalan con el mismo valor Date o
DateTime independientemente de los valores de las fechas. El formato de fecha estricto es:
^aaaa-mm-dd[,][hh[:mm[:ss]][a|p]]
El carcter (^) denota siempre el formato de fecha estricto y hace que los valores de tipo Date y
DateTime se interpreten en formato AMD. Los separadores vlidos son los guiones, las barras, los
puntos y los espacios.
Los valores de tipo Date y DateTime no son ambiguos y siempre son vlidos. Los formatos vacos de
Date y DateTime incluyen {}, {--} y {--,:}.
Con los formatos de fecha estrictos tiene a su disposicin un rango ms grande de valores de tipo
Date y DateTime. En Visual FoxPro 5.0, el menor valor de fecha que se puede expresar es
{^0100/1/1}, 1 de Enero de 100 A.C. Esto es as porque los valores de ao inferiores a 100 siempre
se redondeaban hasta el siglo siguiente basndose en el valor de SET CENTURY.
La menor fecha vlida en Visual FoxPro 6.0 es {^0001-01-01}, 1 de enero del 1 A.C. La mayor fecha
vlida en Visual FoxPro 6.0 es {^9999-12-31}, 31 de diciembre de 9999 D.C.
Observe que el formato estricto de fecha ignora el valor TAIWAN en SET DATE, de forma que el
ao en el formato Date o DateTime estricto siempre hace referencia al calendario occidental.
(Recuerde que esto no es as en Visual FoxPro 5.0).
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 90 de 92
802 of 804
SET STRICTDATE
Puede utilizar un nuevo comando, SET STRICTDATE, para forzar la compatibilidad de las
constantes y cadenas de fechas con el milenio.
SET STRICTDATE TO 0
Establecer STRICTDATE a 0 significa que la comprobacin del formato estricto de fecha est
desactivada. Esto es compatible con Visual FoxPro 5.0. 0 es el valor predeterminado para el entorno
de tiempo de ejecucin de Visual FoxPro y el controlador ODBC. Cuando STRICTDATE est
establecido a 0, los valores Date y DateTime no vlidos se evalan como cadenas vacas.
SET STRICTDATE TO 1
Establecer STRICTDATE a 1 requiere que todas las constantes de tipo Date y DateTime estn en el
formato estricto. Cualquier constante de tipo Date o DateTime que no est en el formato estricto o
que se evale como valor no vlido generar un error, durante la compilacin, en tiempo de ejecucin
o durante una sesin interactiva en Visual FoxPro. 1 es el valor predeterminado para las sesiones
interactivas en Visual FoxPro.
SET STRICTDATE TO 2
Como los valores devueltos por CTOD( ) y CTOT( ) se basan en SET DATE y SET CENTURY para
interpretar la fecha que contienen pueden producir errores de incompatibilidad con el milenio. Utilice
DATE( ) y DATETIME( ) con los argumentos numricos opcionales para crear constantes y
expresiones de tipo Date y DateTime.
Este valor es til en las sesiones de depuracin para detectar el cdigo que pueda contener errores de
incompatibilidad con el milenio.
Se han agregado los siguientes errores nuevos a Visual FoxPro 6.0 y se pueden generar cuando SET
STRICTDATE est establecido a 1 2.
Este error se produce cuando un valor de tipo Date o DateTime no cumple el formato estricto. Las
siguientes condiciones producirn este error:
l Falta el signo ^.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 91 de 92
803 of 804
l El campo ao contiene menos de cuatro caracteres ({^98-02-16}).
Este error se produce por las mismas razones que el error 2032, pero CTOD( ) y CTOT( ) pueden ser
no compatibles o ambiguas. Utilice en su lugar las funciones DATE( ) o DATETIME( ).
Un valor de tipo Date o DateTime no tiene el formato vlido o est fuera del intervalo vlido para
Date y DateTime.
Cuando SET STRICTDATE est establecido a 0, las constantes de tipo Date o DateTime no vlidas
se evalan como constantes Date y DateTime vacas. Cuando se establece SET STRICTDATE a 1
2, las constantes de fecha no vlidas como {^2000-02-31}, 31 de febrero o {^2000-01-01,25:00}, 25
en punto, generarn este error.
l {^2000-01-01,25:00} 25 en punto.
La constante Date o DateTime contiene caracteres no admitidos por las constantes de tipo Date y
DateTime.
Cuando se establece SET STRICTDATE a 0, las constantes de tipo Date o DateTime que contengan
caracteres ilegales se evalan como valores Date o DateTime vacos. Cuando se establece SET
STRICTDATE a 1 2, la constante de tipo Date o DateTime que contenga los caracteres ilegales
generar este error.
La ficha General del cuadro de dilogo Opciones incluye ahora un cuadro de lista desplegable
Compatibilidad con el milenio, que especifica el valor de SET STRICTDATE. Como los dems
elementos del cuadro de dilogo Opciones, el valor se establece para la sesin actual de Visual
FoxPro y la eleccin de Establecer como predeterminado guarda el valor en el Registro de
Windows para la siguiente sesin de Visual FoxPro.
file://C:\temp\~hhE873.htm 30/05/2000
Manual del programador, Parte 11: Lo nuevo en Visual FoxPro Pgina 92 de 92
804 of 804
Ahora las funciones DATE( ) y DATETIME( ) admiten argumentos numricos opcionales que le
permiten crear valores de tipo Date o DateTime compatibles con el milenio. Las mejoras de estas
funciones proporcionan ahora un mtodo preferible para crear valores de tipo Date y DateTime; ya no
es necesario utilizar funciones de manipulacin de caracteres para crearlos.
Funcin FDATE( )
Ahora la funcin FDATE( ) acepta un argumento opcional que le permite determinar la hora de la
ltima modificacin de un archivo sin utilizar funciones de manipulacin de caracteres. Por ejemplo,
en versiones anteriores de Visual FoxPro era necesario escribir cdigo como el siguiente para
determinar cundo se modific por ltima vez el archivo de recursos de Visual FoxPro:
tLastModified = FDATE('Foxuser.dbf', P)
Propiedad Century
file://C:\temp\~hhE873.htm 30/05/2000