Manual Visual Foxpro 6
Manual Visual Foxpro 6
Manual Visual Foxpro 6
Capítulo 1: Introducción a la
programación
En Visual FoxPro funcionan juntas la programación por procedimientos y la programación
orientada
a objetos para permitirle crear aplicaciones potentes y flexibles. Conceptualmente, puede
imaginarse
que la programación consiste en escribir una secuencia de instrucciones con el fin de
realizar tareas
específicas. A un nivel estructural, la programación en Visual FoxPro precisa la
manipulación de los
datos almacenados.
Si no tiene experiencia en programación, este capítulo le ayudará a ponerse en marcha. Si
ya conoce
otros lenguajes de programación y desea compararlos con Visual FoxPro, vea el tema
Visual FoxPro
y otros lenguajes de programación. Si desea una descripción de la programación orientada a
objetos,
consulte el capítulo 3, Programación orientada a objetos.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 2 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
En este capítulo se abordan los temas siguientes:
Ventajas de la programación
La mecánica de la programación en Visual FoxPro
Conceptos básicos de programación
El proceso de la programación
Usar procedimientos y funciones definidos por el usuario
Pasos siguientes
Ventajas de la programación
Normalmente, cualquier función que pueda realizar con un programa podrá realizarla
también a
mano, si dispone de suficiente tiempo. Por ejemplo, si desea consultar información sobre un
cliente
en una tabla de clientes, como por ejemplo la empresa Ernst Handel, podría hacerlo
manualmente si
sigue una secuencia concreta de instrucciones.
Para buscar manualmente un único pedido en una tabla
1. En el menú Archivo, elija Abrir.
2. En el cuadro Archivos de tipo, elija Tabla.
3. Haga doble clic en Customer.dbf en la lista de archivos.
4. En el menú Ver, elija Examinar.
5. Desplácese por la tabla, examinando el campo Company de los registros hasta encontrar
“Ernst
Handel”.
Mediante programación podría 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
máxima del
pedido en un 3%.
Para incrementar manualmente la cantidad máxima del pedido
1. Presione la tecla Tab para desplazarse hasta el campo max_ord_amt.
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 programación, escriba el siguiente comando de
Visual
FoxPro en la ventana Comandos:
Manual del programador, Parte 1: Programación en Visual FoxPro Página 3 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
REPLACE max_ord_amt WITH max_ord_amt * 1,03
Es relativamente sencillo cambiar la cantidad máxima 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 máxima de pedido de todos los clientes. Podría hacerlo
manualmente, pero le llevaría 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 ningún error.
Programa de ejemplo para incrementar las cantidades máximas de pedido de todos
los clientes
Código Comentarios
USE customer Abre la tabla CUSTOMER.
SCAN Examina todos los registros de la tabla y realiza
todas las instrucciones comprendidas entre SCAN
y ENDSCAN para cada registro.
REPLACE max_ord_amt WITH ;
max_ord_amt * 1.03
Incrementa la cantidad máxima de pedido en un
3%. (El punto y coma (;) indica que el comando
sigue en la línea siguiente).
ENDSCAN Final del código que se ejecuta para cada registro
contenido en la tabla.
La ejecución de un programa ofrece numerosas ventajas en comparación con la
introducción de
distintos comandos en la ventana Comandos:
Los programas se pueden modificar y volver a ejecutar.
Se pueden ejecutar programas desde los menús, formularios y barras de herramientas.
Los programas pueden ejecutar otros programas.
En las siguientes secciones se describe la mecánica, los conceptos y los procesos que
subyacen a éste
y otros programas de Visual FoxPro.
La mecánica de la programación en Visual FoxPro
Puede programar en Visual FoxPro escribiendo código: instrucciones en forma de
comandos,
funciones u operaciones que Visual FoxPro puede entender. Puede incluir estas
instrucciones en:
La ventana Comandos.
Archivos de programa
Ventanas de código de eventos o de métodos en el Diseñador de formularios o en el
Diseñador
de clases
Ventanas de código de procedimientos en el Diseñador de menús
Ventanas de código de procedimientos en el Diseñador de informes
Manual del programador, Parte 1: Programación en Visual FoxPro Página 4 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Usar la ventana Comandos
Puede ejecutar un comando de Visual FoxPro si lo escribe en la ventana Comandos y
presiona
ENTRAR. Para volver a ejecutar el comando, lleve el cursor a la línea que contiene el
comando y
presione nuevamente ENTRAR.
Puede ejecutar varias líneas de código en la ventana Comandos como si constituyeran un
programa.
Para ejecutar varias líneas de código en la ventana Comandos
1. Seleccione las líneas de código.
2. Presione ENTRAR o elija Ejecutar selección en el menú emergente.
Como la ventana Comandos es una ventana de edición, 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 código 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.
Además, las opciones que elige en los menús y los cuadros de diálogo aparecen en la
ventana
Comandos como comandos. Puede copiar y pegar estos comandos en un programa de
Visual FoxPro
y a continuación ejecutar el programa repetidamente, lo cual facilita la ejecución 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:
Para crear un programa
1. En el Administrador de proyectos, seleccione Programas en la ficha Código.
2. Elija Nuevo.
–O bien–
1. En el menú Archivo, elija Nuevo.
2. En el cuadro de diálogo Nuevo, seleccione Programa.
3. Elija Nuevo archivo.
–O bien–
Manual del programador, Parte 1: Programación en Visual FoxPro Página 5 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
En la ventana Comandos, escriba:
MODIFY COMMAND
Visual FoxPro abrirá una nueva ventana denominada Programa1. Podrá entonces escribir su
programa en esta ventana.
Guardar programas
Una vez creado un programa, asegúrese de guardarlo.
Para guardar un programa
En el menú Archivo, elija Guardar.
Si intenta cerrar un programa sin antes guardarlo, aparecerá un cuadro de diálogo en el que
se le
preguntará si desea guardar o descartar los cambios realizados en el mismo.
Si guarda un programa creado a partir del Administrador de proyectos, el programa se
agregará al
proyecto.
Si guarda un programa al que todavía no ha asignado un nombre, se abrirá el cuadro de
diálogo
Guardar como, en el que podrá especificar el nombre del programa. Cuando haya guardado
el
programa, podrá ejecutarlo o modificarlo.
Modificar programas
Después de guardar el programa, podrá modificarlo. En primer lugar, abra el programa de
una de las
siguientes maneras:
Para abrir un programa
Si el programa forma parte de un proyecto, selecciónelo en el Administrador de
proyectos y
elija Modificar.
–O bien–
En el menú Archivo, elija Abrir. Aparecerá un cuadro de diálogo 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–
En la ventana Comandos, escriba el nombre del programa que desea modificar:
MODIFY COMMAND miprogram
–O bien–
Manual del programador, Parte 1: Programación en Visual FoxPro Página 6 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
En la ventana Comandos, escriba:
MODIFY COMMAND ?
Cuando aparezca la lista de archivos, seleccione el programa que desea modificar y a
continuación elija Abrir.
Después de abrir el programa, podrá realizar cambios en el mismo. Cuando haya terminado
de
introducir los cambios, asegúrese de guardar el programa.
Ejecutar programas
Después de crear un programa, podrá ejecutarlo.
Para ejecutar un programa
Si el programa forma parte de un proyecto, selecciónelo en el Administrador de
proyectos y
elija Ejecutar.
–O bien–
En el menú Programa, elija Ejecutar. Cuando aparezca la lista de programas,
seleccione el
programa que desea ejecutar y a continuación elija Ejecutar.
–O bien–
En la ventana Comandos, escriba DO y el nombre del programa que desea ejecutar:
DO miprogram
Escribir código en las herramientas de diseño de Visual FoxPro
El Diseñador de formularios, el Diseñador de clases y el Diseñador de menús le permiten
integrar
fácilmente código de programas mediante la interfaz de usuario, de forma que el código
apropiado se
ejecute como respuesta a las acciones del usuario. El Diseñador de informes le permite
crear informes
complejos y personalizados integrando código en el archivo del informe.
Para aprovechar plenamente la eficacia de Visual FoxPro, debe utilizar estas herramientas
de diseño.
Si desea más información sobre el Diseñador de informes, consulte el capítulo 7, Diseñar
informes y
etiquetas, del Manual del usuario. Para obtener información más detallada sobre el
Diseñador de
formularios, consulte el capítulo 3, Programación orientada a objetos, de este manual. Para
obtener
información más detallada sobre el Diseñador de formularios, consulte el capítulo 9, Crear
formularios, y si desea más información acerca del Diseñador de menús, consulte el
capítulo 11,
Diseñar menús y barras de herramientas.
Conceptos básicos de programación
Manual del programador, Parte 1: Programación en Visual FoxPro Página 7 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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
programación. Las herramientas utilizadas para manipular esta materia prima son
comandos,
funciones y operadores.
Almacenar datos
Los datos con los que trabaja probablemente incluyan períodos de tiempo, dinero y
elementos
contables, así como fechas, nombres, descripciones, etc. Cada dato corresponde a un
determinado
tipo, es decir, pertenece a una categoría de datos que se manipula de maneras similares.
Podría
trabajar directamente con estos datos sin almacenarlos, si bien perdería 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 fácilmente 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 números, pero no puede multiplicar caracteres.
Puede
imprimir caracteres en mayúsculas, pero no puede imprimir números en mayúsculas. 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
DateTime
{^1998-01-01}
{^1998-01-01 12:30:00 p}
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 período de pago. Si almacena esta información 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:
Manual del programador, Parte 1: Programación en Visual FoxPro Página 8 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Tipo Descripción
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 módulos 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 continuación se muestran los
operadores
utilizados habitualmente en Visual FoxPro.
Operador Tipos de datos válidos Ejemplo Resultado
= Todos ? n = 7 Imprime .T. si el valor
almacenado en la
variable es 7; de lo
contrario, imprime .F.
+ Numeric,
Character,Date,
DateTime
? "Fox" + "Pro" Imprime “FoxPro”
! or NOT Logical ? !.T. Imprime .F. (falso)
*, / Numeric ? 5 * 5
? 25 / 5
Imprime 25
Imprime 5
Nota Un signo de interrogación (?) situado delante de una expresión imprime el resultado
de la
expresión y un carácter de nueva línea 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 numéricos en dos variables. Los nombres de variable empiezan con la
letra n,
por lo que se puede determinar de inmediato que contienen datos numéricos, pero puede
nombrarlas
con cualquier combinación de caracteres alfanuméricos y caracteres de subrayado.
nPrimero = 123
nSegundo = 45
Manual del programador, Parte 1: Programación en Visual FoxPro Página 9 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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 concatenación, 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 numéricos, 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 conversión. Por ejemplo, STR( )
devuelve el valor
de tipo Character equivalente de un valor de tipo Numeric, mientras que VAL( ) devuelve
el
equivalente numérico de una cadena de caracteres formada por números. 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 específico de datos. Por ejemplo, las funciones STR( ) y
VAL( )
utilizadas en la sección anterior devuelven valores de tipo Character y Numeric,
respectivamente. Al
igual que ocurre con todas las funciones, estos tipos devueltos están documentados con las
funciones.
Hay cinco maneras de llamar a una función de Visual FoxPro:
Asignar a una variable el valor que devuelve la función. La siguiente línea de código
almacena
la fecha actual del sistema en una variable denominada dHoy:
dHoy = DATE( )
Incluir la llamada a la función en un comando de Visual FoxPro. El siguiente comando
establece el directorio predeterminado como el valor devuelto por la función GETDIR( ):
Manual del programador, Parte 1: Programación en Visual FoxPro Página 10 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
CD GETDIR( )
Imprimir el valor devuelto en la ventana de salida activa. La siguiente línea de código
imprime
la hora actual del sistema en la ventana principal de Visual FoxPro:
? TIME( )
Llamar a la función sin almacenar en ningún lugar el valor devuelto. La siguiente
llamada de
función desactiva el cursor:
SYS(2002)
Incluir la función dentro de otra función. La siguiente línea de código imprime el día de
la
semana:
? DOW(DATE( ))
A continuación se enumeran otros ejemplos de funciones utilizados en este capítulo:
Función Descripción
ISDIGIT( ) Devuelve el valor verdadero (.T.) si el carácter situado al comienzo de
una cadena es un número; de lo contrario, devuelve el valor falso (.F.).
FIELD( ) Devuelve el nombre de un campo.
LEN( ) Devuelve el número de caracteres de una expresión de caracteres.
RECCOUNT( ) Devuelve el número de registros de la tabla que está activa en este
momento.
SUBSTR( ) Devuelve el número especificado de caracteres a partir de una cadena de
caracteres, empezando en una posición especificada de la cadena.
Usar comandos
Un comando hace que se realice una determinada acción. Cada comando dispone de una
sintaxis
específica que indica lo que se debe incluir con el fin de que se ejecute correctamente el
comando.
Hay también cláusulas opcionales asociadas a los comandos que permiten especificar de
forma más
detallada la acción que se desea realizar.
Por ejemplo, el comando USE permite abrir y cerrar tablas:
Sintaxis de USE Descripción
USE Cierra la tabla que aparece en el área de trabajo
actual.
USE customer Abre la tabla CUSTOMER en el área de trabajo
actual y cierra cualquier tabla que ya esté abierta
Manual del programador, Parte 1: Programación en Visual FoxPro Página 11 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
en el área de trabajo.
USE customer IN 0 Abre la tabla CUSTOMER en la siguiente área de
trabajo disponible.
USE customer IN 0 ;
ALIAS miCliente
Abre la tabla CUSTOMER en la siguiente área de
trabajo disponible y asigna al área de trabajo el
alias miCliente.
A continuación se muestran algunos ejemplos de comandos utilizados en este capítulo:
Comando Descripción
DELETE Selecciona registros especificados de una tabla para su eliminación.
REPLACE Sustituye el valor almacenado en el campo del registro por un nuevo
valor.
Go Coloca el puntero de registro en una posición específica de la tabla.
Control del flujo del programa
Visual FoxPro incluye una categoría especial de comandos que "envuelven" a otros
comandos y
funciones, y determinan cuándo y con qué frecuencia se ejecutan. Estos comandos permiten
realizar
bifurcaciones condicionales y bucles, dos herramientas de programación muy eficaces. El
siguiente
programa muestra el uso de las bifurcaciones y los bucles condicionales. Estos conceptos se
describen
de forma más detallada después del ejemplo.
Suponga que su empresa cuenta con 10.000 empleados y desea conceder a todos aquéllos
que ganan
3.000.000 de pesetas o más 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 numérico denominado salario. Si desea obtener información sobre las áreas de
trabajo,
consulte "Usar múltiples tablas" en el capítulo 7, Trabajar con tablas..
Programa de ejemplo para aumentar el salario de los empleados
Código Observaciones
SCAN El código comprendido entre SCAN y ENDSCAN
se ejecuta tantas veces como registros haya en la
tabla. Cada vez que se ejecuta el código, el
puntero de registro se desplaza al siguiente
registro de la tabla.
IF salario >= 3000000
REPLACE salary WITH ;
salario * 1,03
Para cada registro, si el salario es mayor o igual
que 3.000.000, este valor se sustituye por un
nuevo salario que es un 3% superior.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 12 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
El signo de punto y coma (;) que aparece después
de WITH indica que el comando continúa en la
siguiente línea.
ELSE
REPLACE salario WITH ;
salario * 1,06
Para cada registro, si el salario no es mayor o igual
que 3.000.000, se sustituye este valor por un
nuevo salario que es un 6% superior.
ENDIF
ENDSCAN
Final de la instrucción condicional IF.
Final del código que se ejecuta para cada registro
de la tabla.
Este ejemplo utiliza comandos de bifurcación y bucle condicional para controlar el
desarrollo del
programa.
Bifurcación condicional
La bifurcación condicional permite someter a prueba condiciones y, a continuación, en
función del
resultado de la prueba, realizar distintas operaciones. Visual FoxPro ofrece dos comandos
que
permiten realizar una bifurcación condicional:
IF ... ELSE ... ENDIF
DO CASE ... ENDCASE
El código comprendido entre la instrucción inicial y la instrucción ENDIF o ENDCASE
sólo se
ejecuta si una condición lógica se evalúa como verdadera (.T.). En el programa de ejemplo,
el
comando IF se utiliza para distinguir entre dos estados: o el salario es de 3.000.000 pesetas
o más, o
no lo es. Se adoptan diferentes medidas, dependiendo del estado.
En el siguiente ejemplo, si el valor almacenado en la variable nTempAgua es menor que
100, no se
realizará ninguna acción:
* definir una variable lógica como Verdadera si se cumple una condición.
IF nTempAgua >= 100
lEbullición = .T.
ENDIF
Nota Un asterisco al principio de una línea de un programa indica que la línea es un
comentario.
Los comentarios ayudan al programador a recordar la función que debe realizar cada
segmento de
código, si bien Visual FoxPro los pasa por alto.
Si se desea comprobar varias condiciones posibles, un bloque DO CASE ... ENDCASE
puede
resultar más eficaz que varias instrucciones IF y además es más fácil realizar un
seguimiento del
mismo.
Bucles
Un bucle le permite ejecutar una o más líneas de código tantas veces como sea necesario.
En Visual
Manual del programador, Parte 1: Programación en Visual FoxPro Página 13 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
FoxPro hay tres comandos que permiten realizar bucles:
SCAN ... ENDSCAN
FOR ... ENDFOR
DO WHILE ... ENDDO
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
código una vez
y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla.
Utilice FOR cuando sepa cuántas veces debe ejecutarse la sección de código. Por ejemplo,
sabe que
una tabla contiene un número específico de campos. Puesto que la función FCOUNT( ) de
Visual
FoxPro devuelve este número, puede utilizar un bucle FOR para imprimir los nombres de
todos los
campos de la tabla:
FOR nRecuento = 1 TO FCOUNT( )
? FIELD(nRecuento)
ENDFOR
Utilice DO WHILE cuando desee ejecutar una sección de código mientras cumpla una
determinada
condición. Tal vez no sepa cuántas veces debe ejecutarse el código, pero sí sabe cuándo
debe
detenerse la ejecución. 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. Surgiría 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, podría agregar un número a las iniciales. Por ejemplo, el
código de
identificación de Miguel Suárez podría ser MS. La siguiente persona cuyas iniciales fuesen
las
mismas, Margarita Sánchez, sería MS1. Si a continuación anexase María Sanz a la tabla, su
código de
identificación sería MS2. Un bucle DO WHILE permite localizar el número correcto que se
debe
adjuntar a las iniciales.
Programa de ejemplo que utiliza DO WHILE para generar un número de
identificación único
Código Comentarios
nAquí = RECNO() Guardar la posición del registro.
cIniciales = LEFT(nombre,1) + ;
LEFT(apellido,1)
nSufijo = 0
Obtener las iniciales de la persona a partir de las
primeras letras de los campos nombre y apellido.
Si es necesario, establecer una variable que
contenga el número que se debe agregar al final de
las iniciales de una persona.
LOCATE FOR id_persona = cIniciales Comprobar si hay otra persona en la tabla cuyas
iniciales son las mismas.
DO WHILE FOUND( ) Si en otro registro de la tabla hay un valor
id_persona que coincide con cIniciales, la
Manual del programador, Parte 1: Programación en Visual FoxPro Página 14 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
función FOUND( ) devolverá el valor verdadero
(.T.) y se ejecutará el código contenido en el bucle
DO WHILE.
Si no se encuentra ninguna coincidencia, la
siguiente línea de código que se ejecute será la
línea que figura a continuación de ENDDO.
nSufijo = nSufijo + 1
cIniciales = ;
LEFT(cIniciales,2);
+ ALLTRIM(STR(nSufijo))
Preparar un sufijo nuevo y anexarlo al final de las
iniciales.
CONTINUE CONTINUE hace que se vuelva a evaluar el
último comando LOCATE. El programa
comprueba si el nuevo valor contenido en
cIniciales ya existe en el campo id_persona de
otro registro. Si es así, FOUND( ) seguirá
devolviendo el valor .T. y se volverá a ejecutar el
código contenido en el bucle DO WHILE. Si el
nuevo valor contenido en cIniciales es
efectivamente único, FOUND( ) devolverá el valor
.F. y la ejecución del programa continuará con la
línea de código que figura a continuación de
ENDDO.
ENDDO Final del bucle DO WHILE.
GOTO nAquí
REPLACE id_persona WITH cIniciales
Volver al registro y almacenar el código de
identificación único en el campo id_persona.
Puesto que no hay manera de saber de antemano cuántas veces se encontrarán los códigos
de
identificación coincidentes que ya se están utilizando, se utiliza el bucle DO WHILE.
El proceso de la programación
Cuando entienda los conceptos básicos, la programación será un proceso reiterativo. Los
pasos se
repiten numerosas veces, perfeccionándose el código a medida que se avanza. Al principio,
someterá
el código a prueba frecuentemente mediante un sistema de prueba y tanteo. Cuanto más
conozca el
lenguaje, mayor será la rapidez con que pueda programar y podrá realizar más pruebas
preliminares
mentalmente.
Entre los pasos básicos de la programación cabe citar los siguientes:
Definir el problema.
Desglosar el problema en elementos discretos.
Construir los elementos.
Comprobar y perfeccionar los elementos.
Ensamblar los elementos.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 15 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Comprobar el programa en su conjunto.
A continuación se enumeran algunos aspectos que debe tener presentes al empezar a
programar:
Defina claramente el problema antes de intentar resolverlo. Si no lo hace, acabará por
realizar
numerosos cambios, desechará código, tendrá que empezar de nuevo o bien terminará con
un
resultado que no es realmente lo que deseaba.
Desglose el problema en pasos manejables, en lugar de intentar resolver todo el
problema de
una sola vez.
Pruebe y depure secciones de código a medida que desarrolla el programa. Compruebe
que el
código hace lo que quiere que haga. La depuración es el proceso de encontrar y solucionar
problemas que impiden que el código se ejecute correctamente.
Perfeccione los datos y el almacenamiento de datos para facilitar la manipulación de
estos
datos a través del código del programa. Esto suele implicar estructurar las tablas de forma
adecuada.
En el resto de esta sección se describen los pasos que debe seguir para construir un pequeño
programa
Visual FoxPro.
Definir el problema
Antes de poder resolver un problema, debe formularlo claramente. Algunas veces, si ajusta
la
formulación del problema podrá ver más opciones para resolverlo.
Suponga que obtiene muchos datos de distintos orígenes. Si bien la mayoría de los datos
son
estrictamente numéricos, algunos valores contienen guiones y espacios en blanco además
de
números. Suponga que quiere eliminar todos los espacios en blanco y los guiones de dichos
campos y
guardar los datos numéricos.
En lugar de intentar eliminar los espacios en blanco y los guiones de los datos originales,
podría
formular el objetivo del programa como:
Objetivo Reemplazar los valores existentes de un campo por otros valores que contengan
todo lo
que contenían los valores originales, excepto los espacios en blanco y los guiones.
Esta formulación 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 específicas a Visual FoxPro en términos de
operaciones,
comandos y funciones, debe descomponer el problema en pasos discretos. La tarea más
discreta para
este problema sería examinar cada carácter de la cadena. Hasta que pueda examinar un
carácter
individualmente, no podrá determinar si desea guardarlo.
Una vez que examine un carácter, deberá comprobar si se trata de un guión o de un espacio
en
blanco. En este momento, quizá desee refinar la declaración del problema. ¿Y si obtuviera
más
adelante datos que contienen paréntesis de apertura y de cierre? ¿Y si desea deshacerse de
los
símbolos de moneda, las comas y los puntos? Cuanto más genérico pueda hacer el código,
más
Manual del programador, Parte 1: Programación en Visual FoxPro Página 16 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
trabajo se ahorrará de ahora en adelante; lo principal es ahorrar trabajo. He aquí una
formulación del
problema válida para una variedad mucho mayor de datos:
Objetivo refinado Reemplazar los valores existentes en un campo por otros valores que
contengan
únicamente los caracteres numéricos de los valores originales.
Con esta formulación, ahora puede volver a plantear el problema a nivel de carácter: si el
carácter es
numérico, guardar el carácter; si el carácter es no numérico, pasar al siguiente carácter.
Cuando haya
construido una cadena que sólo contenga los elementos numéricos de la cadena inicial,
podrá
reemplazar la primera cadena y pasar al siguiente registro hasta que haya terminado con
todos los
datos.
Para resumir, el problema se descompone en los siguientes elementos:
1. Examinar cada carácter.
2. Decidir si el carácter es numérico o no.
3. Si es numérico, copiarlo a la segunda cadena.
4. Cuando haya terminado con todos los caracteres de la cadena original, reemplazar la
cadena
original con la cadena que sólo contiene valores numéricos.
5. Repetir estos pasos para todos los registros de la tabla.
Construir los elementos
Cuando sepa qué debe hacer, puede empezar a formular los elementos en términos 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:
cTest = "123-456-7 89 0"
Examinar cada carácter
En primer lugar desea buscar un único carácter en la cadena. Para obtener una lista de
funciones que
se pueden utilizar para manipular cadenas, vea Funciones de carácter.
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 parámetros: la cadena, la ubicación inicial dentro de la
cadena y el
número de caracteres que se deben devolver de la cadena, empezando por la ubicación
inicial. Para
comprobar si SUBSTR( ) va a hacer lo que usted quiere, podría escribir los siguientes
comandos en la
Manual del programador, Parte 1: Programación en Visual FoxPro Página 17 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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 número
determinado de caracteres (14), puede utilizar un bucle FOR. El contador del bucle FOR se
incrementa cada vez que se ejecuta el código del bucle, por lo que puede utilizar el
contador de la
función SUBSTR( ). Puesto que en la ventana Comandos no puede comprobar las
construcciones de
bucles, deberá probar la siguiente sección de código en un programa de ejemplo.
Para crear un programa nuevo
1. Escriba el siguiente comando en la ventana Comandos:
MODIFY COMMAND numonly
2. En la ventana que aparecerá, escriba las siguientes líneas de código:
FOR nCnt = 1 TO 14
? SUBSTR(cTest, nCnt, 1)
ENDFOR
Ahora que ha creado un programa, ya puede ejecutarlo.
Para ejecutar un programa
1. En la ventana del programa abierto, presione CTRL+E.
2. Si aparece un cuadro de diálogo Guardar, elija Aceptar.
Cuando ejecute este programa, los caracteres individuales de la cadena de prueba se
imprimirán en
líneas distintas en la ventana principal de Visual FoxPro.
Comprobar parte del programa
Manual del programador, Parte 1: Programación en Visual FoxPro Página 18 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Ya ha completado la primera tarea. Ahora puede examinar cada carácter de la cadena.
Decidir si el carácter es numérico
Cuando tenga un único carácter de la cadena, debe saber si se trata de un número. Puede
hacerlo con
ISDIGIT( ).
Puede probar los siguientes comandos en la ventana Comandos:
? ISDIGIT('2')
? ISDIGIT('-')
? ISDIGIT(SUBSTR(cTest, 3, 1))
Resultado
.T.
.F.
.T.
De este resultado se desprende que ‘2’ es un número, ‘ – ’ no es un número y el tercer
carácter, 3, es
un número.
Si el carácter es numérico, copiarlo a la segunda cadena
Ahora que puede examinar los caracteres y determinar si son o no numéricos, necesita una
variable
Manual del programador, Parte 1: Programación en Visual FoxPro Página 19 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
para almacenar los valores numéricos: 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 carácter de la cadena a medida que ésta se manipula:
cCharacter = SUBSTR(cTest, nCnt, 1)
Sugerencia Normalmente es mejor almacenar en una variable de memoria el resultado de
un
cálculo, evaluación o función. Entonces puede manipular la variable en lugar de tener que
repetir el
cálculo o la evaluación.
La siguiente línea de código puede utilizarse cada vez que se encuentra un número para
sumar el
número a la segunda cadena:
cNumOnly = cNumOnly + cCharacter
Hasta ahora, el programa es el siguiente:
cNumOnly = ""
FOR nCnt = 1 TO 14
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
Prueba de los elementos
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:
Manual del programador, Parte 1: Programación en Visual FoxPro Página 20 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
cTest = "456-789 22"
El programa generará un mensaje de error. El bucle FOR ha intentado ejecutarse 14 veces,
pero en la
cadena sólo había 10 caracteres. Necesita una forma de ajustar las longitudes variables de
las cadenas.
Use LEN( ) para devolver el número 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
Agrupar los elementos
Para completar la solución de programación para este problema, quizá desee volver a leer
sus datos
de una tabla. Cuando tenga una tabla, explore los registros y aplique su código de programa
a un
campo de la tabla, en lugar de a una variable.
En primer lugar, podría crear una tabla temporal que contuviera diversas cadenas de
prueba. Dicha
tabla podría 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:
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? TestField
? cNumOnly
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 código 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)
Manual del programador, Parte 1: Programación en Visual FoxPro Página 21 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? TestField
? cNumOnly
?
ENDSCAN
Resultado
123-456-7 89 0
1234567890
456-789 22
45678922
-9221 9220 94321 99-
922192209432199
000001 98-99-234
0000019899234
Comprobar todo el programa
En lugar de imprimir la cadena al final del programa, quizá desee guardarla en la tabla. Para
ello,
utilice la siguiente línea de código:
REPLACE TestField WITH cNumOnly
El programa completo será el siguiente:
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.
Aumentar la robustez del programa
Un programa robusto hace lo que usted quiere que haga, pero también 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:
Hay una tabla abierta en el área de trabajo actual.
Por ejemplo, para basar una nueva clase, x, en parentclass de Mylibrary.vcx, use el
código
siguiente:
CREATE CLASS x OF y AS parentclass ;
FROM mylibrary
Utilizar el Diseñador de clases
Cuando especifica la clase en la que está basada la nueva clase y la biblioteca en la que se
va a
almacenar, se abre el Diseñador de clases.
Diseñador de clases
Manual del programador, Parte 1: Programación en Visual FoxPro Página 44 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
El Diseñador de clases proporciona la misma interfaz que el Diseñador de formularios, que
le permite
ver y modificar las propiedades de la clase en la ventana Propiedades. La ventana de
edición de
código le permite escribir código para que se ejecute cuando ocurran eventos o se llame a
métodos.
Agregar objetos a una clase de control o a una clase de contenedor
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 Diseñador de formularios: elija el botón del control en la barra
de
herramientas Controles de formularios y arrastre para ajustar el tamaño en el Diseñador de
clases.
Independientemente del tipo de clase en el que base la nueva clase, puede establecer
propiedades y
escribir código de método. También podrá crear nuevas propiedades y métodos para la
clase.
Agregar propiedades y métodos a una clase
Puede agregar tantas propiedades y métodos nuevos a la nueva clase como desee. Las
propiedades
contienen valores, mientras que los métodos contienen código de procedimiento que se
ejecutará
cuando llame al método.
Crear propiedades y métodos nuevos
Cuando crea propiedades y métodos nuevos para clases, las propiedades y los métodos
tienen como
alcance la clase, no los componentes individuales de la misma.
Para agregar una propiedad nueva a una clase
Manual del programador, Parte 1: Programación en Visual FoxPro Página 45 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
1. En el menú Clase, elija Nueva propiedad.
2. En el cuadro de diálogo Nueva propiedad, escriba el nombre de la propiedad.
3. Especifique la visibilidad: Public, Protected o Hidden.
Puede tener acceso a una propiedad Public desde cualquier lugar de la aplicación. Las
propiedades Protected y Hidden se tratan en "Proteger y ocultar miembros de clase" más
adelante en este mismo capítulo.
Cuadro de diálogo Nueva propiedad
4. Elija Agregar.
También puede incluir una descripción de la propiedad que aparecerá en la parte inferior de
la
ventana Propiedades en el Diseñador de clases y en el Diseñador de formularios cuando
se
agregue el control a un formulario.
Solución 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 ejecución. Tiene que documentar de forma explícita los valores válidos de la
propiedad. Si
la propiedad puede establecerse como 0, 1 ó 2, por ejemplo, indíquelo en el cuadro
Descripción del
cuadro de diálogo Nueva propiedad. También es conveniente comprobar el valor de la
propiedad en
código que haga referencia a ella.
Para crear una propiedad de matriz
En el cuadro Nombre del cuadro de diálogo Nueva propiedad, especifique el nombre, el
tamaño y las dimensiones de la matriz.
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]
La propiedad de matriz es de sólo lectura en tiempo de diseño y se muestra en cursiva en la
ventana
Propiedades. Se puede administrar y redimensionar en tiempo de ejecución. Para ver un
ejemplo del
Manual del programador, Parte 1: Programación en Visual FoxPro Página 46 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
uso de una propiedad de matriz, consulte "Administrar varias instancias de un formulario"
en el
capítulo 9, Crear formularios.
Para agregar un método nuevo a una clase
1. En el menú Clase, elija Nuevo método.
2. En el cuadro de diálogo Nuevo método, escriba el nombre del método.
3. Especifique la visibilidad: Public, Protected o Hidden.
4. Seleccione la casilla de verificación Access para crear un método de Access, seleccione
la
casilla de verificación para crear un método Assign o seleccione ambas casillas de
verificación
para crear métodos Access y Assign.
Los métodos Access y Assign le permiten ejecutar código cuando se consulta el valor de
una
propiedad o cuando se intenta cambiar su valor.
El código de un método Access se ejecuta cuando se consulta el valor de una propiedad,
generalmente al utilizar la propiedad en una referencia de objeto, al almacenar el valor de
una
propiedad en una variable o al mostrar el valor de la propiedad con un signo de
interrogación (?).
El código de un método 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 más información acerca de los métodos Access y Assign, consulte Métodos
Access y
Assign.
También puede incluir una descripción del método.
Proteger y ocultar miembros de clases
Las propiedades y métodos de una definición de clase son Public de forma predeterminada:
el código
de otras clases u otros procedimientos puede establecer las propiedades o llamar a los
métodos. A las
propiedades y los métodos definidos como Protected sólo pueden tener acceso otros
métodos de la
definición de la clase o de subclases de la clase. A las propiedades y los métodos definidos
como
Hidden sólo pueden tener acceso otros miembros de la definición 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 método desde fuera de la clase mediante programación.
El ejemplo siguiente ilustra el uso de propiedades y métodos protegidos de una clase
La clase Stopwatch incluida en Samples.vcx, en el directorio ...\Samples\Vfp98\Classes de
Visual
Studio, incluye un cronómetro y cinco etiquetas que muestran el tiempo transcurrido:
La clase Stopwatch de Samples.vcx
Manual del programador, Parte 1: Programación en Visual FoxPro Página 47 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
La clase Stopwatch contiene etiquetas y un cronómetro.
Valores de las propiedades de la clase Stopwatch
Control Propiedad Valor
lblSeconds Caption 00
lblColon1 Caption :
lblMinutes Caption 00
lblColon2 Caption :
lblHours Caption 00
tmrSWatch Interval 1000
Esta clase tiene también tres propiedades protegidas, nSec, nMin y nHour, así como un
método
protegido, UpdateDisplay. Los otros tres métodos personalizados de la clase, Start, Stop y
Reset no
están protegidos.
Sugerencia Elija Información de clase en el menú Clase para ver la visibilidad de todas
las
propiedades y métodos de una clase.
Las propiedades protegidas se utilizan en cálculos internos en el método UpdateDisplay y
el evento
Timer. El método UpdateDisplay establece los títulos de las etiquetas para que reflejen el
tiempo
transcurrido.
Método UpdateDisplay
Código Comentarios
CSecDisplay = ALLTRIM(STR(THIS.nSec))
cMinDisplay = ALLTRIM(STR(THIS.nMin))
cHourDisplay = ALLTRIM(STR(THIS.nHour))
Convierte las propiedades numéricas al
tipo Character para mostrarlas en los
títulos de etiqueta.
THIS.lblSeconds.Caption = ;
IIF(THIS.nSec < 10, ;
Establece los títulos de etiqueta,
Manual del programador, Parte 1: Programación en Visual FoxPro Página 48 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
IIF(THIS.nSec < 10, ;
"0" ,"") + cSecDisplay
THIS.lblMinutes.Caption = ;
IIF(THIS.nMin < 10, ;
"0", "") + cMinDisplay
THIS.lblHours.Caption = ;
IIF(THIS.nHour < 10, ;
"0", "") + cHourDisplay
conservando los 0 iniciales si el valor de
la propiedad numérica es menor que 10.
La tabla siguiente muestra el código del evento tmrSWatch.Timer.
Evento Timer
Código Comentarios
THIS.Parent.nSec = THIS.Parent.nSec + 1
IF THIS.Parent.nSec = 60
THIS.Parent.nSec = 0
THIS.Parent.nMin = ;
THIS.Parent.nMin + 1
ENDIF
Incrementa el valor de la propiedad nSec
cada vez que se desencadena el evento de
cronómetro cada segundo.
Si nSec ha llegado a 60, lo restablece a 0 e
incrementa la propiedad nMin.
IF THIS.Parent.nMin = 60
THIS.Parent.nMin = 0
THIS.Parent.nHour = ;
THIS.Parent.nHour + 1
ENDIF
THIS.Parent.UpdateDisplay
Si nMin ha llegado a 60, lo restablece a 0 e
incrementa la propiedad nHour.
Llama al método UpdateDisplay cuando
se establecen los nuevos valores de la
propiedad.
La clase Stopwatch tiene tres métodos que no están protegidos: Start, Stop y Reset. Un
usuario debe
poder llamar directamente a estos métodos para controlar el cronómetro.
El método Start contiene la línea de código siguiente:
THIS.tmrSWatch.Enabled = .T.
El método Stop contiene la línea de código siguiente:
THIS.tmrSWatch.Enabled = .F.
El método Reset establece las propiedades protegidas a 0 y llama al método protegido:
THIS.nSec = 0
THIS.nMin = 0
THIS.nHour = 0
THIS.UpdateDisplay
El usuario no puede establecer directamente estas propiedades o llamar a este método, pero
el código
del método Reset sí puede hacerlo.
Especificar el valor predeterminado para una propiedad
Manual del programador, Parte 1: Programación en Visual FoxPro Página 49 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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.
También puede establecer cualquiera de las propiedades de clase de base en el Diseñador
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
vacía,
seleccione el valor en el cuadro Edición de propiedades y presione la tecla RETROCESO.
Especificar la apariencia en tiempo de diseño
Puede especificar el icono de barra de herramientas y el de contenedor para su clase en el
cuadro de
diálogo Información de clase.
Para establecer un icono de barra de herramientas para una clase
1. En el Diseñador de clases, elija Información de clase en el menú Clase.
2. En el cuadro de diálogo Información de clase, escriba el nombre y la ruta de acceso del
archivo
.BMP en el cuadro Icono de la barra de herramientas.
Sugerencia El archivo de mapa de bits (archivo .bmp) para el icono de la barra de
herramientas debe tener 15 por 16 píxeles. Si la imagen es mayor o menor, se ajustará a 15
por
16 píxeles y posiblemente no tendrá la apariencia deseada.
El icono de barra de herramientas especificado se muestra en la barra de herramientas
Controles de
formularios cuando se llena la barra de herramientas con las clases de la biblioteca de
clases.
También 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.
Para establecer un icono contenedor para una clase
1. En el Diseñador de clases, elija Información de clase en el menú Clase.
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 botón de la barra de herramientas Controles de formularios.
Usar archivos de bibliotecas de clases
Todas las clases diseñadas visualmente se almacenan en una biblioteca de clases con la
extensión de
archivo .vcx.
Crear una biblioteca de clases
Manual del programador, Parte 1: Programación en Visual FoxPro Página 50 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Una biblioteca de clases puede crearse de una de estas tres formas.
Para crear una biblioteca de clases
Cuando cree una clase, especifique un nuevo archivo de biblioteca de clases en el cuadro
Almacenar en del cuadro de diálogo Nueva clase.
–O bien–
Utilice el comando CREATE CLASS, especificando el nombre de la nueva biblioteca de
clases.
Por ejemplo, la instrucción siguiente crea una nueva clase llamada miclase y una nueva
biblioteca de clases llamada nue_bib:
CREATE CLASS miclase OF nue_bib AS CUSTOM
–O bien–
Utilice el comando CREATE CLASSLIB.
Por ejemplo, escriba el comando siguiente en la ventana Comandos para crear una
biblioteca de
clases llamada nue_bib:
CREATE CLASSLIB nue_bib
Copiar y quitar clases de bibliotecas de clases
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.
Para copiar una clase de una biblioteca a otra
1. Asegúrese de que ambas bibliotecas están en un proyecto (no necesariamente en el
mismo).
2. En el Administrador de proyectos, seleccione la ficha Clases.
3. Haga clic en el signo más (+) situado a la izquierda de la biblioteca de clases en la que se
encuentra ahora la clase.
4. Arrastre la clase desde la biblioteca original y colóquela en la nueva.
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 deberán estar abiertas, por lo que se tardará un poco más en
cargar
inicialmente la clase en tiempo de ejecución y en tiempo de diseño.
Para quitar una clase de una biblioteca
Manual del programador, Parte 1: Programación en Visual FoxPro Página 51 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Seleccione la clase en el Administrador de proyectos y elija Quitar.
–O bien–
Utilice el comando REMOVE CLASS.
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 volverán a funcionar correctamente.
Visual FoxPro incluye un Examinador de clases para facilitar el uso y la administración de
clases y
bibliotecas de clases. Para obtener más información, vea la ventana Examinador de clases.
Agregar clases a formularios
Puede arrastrar una clase desde el Administrador de proyectos hasta el Diseñador de
formularios o
hasta el Diseñador de clases. También puede registrar las clases de modo que puedan
mostrarse
directamente en la barra de herramientas Controles de formularios del Diseñador de
formularios o el
Diseñador de clases y agregarse a contenedores de la misma forma que los controles
estándar.
Para registrar una biblioteca de clases
1. En el menú Herramientas, elija Opciones.
2. En el cuadro de diálogo Opciones, elija la ficha Controles.
3. Seleccione Bibliotecas de clases visuales y elija Agregar.
4. En el cuadro de diálogo Abrir, elija una biblioteca de clases para agregar el registro y, a
continuación, 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.
También puede agregar la biblioteca de clases a la barra de herramientas Controles de
formularios si
elige Agregar en el submenú del botón Ver clases. Para que estas clases estén disponibles
en la barra
de herramientas Controles de formularios en sesiones futuras de Visual FoxPro, tendrán
que
establecer el valor predeterminado en el cuadro de diálogo Opciones.
Anular valores predeterminados de propiedades
Al agregar a un formulario objetos basados en una clase definida por el usuario, puede
cambiar el
valor de todas las propiedades de la clase que no estén protegidas, anulando los valores
predeterminados. Si posteriormente cambia las propiedades de clase en el Diseñador de
clases, no se
verá afectada la configuración del objeto del formulario. Si no ha cambiado el valor de una
propiedad
del formulario y cambia el de la clase, el cambio también surtirá efecto en el objeto.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 52 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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 también será
verde.
Llamar al código de métodos de clase primaria
Un objeto o una clase que se basa en otra clase hereda automáticamente la funcionalidad de
la clase
original. Sin embargo, puede anular fácilmente el código de métodos heredado. Por
ejemplo, puede
escribir nuevo código para el evento Click de una clase después de haberla convertido en
subclase o
después de agregar al contenedor un objeto basado en la clase. En ambos casos, el nuevo
código se
ejecuta en tiempo de ejecución; el código original no se ejecuta.
Sin embargo, es más 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 programación 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 diseño de la clase con la función
DODEFAULT( ) o
el operador de resolución de alcance (::) para agregar código a distintos niveles de la
jerarquía del
contenedor o de la clase.
Agregar funcionalidad a subclases
Puede llamar al código de la clase primaria desde una subclase mediante la función
DODEFAULT( ).
Por ejemplo, cmdOK es una clase de botón de comando almacenada en Buttons.vcx, ubicada
en el
directorio ...\Samples\Vfp98\Classes de Visual Studio. El código asociado al evento Click
de cmdOk
libera el formulario que contiene el botón. 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 código siguiente al evento Click:
IF USED( ) AND CURSORGETPROP("Buffering") != 1
TABLEREVERT(.T.)
ENDIF
DODEFAULT( )
Como los cambios se escriben en una tabla almacenada en búfer de forma predeterminada
cuando se
cierra la tabla, no tiene que agregar código TABLEUPDATE( ) a cmdOk. El código
adicional de
cmdCancel deshace los cambios realizados a la tabla antes de llamar al código de cmdOk, la
clase
primaria, para liberar el formulario.
Jerarquías de clases y de contenedores
Las jerarquías de clases y de contenedores son dos entidades distintas. Visual FoxPro busca
código de
evento en la jerarquía de clases, mientras que se hace referencia a los objetos en la jerarquía
de
contenedores. La siguiente sección, "Referencias a objetos en la jerarquía de contenedores",
trata la
jerarquía de contenedores. Más adelante en este capítulo se explican las jerarquías de clases
en la
sección Llamar a código de evento en la jerarquía de clases.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 53 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Referencias a objetos en la jerarquía de contenedores
Para manipular un objeto, hay que identificarlo en relación a la jerarquía de contenedores.
Por
ejemplo, para manipular un control de un formulario perteneciente a un conjunto de
formularios,
deberá hacer referencia al conjunto de formularios, al formulario y, por último, al control.
Hacer referencia a un objeto dentro de su jerarquía de contenedores se puede comparar con
dar una
dirección del objeto a Visual FoxPro. Cuando describe la ubicación de una casa a otra
persona fuera
de su marco inmediato de referencia, debe indicar el país, la provincia o la región, la
ciudad, la calle o
bien sólo el número de la calle donde se encuentra la vivienda, según lo lejos que se
encuentre esa
otra persona. De lo contrario, podría haber cierta confusión.
La ilustración siguiente muestra una posible situación de anidamiento del contenedor.
Contenedores anidados
Para desactivar el control de la columna de cuadrícula, deberá proporcionar la dirección
siguiente:
Formset.Form.PageFrame.Page.;
Grid.Column.Control.Enabled = .F.
La propiedad ActiveForm del objeto aplicación (_VFP) le permite manipular el formulario
activo
aunque no conozca su nombre. Por ejemplo, la siguiente línea de código 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 expresión siguiente introducida en la ventana Inspección muestra el
nombre
del control activo de un formulario a medida que se eligen interactivamente los distintos
controles:
_VFP.ActiveForm.ActiveControl.Name
Referencias relativas
Manual del programador, Parte 1: Programación en Visual FoxPro Página 54 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Cuando haga referencia a objetos desde la jerarquía de contenedores (por ejemplo, en el
evento Click
de un botón de comando de un formulario perteneciente a un conjunto de formularios),
puede utilizar
algunos métodos 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 jerarquía
del
objeto:
Propiedad o palabra clave Referencia
Parent El contenedor más inmediato del objeto
THIS El objeto
THISFORM El formulario que contiene el objeto
THISFORMSET El conjunto de formularios que contiene el objeto
Nota Sólo puede utilizar THIS, THISFORM y THISFORMSET en código de métodos y
eventos.
La tabla siguiente proporciona ejemplos del uso de THISFORMSET, THISFORM, THIS y
Parent
para establecer propiedades de objetos:
Comando Dónde incluir el comando
THISFORMSET.frm1.cmd1.Caption = "Aceptar" En el código de evento o de método de
cualquier control de cualquier
formulario del conjunto de formularios.
THISFORM.cmd1.Caption = "Aceptar" En el código de evento o de método de
cualquier control del mismo formulario
en el que está cmd1.
THIS.Caption = "Aceptar" En el código de evento o de método del
control cuyo título desee cambiar.
THIS.Parent.BackColor = RGB(192,0,0) En el código de evento o de método de
un control de un formulario. El
comando cambia a rojo oscuro el color
de fondo del formulario.
Establecer propiedades
Las propiedades de un objeto pueden establecerse en tiempo de ejecución o en tiempo de
diseño.
Para establecer una propiedad
Utilice esta sintaxis:
Contenedor.Objeto.Propiedad = Valor
Manual del programador, Parte 1: Programación en Visual FoxPro Página 55 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Por ejemplo, las instrucciones siguientes establecen varias propiedades de un a cuadro de
texto
llamado txtDate en un formulario llamado frmPhoneLog:
frmPhoneLog.txtDate.Value = DATE( ) && Muestra la fecha actual
frmPhoneLog.txtDate.Enabled = .T. && El control está activado
frmPhoneLog.txtDate.ForeColor = RGB(0,0,0) && texto en negro
frmPhoneLog.txtDate.BackColor = RGB(192,192,192) && fondo en gris
Para la configuración de propiedades de los ejemplos anteriores, frmPhoneLog es el objeto
contenedor de mayor nivel. Si frmPhoneLog estuviera incluido en un conjunto de
formularios,
también debería incluir el conjunto de formularios en la ruta de acceso primaria:
frsContacts.frmPhoneLog.txtDate.Value = DATE( )
Establecer múltiples propiedades
La estructura WITH ... ENDWITH simplifica el establecimiento de múltiples propiedades.
Por
ejemplo, para establecer múltiples propiedades de una columna en una cuadrícula de un
formulario
perteneciente a un conjunto de formularios, podría utilizar la sintaxis siguiente:
WITH THISFORMSET.frmForm1.grdGrid1.grcColumn1
.Width = 5
.Resizable = .F.
.ForeColor = RGB(0,0,0)
.BackColor = RGB(255,255,255)
.SelectOnEntry = .T.
ENDWITH
Llamar a métodos
Una vez creado un objeto, puede llamar a los métodos de ese objeto desde cualquier lugar
de la
aplicación.
Para llamar a un método
Utilice esta sintaxis:
Primario.Objeto.Método
Las instrucciones siguientes llaman a métodos para mostrar un formulario y establecer el
enfoque en
un cuadro de texto:
frsFormSet.frmForm1.Show
frsFormSet.frmForm1.txtGetText1.SetFocus
Los métodos que devuelven valores y se utilizan en expresiones deben terminar en
paréntesis de
apertura y de cierre. Por ejemplo, la instrucción siguiente establece el título de un
formulario como el
valor devuelto por el método definido por el usuario GetNewCaption:
Form1.Caption = Form1.GetNewCaption( )
Manual del programador, Parte 1: Programación en Visual FoxPro Página 56 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Nota Los parámetros transferidos a métodos deben incluirse entre paréntesis después del
nombre del
método; por ejemplo, Form1.Show(nStyle). transfiere nStyle al código del método Show
de
Form1.
Responder a eventos
El código incluido en un procedimiento de evento se ejecuta cuando se produce el evento.
Por
ejemplo, el código incluido en el procedimiento de evento Click de un botón de comando se
ejecutará
cuando el usuario haga clic en el botón 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 ningún otro evento mediante programación,
pero sí puede
llamar al procedimiento asociado con el evento. Por ejemplo, la instrucción siguiente hace
que se
ejecute el código del evento Activate de frmPhoneLog, pero no activa el formulario:
frmPhoneLog.Activate
Si desea activar el formulario, utilice el método Show del formulario. Al llamar al método
Show se
mostrará y activará el formulario, momento en el que también se ejecutará el código del
evento
Activate:
frmPhoneLog.Show
Definir clases mediante programación
Las clases se pueden definir visualmente en el Diseñador de clases y el Diseñador de
formularios o
mediante programación en archivos .PRG. En esta sección se explica cómo escribir
definiciones de
clase. Para obtener información sobre comandos, funciones y operadores específicos, vea la
Ayuda.
Para obtener más información sobre formularios, consulte el capítulo 9, Crear formularios
En un archivo de programa es posible tener código de programa delante de las definiciones
de clase,
pero no después de ellas, del mismo modo que el código de programa no puede ir después
de los
procedimientos de un programa. El intérprete de comandos básico para la creación de
clases tiene la
sintaxis siguiente:
DEFINE CLASS NombreClase1 AS ClasePrimaria [OLEPUBLIC]
[[PROTECTED | HIDDEN NombrePropiedad1, NombrePropiedad2 ...]
[Object.]NombrePropiedad = eExpresión ...]
[ADD OBJECT [PROTECTED] NombreObjeto AS NombreClase2 [NOINIT]
[WITH cListaPropiedades]]...
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Nombre[_ACCESS | _ASSIGN]
[NODEFAULT]
cInstrucciones
[ENDFUNC | ENDPROC]]...
ENDDEFINE
Manual del programador, Parte 1: Programación en Visual FoxPro Página 57 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Proteger y ocultar miembros de clase
Puede proteger u ocultar propiedades y métodos de una definición de clase con las palabras
clave
PROTECTED y HIDDEN del comando DEFINE CLASS.
Por ejemplo, si crea una clase para almacenar información sobre empleados y no desea que
los
usuarios puedan modificar la fecha de contratación, puede proteger la propiedad
FechaContr. Si los
usuarios necesitan averiguar cuándo se contrató a un empleado determinado, podrá incluir
un método
para devolver la fecha de contratación.
DEFINE CLASS empleado AS CUSTOM
PROTECTED FechaContr
Nombre = ""
Apellido = ""
Dirección = ""
FechaContr = { - - }
PROCEDURE ObtFechaContr
RETURN This.FechaContr
ENDPROC
ENDDEFINE
Crear objetos a partir de clases
Cuando haya guardado una clase visual, puede crear un objeto basado en ella mediante la
función
CREATEOBJECT( ). El ejemplo siguiente muestra la ejecución de un formulario guardado
como una
definición de clase en el archivo de biblioteca de clases Forms.vcx:
Crear y mostrar un objeto Form cuya clase se diseñó en el Diseñador de formularios
Código Comentarios
SET CLASSLIB TO Forms ADDITIVE Establece como biblioteca de clases el archivo
.vcx en el que se guardó la definición del
formulario. La palabra clave ADDITIVE impide
que este comando cierre otras bibliotecas de clases
que estuvieran abiertas.
frmTest = CREATEOBJECT ("FormPrueba") Este código supone que el nombre de la
clase de
formulario guardada en la biblioteca de clases es
FormPrueba.
frmTest.Show Muestra el formulario.
Agregar objetos a una clase contenedor
Puede utilizar la cláusula ADD OBJECT en el comando DEFINE CLASS o en el método
AddObject
para agregar objetos a un contenedor.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 58 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Por ejemplo, la siguiente definición de clase se basa en un formulario. El comando ADD
OBJECT
agrega dos botones de comando al formulario:
DEFINE CLASS miform AS FORM
ADD OBJECT cmdOK AS COMMANDBUTTON
ADD OBJECT PROTECTED cmdCancel AS COMMANDBUTTON
ENDDEFINE
Utilice el método AddObject para agregar objetos a un contenedor después de crear el
objeto
contenedor. Por ejemplo, las líneas de código siguientes crean un objeto formulario y le
agregan dos
botones de comando:
frmMessage = CREATEOBJECT("FORM")
frmMessage.AddObject("txt1", "TEXTBOX")
frmMessage.AddObject("txt2", "TEXTBOX")
También puede utilizar el método AddObject en el código de método de una clase. Por
ejemplo, la
definición de clase siguiente utiliza AddObject en el código asociado al evento Init para
agregar un
control a una columna de cuadrícula.
DEFINE CLASS micuad AS GRID
ColumnCount = 3
PROCEDURE Init
THIS.Column2.AddObject("cboCliente", "COMBOBOX")
THIS.Column2.CurrentControl = "cboCliente"
ENDPROC
ENDDEFINE
Agregar y crear clases en código de métodos
Puede agregar objetos a un contenedor mediante programación con el método AddObject.
También
puede crear objetos con la función CREATEOBJECT( ) en los métodos Load, Init o en
cualquier otro
método de la clase.
Cuando agregue un objeto con el método 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, también se libera
el objeto
agregado.
Cuando crea un objeto con la función CREATEOBJECT( ), el objeto está en el alcance de
una
propiedad de la clase o variable del método que llama a esta función. La propiedad primaria
del
objeto no está definida.
Asignar código de método y código de evento
Además de escribir código para los métodos y eventos de un objeto, puede ampliar el
conjunto de
métodos en las subclases de clases de base de Visual FoxPro. Estas son las reglas para
escribir código
de evento y métodos:
El conjunto de eventos para las clases de base de Visual FoxPro es limitado y no puede
ampliarse.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 59 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Todas las clases reconocen un conjunto limitado de eventos predeterminados, que
incluye
como mínimo los eventos Init, Destroy y Error.
Al crear en una definición de clase un método con el mismo nombre que un evento
reconocible
por la clase, el código del método se ejecutará cuando se produzca el evento.
Puede agregar métodos a las clases mediante la creación de un procedimiento o una
función en
la definición de clase.
Puede crear métodos Access y Assign para sus clases si crea un procedimiento o una
función
con el mismo nombre que una propiedad de clase y anexa _ACCESS o _ASSIGN al
nombre de
procedimiento o de función.
Llamar al código de evento en la jerarquía de clases
Al crear una clase, ésta hereda automáticamente todas las propiedades, los métodos y los
eventos de
la clase primaria. Si se escribe código para un evento en la clase primaria, ese código se
ejecutará
cuando se produzca el evento con respecto a un objeto basado en la subclase. Sin embargo,
podrá
sobrescribir el código de la clase primaria escribiendo código para el evento en la subclase.
Para llamar explícitamente al código de evento en una clase primaria cuando la subclase
tiene código
escrito para el mismo evento, utilice la función DODEFAULT( ).
Por ejemplo, podría tener una clase llamada cmdBottom basada en la clase de base del
botón de
comando que tuviera el código siguiente en el evento Click:
GO BOTTOM
THISFORM.Refresh
Al agregar un objeto basado en esta clase a un formulario llamado, por ejemplo,
cmdInferior1,
podría decidir que también desea mostrar un mensaje para informar al usuario de que el
puntero de
registro está en la parte inferior de la tabla. Podría agregar el código siguiente al evento
Click del
objeto para mostrar el mensaje:
WAIT WINDOW "En la parte inferior de la tabla" TIMEOUT 1
Sin embargo, al ejecutar el formulario se muestra el mensaje, pero el puntero de registro no
se mueve
porque nunca se ejecuta el código del evento Click de la clase primaria. Para asegurarse de
que
también se ejecuta el código del evento Click de la clase primaria, incluya las siguientes
líneas de
código en el procedimiento del evento Click del objeto:
DODEFAULT( )
WAIT WINDOW "En la parte inferior de la tabla" TIMEOUT 1
Nota Puede utilizar la función ACLASS( ) para determinar todas las clases de la jerarquía
de clases
de un objeto.
Impedir la ejecución del código de clase de base
En algunos casos, deseará evitar que produzca el comportamiento predeterminado de la
clase de base
en un evento o método. Para ello, incluya la palabra clave NODEFAULT en el código de
método que
escriba. Por ejemplo, el programa siguiente utiliza la palabra clave NODEFAULT en el
evento
Manual del programador, Parte 1: Programación en Visual FoxPro Página 60 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
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
Crear un conjunto de botones de desplazamiento por tablas
Una característica común 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.
Botones de desplazamiento por tablas
Diseño de los botones de desplazamiento
Todos los botones tendrán algunas características y funciones comunes, por lo que es
conveniente
crear una clase de botones de desplazamiento. A continuación, los botones individuales
pueden
aprovechar fácilmente esta apariencia y funcionalidad comunes. Esta clase primaria es la
clase
NavButton que se definirá posteriormente en esta sección.
Una vez definida la clase primaria, las subclases siguientes definen la funcionalidad y
apariencia
específicas 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.
Definición de la clase NAVBUTTON
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.
Definición de la clase genérica botón de comando de desplazamiento
Manual del programador, Parte 1: Programación en Visual FoxPro Página 61 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Código Comentarios
DEFINE CLASS NavButton AS
COMMANDBUTTON
Height = 25
Width = 25
TableAlias = ""
Define la clase primaria de los botones de
desplazamiento.
Asigna dimensiones a la clase.
Incluye una propiedad personalizada, TableAlias,
que contiene el nombre del alias por el que
desplazarse.
PROCEDURE Click
IF NOT EMPTY(This.TableAlias)
SELECT (This.TableAlias)
ENDIF
ENDPROC
Si se ha establecido TableAlias, este
procedimiento de clase priamria selecciona el alias
antes de ejecutar el código real de desplazamiento
en las subclases. De lo contrario, se supondrá que
el usuario desea desplazarse por la tabla del área
de trabajo seleccionada actualmente.
PROCEDURE RefreshForm
_SCREEN.ActiveForm.Refresh
ENDPROC
Al emplear _SCREEN.ActiveForm.Refresh en
lugar de THISFORM.Refresh puede agregar la
clase a un formulario o una barra de herramientas
y hacer que funcione con la misma precisión.
ENDDEFINE Finaliza la definición de clase.
Los botones de desplazamiento específicos se basan en la clase NavButton. El código
siguiente
define el botón Superior para el conjunto de botones de desplazamiento. Los tres botones
de
desplazamiento restantes se definen en la tabla siguiente. Las cuatro definiciones de clase
son
similares. Por ello, sólo se ofrecen comentarios extensos para la primera definición.
Definición de la clase botón de desplazamiento Superior
Código Comentarios
DEFINE CLASS navTop AS BotDespl
Caption = "|<"
Define la clase botón de desplazamiento Superior
y establece la propiedad Caption.
PROCEDURE Click Crea código de método que se ejecutará cuando se
produzca el evento Click para el control.
DODEFAULT( )
GO TOP
THIS.RefreshForm
Llama al código de evento Click de la clase
primaria, Navbutton, de modo que se pueda
seleccionar el alias adecuado si se ha establecido
la propiedad TableAlias.
Incluye el código para establecer el puntero de
registro en el primer registro de la tabla: GO TOP.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 62 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Llama al método RefreshForm de la clase
primaria. No es necesario utilizar el operador de
resolución de alcance (::) en este caso porque no
hay ningún método en la subclase que tenga el
mismo nombre que el método de la clase primaria.
Por otra parte, tanto la clase primaria como la
subclase tienen código de método para el evento
Click.
ENDPROC Termina el procedimiento Click.
ENDDEFINE Termina la definición de clase.
Los restantes botones de desplazamiento tienen definiciones de clase similares.
Definición de las demás clases de botones de desplazamiento
Código Comentarios
DEFINE CLASS navNext AS Navbutton
Caption = ">"
Define la clase de botón de desplazamiento
Siguiente y establece la propiedad Caption.
PROCEDURE Click
DODEFAULT( )
SKIP 1
IF EOF( )
GO BOTTOM
ENDIF
THIS.RefreshForm
ENDPROC
ENDDEFINE
Incluye el código para establecer el puntero de
registro en el siguiente registro de la tabla.
Termina la definición de la clase.
DEFINE CLASS navPrior AS Navbutton
Caption = "<"
Define la clase de botón de desplazamiento
Anterior y establece la propiedad Caption.
PROCEDURE Click
DODEFAULT( )
SKIP -1
IF BOF( )
GO TOP
ENDIF
THIS.RefreshForm
ENDPROC
ENDDEFINE
Incluye el código para establecer el puntero de
registro en el registro anterior de la tabla.
Termina la definición de clase.
DEFINE CLASS navBottom AS
Navbutton
Caption = ">|"
Define la clase de botón de desplazamiento
Inferior y establece la propiedad Caption.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 63 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
PROCEDURE Click
DODEFAULT( )
GO BOTTOM
THIS.RefreshForm
ENDPROC
ENDDEFINE
Incluye el código para establecer el puntero de
registro en el último registro de la tabla.
Termina la definición de clase.
La siguiente definición de clase contiene los cuatro botones de desplazamiento para poder
agregarlos
como una unidad a un formulario. La clase también incluye un método para establecer la
propiedad
TableAlias de los botones.
Definición de una clase de controles de desplazamiento por tabla
Código Comentarios
DEFINE CLASS vcr AS CONTAINER
Height = 25
Width = 100
Left = 3
Top = 3
Comienza la definición de clase. La
propiedad Height se establece en el
mismo alto que los botones de comando
que contendrá.
ADD OBJECT cmdTop AS navTop ;
WITH Left = 0
ADD OBJECT cmdPrior AS navPrior ;
WITH Left = 25
ADD OBJECT cmdNext AS navNext ;
WITH Left = 50
ADD OBJECT cmdBot AS navBottom ;
WITH Left = 75
Agrega los botones de desplazamiento.
PROCEDURE SetTable(cTableAlias)
IF TYPE("cTableAlias") = 'C'
THIS.cmdTop.TableAlias = ;
cTableAlias
THIS.cmdPrior.TableAlias = ;
cTableAlias
THIS.cmdNext.TableAlias = ;
cTableAlias
THIS.cmdBot.TableAlias = ;
cTableAlias
ENDIF
ENDPROC
Este método se utiliza para establecer la
propiedad TableAlias de los botones.
TableAlias se define en la clase primaria
Navbutton.
También podría utilizar el método
SetAll para establecer esta propiedad:
IF TYPE ("cTableAlias") = 'C'
This.SetAll("TableAlias",
"cTableAlias")
ENDIF
Sin embargo, esto produciría un error si
se agregara a la clase un objeto que no
tuviera la propiedad TableAlias.
ENDDEFINE Termina la definición de clase.
Una vez definida la clase, puede dividirla en subclases o agregarla a un formulario.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 64 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Crear una subclase basada en la nueva clase
También puede crear subclases basadas en vcr que tengan botones adicionales como
Buscar,
Modificar, Guardar y Salir. Por ejemplo, vcr2 incluye un botón Salir:
Botones de desplazamiento por tablas con un botón para cerrar el formulario
Definición de una subclase de control de desplazamiento por tablas
Código Comentarios
DEFINE CLASS vcr2 AS vcr
ADD OBJECT cmdQuit AS
COMMANDBUTTON WITH ;
Caption = "Salir",;
Height = 25, ;
Width = 50
Width = THIS.Width + THIS.cmdQuit.Width
cmdQuit.Left = THIS.Width - ;
THIS.cmdQuit.Width
Define una clase basada en vcr y le agrega un
botón de comando.
PROCEDURE cmdQuit.CLICK
RELEASE THISFORM
ENDPROC
Cuando el usuario haga clic en cmdQuit, este
código liberará el formulario.
ENDDEFINE Termina la definición de clase.
Vcr2 tiene todo lo de vcr más el nuevo botón de comando y no es necesario volver a
escribir ninguna
parte del código.
Cambios en VCR reflejados en la subclase
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 instrucción 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 instrucción IF
BOF( ) de
navPrior.Click por la siguiente:
IF BOF()
Manual del programador, Parte 1: Programación en Visual FoxPro Página 65 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
GO TOP
SET MESSAGE TO "Principio de la tabla"
ELSE
SET MESSAGE TO
ENDIF
Si se realizan estos cambios en las clases navNext y navPrior, también se aplicarán
automáticamente a los botones apropiados de vcr y vcr2.
Agregar vcr a una clase de formulario
Una vez definido vcr como un control, el control puede agregarse a la definición de un
contenedor.
Por ejemplo, el código siguiente agregado a Navclass.prg define un formulario al que se
han agregado
botones de desplazamiento:
DEFINE CLASS NavForm AS Form
ADD OBJECT oVCR AS vcr
ENDDEFINE
Ejecutar el formulario que contiene VCR
Una vez definida la subclase de formulario, podrá mostrarla fácilmente con los comandos
apropiados.
Para mostrar el formulario
1. Cargue la definición de clase:
SET PROCEDURE TO navclass ADDITIVE
2. Cree un objeto basado en la clase navForm:
frmPrueba = CREATEOBJECT("navForm")
3. Invoque el método Show del formulario:
frmPrueba.Show
Si no llama al método 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 método 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.
Definir un control cuadrícula
Una cuadrícula contiene columnas que, a su vez, pueden contener encabezados y cualquier
otro
Manual del programador, Parte 1: Programación en Visual FoxPro Página 66 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
control. El control predeterminado contenido en una columna es un cuadro de texto, por lo
que la
funcionalidad predeterminada de la cuadrícula se aproxima a una ventana Examinar. Sin
embargo, la
arquitectura subyacente de la cuadrícula la abre hasta una extensión ilimitada.
El ejemplo siguiente crea un formulario que contiene un objeto Grid (Cuadrícula) con dos
columnas.
La segunda columna contiene una casilla de verificación para mostrar los valores en un
campo lógico
de una tabla.
Control Grid (Cuadrícula) con una casilla de verificación en una columna
Definición de una clase Grid con una casilla de verificación en una columna de
cuadrícula
Código Comentarios
DEFINE CLASS grdProducts AS Grid
Left = 24
Top = 10
Width = 295
Height = 210
Visible = .T.
RowHeight = 28
ColumnCount = 2
Comienza la definición de clase y establece
las propiedades que determinan la apariencia
de la cuadrícula.
Al establecer la propiedad ColumnCount en
2, se agregan dos columnas a la cuadrícula.
Cada columna contiene un encabezado con el
nombre Header1. Además, cada columna
tiene un grupo de propiedades independiente
que determina su apariencia y
comportamiento.
Column1.ControlSource ="prod_name"
Column2.ControlSource ="discontinu"
Al establecer la propiedad ControlSource de
una columna, la columna muestra los valores
de ese campo para todos los registros de la
tabla.
Discontinu es un campo lógico.
Column2.Sparse = .F. Column2 contendrá la casilla de verificación.
Establezca la propiedad Sparse de la columna
Manual del programador, Parte 1: Programación en Visual FoxPro Página 67 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
en .F. de modo que la casilla de verificación
sea visible en todas las filas, no sólo en la
celda seleccionada.
Procedure Init
THIS.Column1.Width = 175
THIS.Column2.Width = 68
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.
THIS.Column2.chk1.Caption = ""
ENDPROC
Establece el ancho de las columnas y los
títulos de los encabezados.
El método AddObject permite agregar un
objeto a un contenedor ; en este caso, una
casilla de verificación llamada chk1.
Establece la propiedad CurrentControl de la
columna en la casilla de verificación, de
modo que se muestre la casilla de
verificación.
Comprueba que la casilla de verificación es
visible.
Establece el título en una cadena vacía de
modo que no se muestre el título
predeterminado "chk1".
ENDDEFINE Termina la definición de clase.
La siguiente definición de clase es el formulario que contiene la cuadrícula. Ambas
definiciones de
clase pueden incluirse en el mismo archivo de programa.
Definición de una clase Form que contiene la clase Grid
Código Comentarios
DEFINE CLASS GridForm AS FORM
Width = 330
Height = 250
Caption = "Ejemplo de cuadrícula"
ADD OBJECT grid1 AS grdProducts
Crea una clase de formulario y le agrega un
objeto basado en la clase de cuadrícula.
PROCEDURE Destroy
CLEAR EVENTS
ENDPROC
ENDDEFINE
El programa que crea un objeto basado en
esta clase utilizará READ EVENTS. Al
incluir CLEAR EVENTS en el evento
Destroy del formulario, el programa podrá
terminar cuando el usuario cierre el
formulario.
Termina la definición de clase.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 68 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
El programa siguiente abre la tabla donde están incluidos los campos que se van a mostrar
en las
columnas de cuadrícula, 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 están incluidas las
definiciones de clase
si aparece al principio del archivo. También puede emplear el comando SET PROCEDURE
TO para
especificar el programa que contiene las definiciones de clase e incluir este código en un
programa
distinto.
Crear referencias a objetos
En lugar de realizar una copia de un objeto, puede crear una referencia a dicho objeto. Una
referencia
ocupa menos memoria que un objeto adicional, puede transferirse fácilmente entre
procedimientos y
puede ayudar a escribir código genérico.
Devolver una referencia a un objeto
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
DEFINE CLASS InvoiceForm AS FORM
ADD OBJECT txtCompany AS TEXTBOX
* código para establecer propiedades, agregar otros objetos, etc.
ENDDEFINE
El programa siguiente establece una referencia al objeto creado en Newin.prg. La variable
de
referencia puede manipularse exactamente del mismo modo que la variable de objeto:
frmInvoice = NewInv() && almacena la referencia al objeto en una variable
frmInvoice.SHOW
También 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 jerarquía de clases del objeto, los valores de las propiedades, los objetos contenidos y los
métodos
y eventos disponibles. Puede llenar una matriz con las propiedades (no los valores de las
propiedades), eventos, métodos y objetos contenidos de un objeto con la función
AMEMBERS( ).
Manual del programador, Parte 1: Programación en Visual FoxPro Página 69 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Liberar objetos y referencias de la memoria
Si existe una referencia a un objeto, la liberación 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
Comprobar si existe un objeto
Puede utilizar las funciones TYPE( ), ISNULL( ) y VARTYPE( ) para determinar si existe
un objeto.
Por ejemplo, las líneas de código siguientes comprueban si existe un objeto llamado
oConexión:
IF TYPE("oConexión") = "O" AND NOT ISNULL(oConexión)
* El objeto existe
ELSE
* El objeto no existe
ENDIF
Nota El comando ISNULL( ) es necesario porque .NULL. se almacena en la variable de
objeto de
formulario cuando un usuario cierra un formulario, pero el tipo de variable sigue siendo
"O".
Crear matrices de miembros
Puede definir miembros de clases como matrices. En el ejemplo siguiente, elecc es una
matriz de
controles.
DEFINE CLASS MoverListBox AS CONTAINER
DIMENSION choices[3]
ADD OBJECT lFromListBox AS LISTBOX
ADD OBJECT lToListBox AS LISTBOX
ADD OBJECT choices[1] AS COMMANDBUTTON
ADD OBJECT choices[2] AS COMMANDBUTTON
ADD OBJECT choices[3] AS CHECKBOX
PROCEDURE choices.CLICK
PARAMETER nIndex
DO CASE
CASE nIndex = 1
* código
CASE nIndex = 2
* código
CASE nIndex = 3
* código
ENDCASE
ENDPROC
ENDDEFINE
Cuando un usuario hace clic en un control incluido en una matriz de controles, Visual
FoxPro
transfiere el número de índice del control al procedimiento de evento Click. En este
procedimiento,
Manual del programador, Parte 1: Programación en Visual FoxPro Página 70 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
puede utilizar una instrucción CASE para ejecutar código distinto según el botón en el que
se haya
hecho clic.
Crear matrices de objetos
También puede crear matrices de objetos. Por ejemplo, MiMatriz contiene cinco botones
de
comando:
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:
No se puede asignar un objeto a una matriz completa mediante un comando. Es necesario
asignar individualmente el objeto a cada miembro de la matriz.
No se puede asignar un valor a una propiedad de una matriz completa. El comando
siguiente
produciría un error:
MiMatriz.Enabled = .F.
Al redimensionar una matriz de objetos para que sea más grande que la matriz original,
los
elementos nuevos se inicializarán como falso (.F.), como ocurre con todas las matrices de
Visual FoxPro. Cuando redimensione una matriz de objetos para que sea más pequeña que
la
matriz original, se liberarán los objetos cuyo subíndice sea mayor que el mayor subíndice
nuevo.
Usar objetos para almacenar datos
En los lenguajes orientados a objetos, una clase ofrece un medio útil y cómodo para
almacenar datos
y procedimientos relacionados con una entidad. Por ejemplo, podría definir una clase de
cliente para
incluir en ella información sobre un cliente, así como un método para calcular la edad del
cliente:
DEFINE CLASS cliente AS CUSTOM
Apellidos = ""
Nombre = ""
FechaNacimiento = { - - }
PROCEDURE Edad
IF !EMPTY(THIS.FechaNacimiento)
RETURN YEAR(DATE()) - YEAR(THIS.FechaNacimiento)
ELSE
RETURN 0
ENDIF
ENDPROC
ENDDEFINE
Sin embargo, los datos almacenados en objetos que se basan en la clase de cliente sólo se
almacenan
en memoria. Si estos datos estuvieran en una tabla, ésta se almacenaría en disco. Si tuviera
que hacer
un seguimiento de varios clientes, la tabla le daría acceso a todos los comandos y las
funciones de
administración de bases de datos de Visual FoxPro. De este modo, podría localizar
información
rápidamente, ordenarla, agruparla, realizar cálculos, crear informes y consultas basándose
en la
Manual del programador, Parte 1: Programación en Visual FoxPro Página 71 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
información, etc.
Visual FoxPro ofrece un resultado incomparable en cuanto al almacenamiento y la
manipulación de
datos de bases de datos y tablas. Sin embargo, en determinadas ocasiones deseará
almacenar datos en
objetos. Generalmente, los datos sólo serán significativos mientras se esté ejecutando la
aplicación y
pertenecerán a una única entidad.
Por ejemplo, en una aplicación que incluye un sistema de seguridad, normalmente tendría
una tabla
de los usuarios que tienen acceso a la aplicación. La tabla incluiría la identificación, la
contraseña y el
nivel de acceso del usuario. Cuando un usuario haya iniciado una sesión no necesitará toda
la
información de la tabla. Lo único que necesitará es la información sobre el usuario actual y
esta
información se puede almacenar y manipular fácilmente en un objeto. Por ejemplo, la
definición de
clase siguiente inicia una sesión al crear un objeto basado en la clase:
DEFINE CLASS NuevoUsuario AS CUSTOM
PROTECTED LogonTime, AccessLevel
UserId = ""
PassWord = ""
LogonTime = { - - : : }
AccessLevel = 0
PROCEDURE Init
DO FORM LOGON WITH ; && suponiendo que ha creado este formulario
This.UserId, ;
This.PassWord, ;
This.AccessLevel
This.LogonTime = DATETIME( )
ENDPROC
* Crear métodos para devolver valores de propiedad protegidos.
PROCEDURE GetLogonTime
RETURN This.LogonTime
ENDPROC
PROCEDURE GetAccessLevel
RETURN This.AccessLevel
ENDPROC
ENDDEFINE
En el programa principal de la aplicación, podría crear un objeto basado en la clase
NuevoUsuario:
oUser = CREATEOBJECT('NuevoUsuario')
oUser.Logon
En cualquier parte de la aplicación, cuando necesite información sobre el usuario actual,
podrá
obtenerla del objeto oUser. Por ejemplo:
IF oUser.GetAccessLevel( ) >= 4
DO ADMIN.MPR
ENDIF
Integrar objetos y datos
En la mayoría de las aplicaciones, puede sacar el máximo partido de la potencia de Visual
FoxPro si
integra objetos y datos. La mayoría de las clases de Visual FoxPro tienen propiedades y
métodos que
permiten integrar la potencia de un administrador de base de datos relacional y un sistema
completamente orientado a objetos.
Manual del programador, Parte 1: Programación en Visual FoxPro Página 72 de 83
file://C:\temp\~hh52BB.htm 30/05/2000
Propiedades para integrar datos de clases y bases de datos de Visual FoxPro
Clase Propiedades de datos
Cuadrícula RecordSource, ChildOrder, LinkMaster
Todos los demás controles ControlSource
Cuadro de lista y cuadro
combinado
ControlSource, RowSource
Formulario y conjunto de
formularios
DataSession
Puesto que estas propiedades de datos pueden cambiarse en tiempo de diseño o en tiempo
de
ejecución, puede crear controles genéricos con funcionalidad encapsulada que opere con
datos
diversos.
Para obtener más información sobre la integración de datos y objetos, consulte el capítulo
9, Crear
formularios y el capítulo 10, Usar controles.
Por ejemplo, el código siguiente abre la base de datos testdata y le agrega la tabla
orditems:
OPEN DATABASE testdata
ADD TABLE orditems
Para que una tabla libre existente pase a formar parte de una base de datos, debe agregarla
explícitamente. La modificación 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.
Usar tablas libres
Una tabla determinada sólo 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.
Para tener acceso a una tabla de otra base de datos
Manual del programador, Parte 2: Trabajar con datos Página 25 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para tener acceso a una tabla de otra base de datos
Cree una vista en la base de datos actual que haga referencia a la tabla en cuestión.
-O bien–
Tenga acceso a la tabla con el comando USE y el símbolo “!”.
El símbolo “!” 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
En el ejemplo anterior, la base de datos testdata se abre automáticamente al utilizar el
comando
USE, pero Visual FoxPro no la establece como base de datos actual. Las bases de datos
abiertas
automáticamente como en el ejemplo anterior se cierran también automáticamente al cerrar
la tabla, a
menos que se abra explícitamente la base de datos antes de cerrar la tabla.
Si desea información sobre el uso de una vista para tener acceso a información externa a la
base de
datos actual, consulte el capítulo 8, Crear vistas.
Quitar una tabla de una base de datos
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 información de ruta y nombre de archivo se denomina vínculo
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 información de diccionario de datos asociada del
archivo de
la base de datos, sino que también actualiza la información de vínculo 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 también eliminar físicamente
del disco el
archivo de la tabla.
Para quitar una tabla de una base de datos
En el Administrador de proyectos, seleccione el nombre de la tabla y luego elija Quitar.
-O bien–
En el Diseñador de bases de datos, seleccione la tabla y elija Quitar en el menú Base de
datos.
–O bien–
Utilice el comando REMOVE TABLE.
Por ejemplo, el código siguiente abre la base de datos testdata y quita la tabla orditems:
Manual del programador, Parte 2: Trabajar con datos Página 26 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Por ejemplo, el código siguiente abre la base de datos testdata y quita la tabla orditems:
OPEN DATABASE testdata
REMOVE TABLE orditems
Al quitar una tabla de una base de datos, el archivo de tabla no se elimina automáticamente.
Si desea
quitar la tabla de la base de datos y además eliminar del disco su archivo .dbf, utilice la
cláusula
DELETE del comando REMOVE TABLE o el comando DROP TABLE. Por ejemplo, el
código
siguiente abre la base de datos testdata y elimina la tabla orditems del disco:
OPEN DATABASE testdata
REMOVE TABLE orditems DELETE
El código siguiente también abre la base de datos testdata y elimina la tabla orditems
sin mover
una copia a la Papelera de reciclaje de Windows:
OPEN DATABASE testdata
DROP TABLE orditems NORECYCLE
Actualizar vínculos de tablas y bases de datos
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 vínculos anteriores y posteriores que Visual
FoxPro usa
para asociar archivos de bases de datos y de tablas:
El vínculo 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).
El vínculo posterior dice a la base de datos qué tablas le pertenecen. Los vínculos
posteriores
están almacenados en el archivo de base de datos (.dbc) y están formados por la ruta
relativa y
el nombre de archivo para cada archivo de tabla asociado.
Puede restablecer vínculos y actualizar la información de ruta relativa de forma que refleje
la nueva
ubicación del archivo.
Para actualizar vínculos después de mover una tabla o una base de datos
Use la cláusula RECOVER del comando VALIDATE DATABASE.
Por ejemplo, el código siguiente abre la base de datos testdata y muestra cuadros de
diálogo que le
permiten buscar tablas que no están en las ubicaciones contenidas en la base de datos:
OPEN DATABASE testdata
VALIDATE DATABASE RECOVER
Sugerencia Si quiere usar una tabla sin perder tiempo restableciendo los vínculos para
todas las
tablas de la base de datos, puede abrir la tabla con el comando USE. Visual FoxPro muestra
el cuadro
de diálogo Abrir que le permitirá buscar la base de datos propietaria o eliminar los vínculos.
Para obtener información sobre la eliminación del vínculo anterior de una tabla cuya base
de datos
propietaria se ha eliminado accidentalmente del disco, vea FREE TABLE.
Manual del programador, Parte 2: Trabajar con datos Página 27 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
propietaria se ha eliminado accidentalmente del disco, vea FREE TABLE.
Crear relaciones persistentes
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 características siguientes:
Se utilizan automáticamente como condiciones de combinación predeterminadas en los
Diseñadores de consultas y vistas.
Se representan en el Diseñador de bases de datos como líneas que relacionan los índices
de las
tablas.
Aparecen en el Diseñador de entorno de datos como relaciones predeterminadas para los
formularios e informes.
Se utilizan para almacenar información de integridad referencial.
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 relación 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 relación se define entre los índices y no entre los campos, lo que permite
relacionar
las tablas basándose en una expresión de índice simple o compleja.
Para crear una relación persistente entre tablas
En el Diseñador de bases de datos, elija el nombre del índice que desee relacionar y
arrástrelo
hasta el nombre del índice de la tabla relacionada.
–O bien–
Utilice la cláusula FOREIGN KEY en los comandos CREATE TABLE o ALTER
TABLE.
Por ejemplo, el comando siguiente agrega una relación persistente de uno a varios entre las
tablas
customer y orders, basándose en la clave principal cust_id de la tabla customer y en
una nueva
clave externa, cust_id, de la tabla orders:
ALTER TABLE orders;
ADD FOREIGN KEY cust_id TAG ;
cust_id REFERENCES customer
Si examina el esquema de la base de datos en el Diseñador de bases de datos, verá una línea
que une
orders y customer, lo que representa la nueva relación persistente.
Los índices proporcionan la base para relaciones persistentes
Manual del programador, Parte 2: Trabajar con datos Página 28 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
El tipo de etiqueta o clave de índice determinará el tipo de relación persistente que puede
crear. Es
necesaria una etiqueta de índice principal o candidato para el lado 'uno' de una relación de
uno a
varios; para el lado 'varios' debe utilizar una etiqueta o clave de índice normal. Si desea más
información sobre los tipos de índices y cómo crearlos, consulte el capítulo 7, Trabajar con
tablas.
Para eliminar una relación persistente entre tablas
1. En el Diseñador de bases de datos, haga clic en la línea de relación entre las dos tablas.
El ancho de la línea aumentará para indicar que ha seleccionado la relación.
2. Presione la tecla supr.
–O bien–
Use la cláusula DROP FOREIGN KEY con el comando ALTER TABLE.
Por ejemplo, el comando siguiente elimina una relación 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:
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE
Generar integridad referencial
Establecer integridad referencial implica la creación de un conjunto de reglas para preservar
las
relaciones definidas entre las tablas al introducir o eliminar registros.
Si exige la integridad referencial, Visual FoxPro impedirá las acciones siguientes:
Agregar registros a una tabla relacionada cuando no haya ningún registro asociado en la
tabla
principal.
Cambiar valores de una tabla principal cuando tales cambios supongan dejar registros
huérfanos en una tabla relacionada.
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
Manual del programador, Parte 2: Trabajar con datos Página 29 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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 harán que Visual FoxPro las compruebe.
El Generador de IR trata múltiples niveles de eliminaciones y actualizaciones en cascada y
es
recomendable como herramienta para asegurar la integridad referencial.
Para abrir el Generador de IR
1. Abra el Diseñador de bases de datos.
2. En el menú Base de datos, elija Modificar integridad referencial.
Al utilizar el Generador de IR para crear reglas que se van a aplicar a la base de datos,
Visual FoxPro
guarda el código generado para exigir las reglas de integridad referencial como
desencadenantes que
hacen referencia a procedimientos almacenados. Para ver este código puede abrir el editor
de texto de
procedimientos almacenados en la base de datos. Si desea información sobre la forma de
crear
desencadenantes por programa, consulte Uso de desencadenantes en el capítulo 7, Trabajar
con
tablas.
Precaución Cuando haga cambios en el diseño de una base de datos, como modificaciones
en sus
tablas o en los índices utilizados en una relación persistente, debe volver a ejecutar el
Generador de
IR antes de utilizar de nuevo la base de datos. De esta forma se revisará el código de
procedimiento
almacenado y los desencadenantes utilizados para exigir la integridad referencial, de forma
que
reflejen el nuevo diseño. Si no vuelve a ejecutar el Generador de RI, puede que obtenga
resultados
inesperados, ya que no se habrán actualizado los procedimientos almacenados y los
desencadenantes
para ajustarlos a las modificaciones.
Crear procedimientos almacenados
Puede crear procedimientos almacenados para las tablas de una base de datos. Un
procedimiento
almacenado está formado por código de Visual FoxPro incluido en el archivo .dbc. Los
procedimientos almacenados son procedimientos de código que operan específicamente
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.
Para crear, modificar o quitar un procedimiento almacenado
En el Administrador de proyectos, seleccione una base de datos, seleccione
Procedimientos
almacenados y, a continuación, elija Nuevo, Modificar o Quitar.
–O bien–
En el Diseñador de bases de datos, elija Modificar procedimientos almacenados en el
menú
Base de datos.
–O bien–
En la ventana Comandos, utilice el comando MODIFY PROCEDURE.
Manual del programador, Parte 2: Trabajar con datos Página 30 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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 validación a nivel de campo o registro.
Al guardar
una función definida por el usuario como procedimiento almacenado en la base de datos, el
código de
la función se guarda en el archivo .dbc y se desplaza automáticamente con la base de datos
cuando
ésta cambia de lugar. El uso de procedimientos almacenados permite también una mayor
portabilidad
de la aplicación, ya que no es necesario administrar los archivos de funciones definidas por
el usuario
independientemente del archivo de base de datos.
Mostrar y establecer de propiedades 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 código siguiente muestra el número de versión de la base de datos
testdata:
? DBGETPROP('testdata', 'database', 'version')
El valor devuelto representa el número de versión de .dbc de Visual FoxPro y es de sólo
lectura. Con
la misma función puede ver el comentario, si existe, para la base de datos:
? DBGETPROP('testdata', 'database', 'comment')
A diferencia de la propiedad Version, la propiedad Comment se puede establecer. Use la
función
DBSETPROP( ) para introducir una descripción u otro texto que quiera almacenar con la
base de
datos.
Para establecer la propiedad de comentario de la base de datos activa
En el Diseñador de bases de datos, elija Propiedades en el menú Base de datos y
escriba un
comentario en el cuadro Comentario.
–O bien–
Utilice la opción de comentario de la función DBSETPROP( ).
Por ejemplo, el código siguiente abre la base de datos testdata y muestra su esquema en
el
Diseñador de bases de datos:
MODIFY DATABASE testdata
Un esquema de base de datos es una representación de los objetos de la base de datos.
En el Diseñador 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
Manual del programador, Parte 2: Trabajar con datos Página 32 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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. También puede modificar procedimientos
almacenados.
Examinar archivos de base de datos
El archivo de base de datos contiene un registro por cada tabla, vista, índice, etiqueta de
índice,
relación persistente y conexión asociados a la base, y también por cada campo de tabla o de
vista con
propiedades extendidas. También incluye un registro único que contiene todos los
procedimientos
almacenados de la base de datos.
Para obtener más información acerca de la estructura del archivo .dbc, vea Estructura de
archivos de
tabla.
Aunque el Diseñador de bases de datos proporciona una representación 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.
CLOSE DATABASE sales
USE sales.dbc EXCLUSIVE
BROWSE
Precaución No utilice el comando BROWSE para modificar el archivo de base de datos si
no
conoce la estructura de los archivos .dbc. Si comete un error al intentar modificar el archivo
.dbc,
puede invalidar la base de datos y provocar una pérdida de datos.
Extender los archivos de base de datos
Todos los archivos .dbc contienen un campo Memo, llamado User, que puede utilizar para
almacenar
su propia información sobre cada registro de la base de datos. También puede extender un
archivo
.dbc agregándole 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.
Para agregar un campo a un archivo .dbc
1. Abra el archivo .dbc para uso exclusivo con el comando USE.
2. Utilice el comando MODIFY STRUCTURE.
Por ejemplo, el código siguiente abre el Diseñador de tablas para permitirle agregar un
campo a la
estructura de Testdata.dbc:
Manual del programador, Parte 2: Trabajar con datos Página 33 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
estructura de Testdata.dbc:
USE TESTDATA.DBC EXCLUSIVE
MODIFY STRUCTURE
Al agregar un nuevo campo o un archivo de base de datos, utilice como primer carácter de
su nombre
“U” para indicar que se trata de un campo definido por el usuario. Esta convención evita
que el
campo entre en conflicto con futuras extensiones del archivo .dbc.
Precaución 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.
Validar una base de datos
La validación 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.
Para validar una base de datos
Utilice el comando VALIDATE DATABASE.
Por ejemplo, el código siguiente utiliza y valida el archivo .dbc de la base de datos
testdata:
OPEN DATABASE testdata EXCLUSIVE
VALIDATE DATABASE
Administrar una base de datos
Después de crear una base de datos, es posible que quiera agregarla a un proyecto si no
forma parte
de uno. Si su base de datos ya forma parte de un proyecto, puede quitarla del mismo.
Además, si ya
no necesita la base de datos, puede eliminarla del disco.
Una base de datos en el Administrador de proyectos
Manual del programador, Parte 2: Trabajar con datos Página 34 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Agregar una base de datos a un proyecto
Al crear una base de datos con el comando CREATE DATABASE, la base de datos no
pasa
automáticamente a formar parte de un proyecto, aún cuando el Administrador de proyectos
esté
abierto. Puede agregar la base de datos a un proyecto para facilitar la organización, la
presentación y
la manipulación de los objetos de base de datos mediante la interfaz y también para
simplificar el
proceso de generación de una aplicación. Sólo se puede agregar una base de datos a un
proyecto
mediante el Administrador de proyectos.
Para agregar una base de datos a un proyecto
En el Administrador de proyectos, seleccione Bases de datos y, a continuación, elija
Agregar.
Quitar una base de datos de un proyecto
Sólo se puede quitar una base de datos de un proyecto mediante el Administrador de
proyectos.
Para quitar una base de datos de un proyecto
En el Administrador de proyectos, seleccione la base de datos y elija Quitar; a
continuación,
elija Quitar de nuevo.
Eliminar una base de datos
Para eliminar del disco una base de datos puede utilizar el Administrador de proyectos o el
comando
DELETE DATABASE.
Para eliminar una base de datos
En el Administrador de proyectos, seleccione la base de datos, elija Quitar y, a
continuación,
elija Eliminar.
–O bien–
Utilice el comando DELETE DATABASE.
Por ejemplo, el código siguiente elimina la base de datos ejemplo:
DELETE DATABASE sample
Utilice siempre alguno de los métodos 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 vínculos anteriores que unen la base de datos a sus tablas. Otras utilidades de
manipulación de
Manual del programador, Parte 2: Trabajar con datos Página 35 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
los vínculos anteriores que unen la base de datos a sus tablas. Otras utilidades de
manipulación de
archivos, como el Administrador de archivos de Windows, no suprimen los vínculos
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
también
todas sus tablas asociadas, utilice la cláusula DELETETABLES con el comando DELETE
DATABASE.
Hacer referencia a múltiples bases de datos
En un sistema es posible disponer de múltiples bases de datos de Visual FoxPro para
satisfacer las
necesidades de un entorno multiusuario. El uso de múltiples bases de datos ofrece las
siguientes
ventajas:
Controlan el acceso de usuarios a un subconjunto de tablas del sistema global.
Organizan los datos para satisfacer de forma eficaz las necesidades de información de
varios
grupos que usan el sistema.
Permitiendo el uso exclusivo de un subconjunto de tablas para crear vistas locales y
remotas en
tiempo de ejecución.
Por ejemplo, es posible que tenga una base de datos de ventas que guarda información de
ventas
usada principalmente por la fuerza de ventas que trabaja con clientes y otra base de datos
que guarda
información de inventario usada principalmente por los compradores que trabajan con los
suministradores. A veces es necesario que la información de estos grupos se solape. Estas
bases de
datos se pueden abrir simultáneamente y se puede tener acceso a las mismas como se desee,
pero
contendrán tipos de información completamente diferentes.
Múltiples bases de datos pueden agregar flexibilidad a su sistema
Puede usar múltiples bases de datos abriendo más de una base de datos simultáneamente o
estableciendo referencias en una base de datos cerrada. Cuando están abiertas varias bases
de datos,
puede establecer la base de datos actual y seleccionar tablas de ella.
Manual del programador, Parte 2: Trabajar con datos Página 36 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
puede establecer la base de datos actual y seleccionar tablas de ella.
Abrir más de una base de datos
Cuando hay abierta una base de datos, las tablas y las relaciones entre ellas están
controladas por la
información almacenada en la base de datos abierta. Puede tener abierta más de una base de
datos a la
vez. Por ejemplo, puede utilizar múltiples bases de datos abiertas al ejecutar varias
aplicaciones, cada
una basada en una base de datos distinta. También puede ser conveniente abrir varias bases
de datos
para utilizar información (como por ejemplo controles personalizados) almacenada en una
base de
datos distinta de la que utiliza la aplicación.
Para abrir más de una base de datos
En el Administrador de proyectos, seleccione una base de datos y elija Modificar o
Abrir.
–O bien–
Utilice el comando OPEN DATABASE.
Al abrir una nueva base de datos no se cierran las que se hayan abierto previamente. Las
bases
abiertas continuarán en este estado y la última en abrirse pasará a ser la base de datos
activa.
Establecer 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 formarán parte de la
base de
datos activa. Los comandos y funciones que manipulan bases de datos abiertas, como ADD
TABLE y
DBC( ), se aplican también 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.
Para establecer la base de datos activa
En la barra de herramientas estándar, seleccione una base de datos en el cuadro Bases de
datos.
–O bien–
Utilice el comando SET DATABASE.
Por ejemplo, el código siguiente abre tres bases de datos, establece la primera como activa
y luego
Manual del programador, Parte 2: Trabajar con datos Página 37 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Por ejemplo, el código siguiente abre tres bases de datos, establece la primera como activa
y luego
utiliza la función DBC( ) para mostrar el nombre de la base de datos activa:
OPEN DATABASE testdata
OPEN DATABASE tastrade
OPEN DATABASE sample
SET DATABASE TO testdata
? DBC( )
Sugerencia Visual FoxPro puede abrir una o más bases de datos automáticamente 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 explícitamente antes de utilizar comandos que
operen
sobre la base de datos activa.
Seleccionar tablas de la base de datos activa
Para elegir en una lista con las tablas de la base de datos activa, puede utilizar el comando
USE.
Para elegir una tabla de la base de datos activa
Escriba el comando USE con el símbolo “?”.
Aparecerá el cuadro de diálogo Usar en el que puede seleccionar la tabla que desea abrir.
Por ejemplo, el código siguiente abre la base de datos ventas y solicita que se seleccione
una de las
tablas que contiene.
OPEN DATABASE SALES
USE ?
Si desea seleccionar una tabla no asociada a la base de datos abierta, podrá elegir "Otras"
en el cuadro
de diálogo Usar.
Cerrar una base de datos
Puede cerrar una base de datos abierta mediante el Administrador de proyectos o mediante
el
comando CLOSE DATABASE.
Para cerrar una base de datos
En el Administrador de proyectos, seleccione la base de datos y elija Cerrar.
–O bien–
Utilice el comando CLOSE DATABASE.
Crear tablas
Manual del programador, Parte 2: Trabajar con datos Página 40 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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.
Diseñar tablas de base de datos y tablas libres
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:
Nombres largos para la tabla y para cada uno de sus campos.
Títulos y comentarios para cada campo de la tabla.
Valores predeterminados, máscaras de entrada y formato para los campos de la tabla.
Clases de control predeterminada para campos de tablas.
Reglas a nivel de campo y a nivel de registro.
Índices de clave primaria y relaciones de tablas para compatibilidad con reglas de
integridad
referencial.
Un desencadenante para cada evento INSERT, UPDATE o DELETE.
Algunas características sólo son aplicables a las tablas de base de datos. Si desea
información sobre la
forma de asociar tablas a una base de datos, consulte el capítulo 6, Crear bases de datos.
Las tablas de base de datos tienen propiedades con las que no cuentan las tablas libres
Puede diseñar y crear una tabla de forma interactiva mediante el Diseñador de tablas,
accesible a
través del Administrador de proyectos o del menú Archivo, o mediante el lenguaje de
programación.
En esta sección se describe principalmente la creación de una tabla mediante programación.
Si desea
información sobre el uso del Diseñador de tablas para crear tablas de forma interactiva,
consulte el
capítulo 2, Crear tablas e índices, del Manual del usuario.
Para crear y modificar una tabla mediante programación se utilizan los comandos
siguientes:
Comandos para crear y modificar tablas
Manual del programador, Parte 2: Trabajar con datos Página 41 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Comandos para crear y modificar tablas
ALTER TABLE CLOSE TABLES
CREATE TABLE DELETE FILE
REMOVE TABLE RENAME TABLE
DROP TABLE
Crear una tabla de base de datos
Para crear una nueva tabla en una base de datos puede utilizar el sistema de menús, 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.
Para crear una nueva tabla de base de datos
En el Administrador de proyectos seleccione una base de datos, elija Tablas y, a
continuación,
Nuevo para abrir el Diseñador de tablas.
–O bien–
Utilice el comando CREATE TABLE con una base de datos abierta.
Por ejemplo, el código siguiente crea la tabla peqtbl con una columna, llamada nombre:
OPEN DATABASE Sales
CREATE TABLE peqtbl (nombre c(50))
La nueva tabla se asocia automáticamente a la base de datos abierta en el momento de su
creación.
Esta asociación está definida por un vínculo anterior almacenado en el registro de
encabezado de la
tabla.
Crear una tabla libre
Para crear una nueva tabla libreLas tablas libres no están asociadas a ninguna base de datos.
Puede
ser conveniente crear una tabla libre, por ejemplo, para almacenar información de consulta
que
comparten múltiples bases de datos.
Manual del programador, Parte 2: Trabajar con datos Página 42 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
comparten múltiples bases de datos.
En el Administrador de proyectos, seleccione Tablas libres y, a continuación, Nuevo
para
abrir el Diseñador de tablas.
–O bien–
Use la palabra clave FREE con el comando CREATE TABLE.
Por ejemplo, el código 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.
Asignar un nombre a una tabla
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, dígitos o signos de subrayado y deben empezar por una letra
o un signo
de subrayado.
Si la tabla es de base de datos, también 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
Diseñador
de bases de datos, el Diseñador de consultas y el Diseñador de vistas, así como en la barra
de título de
las ventanas Examinar.
Para asignar un nombre largo a una tabla de base de datos
En el Diseñador de tablas, escriba un nombre largo en el cuadro de texto Nombre de la
ficha
Tabla.
–O bien–
Utilice la cláusula NAME del comando CREATE TABLE.
Por ejemplo, el código siguiente crea la tabla provintl y le asigna el nombre largo
vendors_international, más legible:
CREATE TABLE provintl NAME vendors_international (company C(40))
También puede utilizar el Diseñador 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 Diseñador de tablas para agregarle un nombre largo de tabla. Los
nombres
largos pueden contener letras, dígitos o signos de subrayado, y deben empezar por una letra
o un
Manual del programador, Parte 2: Trabajar con datos Página 43 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
largos pueden contener letras, dígitos 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.
Cambiar el nombre de una tabla
Puede cambiar el nombre de tablas de base de datos a través 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 sólo se puede cambiar su
nombre a
través del lenguaje.
Para cambiar el nombre de una tabla de una base de datos
1. En el Diseñador de bases de datos, seleccione la tabla cuyo nombre desea cambiar.
2. En el menú Base de datos, elija Modificar.
3. En el Diseñador de tablas escriba un nuevo nombre para la tabla en el cuadro Nombre
de
tabla de la ficha Tabla.
Para cambiar el nombre de una tabla
Use el comando RENAME.
Precaución Si usa el comando RENAME en tablas asociadas a la base de datos, el
comando
no actualiza el vínculo anterior a la base de datos y puede producir errores de acceso a la
tabla.
Eliminar una tabla de base de datos
Si una tabla está asociada a una base de datos, para eliminarla quítela 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 físicamente del disco, consulte Quitar una tabla de
una base
de datos" en el capítulo 6, Crear bases de datos.
Para eliminar una tabla de base de datos del disco
En el Administrador de proyectos, seleccione el nombre de la tabla, elija Quitar y, a
continuación, elija Eliminar.
–O bien–
En el Diseñador de bases de datos, seleccione la tabla, elija Quitar del menú Base de
datos y,
a continuación, elija Eliminar.
–O bien–
Para eliminar la tabla junto a todos los índices principales, valores predeterminados y
reglas de
validación asociadas a la tabla, use el comando DROP TABLE.
–O bien–
Manual del programador, Parte 2: Trabajar con datos Página 44 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
–O bien–
Para eliminar únicamente el archivo de tabla (.dbf), use el comando ERASE.
Precaución Si usa el comando ERASE en tablas asociadas a la base de datos, el comando
no
actualiza el vínculo anterior a la base de datos y puede producir errores de acceso a tabla.
Por ejemplo, el código siguiente abre la base de datos testdata y elimina la tabla
orditems y sus
índices, valores predeterminados y reglas de validación:
OPEN DATABASE testdata
DROP TABLE orditems
Al eliminar una tabla con la cláusula DELETE del comando REMOVE TABLE también
desaparecen
el archivo memo .fpt y el archivo de índice estructural .cdx.
Eliminar una tabla libre
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.
Para eliminar una tabla libre
En el Administrador de proyectos, seleccione la tabla libre, elija Quitar y, a
continuación, elija
Eliminar.
–O bien–
Utilice el comando DELETE FILE.
Por ejemplo, si la tabla actual es ejemplo, el código 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), asegúrese de eliminar también este archivo. Por ejemplo, si el archivo
ejemplo.dbf
tuviese además un archivo memo asociado, podría eliminar ambos archivos con los
comandos
siguientes:
USE
DELETE FILE ejemplo.dbf
DELETE FILE ejemplo.fpt
Duplicar una tabla
Puede hacer una copia idéntica de una tabla, sus procedimientos almacenados, expresiones
desencadenantes, valores de campos predeterminados y su contenido a través de
programación. No
hay ninguna opción de menú que realice la misma función. Este procedimiento no copia el
contenido
Manual del programador, Parte 2: Trabajar con datos Página 45 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
hay ninguna opción de menú que realice la misma función. Este procedimiento no copia el
contenido
de la tabla.
Para duplicar una tabla
1. Abra la tabla original.
2. Use el comando COPY STRUCTURE para hacer una copia de la tabla original.
3. Abra la tabla vacía creada con el comando COPY STRUCTURE.
4. Use el comando APPEND FROM para copiar los datos desde la tabla original.
Copiar y modificar la estructura de una tabla
Para modificar la estructura de una tabla puede abrir el Diseñador de tablas o bien puede
realizar los
cambios mediante programación con el comando ALTER TABLE. De forma alternativa,
puede crear
una tabla nueva en base a la estructura de una tabla existente y, a continuación, modificar la
estructura de la nueva tabla.
Para copiar y modificar la estructura de una tabla
1. Abra la tabla original.
2. Use el comando COPY STRUCTURE EXTENDED para producir una tabla nueva que
contenga la información estructural de la tabla antigua.
3. Modifique la nueva tabla que contiene la información estructural para variar la estructura
de
cualquier tabla nueva creada a partir de esa información.
4. Cree una tabla nueva con el comando CREATE FROM.
La nueva tabla está vacía.
5. Use APPEND FROM o uno de los comandos de copia de datos para rellenar la tabla si es
necesario.
Guardar una tabla como HTML
Puede utilizar la opción Guardar como HTML del menú Archivo cuando examine el
contenido de
una tabla para guardarla como un archivo HTML (Lenguaje de marcado de hipertexto).
Para guardar una tabla como HTML
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.
3. Elija Guardar como HTML en el menú Archivo.
Manual del programador, Parte 2: Trabajar con datos Página 46 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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. También puede indicar si el campo debe permitir valores nulos y especificar el
valor
predeterminado del campo. Al configurar las propiedades de presentación, 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 título del contenido del campo.
Nota Las tablas de Visual FoxPro puede contener hasta 255 campos. Si uno o más campos
pueden
contener valores nulos, el número máximo de campos que la tabla puede contener se reduce
en una
unidad, de 255 a 254.
Asignar nombres a los campos
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 truncarán a 10 caracteres.
Para asignar nombre a un campo de tabla
En el Diseñador de tablas, escriba un nombre de campo en el cuadro de texto Nombre.
–O bien–
Utilice el comando CREATE TABLE o el comando ALTER TABLE.
Por ejemplo, para crear y abrir la tabla customer con tres campos, cust_id, company y
contact,
podría utilizar el comando siguiente:
CREATE TABLE customer (cust_id C(6), company C(40), contact C(30))
En el ejemplo anterior, C(6) indica que el campo tiene el tipo de datos Character y un
ancho de 6. La
elección del tipo de datos de los campos de tablas se trata más adelante en esta sección.
Con el comando ALTER TABLE agrega los campos, company, y contact, a una tabla
customer
existente:
ALTER TABLE customer ;
ADD COLUMN (company C(40), contact C(30))
Usar nombres cortos de campo
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
también en el archivo .dbf como nombre de campo.
Manual del programador, Parte 2: Trabajar con datos Página 47 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
también en el archivo .dbf como nombre de campo.
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 número
secuencial
a continuación, 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:
Nombre largo Nombre corto
cliente_contacto_nombre cliente_co
cliente_contacto_dirección cliente_c2
customer_contact_city cliente_c3
... ...
cliente_contacto_fax cliente_11
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
perderán 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 información sobre la forma de eliminar un índice, consulte "Eliminar un índice", más
adelante
en este mismo capítulo.
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 más información sobre la asignación de nombres a los identificadores de Visual
FoxPro, vea
Crear nombres de Visual FoxPro.
Elegir los tipos de datos
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:
La clase de valores que se van a permitir en el campo. Por ejemplo, no puede almacenar
texto
en un campo Numeric.
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 ocuparán 8 bytes.
Los tipos de operaciones que pueden realizarse con los valores almacenados en el
campo. Por
ejemplo, Visual FoxPro puede hallar la suma de valores numéricos o de moneda, pero no la
de
valores de tipo character o general.
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 números de teléfono, números de pieza y otros números que no vaya a
Manual del programador, Parte 2: Trabajar con datos Página 48 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Sugerencia Para los números de teléfono, números de pieza y otros números que no vaya a
utilizar en cálculos matemáticos, debe elegir el tipo de datos Character, en lugar de
Numeric.
Para elegir el tipo de datos de un campo
En el Diseñador de tablas, elija un tipo de datos en la lista Tipo.
–O bien–
Utilice el comando CREATE TABLE.
Por ejemplo, para crear y abrir la tabla products con tres campos, prod_id, prod_name y
unit_price, podría utilizar el comando siguiente:
CREATE TABLE products (prod_id C(6), prod_name C(40), unit_price Y)
En el ejemplo anterior, la ‘Y’ que aparece después de unit_price especifica el tipo de
datos
Moneda.
Para obtener más información acerca de tipos de datos específicos, vea Tipos de datos y
tipos de
campos.
Agregar rápidamente un índice normal
Al agregar un campo, puede definir rápidamente un índice normal en el campo si especifica
ascendente o descendente en la columna Índice del Diseñador de tablas. El índice que cree
se agrega
automáticamente a la ficha Índices y usa el campo como expresión. Para modificar el
índice, puede
cambiar a la ficha Índices para cambiar el nombre de índice, el tipo o agregar un filtro.
Usar valores nulos
Al crear una tabla nueva, puede especificar si uno o más campos de la misma deben aceptar
valores
nulos. Al usar un valor nulo, se indica que la información que normalmente se almacenaría
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 podría interpretarse de
modo
erróneo, puede almacenar en ellos un valor nulo hasta que la información correspondiente
esté
disponible.
Para controlar la introducción de valores nulos campo a campo
En el Diseñador de tablas, seleccione o desactive la columna Null del campo
correspondiente.
Cuando la columna Null está seleccionada, se pueden introducir valores nulos en el campo.
–O bien–
Utilice las cláusulas NULL y NOT NULL del comando CREATE TABLE.
Manual del programador, Parte 2: Trabajar con datos Página 49 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Utilice las cláusulas NULL y NOT NULL del comando CREATE TABLE.
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:
CREATE TABLE customer (cust_id C(6) NOT NULL, ;
company C(40) NOT NULL, contact C(30) NULL)
También puede controlar si se admiten o no valores nulos en los campos de la tabla con el
comando
SET NULL ON.
Para permitir valores nulos en todos los campos de la tabla
En el Diseñador de tablas, seleccione la columna Null para todos los campos de la tabla.
–O bien–
Utilice el comando SET NULL ON antes del comando CREATE TABLE.
Al especificar el comando SET NULL ON, Visual FoxPro marca automáticamente la
columna NULL
para cada campo de la tabla a medida que usted agrega campos en el Diseñador de tablas.
Si ejecuta
el comando SET NULL antes de CREATE TABLE, no será necesario especificar las
cláusulas NULL
o NOT NULL. Por ejemplo, el código 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 considerarán en blanco,
vacíos o con
valor cero en la tabla actual.
Si desea más información sobre la forma en que los valores nulos interactúan con los
comandos,
consulte Controlar valores nulos.
Agregar comentarios a los campos
Una vez creada una tabla en una base de datos abierta, puede agregar una descripción de
cada campo
de la tabla para facilitar la comprensión y la actualización 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.
Para agregar un comentario a un campo de una tabla de base de datos
En el Diseñador de tablas, escriba el texto del comentario en el área de edición de
Comentario
de campo.
–O bien–
Utilice la función DBSETPROP( ).
Manual del programador, Parte 2: Trabajar con datos Página 50 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Utilice la función 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:
?DBSETPROP('orditems.price', 'field', 'comment', ;
'Precio de venta al por menor actual’)
Si desea más información sobre el uso de DBSETPROP( ) para establecer propiedades de
los campos
de una tabla de base de datos, consulte el capítulo 6, Crear bases de datos.
Crear valores predeterminados de campo
Si desea que Visual FoxPro rellene automáticamente 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 programación, y
permanece en el campo hasta que se escriba un nuevo valor.
Los valores predeterminados se crean con el Diseñador de tablas o a través del lenguaje. Es
posible
especificar valores predeterminados para todos los tipos de datos, excepto General.
Para asignar un valor predeterminado a un campo de una tabla de base de datos
En el Diseñador de tablas, introduzca el valor en el cuadro de texto Valor
predeterminado de
la sección Propiedades de campo.
–O bien–
Utilice la cláusula DEFAULT del comando CREATE TABLE.
Por ejemplo, puede estimar conveniente que su aplicación limite la mercancía que puede
pedir un
nuevo cliente hasta que haya tenido tiempo de realizar una comprobación de su crédito y
determinar
la cantidad que desea autorizarle. En el ejemplo siguiente se crea un campo maxordamt con
un valor
predeterminado de 1000:
CREATE TABLE customer (cust_id C(6), company C(40), contact C(30), ;
maxordamt Y(4) DEFAULT 1000)
Si la tabla customer ya incluye la columna maxordamt, podrá agregar un valor
predeterminado para
la columna con el comando siguiente:
ALTER TABLE customer ALTER COLUMN maxordamt SET DEFAULT 1000
Usar valores predeterminados para acelerar la escritura de datos
Puede utilizar valores predeterminados para acelerar la escritura de datos por parte de los
usuarios de
la aplicación, permitiéndoles 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
país de la tabla cliente de una base de datos se rellene automáticamente con el nombre
de su país.
Al introducir el registro de un cliente extranjero, puede sobrescribir el nombre de su país
con el del
Manual del programador, Parte 2: Trabajar con datos Página 51 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Al introducir el registro de un cliente extranjero, puede sobrescribir el nombre de su país
con el del
país correspondiente.
Sugerencia Si alguna de las reglas de la aplicación 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
eliminarán de la base de datos. Los procedimientos almacenados a los que haga referencia
el valor
predeterminado quitado o eliminado permanecerán aún después de la eliminación.
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 código 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.
Valores predeterminados permitidos
Puede especificar valores predeterminados escalares (por ejemplo, ‘un número’), o
expresiones que
se evalúen como una cantidad escalar. También puede especificar cualquier expresión de
Xbase
válida que devuelva un valor coherente con el tipo de datos del campo.
Visual FoxPro evalúa 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
expresión es una función 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 generarán un error cuando los tipos de datos no coincidan. Si la expresión es una
FDU o
contiene una FDU, no se evaluará al ejecutar CREATE y no se generará ningún error.
Cuándo se aplican los valores predeterminados
Los valores predeterminados se evalúan (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 explícitamente.
Los
comandos APPEND FROM e INSERT - SQL también 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 conservarán al anexar o insertar el registro, y no se utilizará el valor
predeterminado.
Usar valores predeterminados para rellenar automáticamente campos NOT NULL
Los valores predeterminados son especialmente útiles para rellenar automáticamente los
campos que
no permiten valores nulos. Al agregar un nuevo registro, los valores predeterminados se
aplican en
Manual del programador, Parte 2: Trabajar con datos Página 52 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
no permiten valores nulos. Al agregar un nuevo registro, los valores predeterminados se
aplican en
primer lugar y después se comprueba cada campo según su orden de definición para
determinar si
falta información. Así se asegura que los campos designados como NOT NULL tengan
ocasión de
rellenarse con valores predeterminados antes de aplicar la restricción NOT NULL.
Especificar una máscara de entrada
Al especificar una máscara de entrada, define la puntuación, 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 más
eficaz. Por
ejemplo, al agregar una máscara a un campo numérico que almacena números de teléfono
ayuda al
usuario a rellenar rápidamente el campo porque la puntuación y los espacios ya los
proporciona la
máscara.
Para proporcionar una máscara de entrada
En el Diseñador de tablas, escriba la máscara en el cuadro Máscara de entrada en el
área
Mostrar.
–O bien–
Use la función DBSETPROP( ) para establecer la propiedad InputMask.
Por ejemplo, el código siguiente especifica una máscara de entrada para una fecha:
DBSetProp("orders.postalcode","field","InputMask", "99999-9999")
Controlar la presentación de un campo
Las propiedades adicionales para campos le permiten controlar cómo aparecen un campo y
sus
valores en formularios, ventanas Examinar e informes. Puede especificar un formato de
presentación,
un título de campo predeterminado y una clase y una biblioteca de clases predeterminadas.
Definir un formato
Un formato proporciona una máscara 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,
Para proporcionar un formato
En el Diseñador de tablas, escriba la máscara en el cuadro Formato en el área Mostrar.
–O bien–
Use la función DBSETPROP( ) para establecer la propiedad Format.
Por ejemplo, el código siguiente especifica un formato de presentación para una tarjeta
postal:
DBSetProp("orders.postalcode","field","Format","@R 99999-9999")
Manual del programador, Parte 2: Trabajar con datos Página 53 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
DBSetProp("orders.postalcode","field","Format","@R 99999-9999")
Crear títulos para campos
Puede crear un título para cada campo de una tabla de base de datos. Visual FoxPro
muestra el texto
del título de un campo como encabezado de columna en una ventana Examinar y como
nombre de
encabezado predeterminado en una cuadrícula de formulario.
Para agregar un título a un campo de una tabla de base de datos
En el Diseñador de tablas, escriba el texto para el título en el cuadro Título de la sección
Mostrar.
–O bien–
Use la función DBSETPROP( ).
Por ejemplo, es posible que quiera crear un título para el campo fax de la tabla supplier
escribiendo
“Supplier_Fax” como título del campo:
?DBSETPROP('supplier.fax', 'field', 'caption', 'Supplier_Fax')
Para obtener más información sobre el uso de DBSETPROP( ) para establecer propiedades
de
campos de tablas de base de datos, consulte el capítulo 6, Crear bases de datos.
Establecer una clase predeterminada
Para ahorrar tiempo más 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 automáticamente como controles cuadro de texto cuando los agrega al formulario.
Si en
lugar de esto quiere agregar automáticamente un control cuadro combinado cuando use el
campo en
un formulario, puede establecer la clase como predeterminada para este campo. También
puede usar
bibliotecas de clases que haya creado.
Para establecer una clase predeterminada
En el Diseñador 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 diálogo Opciones. Para obtener más
información sobre la asignación de tipos de datos de campo a clases, consulte el capítulo 3,
Configurar Visual FoxPro, de la Guía de instalación e Índice principal. Para obtener más
información sobre la creación de clases, consulte el capítulo 3, Programación orientada a
objetos, en
este manual.
Exigir reglas comerciales
Puede exigir reglas comerciales para la introducción de datos si crea a nivel de campo y a
nivel de
Manual del programador, Parte 2: Trabajar con datos Página 54 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Puede exigir reglas comerciales para la introducción de datos si crea a nivel de campo y a
nivel de
registro las llamadas reglas de validación, 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 validación sólo
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 información
introducido en una tabla, tanto si el acceso a los datos se realiza mediante una ventana
Examinar, un
formulario o mediante programación. Las reglas permiten exigir su cumplimiento en un
campo con
menos código que si se escribiera la expresión de la regla en una cláusula VALID de un
formulario o
en un fragmento de código del programa. Además, las reglas establecidas para una base de
datos se
aplicarán a todos los usuarios de la tabla, independientemente de los requisitos de la
aplicación.
También 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 información de la base de datos.
Cuándo se establecen las restricciones
Las restricciones de la base de datos se eligen basándose en el nivel al que se desea exigir
una regla
comercial o de integridad referencial, y también la acción que causa que la restricción se
active. En la
tabla siguiente se enumeran las restricciones de validación de datos en el orden en que las
exige el
motor de Visual FoxPro, el nivel al que se aplican y cuándo activa el motor la validación.
Mecanismo de exigencia Nivel Activación
Validación NULL Campo o columna Al salir del campo o columna en una
ventana Examinar o cuando el valor del
campo cambia a causa de INSERT o
REPLACE.
Reglas a nivel de campo Campo o columna Al salir del campo o columna en una
ventana Examinar o cuando el valor del
campo cambia a causa de INSERT o
REPLACE.
Reglas a nivel de registro Registro Al producirse la actualización del
registro.
Índice candidato o principal Registro Al producirse la actualización del
registro.
Cláusula VALID Formulario Al salir del registro.
Desencadenantes Tabla Al cambiar los valores de la tabla a
causa de un evento INSERT, UPDATE
o DELETE.
Las restricciones se activan en el orden en que aparecen en la tabla. El primer
incumplimiento de una
validación detiene el comando correspondiente.
Manual del programador, Parte 2: Trabajar con datos Página 55 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
validación detiene el comando correspondiente.
Los índices candidatos y principales se tratan más adelante en este capítulo, dentro de la
sección
"Controlar los valores duplicados".
Limitar los valores de un campo
Cuando desee controlar el tipo de información que un usuario puede introducir en un
campo y sea
posible validarlo independientemente de las restantes entradas del registro, puede utilizar
una regla de
validación a nivel de campo. Por ejemplo, puede utilizar una regla de validación a nivel de
campo
para asegurarse de que el usuario no escriba un número negativo en un campo que sólo
debe contener
valores positivos. También 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 específicas de la aplicación a nivel de campo o a nivel de registro.
Utilícelas
para exigir reglas de integridad de datos y reglas comerciales que sean siempre aplicables a
la
información de la base de datos, independientemente de quién tenga acceso a la misma. Por
ejemplo,
podría crear una regla que comparase el valor introducido en el campo código postal de
una tabla
con una tabla de búsqueda con los códigos abreviados de su país y que rechazase los
valores que no
fueran una abreviatura válida de código postal.
Para crear una regla a nivel de campo
En el Diseñador de tablas, introduzca la expresión de la regla en el cuadro de texto Regla
de la
sección Validación de campos.
–O bien–
Utilice la cláusula CHECK del comando CREATE TABLE.
–O bien–
Utilice la cláusula SET CHECK del comando ALTER TABLE.
Por ejemplo, el código siguiente agrega a la tabla orditems una regla de validación a nivel
de campo
que requiere que el número introducido en el campo quantity sea mayor o igual que 1:
ALTER TABLE orditems
ALTER COLUMN quantity SET CHECK quantity >= 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
validación al
campo. El texto especificado se mostrará en el cuadro de diálogo en lugar del mensaje de
error
predeterminado.
Para agregar un mensaje de error personalizado a una regla a nivel de campo
En el Diseñador de tablas, escriba el mensaje de error que desee en el cuadro Mensaje
del área
Manual del programador, Parte 2: Trabajar con datos Página 56 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
En el Diseñador de tablas, escriba el mensaje de error que desee en el cuadro Mensaje
del área
Validación de campos.
–O bien–
Utilice la cláusula opcional ERROR con la cláusula CHECK de los comandos CREATE
TABLE o ALTER TABLE.
Por ejemplo, el código siguiente agrega una regla de validación a nivel de campo para la
tabla
orditems que requiere que los números introducidos en la columna quantity sean
mayores o
iguales que 1 y además define un mensaje de error personalizado:
ALTER TABLE orditems ;
ALTER COLUMN quantity SET CHECK quantity >= 1 ;
ERROR "Las cantidades deben ser mayores o iguales que 1"
Cuando el usuario intente escribir un valor menor que 1, Visual FoxPro mostrará un cuadro
de
diálogo de error con el mensaje de error personalizado que usted ha definido y rechazará el
valor.
También puede utilizar la cláusula SET CHECK del comando ALTER TABLE con la
cláusula
opcional ERROR para crear un mensaje de error personalizado.
Cuándo se comprueban las reglas a nivel de campo
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
búfer. 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.
Comprobación de las reglas a nivel de campo
Método de introducción de
datos
Ventana o comando Comprobación de la regla a
nivel de campo
Interfaz de usuario Ventana Examinar
Formulario
Otra ventana
Al salir del campo, si el valor ha
variado. (Si el valor no cambia,
la regla no se comprueba).
Comandos que no
especifican campos
APPEND
APPEND GENERAL
APPEND MEMO
BROWSE
CHANGE
DELETE
EDIT
GATHER
Al cambiar el valor del campo,
en el orden de definición de los
campos.
APPEND BLANK
INSERT
INSERT - SQL
Al anexar o insertar el registro.
Manual del programador, Parte 2: Trabajar con datos Página 57 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
INSERT - SQL
Comandos que especifican
campos
UPDATE
UPDATE - SQL
REPLACE
En el orden en que aparecen los
campos en el comando.
Validar valores a nivel de registro
Las reglas de validación a nivel de registro permiten controlar el tipo de información que el
usuario
puede introducir en los registros. Normalmente, las reglas de validación a nivel de registro
comparan
los valores de dos o más 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
validación 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 validación a nivel de registro y un mensaje de error
personalizado
En la ficha Tabla del Diseñador de tablas, escriba la regla y el mensaje de error que
desee en
los cuadros Regla y Mensaje.
–O bien–
Utilice la cláusula CHECK de los comandos CREATE TABLE o ALTER TABLE.
Por ejemplo, puede querer asegurarse de que los empleados tengan 18 o más años en el
momento de
su contratación. En el código siguiente se agrega a la tabla employee una regla de
validación a nivel
de registro y un texto de error para requerir que la fecha de contratación introducida en
hire_date
sea mayor o igual que la fecha de nacimiento más 18 años:
ALTER TABLE employee SET CHECK ;
hire_date >= birth_date + (18 * 365.25) ;
ERROR "Los empleados deben tener 18 años en la fecha de contratación"
Si el usuario introduce un registro de empleado con una fecha no válida, Visual FoxPro
mostrará un
cuadro de diálogo de error con el mensaje de error personalizado definido y no actualizará
el registro.
También puede utilizar la cláusula SET CHECK del comando ALTER TABLE para crear
una regla
de validación a nivel de registro. Debe asegurarse de que las reglas especificadas para los
campos no
entren en conflicto semántico con las definidas para la tabla. Visual FoxPro no comprueba
la
coherencia entre las expresiones a nivel de campo y a nivel de registro.
Cuándo se comprueban las reglas 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
Manual del programador, Parte 2: Trabajar con datos Página 58 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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 ningún 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.
Si modifica un registro, pero no desplaza el puntero y cierra la ventana Examinar, la regla
se
comprobará, aparecerá un aviso si se producen errores y luego se cerrará la ventana
Examinar.
Precaución No incluya en las reglas de validación comandos o funciones que intenten
desplazar el
puntero de registro del área de trabajo actual (es decir, del área de trabajo cuyas reglas se
están
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
validación puede causar su desencadenamiento recursivo, produciendo una condición de
error.
Al contrario que los desencadenantes, las reglas a nivel de registro se activan incluso
cuando los
datos se encuentran en búfer. Para el caso de que durante la ejecución de una aplicación se
active una
regla a nivel de registro, es necesario incluir código de control de errores. Normalmente,
este código
no permitirá que la aplicación abandone el formulario (o que cambie el entorno activo,
hablando de
forma más genérica), hasta que el usuario corrija el error detectado o cancele la
actualización.
Quitar de una base de datos una tabla con reglas asociadas
Si quita o elimina una tabla de una base de datos, se eliminarán 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 vínculo 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 automáticamente, ya que aún pueden utilizarlos otras reglas de otras tablas que
permanezcan en la base de datos.
Usar desencadenantes
Un desencadenante es una expresión dependiente de una tabla que se invoca cuando se
modifica
alguno de los registros de la tabla con alguno de los comandos de modificación de datos
especificados. Los desencadenantes pueden utilizarse para realizar cualquier operación que
requiera
una aplicación de base de datos cuando se modifique la información. Por ejemplo, puede
utilizar
desencadenantes para llevar a cabo las acciones siguientes:
Registrar las modificaciones de la base de datos.
Exigir la integridad referencial.
Crear un pedido automáticamente para un producto cuyas existencias están a punto de
agotarse.
Los desencadenantes se crean y almacenan como propiedades de una tabla específica. Si
quita una
tabla de una base de datos, los desencadenantes asociados a la misma se eliminarán. Los
desencadenantes se activan una vez realizadas todas las comprobaciones restantes, como las
reglas de
validación, la exigencia de clave principal y la de valor nulo. Al contrario de lo que ocurre
con las
reglas de validación a nivel de campo y a nivel de registro, los desencadenantes no se
activan para los
datos almacenados en búfer.
Manual del programador, Parte 2: Trabajar con datos Página 59 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Crear desencadenantes
Para crear desencadenantes puede utilizar el Diseñador 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 máximo de tres
desencadenantes. Los desencadenantes deben devolver un valor verdadero (.T.) o falso
(.F.).
Para crear un desencadenante
En el cuadro de diálogo Tabla del Diseñador de tablas, escriba la expresión del
desencadenante
o el nombre del procedimiento almacenado que la contiene en los cuadros Insertar
desencadenante, Actualizar desencadenante, o Eliminar desencadenante.
–O bien–
Utilice el comando CREATE TRIGGER.
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
notificación si es necesario volver a pedir ese producto. Podría crear un desencadenante de
actualización para la tabla products para conseguirlo. El desencadenante elegido es de
actualización
(y no de eliminación o inserción), 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.
Para crear el desencadenante puede especificar updProductsTrigger( ) como
desencadenante de
actualización de la tabla products. Puede agregar un campo a products, llamado
reorder_amount,
para almacenar el importe que desee pedir cada vez que realice un nuevo pedido del
producto en
cuestión y crear una tabla reorder con los campos: product_id y reorder_amount. A
continuación
puede agregar este código al procedimiento almacenado:
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 inserción o eliminación
mediante las
cláusulas FOR INSERT o FOR DELETE, respectivamente, en lugar de la cláusula 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.
Quitar o eliminar desencadenantes
Puede quitar un desencadenante de una tabla de base de datos mediante la interfaz o el
comando
DELETE TRIGGER.
Para eliminar un desencadenante
Manual del programador, Parte 2: Trabajar con datos Página 60 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
En el cuadro de diálogo Tabla del Diseñador de tablas, seleccione la expresión de
desencadenante en el cuadro Insertar desencadenante, Actualizar desencadenante o
Eliminar desencadenante y elimínela.
–O bien–
Utilice el comando DELETE TRIGGER.
En el ejemplo siguiente se elimina el desencadenante de actualización de la tabla
customer:
DELETE TRIGGER ON customer FOR UPDATE
Si quita o elimina una tabla de una base de datos, todos los desencadenantes dependientes
de ella se
eliminarán de la base de datos. Sin embargo, los procedimientos almacenados a los que
haga
referencia el desencadenante quitado o eliminado no se eliminarán.
Modificar desencadenantes
Puede modificar los desencadenantes mediante el Diseñador de tablas o a través del
lenguaje.
Para modificar un desencadenante
En el cuadro de diálogo Tabla del Diseñador de tablas, introduzca la nueva expresión del
desencadenante en el cuadro Insertar desencadenante, Actualizar desencadenante o
Eliminar desencadenante.
–O bien
Ejecute el comando SET SAFETY OFF, seguido del comando CREATE TRIGGER.
Si modifica un desencadenante utilizando primero el comando SET SAFETY OFF y
volviendo a
crear después el desencadenante, la expresión anterior se eliminará y se sustituirá
automáticamente
con la expresión recién creada.
Usar desencadenantes para generar integridad referencial
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
más información sobre el uso del Generador de integridad referencial, consulte el capítulo
6,Crear
bases de datos.
Modificar la estructura de la tabla
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 también agregar comentarios o títulos.
Para modificar la estructura de una tabla puede abrir el Diseñador de tablas o bien puede
realizar los
Manual del programador, Parte 2: Trabajar con datos Página 61 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para modificar la estructura de una tabla puede abrir el Diseñador de tablas o bien puede
realizar los
cambios mediante programación con el comando ALTER TABLE. Asegúrese de que tiene
acceso
exclusivo a la tabla antes de modificar su estructura.
Para modificar la estructura de una tabla con el Diseñador de tablas
En el Administrador de proyectos, seleccione el nombre de la tabla y, a continuación,
elija
Modificar.
–O bien–
En el Diseñador de bases de datos, seleccione la tabla en el esquema y elija Modificar en
el
menú Base de datos.
–O bien–
Utilice el comando MODIFY STRUCTURE.
Por ejemplo, puede modificar la estructura de la tabla de base de datos employee con los
comandos
siguientes:
OPEN DATABASE testdata
USE employee EXCLUSIVE
MODIFY STRUCTURE
Todas las opciones anteriores abren el Diseñador de tablas.
Para modificar la estructura de una tabla por programa
Utilice el comando ALTER TABLE.
El comando ALTER TABLE ofrece diversas cláusulas 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 cláusulas sólo son aplicables a las tablas asociadas a una
base de
datos. En esta sección se incluyen algunos ejemplos específicos.
Agregar campos
Para agregar un nuevo campo a una tabla puede utilizar el Diseñador de tablas o hacerlo a
través del
lenguaje.
Para agregar un campo a una tabla
En el Diseñador de tablas, elija Insertar.
–O bien–
Utilice la cláusula ADD COLUMN del comando ALTER TABLE.
Por ejemplo, el comando siguiente agrega un campo llamado fax a la tabla customer y
permite que
Manual del programador, Parte 2: Trabajar con datos Página 62 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Por ejemplo, el comando siguiente agrega un campo llamado fax a la tabla customer y
permite que
el nuevo campo tenga valores nulos:
ALTER TABLE customer ADD COLUMN fax c(20) NULL
Eliminar campos
Puede eliminar un campo existente de una tabla mediante el Diseñador de tablas o a través
del
lenguaje.
Para eliminar un campo de una tabla
En el Diseñador de tablas, seleccione el campo y elija Eliminar.
–O bien–
Utilice la cláusula DROP COLUMN del comando ALTER TABLE.
Por ejemplo, para cambiar el nombre de la columna company de la tabla customer, podría
utilizar el
comando siguiente:
ALTER TABLE customer RENAME COLUMN company TO company_long_new_name
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.
Establecer o modificar las reglas a nivel de campo o de tabla
Manual del programador, Parte 2: Trabajar con datos Página 63 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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.
Para cambiar una regla existente
En el Diseñador de tablas, seleccione la ficha Tabla y escriba la nueva expresión de
regla o
texto de regla en los cuadros Regla y Mensaje de la sección Validación de registros.
–O bien–
Utilice el comando ALTER TABLE.
Puede utilizar la función DBGETPROP( ) para ver la expresión o el texto actual de una
regla; estos
valores son de sólo lectura para las tablas y sólo se pueden modificar mediante el comando
ALTER
TABLE.
Establecer o modificar los valores predeterminados
Una vez generada una tabla, puede establecer o cambiar los valores predeterminados de sus
campos.
Para cambiar un valor predeterminado existente
En el Diseñador de tablas, escriba el nuevo valor en el cuadro Valor predeterminado de
la
ficha Campos.
–O bien–
Utilice el comando ALTER TABLE.
Puede utilizar la función DBGETPROP( ) para ver el valor predeterminado actual de un
campo; estos
valores son de sólo lectura para las tablas y sólo se pueden cambiar mediante el comando
ALTER
TABLE.
Trabajar con registros
Una vez diseñada y creada la estructura de una tabla, puede almacenar datos en ella
agregándole
registros. Después podrá modificar y eliminar los registros existentes. Cada una de estas
tareas puede
realizarse a través de la interfaz o mediante comandos. En esta sección se tratará
principalmente el
trabajo con los registros por programa. Si desea más información sobre el trabajo con
registros a
través de la interfaz, consulte el capítulo 2, Crear tablas e índices, del Manual del usuario.
Agregar registros
Cuando cree una tabla de Visual FoxPro, la tabla estará abierta, pero vacía. 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.
Para agregar registros a una tabla
Manual del programador, Parte 2: Trabajar con datos Página 64 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para agregar registros a una tabla
Utilice el comando INSERT - SQL.
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:
INSERT INTO customer (cust_id, company, contact) ;
VALUES ("SMI007", "Calzados Arbor", "Daniel Rendich")
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á vacío) con un nuevo valor.
El comando REPLACE requiere:
Una tabla abierta.
Un registro existente.
El nombre del campo en el que desea almacenar el valor.
Un valor para cada campo válido según el tipo de datos correspondiente.
En el ejemplo siguiente se utiliza el comando APPEND BLANK para crear un registro en
el que
almacenar datos con el comando REPLACE:
APPEND BLANK && registro disponible ahora
REPLACE lastname WITH "SMITH" && almacenar valor character en el campo
Puede utilizar el comando UPDATE - SQL en lugar de REPLACE para actualizar los
registros de una
tabla.
Agregar registros de otra 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.
Para anexar registros de otro archivo
Utilice el comando APPEND FROM.
–O bien–
Utilice el comando IMPORT.
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 específicos de la
tabla
Manual del programador, Parte 2: Trabajar con datos Página 65 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
comando INSERT especificaba el texto que se va a insertar en campos específicos de la
tabla
customer y también tomarlos de constantes, variables, matrices, objetos u otros orígenes
de datos. Si
desea más información sobre otras formas de importar datos, consulte el capítulo 9,
Importar y
exportar datos, del Manual del usuario.
Agregar registros en modo Examinar
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 cláusula NOAPPEND del comando
BROWSE.
Introducir datos en una tabla
Puede introducir datos en una tabla de forma interactiva, a través de una ventana Examinar
o
mediante programación, con los comandos REPLACE o UPDATE - SQL. Al utilizar
REPLACE o
UPDATE - SQL en una aplicación multiusuario, puede activar el almacenamiento en búfer
de
registros o tablas, lo que le permitirá modificar los datos sin bloquear el registro hasta que
desee
hacer efectivos los cambios. Si desea más información sobre el búfer de registros y tablas,
consulte el
capítulo 17, Programar para acceso compartido.
Modificar los registros de una tabla
Para mostrar y modificar los registros existentes en una tabla puede utilizar la interfaz o
hacerlo
mediante programación.
Para mostrar los registros y modificarlos
Utilice el comando EDIT.
–O bien–
Utilice el comando CHANGE.
Por ejemplo, el código siguiente muestra la tabla customer en una ventana Examinar en
modo de
edición:
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 más
información sobre los formularios, consulte el capítulo 9, Crear formularios.
También puede utilizar los comandos CHANGE y EDIT para modificar campos específicos
de una
tabla.
Agregar gráficos a una tabla
Puede almacenar gráficos en una tabla de Visual FoxPro si crea un campo de tipo general e
importa o
Manual del programador, Parte 2: Trabajar con datos Página 66 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Puede almacenar gráficos 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 gráficos. El comando APPEND
GENERAL sitúa
un objeto OLE en un campo General. En el ejemplo siguiente se almacena un archivo
gráfico de
Microsoft Excel situado en el directorio predeterminado de Visual FoxPro en un campo
General
llamado Gráfico:
APPEND GENERAL Chart FROM "CHART1.CLX" CLASS EXCELCHART
Si desea más información sobre el manejo de objetos OLE en las tablas de Visual FoxPro,
consulte el
capítulo 16, Agregar OLE.
Introducir valores nulos en los campos
Para introducir un valor nulo en un campo puede utilizar el lenguaje, con el elemento
.NULL, o
hacerlo a través de la interfaz con una combinación de teclas si el campo admite valores
nulos.
Para almacenar un valor nulo en un campo
En una ventana Examinar o en un control de formulario, presione CTRL+0 (cero).
–O bien–
Utilice el elemento .NULL.
Por ejemplo, el código siguiente sustituye el valor existente en el campo automóvil por un
valor
nulo:
REPLACE automóvil WITH .NULL
Nota Use el comando SET NULLDISPLAY para especificar el texto mostrado para los
valores
nulos.
Eliminar registros
Para eliminar registros debe marcarlos primero para eliminación y luego suprimir los
registros
marcados. Hasta su supresión, los registros marcados permanecen en el disco y puede
quitarles la
marca para restaurarlos. En esta sección se explica cómo marcar, desmarcar y suprimir los
registros
de una tabla.
Marcar registros para su eliminación
Para marcar registros para su eliminación puede utilizar la interfaz o bien el comando
DELETE -
SQL.
Para marcar un registro para su eliminación
En una ventana Examinar haga clic en el marcador de eliminación para marcar el
registro.
–O bienManual
del programador, Parte 2: Trabajar con datos Página 67 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
–O bien
En el menú Tabla, elija Eliminar registros.
–O bien–
Utilice el comando DELETE - SQL.
También puede utilizar el comando DELETE - SQL para especificar un intervalo de
registros, así
como una condición basada en una expresión lógica que los registros deben satisfacer para
que se
marquen para su eliminación. Por ejemplo, el código siguiente marca para eliminación
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 eliminación no se suprimen físicamente 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 eliminación, pero aún será visible en la tabla, siempre que SET
DELETED
esté desactivado. Si SET DELETED está activado, los registros marcados para su
eliminación no
aparecerán en la ventana Examinar.
La configuración del comando SET DELETED también afecta al acceso a los registros
marcados para
su eliminación por parte de los comandos que operan sobre registros.
Desmarcar los registros marcados para su eliminación
Para desmarcar los registros marcados para su eliminación puede utilizar el comando
RECALL. El
comando RECALL sólo podrá recuperar los registros cuando aún no se haya especificado
un
comando PACK o ZAP, los cuales eliminan físicamente los registros de la tabla.
Para quitar la marca de un registro marcado para su eliminación
En una ventana Examinar, haga clic en el marcador de eliminación para quitar el
indicador del
registro.
–O bien–
En el menú Tabla, elija Desmarcar registros.
–O bien–
Utilice el comando RECALL.
Con el comando RECALL puede especificar un intervalo de registros, así como una
condición basada
en una expresión lógica que los registros deben satisfacer para que se les quite la marca de
eliminación. Por ejemplo, el código siguiente quita la marca de eliminación de todos los
registros de
productos que contengan ‘T’ en el campo discontinu:
Manual del programador, Parte 2: Trabajar con datos Página 68 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
USE products
RECALL FOR discontinu = .T.
BROWSE
Cuando vea la tabla en la ventana Examinar, los registros especificados ya no tendrán la
marca de
eliminación.
Suprimir registros marcados para eliminación
Una vez marcado un grupo de registros para su eliminación, puede suprimirlos de forma
definitiva
del disco a través de la interfaz o mediante el lenguaje.
Para suprimir del disco los registros marcados para eliminación
En una ventana Examinar, elija Quitar registros eliminados en el menú Tabla.
–O bien–
Utilice el comando PACK.
El comando PACK tiene dos cláusulas: MEMO y DBF. Si especifica PACK sin MEMO ni
DBF, se
suprimirán tanto los registros del archivo de tabla como los del archivo memo asociado. Por
ejemplo,
el código siguiente suprime los registros marcados para eliminación:
USE customer EXCLUSIVE
PACK
Para eliminar solamente los registros del archivo de tabla y dejar intactos los del archivo
memo,
utilice PACK DBF.
Conservar espacio
La información de los campos memo de una tabla se almacena en un archivo memo
asociado con el
mismo nombre de la tabla y la extensión .FPT. Si desea eliminar el espacio no utilizado en
el archivo
memo, pero no quiere suprimir los registros de la tabla marcados para eliminación, ejecute
el
comando PACK con la cláusula MEMO. Asegúrese de tener acceso exclusivo a la tabla.
Suprimir todos los registros de una tabla
Si desea suprimir todos los registros de una tabla, dejando sólo su estructura, puede utilizar
el
comando ZAP. El uso de ZAP equivale a especificar DELETE ALL y a continuación
PACK, pero
ZAP es mucho más rápido. Asegúrese de tener acceso exclusivo a la tabla.
Precaución 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
Manual del programador, Parte 2: Trabajar con datos Página 69 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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 ordenación para
ofrecer
flexibilidad y eficacia al programar una aplicación. La flexibilidad supone crear y utilizar
múltiples
claves de índice distintas para la misma tabla, lo que permite trabajar con los registros
ordenados de
formas diferentes, según las necesidades de la aplicación. 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 lógicamente
según los
valores de una clave de índice. El archivo de índice es independiente del archivo .DBF de la
tabla, y
no cambia el orden físico 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 ningún
archivo de
índice. Los registros introducidos en la nueva tabla se almacenarán en el orden de
introducción, y al
examinar la tabla aparecerán en ese orden.
Normalmente, será conveniente ver y tener acceso a los registros en un orden específico.
Por ejemplo,
puede ser adecuado ver los registros de la tabla de clientes ordenados alfabéticamente 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 ordenación
de
registros, o clave de índice, de la tabla. A continuación puede establecer como orden de la
tabla la
nueva clave de índice y tener acceso a los registros siguiendo ese orden.
Para crear una clave de índice de una tabla
En el Diseñador de tablas, elija la ficha Índices e introduzca la información de una clave
de
índice. Elija Normal como tipo de índice.
–O bien–
Utilice el comando INDEX.
Por ejemplo, en el código 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 podría haber elegido uno
distinto
para la etiqueta).
Al crear un índice con el comando INDEX, Visual FoxPro lo utiliza automáticamente para
establecer
el orden de los registros de la tabla. Por ejemplo, si introduce algunos datos en la tabla
utilizada en el
Manual del programador, Parte 2: Trabajar con datos Página 70 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
el orden de los registros de la tabla. Por ejemplo, si introduce algunos datos en la tabla
utilizada en el
ejemplo anterior y a continuación la examina, los registros aparecerán ordenados por
ciudad.
Crear un archivo de índice
Al crear la primera clave de índice para la tabla del ejemplo anterior, Visual FoxPro creó
automáticamente un nuevo archivo, Customer.cdx, para almacenar la nueva clave de índice.
Las
claves de índice se almacenan en archivos con la extensión .cdx. El archivo de índice .cdx,
llamado
índice compacto estructural compuesto, es el tipo de archivo de índice más importante y
más común
en Visual FoxPro. El archivo .cdx estructural:
Se abre automáticamente al abrir la tabla.
Puede contener múltiples ordenaciones de registros, o claves de índice, en el mismo
archivo.
Se modifica automáticamente al agregar, cambiar o eliminar registros de la tabla.
Si una tabla de Visual FoxPro tiene un archivo de índice asociado, normalmente se tratará
de un
archivo .cdx estructural. El término “estructural” hace referencia al hecho de que Visual
FoxPro trata
al archivo como una parte intrínseca de la tabla y lo abre automáticamente al abrir aquélla.
Ya sea a
través del Diseñador de tablas o con la forma más 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 información 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 presentación o introducción de datos, vínculos con SET RELATION,
optimización 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 más
importante, la
mayoría de los ejemplos de esta sección utilizarán 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 sección.
Ver la información de índice
Para ver el número registros que se indexan durante el proceso de indexación, puede
establecer
TALK a ON. El intervalo de registros mostrado durante la indexación puede especificarse
con SET
ODOMETER. Si desea más información 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 número de archivos de índice (.idx o .cdx) que pueden abrirse sólo está limitado por la
memoria y
los recursos del sistema.
Controlar los valores duplicados
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.
Impedir valores duplicados
Manual del programador, Parte 2: Trabajar con datos Página 71 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Un índice principal nunca permite valores duplicados en la expresión 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 relación persistente. Sólo 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 expresión 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 múltiples índices candidatos para una tabla. Los índices candidatos pueden
utilizarse para
hacer referencia o para ser referenciados en una relación 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.
Establecer un índice principal o candidato
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 relación
persistente
de uno a varios o de uno a uno.
Para crear un índice principal o candidato
En el Diseñador de tablas, elija la ficha Índices y cree un índice, seleccionando como
tipo
Principal o Candidato.
–O bien–
Utilice el comando ALTER TABLE.
Por ejemplo, cualquiera de los dos comandos siguientes hace de cust_id la clave principal
de la
tabla customer:
ALTER TABLE customer ADD PRIMARY KEY cust_id TAG cust_id
ALTER TABLE customer ALTER COLUMN cust_id c(5) PRIMARY KEY
Los índices principal y candidatos se almacenan en el archivo .cdx estructural de la tabla
correspondiente y también en la base de datos con las propiedades “Primary” o
“Candidate”. No se
puede almacenar estos tipos de índices en otros archivos .cdx, ni tampoco utilizar para ellos
archivos
.idx. El motivo principal es que el archivo que contiene estos índices siempre debe estar
abierto
cuando esté abierta la tabla a la que están asociados.
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 función definida por el usuario en una expresión de índice asociada a una
base de datos,
Visual FoxPro tratará la expresión de la misma forma que las expresiones de reglas y
Manual del programador, Parte 2: Trabajar con datos Página 72 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Visual FoxPro tratará la expresión de la misma forma que las expresiones de reglas y
desencadenantes que contienen FDU.
Permitir valores duplicados
En Visual FoxPro, los índices únicos no evitan el uso de valores duplicados, aunque sólo
almacenan
la primera aparición 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 sólo contiene valores únicos, pues no
almacena cada
clave más 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. También puede usar un índice normal como lado “varios” de una relación
persistente de
uno a varios.
Para crear un índice normal
En el Diseñador de tablas, elija la ficha Índices y cree un índice seleccionando Normal
como
tipo.
–O bien–
Utilice el comando INDEX.
Por ejemplo, los comandos siguientes hacen de city una clave normal para la tabla
customer:
USE customer
INDEX ON city TAG city
Crear múltiples índices
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 rápidamente un nombre que se busca, o por
postal_code, para generar etiquetas de correo ordenadas para un envío más eficiente.
Puede crear y almacenar varias ordenaciones distintas para una tabla creando múltiples
claves de
índice para la misma. Esto permite ordenar los registros de una forma distinta en cada
momento,
según las operaciones que vaya a realizar.
Para crear claves de índice adicionales para una tabla
En el Diseñador de tablas elija la ficha Índices e introduzca la información de las claves
adicionales.
–O bien–
Manual del programador, Parte 2: Trabajar con datos Página 73 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Utilice el comando INDEX.
Por ejemplo, el código 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á automáticamente al archivo .cdx estructural de la tabla. En el diagrama siguiente
se muestra
un archivo de índice .cdx con tres etiquetas.
Índice .cdx con múltiples etiquetas que representan múltiples 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 según una expresión sencilla de dos
campos. Si
desea más información sobre la forma de generar índices basados en múltiples campos,
consulte
"Indexar por prestaciones", más adelante en este mismo capítulo.
Controlar el orden de acceso a los registros
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 ordenación de la tabla.
Manual del programador, Parte 2: Trabajar con datos Página 74 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Por ejemplo, el código siguiente abre una ventana Examinar con los registros de la tabla
customer
ordenados por países:
SET ORDER TO country
BROWSE
Establecer el orden de los registros en tiempo de ejecución
SET ORDER permite designar el archivo o etiqueta de índice que controla el orden de los
registros.
Una tabla puede tener abiertos simultáneamente 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.
Establecer el orden de los registros de forma interactiva en un formulario
Puede utilizar SET ORDER en tiempo de ejecución para cambiar el orden de los registros
en un
formulario. Por ejemplo, puede ser conveniente que los usuarios de su aplicación puedan
cambiar el
orden de los registros de una cuadrícula haciendo clic en el encabezado de la columna que
deseen
ordenar.
Para ordenar los registros de una cuadrícula por una columna
1. Cree un formulario con un control Grid.
Manual del programador, Parte 2: Trabajar con datos Página 75 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
1. Cree un formulario con un control Grid.
2. Establezca en la propiedad ColumnCount de la cuadrícula el número de campos que
desee
mostrar en ella.
3. En el evento Click del encabezado de cada columna de la cuadrícula, inserte código para:
Establecer como orden de los registros una clave de índice basada en la columna.
Actualizar el formulario.
Por ejemplo, si crea un formulario basado en la tabla Customer de la base de datos Testdata
con una
cuadrícula que contenga las cuatro columnas, company, contact, postal code y phone,
la
cuadrícula aparecerá en primer lugar ordenada alfabéticamente, ya que los registros de esa
tabla se
introdujeron por ese orden.
Tabla Customer en una cuadrícula, ordenada alfabéticamente por nombre de
empresa
A continuación puede permitir que el usuario ordene la cuadrícula por contact o
postal_code si
inserta el código siguiente en el evento Click de cada encabezado de columna:
Ejemplo de código de evento para ordenar los registros de una cuadrícula al hacer clic
en el
encabezado de las columnas
Código Comentario
SET ORDER TO company
GO TOP
THISFORM.Refresh
En el código de evento Click del encabezado de Company se
reordena la cuadrícula por la clave de índice company y se
actualiza el formulario para mostrar los registros ordenados
por empresas.
SET ORDER TO contact
GO TOP
THISFORM.Refresh
En el código de evento Click del encabezado de Contact se
reordena la cuadrícula por la clave de índice contact y se
actualiza el formulario para mostrar los registros ordenados
por nombres de contacto.
Manual del programador, Parte 2: Trabajar con datos Página 76 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
SET ORDER TO
postalcode
GO TOP
THISFORM.Refresh
En el código de evento Click del encabezado de
Postal_Code se reordena la cuadrícula por la clave de
índice postalcode y se actualiza el formulario para mostrar
los registros ordenados por códigos postales.
Como la ordenación por números de teléfono no es adecuada
para esta aplicación, se deja en blanco el código del evento
Click del encabezado de Phone.
En este ejemplo, al mostrar un formulario la cuadrícula aparece ordenada alfabéticamente
por
empresas. Cuando el usuario hace clic en el encabezado de la columna Contact, Visual
FoxPro
muestra los registros en la cuadrícula ordenados alfabéticamente por el nombre del
contacto.
Tabla Customer en una cuadrícula, reordenada alfabéticamente por nombre de
contacto
Si el usuario hace clic en el encabezado de la columna Postal_code la cuadrícula se
reordenará y
aparecerá ordenada por códigos postales.
Tabla Customer en una cuadrícula, reordenada por códigos postales
Manual del programador, Parte 2: Trabajar con datos Página 77 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Como en esta aplicación de ejemplo no hay necesidad de ordenar los contactos por sus
números de
teléfono, no se inserta el código con SET ORDER en el evento Click del encabezado de la
columna
phone. Cuando el usuario hace clic en el encabezado de Phone, la cuadrícula no cambia.
Usar otros tipos de índices
Además del índice más habitual, el compacto estructural compuesto .cdx, Visual FoxPro
admite otros
dos tipos de archivos de índice: el .cdx no estructural y el índice autónomo .idx. Los índices
.cdx no
estructurales se utilizan como etiquetas de clave múltiple de uso menos frecuente. Los
índices
autónomos, 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 número de
claves que
pueden contener y las limitaciones en caracteres de cada uno de ellos.
Tipos de índices de Visual FoxPro
Tipo de índice Descripción Número de claves Límites
.cdx estructural Utiliza el mismo
nombre base que el
archivo de tabla; se abre
automáticamente con la
tabla
Expresiones de
múltiples claves,
llamadas etiquetas
Límite de 240
caracteres en las
expresiones
evaluadas
.cdx no estructural Debe abrirse
explícitamente; utiliza
un nombre distinto del
nombre base de la tabla
Expresiones de
múltiples claves,
llamadas etiquetas
Límite de 240
caracteres en las
expresiones
evaluadas
.idx autónomo Debe abrirse
explícitamente; el
usuario define el
nombre del archivo .idx
Expresión de una sola
clave
Límite de 100
caracteres en las
expresiones
evaluadas
Usar índices .cdx no estructurales
Un índice .cdx no estructural resulta útil cuando desea crear múltiples etiquetas de índice
con un fin
determinado, pero no quiere cargar sus aplicaciones manteniendo estos índices de una
forma
continua. Por ejemplo, su aplicación puede tener un conjunto especial de informes que
analicen los
datos basándose 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
continuación eliminar el índice .cdx no estructural.
Para crear una etiqueta de índice .cdx no estructural
Manual del programador, Parte 2: Trabajar con datos Página 78 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para crear una etiqueta de índice .cdx no estructural
Utilice el comando INDEX con las cláusulas TAG y OF.
Al especificar la cláusula 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
Usar índices autónomos
Los índices autónomos, basados en una expresión de una sola clave, se almacenan como
archivos
.idx. Al contrario que los índices .cdx, que pueden almacenar expresiones de múltiples
claves, los
índices .idx se limitan a una sola.
Normalmente, los índices autónomos se utilizan de forma temporal, creándolos o
reindexándolos
inmediatamente antes de su uso. Por ejemplo, puede tener un índice que sólo utilice para un
informe
resumen trimestral o anual. En lugar de incluir este índice de uso poco frecuente en el .cdx
estructural, donde se actualizará cada vez que se utilice la tabla, puede crear un índice .idx
autónomo.
Una tabla determinada puede tener tantos archivos .idx como se desee.
Para crear un índice .idx autónomo
Utilice la cláusula COMPACT del comando INDEX.
–O bien–
Utilice el comando COPY TAG.
Al utilizar el comando INDEX con la cláusula COMPACT se crea un nuevo índice
autónomo en un
archivo pequeño y de acceso rápido. Puede omitir la cláusula COMPACT si desea crear un
archivo
.idx autónomo no compacto y mantener así la compatibilidad con los formatos de índice de
FoxBASE+® y FoxPro® versión 1.0.
El código siguiente crea un archivo .idx autónomo 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 autónomo 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 sólo se utiliza para
informes
Manual del programador, Parte 2: Trabajar con datos Página 79 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
uno de los índices que actualmente se incluyen en el .cdx estructural sólo se utiliza para
informes
trimestrales o anuales. En el código siguiente se crea un índice autónomo a partir de una
etiqueta
birth_date de la tabla employee:
COPY TAG birth_date to birthdt COMPACT
Una vez creado un índice autónomo a partir de una etiqueta de un archivo .cdx,
normalmente deberá
eliminar la etiqueta, ahora innecesaria, del archivo .cdx. En la sección 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 autónomos. La eliminación 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.
Eliminar una etiqueta del archivo .idx estructural
Puede eliminar una etiqueta del archivo .idx estructural mediante el Diseñador de tablas o
bien
mediante el lenguaje.
Para eliminar una etiqueta de índice del .cdx estructural
En el Diseñador de tablas, utilice la ficha Índices para seleccionar el índice y eliminarlo.
–O bien–
Utilice el comando DELETE TAG.
–O bien–
Utilice las cláusulas 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
código 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
Eliminar una etiqueta de un archivo .cdx no estructural
Los índices .cdx no estructurales y sus etiquetas no son visibles en el Diseñador de tablas.
Para
eliminar las etiquetas de un archivo .cdx no estructural debe utilizar el lenguaje.
Manual del programador, Parte 2: Trabajar con datos Página 80 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
eliminar las etiquetas de un archivo .cdx no estructural debe utilizar el lenguaje.
Para eliminar un índice de un archivo .cdx no estructural
Utilice la cláusula OF del comando DELETE TAG.
Al utilizar la cláusula 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:
DELETE TAG title OF qtrlyrpt
Para eliminar todas las etiquetas de un archivo .cdx estructural o no estructural, utilice la
cláusula
ALL del comando DELETE TAG.
Eliminar un archivo de índice autónomo .idx
Como los archivos de índice autónomos solamente contienen una expresión de clave única,
para
eliminar la expresión basta con eliminar el archivo .IDX del disco.
Para eliminar un archivo de índice autónomo .idx
Utilice el comando DELETE FILE.
Por ejemplo, el código siguiente elimina el archivo de índice autónomo .idx Orddate.idx:
DELETE FILE orddate.idx
También puede utilizar el sistema operativo para eliminar los archivos .idx autónomos
innecesarios.
Indexar sobre expresiones
Para hacer más eficaces sus aplicaciones puede crear índices basados en expresiones. Estas
expresiones pueden ser simples o complejas, dependiendo de lo que se quiera lograr.
Indexar sobre expresiones simples
Las expresiones de índice simples se basan en un solo campo o en la concatenación de dos
o más
campos de caracteres para formar una clave de múltiples campos. Por ejemplo, para la tabla
Customer de la base de datos TasTrade podría crear un índice basado en la expresión:
country + region + cust_id
Al examinar la tabla Customer ordenada según esta etiqueta de índice, los clientes
aparecerán
ordenados por países, dentro de cada país por regiones y dentro de cada región por Id. de
cliente.
Usar una expresión para evitar valores duplicados en una combinación de campos
Si desea evitar la duplicación de valores en múltiples campos, puede crear un índice
principal o
Manual del programador, Parte 2: Trabajar con datos Página 81 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Si desea evitar la duplicación de valores en múltiples campos, puede crear un índice
principal o
candidato basado en una expresión que combine múltiples campos.
Por ejemplo, si tiene una tabla que almacena el prefijo de zona y el número de teléfono en
dos
columnas:
Prefijo de zona Número de teléfono
206 444-nnnn
206 555-nnnn
313 444-nnnn
En ambas columnas existen valores duplicados en otras filas. Sin embargo, no hay ningún
número de
teléfono duplicado, ya que la combinación de los dos campos siempre es única. Por ello, si
se
especifican las dos columnas en la expresión de un índice principal o candidato, las filas del
ejemplo
no se considerarán duplicadas. Si intenta introducir un valor con el mismo prefijo de zona y
el mismo
número de teléfono que una de las filas existentes, Visual FoxPro rechazará la entrada por
estar
duplicada.
Usar valores nulos en expresiones de índice
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:
Hay valores nulos en el campo SocSec de dos registros
El valor .NULL. en dos registros representa el hecho de que los números de seguridad
social de Anne
Dunn y Alan Carter son desconocidos o no están disponibles. Puede crear un índice con el
número
SocSec, como en el ejemplo siguiente:
INDEX ON SocSec + LastName + FirstName TAG MyIndex
Al ver la tabla ordenada por este índice, la secuencia es:
Después de indexar sobre SocSec, los registros con valores nulos en SocSec aparecen
en primer
lugar
Manual del programador, Parte 2: Trabajar con datos Página 82 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
lugar
Cuando la expresión de índice contiene valores nulos, los registros cuyo valor de SocSec
es .NULL.
se sitúan los primeros (ordenados por LastName), y a continuación 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.
Indexar sobre expresiones complejas
También puede crear índices basados en expresiones más complejas. Las expresiones de
clave de
índice de Visual FoxPro pueden contener funciones de Visual FoxPro, constantes o
funciones
definidas por el usuario.
La expresión que cree debe ofrecer como resultado no más de 100 caracteres en el caso de
índices
autónomos (.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
expresión a
datos de tipo Character.
Para aprovechar la optimización Rushmore™, la expresión de índice debe cumplir
exactamente los
criterios.
Usar funciones de Visual FoxPro en una etiqueta de índice
Puede utilizar funciones de Visual FoxPro en las etiquetas de índice. Por ejemplo, puede
utilizar la
función STR( ) para convertir un valor numérico 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 código siguiente:
INDEX ON cust_id + STR(maxordamt, 8, 2) TAG custmaxord
Si quiere reducir el tamaño de los índices para campos que contienen valores enteros, puede
convertir
los valores enteros en una representación Character (Binary) mediante la función BINTOC(
).
También puede convertir los valores binarios mediante la función CTOBIN( ).
Manual del programador, Parte 2: Trabajar con datos Página 83 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Si desea crear un índice para ordenar una tabla en orden cronológico, puede utilizar la
función 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 expresión de índice:
INDEX ON DTOS(hire_date) + emp_id TAG id_hired
Incluir procedimientos almacenados o funciones definidas por el usuario en una
etiqueta de
índice
Para hacer más eficaz el índice puede hacer referencia en su expresión a un procedimiento
almacenado o a una función definida por el usuario. Por ejemplo, puede utilizar un
procedimiento
almacenado o una FDU para extraer el nombre de la calle de un campo único que incluya
además del
nombre el número de la calle. Si el número de la calle es siempre numérico, el
procedimiento
almacenado o la FDU puede devolver la parte de caracteres del campo y rellenar el resto
con espacios
hasta completar una clave de índice de longitud constante. A continuación puede utilizar
esta clave de
índice para tener acceso a los registros de la tabla ordenados por el nombre de calle.
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
válida. El código 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 código especificado. Si
utiliza una
FDU en la expresión de índice, se usará en la indexación 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
expresión de
índice, ya que el tiempo necesario para crear el índice aumentará.
Usar datos de un campo de otra tabla en una etiqueta de índice
Puede crear una etiqueta de índice que haga referencia a una tabla abierta en otra área de
trabajo. Lo
mejor es utilizar un índice autónomo (.idx) para las etiquetas que hagan referencia a más de
una tabla,
ya que si se incluye una etiqueta de este tipo en un archivo .cdx estructural, Visual FoxPro
no
permitiría abrir la tabla hasta que esté abierta la tabla referenciada en la etiqueta de índice.
Acceso a los registros en orden descendente
Para ver los registros en orden descendente puede crear un índice descendente o bien leer
un índice
existente en orden descendente.
Para crear un índice descendente
En la ficha Índices del Diseñador de tablas, elija el botón de flecha situado a la izquierda
del
cuadro Nombre de forma que la flecha apunte hacia abajo.
–O bien–
Manual del programador, Parte 2: Trabajar con datos Página 84 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Utilice la cláusula DESCENDING con el comando INDEX ON para crear un índice
descendente.
Para crear archivos de índice estructural compuesto, puede utilizar los dos métodos. Para
crear otros
tipos de archivos de índice, sólo 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 código siguiente:
USE products
INDEX ON unit_price TAG unit_price DESCENDING
BROWSE
Para leer un índice existente en orden descendente
Utilice la cláusula 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 código siguiente:
USE products
INDEX ON unit_price TAG unit_price
De forma predeterminada, el orden es ascendente. Ahora puede examinar la tabla en orden
descendente con el siguiente código:
USE products
SET ORDER TO unit_price DESCENDING
BROWSE
En los ejemplos anteriores se trata el acceso a la información en orden descendente. Tanto
SET
ORDER como INDEX cuentan con una cláusula ASCENDING. Si combina estos dos
comandos
puede obtener una gran flexibilidad en sus aplicaciones. Por ejemplo, si utiliza la cláusula
ASCENDING o DESCENDING para crear un índice en el orden de uso más frecuente,
puede utilizar
la cláusula opuesta con el comando SET ORDER para ver o tener acceso a la información
en el orden
inverso cuando resulte más adecuado.
Filtrar datos
Puede limitar el acceso a los registros que se desee con un índice filtrado. Al crear un índice
filtrado,
solamente estarán disponibles para su presentación y acceso los registros que satisfagan la
expresión
de filtro.
Para filtrar los datos con un índice filtrado
En el Diseñador de tablas, escriba una expresión de filtro en el cuadro de texto Filtro del
índice
correspondiente.
–O bien–
Manual del programador, Parte 2: Trabajar con datos Página 85 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
–O bien–
Utilice la cláusula opcional FOR con el comando INDEX.
Si incluye la cláusula opcional FOR con el comando INDEX, el archivo de índice actuará
como un
filtro para la tabla. En el archivo de índice sólo se crearán claves para los registros que
satisfagan la
expresión de filtro. Por ejemplo, si prepara una circular destinada a los representantes de
ventas de su
empresa y desea ordenar el envío por países, puede crear un índice que filtre la tabla
employee de
forma que sólo aparezcan los registros de los representantes de ventas, ordenados por países
y por
apellidos. El código 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 sólo aparecerán los representantes de ventas, no los registros de
los
demás empleados.
Un índice filtrado se aplica solamente a los registros que satisfacen la expresión de
filtro.
Manual del programador, Parte 2: Trabajar con datos Página 86 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Filtrar datos de forma temporal
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
condición
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 sólo muestre los
clientes de
Alemania:
USE customer
SET FILTER TO country = "Germany"
BROWSE
El comando SET FILTER admite como condición de filtro cualquier expresión lógica
válida en
Visual FoxPro. Una vez especificado el comando SET FILTER, sólo estarán disponibles en
la tabla
los registros que cumplan la condición de filtro. Todos los comandos de acceso a la tabla
respetan la
condición de SET FILTER. Puede establecer un filtro distinto para cada tabla abierta.
Usar los índices de forma eficaz
Puede mejorar el rendimiento de las tablas indexadas si mantiene los índices actualizados y
utiliza en
ellos expresiones optimizables.
Volver a generar un archivo de índice activo
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 también pueden
quedar
invalidados a consecuencia de una caída 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.
Para volver a generar un archivo de índice activo
Manual del programador, Parte 2: Trabajar con datos Página 87 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
En el menú Tabla, elija Volver a generar índices.
–O bien–
Utilice el comando REINDEX.
Por ejemplo, el código siguiente actualiza el archivo de índice de la tabla Customer:
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 efectúa la reindexación según corresponda. Al hacerlo, actualiza todas las etiquetas
de los
archivos .cdx y también los archivos .cdx estructurales, que se abren automáticamente con
la tabla.
También puede actualizar los archivos de índice obsoletos con el comando REINDEX.
Reindexar en tiempo de ejecución
La reindexación lleva tiempo, especialmente cuando se trata de tablas de gran tamaño. Sólo
debe
reindexar cuando sea necesario. Para mejorar el rendimiento, puede reindexar durante la
inicialización o la finalización del programa, en lugar de hacerlo en la ejecución principal.
Usar índices para optimizar consultas
Puede utilizar índices para acelerar las consultas y otras operaciones. Si desea información
sobre la
forma de crear expresiones de índice optimizables Rushmore, consulte el capítulo 15,
Optimizar
aplicaciones
Usar múltiples tablas
Para usar varias tablas es necesario emplear áreas de trabajo. Un área de trabajo es una
región
numerada que identifica una tabla abierta. Puede abrir y manipular tablas de Visual FoxPro
en 32.767
áreas de trabajo. Las áreas de trabajo se suelen identificar en las aplicaciones por el alias de
la tabla
abierta en ellas. Un alias de tabla es un nombre que se refiere a una tabla abierta en un área
de trabajo.
Usar sesiones de datos
Además de las áreas de trabajo visibles en la ventana Sesión de datos, Visual FoxPro
proporciona
automáticamente un entorno independiente para cada instancia de un formulario o conjunto
de
formularios a través de las sesiones de datos. Una sesión de datos es una representación del
entorno
de trabajo dinámico actual utilizado por un formulario, un conjunto de formularios o un
informe.
Cada sesión 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
información sobre
el uso de sesiones de datos, consulte el capítulo 17, Programar para acceso compartido.
Ver las áreas de trabajo
Manual del programador, Parte 2: Trabajar con datos Página 88 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para ver la lista de tablas abiertas en una sesión de Visual FoxPro, puede abrir la ventana
Vista.
Para abrir la ventana Vista
En el menú Ventana, elija Sesión de datos.
–O bien–
Utilice el comando SET.
Al escribir SET en la ventana Comandos, Visual FoxPro abre la ventana Sesión de datos y
muestra
los alias de las áreas de trabajo de las tablas abiertas en la sesión actual.
Ventana Sesión de datos con tabla Employees abierta
Abrir una tabla en un área de trabajo
Para abrir una tabla en un área de trabajo puede utilizar la ventana Sesión de datos o el
comando
USE.
Para abrir una tabla en un área de trabajo
En la ventana Sesión de datos elija Abrir.
–O bien–
Escriba USE en la ventana Comandos.
Para abrir una tabla en la menor área de trabajo disponible, utilice la cláusula 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
Manual del programador, Parte 2: Trabajar con datos Página 89 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
USE customer IN 0
También puede elegir Abrir en el menú Archivo para abrir una tabla en un área de trabajo.
Cerrar una tabla en un área de trabajo
Para cerrar una tabla en un área de trabajo puede utilizar la ventana Sesión de datos o bien
hacerlo
mediante el lenguaje.
Para cerrar una tabla en un área de trabajo
En la ventana Sesión de datos, seleccione el alias de la tabla y luego elija Cerrar.
–O bien–
Escriba USE sin indicar un nombre de tabla.
–O bien–
Utilice la cláusula IN del comando USE para referirse al área de trabajo de la tabla que
desee
cerrar.
Cuando especifique el comando USE sin ningún nombre de tabla y haya un archivo de
tabla abierto
en el área de trabajo seleccionada actualmente, la tabla se cerrará. Por ejemplo, el código
siguiente
abre la tabla customer, muestra una ventana Examinar y luego cierra la tabla:
USE customer
BROWSE
USE
También se cierra la tabla automáticamente cuando se abre otra en la misma área de trabajo
o cuando
se especifica el comando USE con la cláusula IN y se hace referencia al área de trabajo
actual. El
código siguiente abre, muestra y cierra la tabla customer utilizando USE IN y el alias de
tabla
customer:
USE customer
BROWSE
USE IN customer
No puede tener abierta más de una tabla a la vez en la misma área de trabajo.
Hacer referencia a un área de trabajo
Antes de abrir una tabla, puede referirse a la siguiente área de trabajo disponible con el
número de
área de trabajo como se indica a continuación:
SELECT 0
Usar alias de tablas
Un alias de tabla es el nombre que utiliza Visual FoxPro para referirse a una tabla abierta
en un área
Manual del programador, Parte 2: Trabajar con datos Página 90 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Un alias de tabla es el nombre que utiliza Visual FoxPro para referirse a una tabla abierta
en un área
de trabajo. Visual FoxPro utiliza automáticamente 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á automáticamente a la tabla el alias predeterminado
customer:
SELECT 0
USE customer
A continuación puede utilizar el alias customer para identificar la tabla en un comando o
función.
También puede especificar otro alias.
Crear un alias definido por el usuario
Puede asignar el alias que desee a una tabla en el momento de abrirla.
Para abrir una tabla con un alias definido por el usuario
Escriba USE con un nombre de alias de tabla.
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 continuación podrá utilizar el alias people para referirse a la tabla abierta. Un alias
puede tener
hasta 254 letras, dígitos o signos de subrayado, y debe comenzar por una letra o un signo de
subrayado. Visual FoxPro crea automáticamente un alias alternativo cuando el especificado
contiene
algún carácter no admitido.
Usar un alias asignado por Visual FoxPro
Visual FoxPro asigna alias automáticamente a las tablas en determinadas situaciones:
Al abrir una misma tabla simultáneamente en varias áreas de trabajo incluyendo la
cláusula
AGAIN en el comando USE y sin especificar alias distintos al abrir la tabla en cada área.
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.
Seleccionar un área de trabajo con un alias
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
Hacer referencia a tablas abiertas en otras áreas de trabajo
Manual del programador, Parte 2: Trabajar con datos Página 91 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Hacer referencia a tablas abiertas en otras áreas de trabajo
También 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 expresión 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 expresión siguiente:
people.lastname
El uso del nombre o el alias de una tabla la identifica específicamente, independientemente
del área
de trabajo en la que esté abierta.
Establecer relaciones temporales entre tablas
Al establecer una relación temporal entre tablas, se hace que el puntero de registro de una
tabla (la
tabla secundaria) siga automáticamente los movimientos del de la otra (la tabla primaria), lo
que
permite seleccionar un registro en el lado ‘uno’, o primario, de una relación y tener acceso
automáticamente 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 número 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.
Tablas relacionadas temporalmente
Puede utilizar la ventana Sesión de datos o el lenguaje para crear relaciones temporales
entre las
tablas.
Para relacionar tablas temporalmente
En la ventana Sesión de datos, seleccione las tablas y utilice el botón Relaciones para
crear las
relaciones.
–O bien –
Utilice el comando SET RELATION.
Con el comando SET RELATION puede establecer una relación entre una tabla abierta en
el área de
trabajo seleccionada actualmente y otra tabla abierta en otra área. Normalmente se
relacionan tablas
Manual del programador, Parte 2: Trabajar con datos Página 92 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
trabajo seleccionada actualmente y otra tabla abierta en otra área. Normalmente se
relacionan tablas
que tienen un campo común y la expresión utilizada para establecer la relación es
habitualmente la
expresión 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
relación entre el campo común a ambas tablas, podrá ver fácilmente todos los pedidos de un
cliente
determinado. En el programa siguiente se utiliza un campo, cust_id, común a las dos
tablas, para
crear una relación 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 relación entre dos tablas
Código 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 ORDER TO TAG cust_id Especifica el orden de la tabla secundaria
mediante la etiqueta de índice cust_id.
SELECT customer Selecciona el área de trabajo independiente.
SET RELATION TO cust_id INTO orders Crea la relación entre la tabla primaria y el
índice
que controla la tabla secundaria.
SELECT orders
BROWSE NOWAIT
SELECT customer
BROWSE NOWAIT
Abre dos ventanas Examinar. Observe que al
mover el puntero de registro en la tabla primaria
los datos de la tabla secundaria cambian.
La ventana Sesión de datos muestra las dos tablas abiertas, Orders y Customer, y la
relación
establecida con el comando SET RELATION.
La ventana Sesión de datos muestra los alias y las relaciones temporales de las tablas
abiertas
Manual del programador, Parte 2: Trabajar con datos Página 93 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
El índice creado para la tabla secundaria, orders, ordena los registros de la tabla orders por
grupos,
según el cliente que ha originado el pedido. Al establecer una relación 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 relación simple entre dos tablas. También
puede utilizar
el comando SET RELATION para establecer relaciones múltiples entre una tabla primaria
y varias
tablas secundarias.
Guardar relaciones entre tablas en un entorno de datos
Si va a crear un formulario que utiliza más 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 automáticamente al ejecutar el formulario. Si desea información sobre cómo
crear un
entorno de datos, consulte el capítulo 9, Crear formularios.
Relacionar registros de una sola tabla
También puede crear una relación entre registros de una sola tabla. Esta relación,
denominada con
referencia a sí misma, puede ser útil en aquellas situaciones en las que se tiene toda la
información
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
automáticamente al mover el puntero de registro de un supervisor a otro.
Para relacionar temporalmente registros de una sola tabla
En la ventana Sesión de datos, seleccione la tabla y utilice el botón Relaciones para
establecer
relaciones.
-O bien
Utilice el comando SET RELATION.
Para crear una relación 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
continuación
utilizará un índice para relacionar los registros. Por ejemplo, el código siguiente establece y
examina
una relación 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
Manual del programador, Parte 2: Trabajar con datos Página 94 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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
Al desplazar el puntero de registro de la ventana Examinar managers, la ventana Examinar
employees se actualiza de forma que sólo muestra los empleados que dependen del
supervisor
seleccionado.
Establecer relaciones persistentes con índices
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 automáticamente como condiciones predeterminadas de
combinación en el
Diseñador de consultas y en el Diseñador de vistas. Las relaciones persistentes aparecen
también en el
Diseñador de bases de datos en forma de líneas 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 relación entre los punteros de registros,
por lo
que deberá utilizar ambos tipos al programar aplicaciones con Visual FoxPro. Si desea más
información sobre el establecimiento de relaciones persistentes, consulte el capítulo 6,Crear
bases de
datos.
Diseñador
de conexiones.
–O bien–
Use el comando CREATE CONNECTION con un nombre de conexión.
Por ejemplo, para crear una conexión en la base de datos testdata que almacene la
información
necesaria para conectarse al origen de datos ODBC sqlremote, puede escribir el código
siguiente:
OPEN DATABASE testdata
CREATE CONNECTION remote_01 DATASOURCE sqlremote userid password
Visual FoxPro muestra remote_01 como el nombre de la conexión en el Administrador de
proyectos.
La creación de una conexión con nombre en su base de datos no utiliza ningún recurso
remoto ni de
red, ya que Visual FoxPro no activa la conexión hasta que usted utiliza la vista. Hasta que
active la
conexión, la conexión con nombre sólo existe como una definición de conexión
almacenada como
una fila en el archivo .dbc de la base de datos. Cuando utilice una vista remota, Visual
FoxPro usará
la conexión con nombre mencionada en la vista para crear una conexión activa con el
origen de datos
remoto y enviará la solicitud de datos al origen remoto utilizando la conexión activa como
canal.
Puede crear opcionalmente una vista que especifique únicamente el nombre del origen de
datos, en
lugar del nombre de la conexión. Cuando utilice la vista, Visual FoxPro usará la
información de
ODBC acerca del origen de datos para crear y activar una conexión con el origen de datos.
Cuando
cierre la vista se cerrará la conexión.
Prioridad de nombres para conexiones y orígenes de datos
Cuando utilice el comando CREATE SQL VIEW con la cláusula CONNECTION,
especifique un
nombre que represente una conexión o bien un origen de datos. Visual FoxPro buscará
primero en la
base de datos actual una conexión con el nombre que especificó. Si no existe ninguna
conexión 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 conexión
con nombre
cuyo nombre coincide con el de un origen de datos ODBC de su sistema, Visual FoxPro la
encontrará
y utilizará la conexión con nombre.
Mostrar instrucciones de inicio de sesión ODBC
Cuando use una vista cuya información de registro de conexión no esté totalmente
especificada,
Visual FoxPro puede mostrar un cuadro de diálogo específico del origen de datos que le
pida la
información que falte.
Puede controlar si Visual FoxPro le pedirá la información que dejó sin especificar en el
momento de
Manual del programador, Parte 2: Trabajar con datos Página 104 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Puede controlar si Visual FoxPro le pedirá la información que dejó sin especificar en el
momento de
la conexión.
Para controlar la presentación de instrucciones de inicio de sesión ODBC
En el Administrador de proyectos, seleccione el nombre de la conexión y elija Modificar
para
abrir el Diseñador de conexiones.
En el área Mostrar instrucciones de inicio de sesión ODBC, elija una opción.
–O bien–
Use la propiedad DispLogin de las funciones DBSETPROP( ) o SQLSETPROP( ).
Por ejemplo, el código siguiente muestra las conexiones de la base de datos testdata:
OPEN DATABASE testdata
DISPLAY CONNECTIONS
Crear una vista remota
Cuando tiene un origen de datos o una conexión con nombre válidos, puede crear una vista
remota
con el Administrador de proyectos o el lenguaje de programación. Una vista remota es
similar a una
vista local, pero usted agrega un nombre de conexión o de origen de datos al definir la
vista. La
instrucción SQL de la vista remota utiliza el dialecto nativo del servidor.
Para crear una vista remota
En el Administrador de proyectos, seleccione una base de datos, seleccione Vistas
remotas y
elija Nuevo para abrir el Diseñador de vistas.
–O bien–
Use el comando CREATE SQL VIEW con la cláusula REMOTE o la cláusula
CONNECTION.
Manual del programador, Parte 2: Trabajar con datos Página 105 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
CONNECTION.
Si usa la cláusula 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 código siguiente creará una vista remota de la tabla products:
OPEN DATABASE testdata
CREATE SQL VIEW product_remote_view ;
CONNECTION remote_01 ;
AS SELECT * FROM products
Puede utilizar el nombre de un origen de datos en lugar del nombre de una conexión cuando
cree una
vista remota. También puede elegir entre omitir el nombre de la conexión o del origen de
datos
remoto cuando utilice el comando CREATE SQL VIEW con la cláusula REMOTE. Visual
FoxPro
mostrará entonces el cuadro de diálogo Selección de conexión u Origen de datos, en el que
podrá
elegir un origen de datos o una conexión válidos.
Después de crear una vista, puede abrir el Diseñador 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.
Si combina dos o más tablas en el Diseñador de vistas remotas, el Diseñador usa
combinaciones
internas (o equicombinaciones) y coloca la condición de combinación en la cláusula
WHERE. Si
quiere usar una combinación externa, el Diseñador de vistas remotas sólo proporciona
combinaciones
externas izquierdas, la sintaxis con la que es compatible ODBC. Si necesita combinaciones
externas
derechas o completas o sólo quiere usar una sintaxis nativa para una combinación externa
izquierda,
cree la vista mediante programación.
Usar vistas
Después de haber creado una vista, puede utilizarla para mostrar y actualizar datos.
También puede
modificar las propiedades de una vista para aumentar el rendimiento de la misma. Se trata
la vista
como una tabla:
Abra la vista con el comando USE y el nombre de la vista.
Cierre la vista con el comando USE.
Muestre los registros de la vista en una ventana Examinar.
Muestre los alias de vista abierta en la ventana Sesión de datos.
Use la vista como un origen de datos como en un formulario o un control Grid.
Puede utilizar una vista con el Administrador de proyectos o con el lenguaje de
programación.
Para usar una vista
En el Administrador de proyectos, seleccione una base de datos, elija el nombre de la
vista y
elija Examinar para mostrar la vista en una ventana Examinar.
–O bien–
Manual del programador, Parte 2: Trabajar con datos Página 106 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
–O bien–
Tenga acceso a la vista mediante programación con el comando USE.
Por ejemplo, el código siguiente crea una regla a nivel de campo en orditems_view que
evita la
entrada de una cantidad inferior a 1:
OPEN DATABASE testdata
USE VIEW orditems_view
DBSETPROP('Orditems_view.quantity','Field', ;
'RuleExpression', 'quantity >= 1')
DBSETPROP('Orditems_view.quantity','Field', ;
'RuleText', ;
'"Las cantidades deben ser mayores o iguales que 1"')
También puede usar la función 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 información 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 combinación 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 múltiples 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
mostrarán en la ventana Sesión de datos. Las tablas remotas no aparecen en la ventana
Sesión de
datos.
Combinar datos locales y remotos en una vista
Puede combinar datos locales y remotos en una vista si crea una nueva vista local basada en
una vista
local y una vista remota.
Para crear una vista que combina datos locales y remotos
En el Administrador de proyectos, seleccione una base de datos, elija Vistas locales y, a
continuación, elija Nuevo para abrir el Diseñador de vistas. Agregue cualquier
combinación de
tablas, vistas locales y vistas remotas a su vista.
–O bien
Use el comando CREATE SQL VIEW.
Por ejemplo, para crear una vista local que combine información de la tabla local Employee
y la tabla
remota Orders, puede utilizar el código siguiente:
OPEN DATABASE testdata
CREATE SQL VIEW remote_orders_view ;
Manual del programador, Parte 2: Trabajar con datos Página 121 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
CREATE SQL VIEW remote_orders_view ;
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
Actualizar datos locales y remotos en una vista
Cuando actualice datos en una vista multicapa, las actualizaciones bajarán 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.
Trabajar con datos fuera de línea
Hay veces en las que quiere mostrar, reunir o modificar datos independientemente de la
base de datos
host. Con las características de la vista fuera de línea de Visual FoxPro, puede usar vistas
para
conectarse a una base de datos host y crear un subconjunto de datos para trabajar fuera de
línea.
Entonces, al trabajar fuera de línea podrá usar la vista directamente o mediante una
aplicación que
cree. Cuando haya terminado, puede cargar las modificaciones almacenadas en la vista a la
base de
datos host.
Algunos escenarios en los que son útiles las vistas fuera de línea son:
Una situación de almacenamiento de datos, en la que se mantienen grandes bases de
datos
centralizadas en servidores MIS. Si sólo está interesado en datos pertenecientes a, por
ejemplo,
el departamento de Marketing, puede crear una vista que incluya sólo los datos que le
importen. Entonces puede usar los datos fuera de línea, permitir que varios usuarios del
departamento de Marketing actualicen los datos y después devolver los datos modificados a
la
base de datos de origen.
Una ubicación geográfica remota que requiere que lleve un subconjunto de datos en su
portátil,
modificar los datos de forma independiente en la base de datos host y después actualizar la
base
de datos con los datos modificados.
Datos sensibles al tiempo. Por ejemplo, puede querer actualizar datos que reflejen los
aumentos
de sueldo de los empleados antes de que se apliquen los nuevos sueldos.
Trabajar con vistas fuera de línea
Manual del programador, Parte 2: Trabajar con datos Página 122 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para crear y usar datos de vista fuera de línea, puede usar las siguientes características del
lenguaje:
La función CREATEOFFLINE( )
El comando USE SQLNombreVista con las cláusulas ADMIN y ONLINE
El comando TABLEUPDATE
La función DROPOFFLINE( )
Si pretende usar la vista fuera de línea en un equipo distinto del utilizado para crear la vista
fuera de
línea, debe preparar el destino fuera de línea creando una copia del archivo de base de datos
host
(.dbc); asegúrese 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 orígenes 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.
Crear vistas fuera de línea
Como con los datos en línea, analice sus requisitos antes de crear vistas fuera de línea para
determinar
el diseño de vistas que necesita en la base de datos fuera de línea. Cuando determine el
subconjunto
de datos que desea usar fuera de línea, 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 línea, puede usarla, o
puede
crear una vista mediante programación. La vista que usa fuera de línea se almacena en un
archivo .dbf
en el contenedor de base de datos.
Nota Si pretende modificar datos en una vista fuera de línea, asegúrese de hacer la vista
actualizable
antes de usarla fuera de línea. Cuando una vista está fuera de línea sólo puede establecer
sus
propiedades de actualización a través de programación; no puede modificar una vista fuera
de línea
en el Diseñador de vistas.
Para usar una vista existente fuera de línea
Use la función CREATEOFFLINE( ) y el nombre de la vista.
Por ejemplo, si quiere ir a sitios cliente para actualizar cuentas, agregar clientes y registrar
nuevas
ventas, necesita la información de los clientes así como los pedidos actuales y las
descripciones de
productos en pantalla. Puede tener una vista llamada customerinfo que combine
información de la
tabla Customers, la tabla Orders y la tabla OrderItems. Para crear la vista, use este código:
CREATEOFFLINE("customerinfo")
Manual del programador, Parte 2: Trabajar con datos Página 123 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para crear una vista fuera de línea mediante programación
Use el comando CREATE SQL VIEW, seguido por el comando CREATEOFFLINE( ).
Por ejemplo, el código siguiente crea una vista que muestra datos de la tabla Products y la
tabla
Inventory desde la base de datos en línea. Como no se especifica ningún criterio de
actualización,
esta vista es de sólo lectura.
CREATE SQL VIEW showproducts ;
CONNECTION dsource ;
AS SELECT * FROM Products INNER JOIN Inventory ;
ON Products.ProductID = Inventory.ProductID ;
CREATEOFFLINE("showproducts")
Mostrar y modificar datos fuera de línea
Después de crear la vista para sus datos fuera de línea, puede usarla como cualquier vista de
su
aplicación: puede agregar, cambiar y eliminar registros. Múltiples usuarios pueden tener
acceso a la
vista fuera de línea simultáneamente usando la misma base de datos en modo compartido.
Si decide
no conservar las modificaciones, puede revertir la información para que refleje la
información
original.
Usar datos fuera de línea
Si usa los datos fuera de línea, puede mostrar y actualizar datos de la misma forma que lo
hace en
línea con los mismos formularios, informes o aplicaciones. Por ejemplo, el código siguiente
abre la
vista Showproducts:
USE Showproducts
Sugerencia Si no obtiene el subconjunto de datos que esperaba, compruebe la
configuración de
optimización para la vista remota. Si establece la propiedad MaxRecords mediante la
función
DBSETPROP( ), sólo aparece ese número de registros en las vistas fuera de línea. Sin
embargo, si
incluye un campo Memo en la lista de campos de la vista, se incluye automáticamente en el
conjunto
Manual del programador, Parte 2: Trabajar con datos Página 124 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
incluye un campo Memo en la lista de campos de la vista, se incluye automáticamente en el
conjunto
de resultados incluso si FetchMemo está establecido como falso (.F.).
Administrar datos fuera de línea
En algunos casos (especialmente en un entorno de múltiples usuarios en el que muchas
personas
modifican los datos) puede querer examinar las modificaciones realizadas a la vista fuera
de línea
antes de introducir las modificaciones en la base de datos de origen. Con el comando USE
y la
cláusula ADMIN, puede ver todas las modificaciones que se han introducido en una vista
desde que
se usó fuera de línea. Entonces puede revertir de forma selectiva las modificaciones que se
hayan
realizado sin estar conectado al origen de datos. Por ejemplo, el código siguiente abre la
vista
Showproducts en modo administrador:
USE Showproducts ADMIN
Actualizar datos en línea
Después de terminar de trabajar fuera de línea, puede actualizar los datos en el servidor
usando las
mismas transacciones de actualización de tabla que utiliza normalmente con los datos en
línea. Al
trabajar con datos remotos, recuerde las sugerencias siguientes:
Para actualizaciones de registros individuales, use transacciones automáticas.
Para actualizaciones de proceso por lotes, use transacciones manuales.
Si es necesario, incluya código para detectar conflictos, cree un registro de conflictos y
resuélvalos.
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. Después de ejecutar el comando,
Visual
FoxPro intenta localizar la base de datos host con la información de origen de datos
almacenada en la
vista. Cuando la conexión está establecida, puede usar TABLEUPATE( ) para procesar las
actualizaciones almacenadas en los datos fuera de línea.
Para asegurarse de que la información de conexión es correcta independientemente de la
ubicación
del host y las tablas de vista, tiene que usar sintaxis de cadena de conexión en lugar de una
conexión
con nombre.
Actualizar lotes de registros en tablas locales
Para procesar un lote de cambios en tablas locales, puede usar transacciones manuales que
le
permiten procesar el lote de cambios en una única transacción en lugar de una serie de
transacciones
independientes.
Actualización de tablas locales con vistas fuera de línea
Código Coment
USE myofflineview ONLINE EXCLUSIVE Volver a conectarse abrir la vista
Manual del programador, Parte 2: Trabajar con datos Página 125 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
BEGIN TRANSACTION
IF TABLEUPDATE (2, .F., "myofflineview")
END TRANSACTION
ELSE
MESSAGEBOX("Ha ocurrido un error: La actualización no ha tenido éxito")
ROLLBACK
ENDIF
Comprobar si hay conflictos actualización y actualizar apropiado.
Actualizar lotes de registros en tablas remotas
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 conexión para administrar sus transacciones manualmente, tiene que usar
CURSORGETPROP( ) en el cursor de la vista para obtener el controlador de conexión y, a
continuación, establecer la propiedad Transactions a modo manual.
En el código siguiente, la identificación de conexión actual para la vista, myview, se
almacena en
hConn1. hConn1 se usa para establecer la propiedad Transactions a "2" para transacciones
manuales.
hConn1 = CURSORGETPROP("CONNECTHANDLE","myview") ;
SQLSETPROP(hConn1,"TRANSACTIONS",2)
Después de establecer la conexión 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
código
como directiva.
Actualización de tablas remotas con vistas fuera de línea
Código Comentario
USE myofflineview ONLINE EXCLUSIVE Volver a conectarse al host abrir la vista.
SQLSetProp(liviewhandle,"transacciones",2)
SQLSetProp(custviewhandle,"transacciones",2)
SQLSetProp(ordviewhandle,"transacciones",2)
Establecer las conexiones las vistas para controlar
manualmente la transacción.
IF NOT TABLEUPDATE(.T.,.F.,"lineitemsview")
=SQLROLLBACK(ordviewhandle)
=MESSAGEBOX("No se puede actualizar la tabla de elementos de línea")
IF NOT TableUpdate(.T.,.F.,"ordersview")
=SQLROLLBACK(liviewhandle)
=MESSAGEBOX("No se puede actualizar la tabla de pedidos")
IF NOT TABLEUPDATE(.T.,.F.,"customerview")
=SQLROLLBACK(custviewhandle)
=MESSAGEBOX("No se puede actualizar la tabla de clientes")
Else *# comprobar escenarios de error
IF NOT SQLCOMMIT(liviewhandle)
=SQLROLLBACK(liviewhandle)
Controlar actualizaciones conflictos de actualización.
Manual del programador, Parte 2: Trabajar con datos Página 126 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
=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 automáticas. Como cada
instrucción para
procesar una actualización, eliminación o inserción se controla como una transacción
independiente,
no puede deshacer instrucciones de transacciones anteriores.
USE customerview ONLINE EXCLUSIVE
GO TO 3
IF TABLEUPDATE (0, .F. workarea)
* conflicto controlando el código
ENDIF
Sugerencia Para actualizar un único registro en una tabla local, use la función
GETNEXTMODIFIED().
Cancelar actualizaciones fuera de línea
Si decide que quiere eliminar los datos fuera de línea y convertir la vista en una vista en
línea, puede
usar la función DROPOFFLINE( ).
Para cancelar actualizaciones fuera de línea
Use DROPOFFLINE( ) con el nombre de la vista.
Asegúrese 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 código 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 línea, pero no puede usar los comandos PACK, ZAP o
INSERT con
una vista fuera de línea.
Optimizar el rendimiento de una vista
Puede optimizar el rendimiento de sus vistas estableciendo sus propiedades.
Manual del programador, Parte 2: Trabajar con datos Página 127 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Controlar el tamaño de búsqueda de la búsqueda progresiva
Puede controlar el número 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.
Controlar la búsqueda memo
Puede utilizar la característica de búsqueda diferida de memo de Visual FoxPro para
acelerar la
recuperación de los datos de la vista. Cuando elija esta característica, 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 búsqueda diferida de memo funcione. No obstante, no tiene
que
establecer las propiedades SendUpdates o Updatable para que la búsqueda memo funcione.
Establecer el número máximo de registros que se descargarán
Puede controlar la cantidad de datos que se descargan al abrir una vista si establece la
propiedad
MaxRecords. Cuando Visual FoxPro envía una instrucción SQL al origen de datos para
crear una
vista, el origen de datos genera y almacena un conjunto resultante. La propiedad
MaxRecords
especifica el número máximo 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.
Para controlar el número de filas que se descargan en una vista
Elija Opciones en el menú Herramientas y seleccione la ficha Datos remotos. En el
área
Opciones predeterminadas de vista remota, junto a Máximo de registros para buscar,
desactive Todos, introduzca un valor en el cuadro de texto y elija Aceptar.
-O bien–
Use la propiedad MaxRecords de las funciones DBSETPROP( ) o CURSORSETPROP(
).
Por ejemplo, el código siguiente modifica la definición de la vista para limitar a 50 el
número de filas
descargadas en la vista, independientemente del tamaño del conjunto resultante generado en
el origen
de datos remoto:
OPEN DATABASE testdata
USE VIEW remote_customer_view
?DBSETPROP ('Remote_customer_view', ; 'View','MaxRecords', 50)
Puede utilizar la función CURSORSETPROP( ) para establecer el límite de MaxRecords
para una
vista activa.
Sugerencia No puede usar la propiedad MaxRecords para detener una consulta en
ejecución, ya que
la propiedad MaxRecords no controla la creación del conjunto resultante. Use la propiedad
QueryTimeOut para controlar el tiempo de ejecución en el origen de datos remoto.
Optimizar filtros y combinaciones
Manual del programador, Parte 2: Trabajar con datos Página 128 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Optimizar filtros y combinaciones
Para tomar decisiones de optimización para una vista o una consulta, es posible que tenga
que
conocer el plan de ejecución: el orden en que se evalúan las cláusulas de combinaciones y
filtros. Con
la función SYS(3054), puede mostrar uno de los tres niveles de optimización Rushmore.
Los tres
niveles indican el grado en que las condiciones de filtro o las condiciones de combinación
pudieron
utilizar la optimización Rushmore. Los niveles son completamente (Full), parcialmente
(Partial) o
nada (None).
Para mostrar el plan de ejecución para filtros
1. En la ventana Comandos, escriba SYS(3054,1) para activar SQL ShowPlan.
2. Escriba la instrucción SQL SELECT.
Por ejemplo, puede escribir:
SELECT * FROM customer, orders ;
AND Upper(country) = "Méjico"
3. Lea el plan de ejecución que aparece en pantalla.
Para este ejemplo, la pantalla podría tener esta apariencia:
Using Index Tag Country to optimize table customer
Rushmore Optimization Level for table customer: Full
Rushmore Optimization level for table orders: none
4. En la ventana Comandos, escriba SYS(3054,0) para desactivar SQL ShowPlan.
Entonces puede pasar 11 a la función SYS para evaluar combinaciones en las cláusulas
FROM o
WHERE.
Para mostrar el plan de ejecución para combinaciones
1. En la ventana Comandos, escriba SYS(3054,11) para activar SQL ShowPlan.
2. Escriba su instrucción SQL SELECT.
Por ejemplo, puede escribir:
SELECT * ;
FROM customer INNER JOIN orders ;
ON customer.cust_id = orders.cust_id ;
WHERE Upper(country) = "Méjico"
3. Lea el plan de ejecución que aparece en pantalla.
Para este ejemplo, la pantalla puede tener la siguiente apariencia:
Using Index Tag Country to optimize table customer
Manual del programador, Parte 2: Trabajar con datos Página 129 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
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
4. En la ventana Comandos, escriba SYS(3054,0) para desactivar SQL ShowPlan.
Controlar la evaluación de combinaciones
Si el plan de ejecución para sus combinaciones no satisface sus necesidades específicas,
puede hacer
que el orden de combinación se ejecute exactamente como está escrito sin optimización del
procesador. Para forzar el orden de evaluación de la combinación, debe agregar la palabra
clave
FORCE y colocar sus condiciones de combinación en la cláusula FROM. Las condiciones
de
combinación que se colocan dentro de una cláusula WHERE no se incluyen en una
evaluación de
combinación forzada.
Nota No puede usar la palabra clave FORCE en instrucciones de paso a través SQL ni en
vistas
remotas porque la palabra clave es una extensión de Visual FoxPro del estándar ANSI y no
está
admitida en otros diccionarios SQL.
La cláusula FORCE es global, por lo que se aplica a todas las tablas de la cláusula JOIN.
Asegúrese
de que el orden en el que aparecen las tablas de combinación es exactamente el orden en el
que se
deben combinar. También puede usar los paréntesis para controlar el orden de evaluación
de
combinaciones.
En este ejemplo, la primera combinación especificada también es la primera combinación
evaluada.
La tabla Customer se combina con la tabla Orders en primer lugar. El resultado de la
combinación se
combina entonces con la tabla OrdItems:
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 combinación entre paréntesis para la tabla Orders y OrdItems se evalúa
primero. El
resultado de la combinación se utiliza en la evaluación de la combinación 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
Conexiones compartidas para múltiples vistas remotas
Puede utilizar una conexión activa como canal de información para múltiples vistas remotas
si
comparte una conexión. Cuando comparte una conexión activa, usted:
Reduce el número de conexiones de un servidor remoto.
Reduce los costes por conexiones a servidores que se cobran por conexión.
Manual del programador, Parte 2: Trabajar con datos Página 130 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Para compartir conexiones establece la definición de la vista para utilizar una conexión
compartida al
activarse. Cuando se utiliza la vista, Visual FoxPro se conecta al origen de datos remoto
con la
conexión compartida existente (en caso de que haya alguna). Si no hay ninguna conexión
compartida
en uso, Visual FoxPro creará una conexión exclusiva cuando se abra la vista, que puede
compartirse
con otras vistas.
Sólo una instancia activa de una definición de conexión con nombre se comparte durante
una sesión
de Visual FoxPro. Si hay varias instancias activas de la misma definición de conexión, la
primera de
ellas que se use como conexión compartida se convertirá en la conexión compartida
designada. Todas
las vistas que utilicen esa definición de conexión y empleen conexiones compartidas
tendrán acceso
al servidor remoto a través de la conexión compartida designada.
No se compartirán otras conexiones distintas de la conexión compartida designada. El uso
compartido de conexiones no está ligado a las sesiones.
Para compartir una conexión
Elija Opciones en el menú Herramientas. Elija la ficha Datos remotos; active la casilla
de
verificación Compartir conexión en el área Opciones predeterminadas de vista remota
y
elija Aceptar.
–O bien–
Use el Diseñador de vistas.
–O bien–
Use el comando CREATE SQL VIEW con la cláusula SHARE.
El código siguiente crea una vista que, cuando se activa con el comando USE, comparte
una
conexión:
CREATE SQL VIEW product_view_remote ;
CONNECTION remote_01 SHARE AS ;
SELECT * FROM products
USE product_view_remote
Comprobar si una conexión está ocupada
Cuando una conexión está ocupada, como ocurre cuando Visual FoxPro busca datos de
forma
progresiva en un cursor, no querrá comenzar otra búsqueda o enviar actualizaciones por la
misma
conexión. Puede determinar si una conexión está ocupada mediante la propiedad
ConnectBusy, que
devuelve un valor verdadero (.T.) si la conexión está ocupada. Puede utilizar esta propiedad
en su
aplicación para comprobar si la conexión está ocupada o no antes de enviar una solicitud a
un origen
de datos remoto a través de una conexión compartida.
Para determinar si una conexión está ocupada
Use la propiedad ConnectBusy de la función SQLGETPROP( ).
Manual del programador, Parte 2: Trabajar con datos Página 131 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Use la propiedad ConnectBusy de la función SQLGETPROP( ).
Necesita el controlador de la conexión para utilizar la función SQLGETPROP( ). Puede
identificar el
controlador de la conexión para una vista activa mediante la propiedad ConnectHandle de
la función
CURSORGETPROP( ). El código siguiente identifica un controlador de conexión y lo
utiliza para
comprobar si la conexión está ocupada:
nConnectionHandle=CURSORGETPROP('ConnectHandle')
SQLGETPROP(nConnectionHandle, "ConnectBusy")
Manual del programador, Parte 2: Trabajar con datos Página 132 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 2: Trabajar con datos Página 133 de 133
file://C:\temp\~hhE1A2.htm 30/05/2000
Manual del programador, Parte 3: Crear la interfaz Página 1 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Diseñar formularios
Visual FoxPro proporciona un eficaz Diseñador de formularios para que el diseño de
formularios
resulte rápido y sencillo. Puede disponer de:
Diversos tipos de objetos en los formularios.
Datos dependientes del formulario.
Formularios de nivel superior o formularios secundarios.
Múltiples formularios que pueden manipularse conjuntamente.
Formularios basados en sus propias plantillas personalizadas.
Los formularios y los conjuntos de formularios son objetos con sus propias propiedades,
eventos y
métodos que pueden establecerse en el Diseñador de formularios. Un conjunto de
formularios consta
de uno o más 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 ejecución.
Crear un formulario nuevo
Puede crear formularios nuevos en el Diseñador de formularios, y ver a medida que lo
diseña cómo
verá el usuario cada objeto.
Para crear un formulario nuevo
En el Administrador de proyectos, seleccione Formularios y elija Nuevo.
-O bien–
En el menú Archivo, elija Nuevo, seleccione Formulario y, a continuación, elija Nuevo
archivo.
–O bien–
Utilice el comando CREATE FORM.
Usar imágenes
El control Image permite agregar imágenes (archivos .bmp) al formulario. Un control
Image tiene la
gama completa de propiedades, eventos y métodos que tienen otros controles, por lo que
puede
cambiarse dinámicamente en tiempo de ejecución. Los usuarios pueden interactuar con
imágenes
haciendo clic, haciendo doble clic, etc.
La tabla siguiente muestra algunas de las propiedades clave de un control Image.
Propiedad Descripción
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 mostrarán las partes de la
Manual del programador, Parte 3: Crear la interfaz Página 77 de 127
file://C:\temp\~hh572C.htm 30/05/2000
imagen que superen las dimensiones del control Image. Si Stretch se
establece a 1 – Isométrico, 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
Las etiquetas se diferencian de los cuadros de texto en los siguientes aspectos:
No pueden tener un origen de datos.
No pueden modificarse directamente.
No puede tener acceso a las mismas mediante la tecla tab.
Se pueden cambiar las propiedades Caption y Visible de las etiquetas mediante
programación para
adaptar la etiqueta a la situación concreta.
Propiedades comunes de las etiquetas
Las siguientes propiedades de las etiquetas suelen establecerse en tiempo de diseño.
Propiedad Descripción
Caption El texto que muestra la etiqueta.
AutoSize Indica si el tamaño de la etiqueta se ajusta a la longitud del título.
BackStyle Indica si la etiqueta es opaca o transparente.
WordWrap Indica si el texto que se muestra en la etiqueta puede ajustarse
automáticamente a líneas adicionales.
Usar cuadros de texto y cuadros de edición para mostrar información
Establezca la propiedad ReadOnly de cuadros de texto y cuadros de edición para mostrar
información
que el usuario puede ver pero no modificar. Si sólo desactiva un cuadro de edición, el
usuario no
podrá desplazarse por el texto.
Usar formas y líneas
Las formas y las líneas ayudan a agrupar visualmente elementos de los formularios. Se ha
comprobado que la asociación de elementos relacionados ayuda a los usuarios a
comprender y utilizar
una interfaz, lo que facilita el uso de la aplicación.
Las siguientes propiedades del control Shape suelen establecerse en tiempo de diseño.
Manual del programador, Parte 3: Crear la interfaz Página 78 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Propiedad Descripción
Curvature Un valor entre 0 (ángulos de 90 grados) y 99 (círculo 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. Sólo tiene efecto cuando la
propiedad Curvature se establece a 0.
Las siguientes propiedades de Line suelen establecerse en tiempo de diseño.
Propiedad Descripción
BorderWidth Indica cuántos píxeles de ancho tiene la línea.
LineSlant Cuando la línea no es horizontal ni vertical, indica el sentido de la
inclinación. Los valores válidos para esta propiedad son una barra
diagonal ( / ) y una barra inversa ( \ ).
Usar gráficos de formulario para mostrar información
Puede mostrar información gráficamente en un formulario con los siguientes métodos de
formulario.
Método Descripción
Circle Dibuja una figura circular o un arco en un formulario.
Cls Borra gráficos y texto de un formulario.
Line Dibuja una línea en un formulario.
Pset Establece un punto de un formulario con un determinado color.
Print Imprime una cadena de caracteres en un formulario.
Para ver ejemplos que muestran gráficos de formularios
1. Ejecute Solution.app en el directorio …\Samples\Vfp98\Solution de Visual Studio.
2. En la vista de árbol, haga clic en Formularios y, a continuación, haga clic en Gráficos
de
formulario.
Mejorar la presentación de controles
Manual del programador, Parte 3: Crear la interfaz Página 79 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Los botones de comando, las casillas de verificación y los botones de opción pueden
mostrar una
imagen además de un título. Todos estos controles tienen propiedades que permiten
especificar
imágenes que se muestran en los controles.
Propiedad Descripción
DisabledPicture Imagen que se muestra en el botón cuando éste está desactivado.
DownPicture Imagen que se muestra en el botón cuando éste está presionado.
Picture Imagen que se muestra en el botón 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 botón aparezca presionado cuando se presione
el botón.
Si no desea que se muestre un título además de la imagen, establezca la propiedad Caption
como una
cadena vacía eliminando el título predeterminado en el cuadro "Edición de propiedades" de
la
ventana Propiedades.
Usar máscaras de imagen
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 máscara temporal
predeterminada para
el .bmp. Las áreas en blanco reciben un atributo transparente de modo que sea transparente
el color
subyacente del botón o el fondo. Para mantener en blanco algunas áreas del .bmp, cree una
máscara
para el .bmp que no aplique el valor predeterminado.
Para crear una máscara para un .bmp
1. Abra el archivo .BMP en Paint u otra utilidad de mapa de bits.
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 extensión .msk.
Cuando Visual FoxPro cargue un archivo .bmp especificado por la propiedad Picture para
un botón
de comando, un botón de opción o una casilla de verificación, 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 máscara 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
máscara
Manual del programador, Parte 3: Crear la interfaz Página 80 de 127
file://C:\temp\~hh572C.htm 30/05/2000
pueda representar el área del .bmp.
Manipular múltiples filas de datos
Visual FoxPro proporciona una herramienta muy potente, el objeto Grid, para mostrar y
manipular
múltiples filas de datos.
Usar cuadrículas
La cuadrícula es un objeto contenedor. Del mismo modo que un conjunto de formularios
puede
contener formularios, una cuadrícula 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
métodos, lo que proporciona un gran control sobre los elementos de la cuadrícula.
Contenedor Puede contener
Cuadrícula Columnas
Columna Encabezados, controles
El objeto Grid permite mostrar y manipular filas y columnas de datos de un formulario o
una página.
Una aplicación especialmente útil del control Grid consiste en crear formularios de uno a
varios,
como un formulario de facturas.
Para ver ejemplos del uso de cuadrículas
1. Ejecute Solution.app en el directorio …\Samples\Vfp98\Solution de Visual Studio.
2. En la vista de árbol, haga clic en Controles y, a continuación, haga clic en Cuadrícula.
Un formulario con una cuadrícula llena
Manual del programador, Parte 3: Crear la interfaz Página 81 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Para agregar un control Grid a un formulario
En la barra de herramientas Controles de formularios, elija el botón Cuadrícula y
arrástrelo
hasta obtener el tamaño deseado en la ventana Formulario.
Si no especifica ningún valor RecordSource para la cuadrícula y hay una tabla abierta en el
área de
trabajo actual, la cuadrícula mostrará todos los campos de esa tabla.
Establecer el número de columnas de una cuadrícula
Una de las primeras propiedades que puede establecer para el control Grid es el número de
columnas.
Para establecer el número de columnas de una cuadrícula
1. Seleccione la propiedad ColumnCount en la lista de Propiedades y métodos.
2. En el cuadro Propiedad, escriba el número de columnas que desea.
Si la propiedad ColumnCount está establecida a –1 (el valor predeterminado), la cuadrícula
contendrá, en tiempo de ejecución, tantas columnas como campos haya en la tabla asociada
a la
cuadrícula.
Ajustar de forma manual la presentación de la cuadrícula en tiempo de diseño
Cuando haya agregado columnas a la cuadrícula, 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
diseño de
cuadrícula.
Para cambiar al modo de diseño de cuadrícula
Elija Modificar en el menú de método abreviado de la cuadrícula.
–O bien–
En el cuadro Objeto de la ventana Propiedades seleccione una columna de la cuadrícula.
Cuando esté en modo de diseño de cuadrícula, aparecerá un borde grueso alrededor de la
cuadrícula.
Para salir de este modo, seleccione el formulario u otro control.
Para ajustar el ancho de las columnas de una cuadrícula
1. En modo de diseño de cuadrícula, sitúe el puntero del mouse entre los encabezados de
columna
de la cuadrícula de modo que el puntero cambie a una barra con las flechas que apunta a la
izquierda y la derecha.
2. Seleccione la columna y arrástrela hasta que tenga el ancho deseado
Manual del programador, Parte 3: Crear la interfaz Página 82 de 127
file://C:\temp\~hh572C.htm 30/05/2000
–O bien–
Establezca la propiedad Width de la columna en la ventana Propiedades.
Para ajustar el alto de las filas de una cuadrícula
1. En modo de diseño de cuadrícula, sitúe el puntero del mouse entre el primer botón y el
segundo
botón 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.
2. Seleccione la fila y arrástrela hasta que tenga el alto deseada.
–O bien–
Establezca la propiedad Height de la columna en la ventana Propiedades.
Sugerencia Puede evitar que un usuario cambie la altura de las filas de cuadrícula en
tiempo de
ejecución si establece AllowRowSizing a falso (.F.).
Establecer el origen de los datos que se muestran en la cuadrícula
Puede establecer el origen de los datos para la cuadrícula y para cada columna
individualmente.
Para establecer el origen de datos para una cuadrícula
1. Seleccione la cuadrícula y, a continuación, haga clic en la propiedad RecordSourceType
en la
ventana Propiedades.
2. Establezca la propiedad RecordSourceType como 0 - Tabla, si desea que Visual FoxPro
abra
la tabla o como 1 - Alias si desea que la cuadrícula se llene con los campos de una tabla que
ya
está abierta.
3. Haga clic en la propiedad RecordSource de la ventana Propiedades.
4. Escriba el nombre del alias o la tabla que va a servir de origen de datos para la
cuadrícula.
Si desea especificar determinados campos para que aparezcan en columnas específicas,
también
puede establecer el origen de datos para una columna.
Para establecer el origen de datos para una columna
1. Seleccione la columna y, a continuación, haga clic en la propiedad ControlSource de la
ventana
Propiedades.
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
Manual del programador, Parte 3: Crear la interfaz Página 83 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Agregar registros a una cuadrícula
Puede permitir a los usuarios agregar nuevos registros a una tabla mostrada en una
cuadrícula si
establece la propiedad AllowAddNew de la cuadrícula 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 más control sobre cuándo 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.
Establecer un formulario de uno a varios mediante el control Grid
Uno de los usos más comunes de una cuadrícula 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 cuadrícula muestra los registros
secundarios
correspondientes.
Si tiene un entorno de datos para su formulario que incluye una relación de uno a varios
entre dos
tablas, le resultará muy fácil mostrar la relación de uno a varios en el formulario.
Para establecer un formulario de uno a varios con un entorno de datos
1. Arrastre los campos deseados desde la tabla primaria del Diseñador de entorno de datos
hasta
el formulario.
2. Arrastre la tabla relacionada desde el Diseñador de entornos 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 más complicado crear un formulario de uno a
varios sin
utilizar el Diseñador de entornos de datos.
Para establecer un formulario de uno a varios sin crear un entorno de datos
1. Agregue cuadros de texto al formulario para mostrar los campos deseados de la tabla
principal.
2. Establezca la propiedad ControlSource de los cuadros de texto como la tabla principal.
3. Agregue una cuadrícula al formulario.
4. Establezca la propiedad RecordSource de la cuadrícula con el nombre de la tabla
relacionada.
5. Establezca la propiedad LinkMaster de la cuadrícula con el nombre de la tabla principal.
6. Establezca la propiedad ChildOrder de la cuadrícula con el nombre de la etiqueta de
índice de
la tabla relacionada que corresponde a la expresión relacional de la tabla principal.
7. Establezca la propiedad RelationalExpr de la cuadrícula con la expresión que combina la
tabla
Manual del programador, Parte 3: Crear la interfaz Página 84 de 127
file://C:\temp\~hh572C.htm 30/05/2000
relacionada con la tabla principal. Por ejemplo, si la etiqueta ChildOrder está indexada en
"apellido + nombre", establezca RelationalExpr con la misma expresión.
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 código siguiente puede incluirse en el evento Click de un botón de comando:
SELECT orders && si orders es la tabla primaria
SKIP
IF EOF( )
GO BOTTOM
ENDIF
THISFORM.Refresh
Mostrar controles en columnas de cuadrícula
Además de mostrar datos de campos en una cuadrícula, puede tener controles en las
columnas de una
cuadrícula para poder mostrar a un usuario cuadros de texto, casillas de verificación,
controles
desplegables, controles numéricos y otros tipos de controles incrustados. Por ejemplo, si
tiene un
campo lógico en una tabla, cuando ejecute el formulario un usuario podrá distinguir qué
valores de
registro son verdaderos (.T.) y cuáles son falsos (.F.) si ve si la casilla de verificación está
activada.
Cambiar el valor es tan fácil como activar o desactivar la casilla de verificación.
Puede agregar controles a columnas de la cuadrícula de forma interactiva en el Diseñador
de
formularios o bien puede escribir código para agregar los controles a las columnas en
tiempo de
ejecución.
Para agregar de forma interactiva controles a una columna de cuadrícula
1. Agregue una cuadrícula a un formulario.
2. En la ventana Propiedades, establezca la propiedad ColumnCount de la cuadrícula como
el
número de columnas deseadas.
Por ejemplo, escriba 2 para una cuadrícula de dos columnas.
3. En la ventana Propiedades seleccione la columna primaria para el control en el cuadro
Objeto.
Por ejemplo, seleccione Columna1 para agregar un control a Columna1. El borde de la
cuadrícula cambiará para indicar que está modificando un objeto contenido cuando
seleccione
la columna.
4. Seleccione el control deseado en la barra de herramientas Controles de formularios y
haga clic
en la columna primaria.
El nuevo control no aparecerá ahora en la columna de cuadrícula dentro del Diseñador de
formularios, pero será visible en tiempo de ejecución.
5. En la ventana Propiedades asegúrese de que el control se muestra sangrado bajo la
columna
primaria en el cuadro Objeto.
Manual del programador, Parte 3: Crear la interfaz Página 85 de 127
file://C:\temp\~hh572C.htm 30/05/2000
Una casilla de verificación agregada a una columna de cuadrícula
Si el nuevo control es una casilla de verificación, establezca la propiedad Caption de la
casilla
como " " y la propiedad Sparse de la columna como falso (.F.).
6. Establezca la propiedad ControlSource de la columna primaria como el campo de tabla
deseado.
Por ejemplo, el ControlSource de la columna en la siguiente ilustración es
products.discontinu de Testdata.dbc en el directorio ...\Samples\Vfp98\Data de Visual
Studio.
7. Establezca la propiedad CurrentControl de la columna primaria como el nuevo control.
Cuando ejecute el formulario, el control aparecerá en la columna de cuadrícula.
La casilla de verificación se muestra en la columna en tiempo de ejecución.
Sugerencia Si desea poder centrar una casilla de verificación en una columna de
cuadrícula, cree
una clase de contenedor, agregue una casilla de verificación a la clase de contenedor y
ajuste la
Manual del programador, Parte 3: Crear la interfaz Página 86 de 127
file://C:\temp\~hh572C.htm 30/05/2000
posición de la casilla en dicha clase. Agregue la clase de contenedor a la columna de
cuadrícula y
establezca la propiedad ControlSource de la casilla de verificación como el campo deseado.
Para quitar controles de columnas de cuadrícula en el Generador de formularios
1. En el cuadro Objeto de la ventana Propiedades, seleccione el control.
2. Active el Diseñador de formularios.
Si la ventana Propiedades está visible, el nombre del control aparecerá en el cuadro
Objeto.
3. Presione la tecla supr.
También puede agregar controles a una columna de cuadrícula con el método AddObject en
el
código.
Para agregar controles a una columna de cuadrícula mediante programa
En el evento Init de la cuadrícula, use el método AddObject para agregar el control a la
columna de cuadrícula y establezca la propiedad CurrentControl de la columna.
Por ejemplo, las líneas de código siguientes del evento Init de una cuadrícula agregan dos
controles a
una columna de cuadrícula 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 líneas de código aseguran que el control está visible
* y se muestra en cada fila de la cuadrícula
THIS.grcColumn1.spnQuantity.Visible = .T.
THIS.grcColumn1.Sparse = .F.
En este ejemplo, Column1 tiene tres valores actuales de control posibles:
spnQuantity
cboQuantity
Agregar consultas
Cuando agrega consultas a su aplicación, puede combinar varios orígenes de datos, filtrar
registros,
manipular datos y ordenar los resultados, todo ello con la instrucción SELECT - SQL. Al
utilizar
instrucciones SQL, dispone de un control completo sobre los resultados obtenidos en sus
consultas y
sobre dónde se almacenan estos resultados.
Una consulta es una instrucción SELECT - SQL.
Puede agregar instrucciones SELECT - SQL a procedimientos o código de eventos. Para
ver más
información acerca de los eventos, consulte el capítulo 4, Descripción del modelo de
eventos.
Crear una instrucción SELECT - SQL
Para crear una instrucción SELECT - SQL
Utilice el Diseñador de consultas o el Diseñador de vistas para crear la instrucción y
copie el
contenido de la ventana SQL a una ventana de código.
–O bien–
En una ventana de código, escriba la instrucción SELECT - SQL.
Por ejemplo, puede seleccionar todos los registros de la tabla Customer de la base de datos
TasTrade
Manual del programador, Parte 4: Agrupar todos los elementos Página 3 de 87
file://C:\temp\~hhA455.htm 30/05/2000
en los que el campo country contenga el valor "Canadá":
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canadá"
Para ejecutar el comando inmediatamente, puede introducir la instrucción en la ventana
Comandos.
Si desea que cada cláusula aparezca en una línea distinta dentro de la ventana, termine cada
línea,
excepto la última, con un punto y coma. De esta forma Visual FoxPro procesa el comando
sólo
después de la última línea.
Seleccionar un número o porcentaje de registros
Si sólo necesita un cierto número o porcentaje de registros del conjunto de resultados que
su consulta
devolvería, puede usar la propiedad Registros incluidos de la ficha Varios de los
Diseñadores de
consultas o de vistas o puede agregar una cláusula TOP a su instrucción SELECT - SQL. El
número
que proporcione en una cláusula 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 más
altas, puede especificar un GROUP BY en CUST_ID para mostrar un registro agregado
para cada
cliente y ordenar por ORDER_AMT en la cláusula ORDER BY. Para obtener un TOP 10
verdadero,
debe especificar una ordenación descendente en ORDER_AMT de forma que los registros
con las
cantidades de pedidos más 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 tendrían en realidad los
valores más
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
Especificar destinos para resultados de consultas
Al utilizar cláusulas de la instrucción SELECT - SQL, puede especificar varios destinos
para
almacenar el resultado de sus consultas.
Para enviar los resultados a este destino Utilice esta cláusula
Otra tabla INTO TABLE mitabla
Matriz INTO ARRAY aMiMatriz
Tabla temporal INTO CURSOR micursor
Ventana activa TO SCREEN
Ventana Examinar Predeterminado si no se especifica otro destino.
Manual del programador, Parte 4: Agrupar todos los elementos Página 4 de 87
file://C:\temp\~hhA455.htm 30/05/2000
Una vez que los resultados están almacenados, puede utilizar comandos para controlar
cómo se
integran los resultados almacenados para su presentación o impresión.
Almacenar los resultados en una tabla, matriz o cursor
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
sólo temporalmente, envíelos a una matriz o a un cursor. Si lo que desea es almacenar los
resultados
definitivamente, envíelos a una tabla.
Para especificar una tabla como destino
Utilice la cláusula INTO de la instrucción SELECT - SQL para especificar un destino.
Este ejemplo muestra una cláusula INTO para una tabla:
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canadá" ;
INTO TABLE mitabla
Para especificar una matriz como destino
Utilice la cláusula INTO de la instrucción SELECT - SQL para especificar un destino.
El ejemplo siguiente muestra una cláusula INTO para una matriz:
SELECT * ;
FROM tastrade!customer ;
WHERE customer.country = "Canadá" ;
INTO ARRAY aMiMatriz
Para especificar un cursor como destino
Utilice la cláusula INTO de la instrucción SELECT - SQL para especificar un destino.
Este ejemplo muestra una cláusula 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
instrucción
SELECT - SQL.
Los dos procedimientos siguientes describen dos formas comunes para incluir en una
aplicación los
resultados de consultas almacenados en tablas y cursores.
Manual del programador, Parte 4: Agrupar todos los elementos Página 5 de 87
file://C:\temp\~hhA455.htm 30/05/2000
Rellenar un control de formulario
Si desea mostrar los resultados de sus consultas en un formulario, puede utilizar una tabla,
una matriz
o un cursor para colocarlos en una cuadrícula, un cuadro de lista o un cuadro combinado.
Para rellenar un control cuadro de lista o cuadro combinado con una tabla o cursor
1. En el Diseñador de formularios, modifique el formulario que tiene el control que desea
rellenar.
2. Establezca la propiedad RowSourceType a 3 - SQL Statement.
3. En la propiedad RowSource del control, escriba una instrucción SELECT - SQL que
incluya
una cláusula INTO TABLE o INTO CURSOR.
Para llenar un control cuadrícula con una tabla o un cursor
1. En el Diseñador de formularios, modifique el formulario que tiene el control que desea
llenar.
2. En el evento Load del formulario, escriba una instrucción SELECT - SQL que incluya
una
cláusula INTO TABLE o INTO CURSOR.
3. Establezca la propiedad RecordSource de la cuadrícula como el nombre de la tabla o
cursor que
haya creado en el paso 2.
4. Establezca la propiedad RecordSourceType de la cuadrícula a 0 – Table (para una tabla)
o1–
Alias (para un cursor).
Imprimir el resultado en un informe o una etiqueta
Si su informe o etiqueta incluye grupos, o si necesita ordenar los datos de alguna otra
manera, puede
utilizar las distintas cláusulas de la instrucción SELECT - SQL para obtener el resultado
exacto que
necesita.
Para enviar los resultados a un informe o una etiqueta existente
Utilice la instrucción SELECT - SQL con un comando REPORT o LABEL.
El ejemplo siguiente utiliza las cláusulas 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
Manual del programador, Parte 4: Agrupar todos los elementos Página 6 de 87
file://C:\temp\~hhA455.htm 30/05/2000
El ejemplo siguiente utiliza un comando LABEL FORM:
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 instrucción SELECT - SQL es el método más flexible para rellenar sus informes
o
etiquetas, no es el único método. Para obtener más información acerca de cómo establecer
orígenes
de datos para informes, consulte la sección Controlar los orígenes de datos de un informe,
más
adelante en este mismo capítulo. Para ver más información acerca de la integración de los
destinos de
informes en sus aplicaciones, consulte la sección Integrar consultas e informes, más
adelante en este
mismo capítulo.
Mostrar el resultado en una ventana
Si desea mostrar el resultado de su instrucción 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 cláusula de destino. Puede enviar también el resultado a la ventana principal de
Visual
FoxPro o a otra ventana activa.
Para mostrar resultados en la ventana principal de Visual FoxPro
Utilice la cláusula TO SCREEN de una instrucción SELECT - SQL.
Probar el proyecto
Para comprobar las referencias y que todos los componentes están 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.
Para probar un proyecto
1. En el Administrador de proyectos, elija Generar.
2. En el cuadro de diálogo Opciones para generar elija Volver a generar el proyecto.
3. Seleccione cualquier otra opción que necesite y elija Aceptar.
–O bien–
Utilice el comando BUILD PROJECT.
Por ejemplo, para generar una aplicación denominada Miproy.pjx, escriba:
BUILD PROJECT miproy
Si se producen errores durante el proceso de generación, se incluyen en un archivo que
recibe el
nombre del proyecto y la extensión .err y se localiza en el directorio actual. El recuento de
errores de
compilación se muestra en la barra de estado. También puede ver el archivo de errores.
Para mostrar el archivo de errores
Seleccione la casilla de verificación Mostrar errores.
Una vez generado el proyecto correctamente, deberá intentar ejecutarlo antes de crear una
aplicación.
Manual del programador, Parte 4: Agrupar todos los elementos Página 43 de 87
file://C:\temp\~hhA455.htm 30/05/2000
Para ejecutar una aplicación
En el Administrador de proyectos, resalte el programa principal y, a continuación, elija
Ejecutar.
-O bien–
En la ventana Comandos, ejecute un comando DO con el nombre del programa
principal:
DO MAINPROG.PRG
Si el programa se ejecuta correctamente, estará preparado para generar un archivo de
aplicación que
contenga todos los archivos incluidos en el proyecto.
Debería repetir los pasos de regeneración y ejecución del proyecto siempre que agregue
componentes
al proyecto. A menos que elija Volver a compilar todos los archivos en el cuadro de diálogo
Opciones
para generar, sólo se volverán a compilar los archivos que se hayan modificado desde la
última
generación.
Generar una aplicación desde un proyecto
Para generar un archivo terminado desde la aplicación, genérelo en un archivo de
aplicación. Los
archivos de aplicación tienen la extensión .app. Para ejecutar la aplicación, los usuarios
deben iniciar
Visual FoxPro primero y después cargar el archivo .app.
Puede optar por generar un archivo de aplicación (.app) o un archivo ejecutable (.exe)
desde el
proyecto. Los usuarios pueden ejecutar un archivo .app si ya tienen una copia de Visual
FoxPro.
Además, puede crear un archivo .exe, que funciona con dos bibliotecas de vínculos
dinámicos de
Visual FoxPro (Vfp6r.dll y Vfp6enu.dll), las cuales se distribuyen con la aplicación para
ofrecer un
entorno de ejecución completo para Visual FoxPro. El segundo archivo es específico del
país de
destino de la aplicación. Para obtener más información, vea la parte 8, Distribuir
aplicaciones.
Para generar una aplicación
1. En el Administrador de proyectos, elija Generar.
2. En el cuadro de diálogo Opciones para generar, elija Generar aplicación si desea
generar un
archivo .app o Generar ejecutable si desea generar un archivo .exe.
3. Seleccione cualquier otra opción que necesite y elija Aceptar.
–O bien–
Utilice los comandos BUILD APP o BUILD EXE.
Por ejemplo, para generar una aplicación denominada Miapli.app a partir de un proyecto
denominado
Miproy.pjx, escriba:
Manual del programador, Parte 4: Agrupar todos los elementos Página 44 de 87
file://C:\temp\~hhA455.htm 30/05/2000
BUILD APP miapli FROM miproy
Para crear una aplicación denominada Miapli.exe a partir de un proyecto llamado
Miproy.pjx,
escriba:
BUILD EXE miapli FROM miproy
Nota También puede usar el cuadro de diálogo Opciones de generación para crear un
servidor de
Automatización personalizado desde la aplicación de Visual FoxPro. Para obtener más
información,
vea Crear servidores de Automatización en el capítulo 16, "Agregar OLE".
Una vez creado y terminado un archivo de aplicación para el proyecto, todos los usuarios
podrán
ejecutarlo.
Para ejecutar una aplicación como un archivo .app
En Visual FoxPro, elija Ejecutar en el menú Programa y seleccione el archivo de
aplicación.
–O bien–
En la ventana Comandos, escriba DO y el nombre del archivo de aplicación.
Por ejemplo, para ejecutar una aplicación denominada MIAPLI, escriba:
DO miapli.app
Si ha creado un archivo .exe desde la aplicación, los usuarios podrán ejecutarlo de diversas
maneras.
Para ejecutar una aplicación como un archivo .exe
En Visual FoxPro, elija Ejecutar en el menú Programa y seleccione el archivo de
aplicación
o, en la ventana Comandos, escriba DO y el nombre del archivo de aplicación.
Por ejemplo, para ejecutar un archivo .exe denominada Miapli.exe, escriba:
DO miapli.exe
–O bien–
En Windows, haga doble clic en el icono del archivo .exe.
Nota Puede usar el Asistente para instalación para crear una rutina de instalación que
instale
los archivos apropiados.
Capítulo 14: Probar y depurar
aplicaciones
El proceso de prueba implica la búsqueda de problemas en el código, mientras que la
depuración
Manual del programador, Parte 4: Agrupar todos los elementos Página 45 de 87
file://C:\temp\~hhA455.htm 30/05/2000
consiste en aislar y resolver los problemas. La prueba y la depuración son partes inevitables
del ciclo
de desarrollo, que es mejor incorporar en una etapa inicial. La prueba y depuración de
componentes
individuales simplifica de forma significativa el proceso análogo de aplicaciones
integradas.
Para obtener más información sobre la creación de una aplicación, consulte el capítulo 2,
Programar
una aplicación y el capítulo 13, Compilar una aplicación.
Este capítulo trata los temas siguientes:
Preparar la prueba y depuración
Depurar antes de que se produzcan errores
Aislar los problemas
Mostrar los resultados
Registrar el trayecto del código
Controlar errores de tiempo de ejecución
Hardware y software
Para obtener la máxima portabilidad, debe programar las aplicaciones en la plataforma
común de
menor nivel en la que va a ejecutarlas. Para establecer una plataforma de base:
Programe las aplicaciones utilizando el modo de vídeo común más bajo.
Determine los requisitos básicos para la RAM y el espacio de almacenamiento de
medios,
incluyendo los controladores necesarios o el software que se ejecute de forma simultánea.
Tenga en cuenta casos especiales de memoria, archivo y bloqueo de registros para las
versiones
en red y autónoma de las aplicaciones.
Rutas del sistema y propiedades de archivos
Con el fin de garantizar que todos los archivos de programa necesarios son fácilmente
accesibles en
todos los equipos en los que se ejecuta la aplicación, también puede necesitar una
configuración de
archivo de base. Para definir una línea de base para la configuración, responda a las
siguientes
preguntas:
¿Necesita su aplicación rutas comunes de sistema?
¿Ha establecido propiedades adecuadas de acceso a archivos?
¿Se han establecido correctamente permisos de red para cada usuario?
Establecer aserciones
Puede incluir aserciones en el código para comprobar las hipótesis que tiene sobre el
entorno de
ejecución del código.
Manual del programador, Parte 4: Agrupar todos los elementos Página 47 de 87
file://C:\temp\~hhA455.htm 30/05/2000
Para establecer una aserción
Use el comando ASSERT para identificar las hipótesis del programa.
Cuando la condición estipulada en el comando ASSERT se evalúa como falsa (.F.), aparece
un
cuadro de mensajes de aserciones y se repite en la ventana Resultados del depurador.
Por ejemplo, podría escribir una función que espera un valor del parámetro distinto de cero.
La línea
de código siguiente en la función le avisa si el valor del parámetro es 0:
ASSERT nParm != 0 MESSAGE "Recibido el parámetro 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.
Mostrar las secuencias de eventos
Cuando vea que se producen eventos en relación con otros eventos, puede determinar la
ubicación
más eficaz para incluir el código.
Para hacer un seguimiento de eventos
En el menú Herramientas de la ventana Depurador, elija Seguimiento de eventos.
–O bien–
Use el comando SET EVENTTRACKING.
El cuadro de diálogo Seguimiento de eventos permite seleccionar los eventos que desee
ver.
Cuadro de diálogo Seguimiento de eventos
Manual del programador, Parte 4: Agrupar todos los elementos Página 48 de 87
file://C:\temp\~hhA455.htm 30/05/2000
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 visión de las
secuencias de los demás 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,
también podrá guardarlos en un archivo según se describe en Mostrar los resultados más
adelante en
este mismo capítulo.
Nota Si la ventana Resultados del depurador no está abierta, los eventos no se presentarán
en la lista
aun cuando esté activado el cuadro Ventana Resultados del depurador.
Aislar los problemas
Una vez identificados los problemas mediante la prueba, puede usar el entorno de
depuración de
Visual FoxPro para aislarlos con los pasos siguientes:
Iniciar una sesión de depuración
Seguimiento del código
Suspensión de la ejecución del programa
Mostrar los valores almacenados
Mostrar los resultados
customers a
menos que necesite todos los campos de la tabla.
Incluya una cláusula WHERE para limitar el número de registros transferidos. Cuanto
más
específica sea la cláusula WHERE, menos registros se transmitirán al equipo y con más
rapidez
se terminará la consulta.
Si no puede predecir durante el diseño los valores que se van a utilizar en una cláusula
WHERE, puede utilizar parámetros en la cláusula. Cuando se ejecute la consulta, Visual
FoxPro usará el valor de una variable de parámetro o solicitará al usuario el valor de
búsqueda.
Por ejemplo, esta consulta permite a la aplicación o al usuario rellenar la región en el
tiempo de
ejecución:
SELECT cust_id, company, contact, address ;
FROM customers ;
WHERE region = ?pcRegion
Establezca la propiedad NoDataOnLoad del objeto Cursor en el entorno de datos
correspondiente. Esta técnica se suele utilizar con vistas parametrizadas en las que los datos
del
parámetro proceden del valor de un control de un formulario.
Actualizar tablas remotas de forma eficaz
Cuando se usa una vista para actualizar una tabla en un origen de datos remoto, Visual
FoxPro debe
comprobar si los registros que se están actualizando han sufrido alguna modificación. Para
ello,
Visual FoxPro debe examinar los datos en el servidor y compararlos con los datos
existentes en su
equipo. En algunos casos, esta operación puede resultar lenta.
Manual del programador, Parte 4: Agrupar todos los elementos Página 83 de 87
file://C:\temp\~hhA455.htm 30/05/2000
Para optimizar el proceso de actualización de datos en orígenes de datos remotos, puede
especificar la
forma en que Visual FoxPro debe comprobar los registros modificados. Para ello, tiene que
indicar la
cláusula WHERE que Visual FoxPro debe generar para realizar la actualización.
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 instrucción SELECT - SQL como la siguiente:
SELECT cust_id, company, address, contact ;
FROM customers ;
WHERE region = ?vpRegion
Quiere actualizar los cuatro campos que ha especificado en la vista, salvo el campo clave
(cust_id).
En la tabla siguiente se presenta la cláusula WHERE que Visual FoxPro generará para cada
una de
las opciones disponibles en la cláusula SQL WHERE.
Nota La función OLDVAL( ) devuelve la versión preactualizada de los campos que se han
modificado y la función 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.
Valor Cláusula WHERE resultante
Sólo campos clave WHERE OLDVAL(cust_id) = CURVAL(cust_id)
Campos clave y
actualizables
(predeterminado)
WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND
OLDVAL(<mod_fld1>) = CURVAL(<mod_fld2>) AND
OLDVAL(<mod_fld2>) = CURVAL(<mod_fld2>) AND
...
Campos clave y
modificados
WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND
OLDVAL(company) = CURVAL(company) AND
OLDVAL(contact) = CURVAL(contact) AND
OLDVAL(address) = CURVAL(address)
Clave y marca de hora WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND
OLDVAL(timestamp) = CURVAL(timestamp)
En general, debería elegir una opción para la cláusula 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 más rápida de indicar si se ha modificado algún registro.
2. Campos clave y modificados, porque los campos que se actualizan en el servidor son
casi
siempre un subconjunto del número total de campos que se podría actualizar.
3. Campos clave y actualizables.
4. Sólo campos clave. El uso de esta configuración implica que el servidor remoto insertará
un
Manual del programador, Parte 4: Agrupar todos los elementos Página 84 de 87
file://C:\temp\~hhA455.htm 30/05/2000
registro totalmente nuevo que use la clave modificada y eliminará el registro anterior.
Enviar instrucciones en un lote
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 tráfico de la red y porque
el
servidor puede compilar múltiples instrucciones a la vez.
Por ejemplo, si especifica un tamaño de lote de cuatro y actualiza 10 registros en una base
de datos,
Visual FoxPro envía en un solo lote cuatro instrucciones como la siguiente a la base de
datos del
servidor:
UPDATE customer SET contact = "Agustina Rivera" ;
WHERE cust_id = 1;
UPDATE customer SET contact = "Cristina Martínez" ;
WHERE cust_id = 2;
UPDATE customer SET company = "Enrique Ballina" ;
WHERE cust_id = 3;
UPDATE customer SET contact = "Ernesto Méndez" ;
WHERE cust_id = 4
Para enviar instrucciones en un lote
En el cuadro de diálogo Opciones, elija la ficha Datos remotos y en Registros para
actualizar por lotes especifique el número de registros que van a incluirse en el lote.
–O bien–
Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) para establecer estas
propiedades:
Establezca Transaction a 2.
Establezca BatchUpdateCount al número de instrucciones que se van a enviar en un lote.
–O bien–
1. En el Diseñador de vistas, elija Opciones avanzadas del menú Consulta para abrir el
cuadro
de diálogo Opciones avanzadas.
2. En el área Rendimiento, situada junto a Número de registros para actualizar por
lotes,
especifique el número de instrucciones que se van a enviar en un lote.
Nota Debería probar con diferentes valores para esta propiedad y la propiedad PacketSize
para optimizar las actualizaciones.
Establecer el tamaño del paquete
Puede optimizar el acceso a servidores remotos; para ello, ajuste el tamaño del paquete de
red que se
envía y se obtiene de la base de datos remota. Por ejemplo, si la red admite tamaños
grandes (más de
4096 bytes), puede aumentar el tamaño del paquete en Visual FoxPro con el fin de enviar
más datos
Manual del programador, Parte 4: Agrupar todos los elementos Página 85 de 87
file://C:\temp\~hhA455.htm 30/05/2000
cada vez que lea o escriba en la red.
Para establecer el tamaño del paquete
Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) y establezca la
propiedad
PacketSize a un valor entero positivo. El valor predeterminado es 4096.
Nota Es posible que distintos proveedores de red administren esta propiedad de forma
distinta
por lo que deberá consultar la documentación de su servicio de red. Novell® NetWare®, por
ejemplo, tiene un tamaño de paquete máximo de 512 bytes por lo que si se establece la
propiedad PacketSize a un valor superior a éste no se obtendrá ninguna ventaja adicional.
Retardo de la recuperación de datos memo y binarios
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 aplicación la requiera
realmente.
Para retardar la recuperación de los datos memo y binarios
En el cuadro de diálogo Opciones, elija la ficha Datos remotos y en Opciones
predeterminadas de vista remota, establezca Buscar memo.
–O bien–
Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) para establecer la
propiedad
FetchMemo.
Almacenamiento local de datos de consulta
Muchas aplicaciones incluyen datos de consulta estáticos, como abreviaturas de estados,
códigos
postales y cargos de empleados. Si la aplicación contiene este tipo de datos y si la tabla no
es
demasiado grande, podría aumentar la velocidad de la aplicación; para ello, mantenga
copias de esta
información en el equipo de cada usuario, ya que las consultas no generan tráfico de red.
Esta técnica es especialmente útil para los datos que nunca cambian o lo hacen muy
esporádicamente.
Si los datos cambian en alguna ocasión, debe diseñar una estrategia para transferir una
copia nueva de
la tabla de consultas al equipo de cada usuario.
Crear reglas locales
Puede aumentar el rendimiento de la aplicación 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 definición de reglas en Visual FoxPro, se detectan los datos no válidos antes de
enviarse
a través de la red, lo que es más rápido y ofrece un mejor control para administrar las
condiciones de
error. Sin embargo, el uso de reglas locales también implica su coordinación con las reglas
del
Manual del programador, Parte 4: Agrupar todos los elementos Página 86 de 87
file://C:\temp\~hhA455.htm 30/05/2000
servidor remoto. Por ejemplo, si se modifican las reglas del servidor, tendría que cambiar
las reglas
locales para que coincidieran.
Para obtener información sobre la creación de reglas locales, vea la sección Actualizar
datos en una
vista del capítulo 8, "Crear vistas".
Optimizar aplicaciones internacionales
Si va a programar aplicaciones internacionales, podría necesitar administrar la secuencia de
ordenación de los datos para obtener el máximo rendimiento. Esta sección trata sobre lo
siguiente:
Usar secuencias de ordenación de forma eficaz.
Usar SELECT - SQL con múltiples secuencias de ordenación.
Para abrir la aplicación para un objeto OLE en una ventana de un campo General
En el menú Edición, seleccione el tipo de objeto específico y, en el submenú, elija
Abrir.
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 modificación del objeto.
Si establece la propiedad AutoActivate de un control contenedor OLE u OLE dependiente,
puede
determinar si el objeto OLE se abrirá o modificará cuando el control aparezca con el foco o
cuando el
usuario haga doble clic sobre el control. La propiedad AutoVerbMenu especifica si el menú
contextual del control ActiveX permite al usuario abrir o modificar el objeto OLE.
Para controlar el acceso de modo que el objeto OLE sólo pueda abrirse o modificarse
mediante
programación con el método DoVerb, establezca AutoActivate como 0 - Manual y
AutoVerbMenu
como falso (.F.) .
Controlar los menús
Cuando un usuario modifica directamente un objeto OLE, aparece la barra de menús del
objeto OLE
y no los menús de la aplicación. Si crea un título de menú y desea que se muestre mientras
el usuario
modifica objeto OLE, seleccione Negociar en el cuadro de diálogo Opciones de la acción
del
Diseñador de menús. Para obtener más información, consulte el capítulo 11, Diseñar menús
y barras
de herramientas o la cláusula NEGOTIATE en el tema DEFINE PAD de la Ayuda.
Usar controles ActiveX
Los controles ActiveX son objetos con funcionalidad encapsulada que ofrecen propiedades,
eventos y
métodos. Proporcionan una amplia gama de funciones que se puede utilizar fácilmente.
Algunos de
Manual del programador, Parte 5: Ampliar aplicaciones Página 12 de 89
file://C:\temp\~hh1768.htm 30/05/2000
métodos. Proporcionan una amplia gama de funciones que se puede utilizar fácilmente.
Algunos de
los controles ActiveX incluidos en Visual FoxPro son:
Los controles de Windows 95, como RichText y los controles TreeView.
Los controles del sistema, como los de comunicaciones y MAPI.
Los controles ActiveX son versátiles porque se pueden crear subclases para crear otros
controles y se
pueden controlar mediante los eventos, métodos y propiedades que tengan asociados. No
puede crear
controles ActiveX con Visual FoxPro; sin embargo, puede crearlos con Microsoft OLE
Custom
Control Developer’s Kit suministrado con Microsoft Visual C++® 4.0 y con Microsoft
Visual Basic®
Control Creation Edition versión 5.0.
Para obtener más información sobre el acceso a controles ActiveX, consulte el capítulo 27,
Extender
Visual FoxPro con bibliotecas externas. Para obtener más información sobre la creación de
controles
ActiveX específicos de Visual FoxPro, consulte el capítulo 28, Acceso a la API de Visual
FoxPro.
Agregar controles ActiveX a un formulario
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.
Para agregar un control ActiveX a un formulario
1. En la barra de herramientas Controles de formularios, elija Control Contenedor OLE y
arrástrelo para incluirlo en el formulario.
2. En el cuadro de diálogo Insertar objeto, elija Insertar control.
Cuadro de diálogo Insertar objeto
3. En la lista Tipo de control, seleccione el control ActiveX que desee.
Manual del programador, Parte 5: Ampliar aplicaciones Página 13 de 89
file://C:\temp\~hh1768.htm 30/05/2000
4. Elija Aceptar.
Administrar controles ActiveX dependientes
Si un control ActiveX admite la vinculación 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.).
Manipular objetos con Automatización
Los objetos OLE de los formularios o programas, o los controles ActiveX dentro de los
controles
Contenedor OLE, pueden manipularse con código de la misma manera en que se
programan los
objetos de Visual FoxPro nativos.
Manipular propiedades extrínsecas de objetos
En el código, puede manipular un objeto mediante sus propiedades. La manera en que se
hace
referencia a una propiedad depende de si el objeto es autónomo 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 código siguiente
hace
referencia a la propiedad Left del objeto.
frm1.olecontrol1.Object.Left = 25 && Propiedad Left del objeto
Si se omite la propiedad Object, se hace referencia a la propiedad Left del contenedor.
frm1.olecontrol1.Left= 25 && Propiedad Left del contenedor
Por ejemplo, suponga que tiene una aplicación que envía correo cuando el usuario hace clic
en un
botón de comando Enviar. Si ha agregado un control de mensajes de Microsoft MAPI a un
formulario
como olecontrol1, el código asociado al evento Click del botón de comando podría ser:
THISFORM.olecontrol1.Object.Enviar
THISFORM.olecontrol1.Object.Send(.T.)
Manual del programador, Parte 5: Ampliar aplicaciones Página 14 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Además 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 sólo lectura para identificar el tipo de objeto del contenedor y la
propiedad
Sizable para impedir que los usuarios puedan cambiar el tamaño de un objeto. Para obtener
detalles
sobre las propiedades del control contenedor, consulte Control Contenedor OLE.
En los diseñadores de formularios y clases, las propiedades de los controles ActiveX se
muestran en
la ventana Propiedades de Visual FoxPro, pero la mayoría de los controles ActiveX
también tienen su
propia interfaz para establecer propiedades comunes. Puede ver esta interfaz de las
propiedades si
selecciona la opción Propiedades específica del objeto en el menú contextual del control
ActiveX.
Por ejemplo, para abrir el cuadro de diálogo Propiedades correspondiente a un control
RichText, elija
Propiedades del control Microsoft RichText en el menú contextual.
Apertura del cuadro de diálogo Propiedades del control RichText
Usar métodos extrínsecos de objetos
Además de establecer y recuperar las propiedades de los objetos, puede manipular un
objeto usando
los métodos que admite. Por ejemplo, puede usar el método Add de un objeto de colección
de
Microsoft Excel para crear un libro de trabajo de Excel.
Manual del programador, Parte 5: Ampliar aplicaciones Página 15 de 89
file://C:\temp\~hh1768.htm 30/05/2000
El siguiente ejemplo de automatización OLE emplea el método Add para crear un libro de
trabajo de
Excel, el método Save para guardar el libro de trabajo y el método Quit para salir de Excel:
Código Comentarios
oleApp = CREATEOBJECT("Excel.Application") Inicia Excel.
oleApp.Visible=.T. Muestra Excel.
OleApp.Workbooks.Add Crea un libro de trabajo.
OleApp.Cells(1,1).Value=7 Establece el valor de la
celda.
OleApp.ActiveWorkbook.SaveAs("C:\TEMP.XLS") Guarda el libro.
OleApp.Quit Sale de Excel.
Si crea un objeto con el control contenedor OLE o el control OLE dependiente, puede usar
el método
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 edición visual, y DoVerb( –
2) para
abrir el objeto en una ventana distinta.
Nota Consulte la documentación de la aplicación para determinar qué comandos de
Automatización
se admiten. Por ejemplo, los complementos de Microsoft Excel no están disponibles para
Automatización.
Establecer tiempos de espera
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. También podrá determinar lo que ocurrirá cuando haya
transcurrido ese
tiempo si establece la propiedad OLEServerBusyRaiseError.
Acceso a colecciones de objetos
Un tipo de objeto puede representar un único objeto o una colección 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
colección de objetos, se llama objeto de colección.
En código, una colección es una lista no ordenada en la que la posición de un objeto puede
cambiar
siempre que se agreguen o quiten objetos de la colección. Para tener acceso a un objeto de
una
colección debe iterar dentro de la colección mediante la propiedad Count de la misma. La
propiedad
Count devuelve el número de elementos de la colección. Además, puede usar el método
Item para
Manual del programador, Parte 5: Ampliar aplicaciones Página 16 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Count devuelve el número de elementos de la colección. Además, puede usar el método
Item para
devolver un elemento de la colección.
Por ejemplo, para mostrar los nombres de las hojas de cálculo en un libro de Excel, use el
siguiente
código:
oleApp = CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
FOR EACH x IN oleApp.Workbooks
? x.Name
ENDFOR
También puede tener acceso a una colección dentro de otra colección. Por ejemplo, puede
tener
acceso a una colección de celdas dentro de un intervalo con el código siguiente:
oleApp = CREATEOBJECT("Excel.sheet")
oleApp.Workbooks.Add
oleApp.Range(oleApp.Cells(1,1),oleApp.Cells(10,10)).Value=100
oleApp.Visible=.T.
Usar matrices de objetos
Puede transferir matrices a métodos 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
código. 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.
Además, 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 más de dos dimensiones a objetos
OLE.
Para obtener más información acerca de cómo trabajar con matrices en Visual FoxPro,
consulte el
capítulo 3, Programación orientada a objetos y Descripción general del lenguaje.
Manual del programador, Parte 5: Ampliar aplicaciones Página 17 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Liberar objetos extrínsecos
Un servidor de Automatización se libera automáticamente si no está visible y si no hay
variables en el
ámbito que hagan referencia al objeto. Puede usar el comando RELEASE para liberar la
variable
asociada a un objeto. Si el servidor está visible, use el método Quit para liberarlo.
Crear subclases de objetos
Puede crear objetos personalizados creando subclases de las clases de base incluidas en
Visual
FoxPro. Por ejemplo, el código siguiente crea una subclase del control Outline
suministrado con
Visual FoxPro:
Creación de una subclase del control Outline
Código Comentarios
PUBLIC frmMyForm, cFilename
SET SAFETY OFF
Declara variables y las
inicializa.
frmMyForm = CREATEOBJECT("form")
frmMyForm.Width = 100
frmMyForm.ADDOBJECT("oleOutl","myoutline")
DIMENSION aSection(3)
aSection(1) = "Table"
aSection(2) = "Field"
aSection(3) = "Index"
Crea un formulario, agrega el
control Outline personalizado al
formulario y después crea una
matriz para los elementos que
presenta el control.
cFilename = GETFILE("dbc","Seleccione un archivo DBC")
USE (cFilename)
INDEX ON objecttype FOR (objecttype = "Table" ;
OR objecttype = "Field" ;
OR objecttype = "Index" ) ;
TAG fname
Solicita una base de datos que
contiene la información que va a
presentar el control.
FOR nIndex = 1 TO 3 STEP 1
frmMyForm.oleOutl.AddItem(aSection(nIndex))
frmMyForm.oleOutl.Indent;
((frmMyForm.oleOutl.ListCount-1)) = 1
SCAN
IF objecttype = aSection(nIndex)
frmMyForm.oleOutl.Additem(objectname)
frmMyForm.oleOutl.Indent;
((frmMyForm.oleOutl.ListCount-1)) = 2
ENDIF
ENDSCAN
GO TOP
ENDFOR
Recopila información de la base
de datos y la agrega al control.
frmMyForm.oleOutl.Visible = .T.
frmMyForm.Show
Deja el control visible y muestra
el formulario.
Manual del programador, Parte 5: Ampliar aplicaciones Página 18 de 89
file://C:\temp\~hh1768.htm 30/05/2000
DEFINE CLASS myoutline AS olecontrol
OleClass = "msoutl.outline"
Top = 5
Left = 5
Height = 10
Width = 60
ENDDEFINE
Define una subclase del control
Contenedor OLE y agrega el
control Outline estableciendo la
propiedad OleClass del
contenedor y definiendo los
otros valores personalizados.
Si desea distribuir las aplicaciones, hay algunas otras consideraciones. Para obtener más
información,
consulte el capítulo 25, "Generar una aplicación para su distribución".
Controlar Visual FoxPro desde otras aplicaciones
Dado que Visual FoxPro actúa como servidor (con conformidad de nivel 2) y como cliente,
las
aplicaciones que admiten Automatización pueden crear instancias de Visual FoxPro,
ejecutar
comandos de Visual FoxPro y tener acceso a sus objetos.
Puede incluso manipular Visual FoxPro desde aplicaciones que no admitan Automatización
mediante
Fpole.dll
Puede controlar Visual FoxPro desde otras aplicaciones mediante el objeto Application de
Visual
FoxPro. Se crea automáticamente un objeto Application siempre que se inicia Visual
FoxPro
directamente, mediante DDE o mediante Automatización.
Por ejemplo, las líneas de código siguiente en Visual Basic®, o en un módulo de Microsoft
Excel,
crean una referencia a un objeto Application de Visual FoxPro:
Dim oFox as Object
Set oFox = CreateObject("VisualFoxPro.Application")
Una vez establecida una referencia al objeto Application de Visual FoxPro, puede llamar a
métodos
asociados con el objeto y tener acceso a otros objetos mediante las propiedades de la
colección del
objeto Application.
Métodos del objeto Application
DataToClip Help
DoCmd Quit
Eval RequestData
El ejemplo siguiente usa Visual Basic para código de aplicaciones en un módulo 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 cálculo activa:
Sub FoxTest()
Dim oFox as Object
Set oFox = CreateObject("VisualFoxPro.Application")
Manual del programador, Parte 5: Ampliar aplicaciones Página 19 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Set oFox = CreateObject("VisualFoxPro.Application")
oFox.DoCmd "USE customer"
oFox.DoCmd "SELECT contact, phone FROM customer
WHERE country = " + Chr$(39) + USA+ Chr$(39) + " INTO CURSOR cust"
oFox.DataToClip "cust",,3
Range("A1:B1").Select
ActiveSheet.Paste
End Sub
Modelo de objeto Application de Visual FoxPro
Cada vez que inicia Visual FoxPro se crea un objeto Application automáticamente, ya sea
directamente, a través de Automatización o de DDE. Este objeto Application proporciona
acceso a
todos los objetos creados en una sesión de Visual FoxPro a través de las propiedades de la
colección.
Modelo de objeto Application de Visual FoxPro
Manual del programador, Parte 5: Ampliar aplicaciones Página 20 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Acceso a objetos a través de las propiedades Collection
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 numérica
que indica el
número de objetos contenidos.
En la tabla siguiente se muestran los objetos y la propiedades Collection y Count
correspondientes.
Objeto Propiedad Collection Propiedad Count
Application Objects
Forms
Count
FormCount
FormSet Forms FormCount
Form Objects
Controls
Count
ControlCount
PageFrame Pages PageCount
Page Controls ControlCount
Grid Columns ColumnCount
CommandGroup Buttons ButtonCount
OptionGroup Buttons ButtonCount
Column Controls ControlCount
ToolBar Controls ControlCount
Container Controls ControlCount
Control Controls ControlCount
Estas propiedades permiten el uso de un bucle para manipular mediante programación
todos los
objetos contenidos o sólo los especificados. Por ejemplo, las líneas de código siguientes
establecen la
propiedad Visible de todos los formularios como verdadera (.T.):
FOR EACH Form IN Application.Forms
Form.Visible = .T.
ENDFOR
Crear servidores de Automatización
Con Visual FoxPro puede crear servidores de Automatización (componentes COM) que
empaquetan
el código para realizar tareas comunes a muchas aplicaciones o que implementan reglas
comerciales
complejas. Estas tareas y reglas están disponibles para otros programadores de la empresa y
para los
usuarios de herramientas que admitan la automatización.
Manual del programador, Parte 5: Ampliar aplicaciones Página 21 de 89
file://C:\temp\~hh1768.htm 30/05/2000
usuarios de herramientas que admitan la automatización.
Por ejemplo, podría crear una o varias clases para controlar las reglas comerciales de toda
la
compañía. Una aplicación cliente que utilice los objetos de regla comercial transferiría los
parámetros
de entrada en una llamada a un método y el servidor de Automatización podría estar
demasiado
ocupado transfiriendo datos de varios orígenes y realizando cálculos completos antes de
devolver la
respuesta.
Los ejemplos de servidores de Automatización están instalados en el directorio
...\Samples\Vfp98
\Servers de Visual Studio.
Crear el servidor
Todo lo que necesita para crear un servidor de Automatización 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 definición de clase siguiente en un archivo de programa crea una clase
pública OLE
personalizada:
DEFINE class person AS CUSTOM OLEPUBLIC
FirstName = SPACE(30)
LastName = SPACE(45)
PROCEDURE GetName
RETURN THIS.FirstName + " " + THIS.LastName
ENDPROC
ENDDEFINE
Cuando diseñe una clase en el Diseñador de clases, seleccione OLE público en el cuadro
de diálogo
Información de clase para designar la clase como OLEPUBLIC.
Cuadro de diálogo Información de clase
Manual del programador, Parte 5: Ampliar aplicaciones Página 22 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Compilación del servidor
En Visual FoxPro puede crear un servidor de Automatización fuera de proceso o en
proceso. Un
componente fuera de proceso es un ejecutable (archivo .exe) que ejecuta su propio proceso.
La
comunicación entre una aplicación cliente y un servidor fuera de proceso se denomina
comunicación
entre procesos. Un componente en proceso es una biblioteca de vínculos dinámicos (dll)
que se
ejecuta en el mismo espacio de direcciones de proceso que el cliente que la llama.
Cada componente tiene sus propias ventajas. Un servidor en proceso es más rápido porque
no hay
necesidad de comunicación entre procesos. Por otro lado, un servidor fuera de proceso
puede
utilizarse en modo remoto, función no disponible en el servidor en proceso. Además, 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 sólo interrumpiría el servidor.
Cuando se crea un ejecutable con clases OLE públicas, 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 incluiría en una aplicación. Puede aumentar, por tanto, la
capacidad de
expansión de la aplicación permitiendo que otras aplicaciones exploten las funciones
específicas que
desea ofrecer.
Nota Si hay más de un usuario que intenta tener acceso al servidor de Automatización,
pueden
surgir conflictos. Si ha proporcionado acceso a Automatización además 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.
Para compilar un servidor de Automatización
1. En el Administrador de proyectos, elija Generar.
2. En el cuadro de diálogo Opciones de generación, elija Generar ejecutable o Generar
DLL
OLE.
Manual del programador, Parte 5: Ampliar aplicaciones Página 23 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Cuadro de diálogo Opciones de generación
3. Elija Aceptar.
–O bien–
Use los comandos BUILD DLL o BUILD EXE.
Una vez creado el proyecto, puede ver las clases de servidor mostradas en el cuadro de
diálogo
Información del proyecto, donde también 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 más genéricos.
Cuadro de diálogo Información del proyecto
Manual del programador, Parte 5: Ampliar aplicaciones Página 24 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Puede elegir valores de creación de instancias específicos de la clase en el cuadro de
diálogo
Información del proyecto. Las opciones de creación de instancias son las siguientes:
No se puede crear Aún cuando la clase esté marcada como OLE pública, no estará
disponible
en otras aplicaciones. Por ejemplo, podría tener una biblioteca estándar de clases OLE
públicas
en múltiples aplicaciones y desactivar la automatización de una o varias clases para una
sola
aplicación.
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 ejecución. Aunque
instancias independientes requieren más memoria, si se elige Uso único el sistema
operativo
podrá aplicar multitarea de asignación prioritaria.
Multiuso Una vez creado el servidor, otras aplicaciones pueden utilizar la misma
instancia.
Nota Si realiza cambios en la ficha Servidores del cuadro de diálogo Información del
proyecto, será necesario volver a generar la .dll o el .exe para que entre en vigor la nueva
configuración.
Cuando cree un proyecto con clases OLE públicas, se crean tres archivos:
El archivo .dll o .exe
Un archivo de biblioteca de tipos (.tlb)
Un archivo de registro (.vbr).
El archivo de biblioteca de tipos es un archivo binario que presenta una relación de todas
las clases
publicadas en el servidor de Automatización, junto con sus propiedades, métodos y
eventos. Los
examinadores de objetos OLE leen esta información 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 código.
Archivo .VBR con GUID para cada clase OLE pública de un proyecto
Manual del programador, Parte 5: Ampliar aplicaciones Página 25 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Registrar un servidor de Automatización
Los servidores OLE quedarán disponibles para otras aplicaciones cuando se hayan
agregado los
servidores al Registro de Windows. Cuando genere un servidor de Automatización, se
registrará
automáticamente en la máquina donde se ha efectuado la generación. También puede
registrar los
servidores en otras máquinas.
Cuando utilice el Asistente para instalación de Visual FoxPro para crear discos de
instalación, el
programa de instalación registrará los servidores en los equipos de los clientes. También
puede
registrar servidores manualmente.
Para registrar un componente .exe
Ejecute el archivo .exe con el modificador /regserver.
Por ejemplo, para registrar Miservid.exe, ejecute el comando siguiente:
miservid /regserver
Para quitar una entrada del registro de componentes .exe
Ejecute el archivo .exe con el modificador /unregserver.
Por ejemplo, para eliminar Miservid.exe del registro, ejecute el comando siguiente:
miservid /unregserver
Manual del programador, Parte 5: Ampliar aplicaciones Página 26 de 89
file://C:\temp\~hh1768.htm 30/05/2000
miservid /unregserver
Para registrar un componente .dll
Ejecute REGSVR32 con el nombre del servidor.
Por ejemplo, para registrar Miservid.dll, ejecute el comando siguiente:
REGSVR32 miservid.dll
Para quitar una entrada del registro de componentes .dll
Ejecute REGSVR32 con el nombre del servidor y el parámetro /u.
Por ejemplo, para registrar Miservid.dll, ejecute el comando siguiente:
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.
Usar el servidor de Automatización
Una aplicación que puede crear objetos de Automatización puede crear objetos basados en
el servidor
de Automatización, establecer propiedades que no estén HIDDEN o PROTECTED y llamar
a
métodos. Por ejemplo, suponiendo que el nombre del servidor sea foxole y que contenga
una clase
denominada persona con un método GetName, el código siguiente podría ejecutarse en
Visual
FoxPro 3.0:
oTest = CREATEOBJECT("foxole.persona")
cName = oTest.GetName()
Se podría crear código similar en Microsoft Excel o Visual Basic:
Set oTest = CreateObject("foxole.person")
cName$ = oTest.GetName()
Detener o devolver errores de los servidores de Automatización
La única interacción con los objetos proporcionados por un servidor de Automatización
(componente
COM) se hace mediante los métodos y las propiedades de las clases expuestas. Cuando una
aplicación cliente llama a un método de un objeto y se produce un error en el servidor de
Automatización, el método devuelve un valor de error o surge un error en la aplicación
cliente.
La aplicación cliente decide si debe avisar al usuario o continuar con otra ruta de acceso de
ejecución.
El propio servidor de Automatización nunca interactúa con el usuario. Esto permite que la
aplicación
del servidor de Automatización sea transparente para la aplicación cliente. El servidor de
Automatización puede ser local (es decir, se ejecuta en el equipo del usuario) o se puede
usar la
característica de Automatización remota de Visual FoxPro para ejecutarlo en un servidor de
red.
Manual del programador, Parte 5: Ampliar aplicaciones Página 27 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Usar Automatización remota
En las situaciones habituales de Automatización, tanto el cliente como el servidor se
encuentran en
un solo equipo y comparten los mismos recursos, como la memoria y el procesador.
Automatización en un único equipo
Cuando se crean servidores locales para Automatización, puede utilizarlos en modo remoto.
La
automatización remota permite la misma flexibilidad, capacidad de ampliación y eficacia
que la
automatización local, pero en una red. La Automatización remota permite que:
Los servidores utilicen recursos diferentes.
Muchos usuarios diferentes tengan acceso al mismo servidor.
Puede configurar un servidor y un equipo local para la automatización remota con el
Administrador
de conexiones de automatización remota, con lo que se guarda la configuración en el
registro. Al
ejecutarse el Administrador de Automatización en el equipo servidor, se administra la
automatización
de modo que el mismo código que manipula un objeto local pueda manipular
automáticamente un
objeto remoto.
Automatización remota
Configurar el servidor
El primer paso en la activación de la automatización remota es configurar el equipo
servidor para el
acceso del cliente en el Administrador de conexiones de automatización remota.
Para configurar el servidor de automatización remota
Manual del programador, Parte 5: Ampliar aplicaciones Página 28 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Para configurar el servidor de automatización remota
1. Copie el archivo ejecutable del servidor de Automatización (.EXE) en el servidor y
ejecútelo
una vez para registrarlo en el Registro de Windows.
2. En el equipo servidor, ejecute Racmgr32.exe, el Administrador para conexiones.
3. Seleccione la clase en la lista Clases OLE.
4. En la ficha Acceso de cliente, elija Permitir creaciones remotas mediante clave.
5. En la ficha Acceso de cliente, compruebe que la opción Permitir activación remota
esté
activada.
Una vez activado el acceso al cliente en el Administrador de conexiones de automatización
remota,
ejecute el Administrador de automatización, Autmgr32.exe, en el equipo servidor.
Autmgr32.exe está
instalado en la carpeta System de Windows 95 o en la carpeta System32 de Windows NT.
Esto
permitirá las conexiones de automatización remota desde otros equipos.
Configurar el cliente
Una vez configurado el equipo servidor, podrá configurar el equipo cliente.
Para configurar el equipo local para la automatización remota
Manual del programador, Parte 5: Ampliar aplicaciones Página 29 de 89
file://C:\temp\~hh1768.htm 30/05/2000
1. Copie en la máquina cliente el archivo .vbr que se creó cuando se creó el servidor de
Automatización.
2. Ejecute CLIREG32 con el nombre del archivo .vbr. Por ejemplo, si el archivo es
MiServid.VBR, ejecute el comando siguiente en el símbolo del sistema:
CLIREG32 Miservid.vbr
3. En el cuadro de diálogo que se abre, introduzca la dirección de red de la máquina
servidor y
elija el protocolo de red (normalmente TCP/IP).
Opciones de política de seguridad del sistema
En la tabla siguiente se describen las opciones del área Política de seguridad del sistema de
la ficha
Acceso de cliente del Administrador de conexiones de automatización remota.
Nombre Valor Descripción
No permitir ninguna
creación remota
0 No permite la creación de ningún objeto.
Permitir creaciones
remotas por índice
2 Sólo puede crearse un objeto si está activada la casilla de
verificación Permitir activación remota. Esto modifica su
CLSID en el Registro de Windows para incluir la
configuración de subclaves siguiente:
AllowRemoteActivation = Y
Permitir creaciones
remotas con ACL
3 Un usuario puede crear un objeto sólo si el usuario está
incluido en la lista de control de acceso del CLSID del
Registro de Windows. Sólo para Windows NT.
Permitir todas las
creaciones remotas
1 Permite la creación de cualquier objeto. No se
recomienda fuera el entorno de programación.
1La columna Valor presenta la configuración preferente de RemoteActivationPolicy del
Administrador de automatización en el Registro de Windows.
Usar la autenticación en Automatización remota
Para los servidores de Automatización remotos que se ejecuten en cualquier sistema
operativo
Windows, el procedimiento de llamada remota (RPC) ofrece los niveles de autenticación
siguientes.
Nombre Valor Descripción
Ninguno 0 Usar el valor predeterminado de la red.
Ninguno 1 Sin autenticación.
Conectar 2 Se autentica la conexión al servidor.
Llamar 3 Se autentica sólo al comienzo de cada llamada a
Manual del programador, Parte 5: Ampliar aplicaciones Página 30 de 89
file://C:\temp\~hh1768.htm 30/05/2000
Llamar 3 Se autentica sólo 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 conexión (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 ningún 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 autenticación RPC debería evaluarse detenidamente, porque a medida que
aumenta
el nivel de autenticación RPC, disminuye el rendimiento. Puede especificar un nivel de
autenticación
para cada clase del servidor de Automatización, de modo que tanto los niveles costosos,
como la
codificación, no necesiten aplicarse a todo el componente.
Por ejemplo, un servicio de datos implementado como servidor de Automatización remoto
podría
tener una clase Logon utilizada para transmitir la información del usuario y la contraseña y
esta clase
podría requerir la autenticación Privacidad del paquete. Otras clases expuestas por el
servidor podrían
utilizar un nivel de autenticación más bajo.
Solucionar problemas de Automatización remota
A continuación se presentan varias sugerencias en caso de que surjan dificultades.
Problema Acción
Código de error OLE 0x800706d9: No hay
más puntos finales disponibles en el
administrador de puntos finales.
Compruebe que el Administrador de
Automatización se está ejecutando en el equipo
servidor y que el nombre de este equipo se haya
introducido correctamente en el cuadro Dirección de
la red del Administrador de conexiones de
automatización remota.
Visual FoxPro: la aplicación no aparece en
la lista de Clases OLE del Administrador de
automatización remota.
1. Ejecute Regedit.exe para abrir el registro.
vfp6.exe –r
2. Elimine todas las referencias a Microsoft
Visual FoxPro.
3. Ejecute Visual FoxPro con la etiqueta -r en la
línea de comandos:
Manual del programador, Parte 5: Ampliar aplicaciones Página 31 de 89
file://C:\temp\~hh1768.htm 30/05/2000
ejemplo, straße se ordena igual que Strasse, y cæsar igual que Caesar.
En algunos idiomas, dos caracteres se ordenan como un único carácter. Por ejemplo, en
Ayuda HTML
La Ayuda HTML proporciona muchas de las características de Winhelp y agrega las
siguientes:
Manual del programador, Parte 7: Crear archivos de Ayuda Página 2 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Soporte para HTML.
Soporte para ActiveX, Java y secuencias de comandos (Javascript y Microsoft Visual
Basic
Script).
Soporte para los formatos de imagen de HTML (.jpg, .gif, .png).
Capacidad para ir desde un tema de Ayuda a un sitio de Internet.
Capacidad para ver el código HTML de un tema de Ayuda.
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 creación de
Ayuda
HTML e incluye una compatibilidad con versiones anteriores que le permite crear
fácilmente
archivos de Ayuda HTML a partir de proyectos Winhelp existentes. Para crear archivos de
Ayuda
HTML en su aplicación, consulte la Ayuda en pantalla de HTML Help Workshop.
En …\Samples\Vfp98\Solution\Help se incluye un proyecto de Ayuda HTML de ejemplo,
parte del
ejemplo Solutions. Incluye los siguientes archivos:
Archivo Descripción
Solution.chm Archivo de Ayuda compilado.
Solution.hhp Archivo de proyecto (un archivo de texto que reúne todos los elementos de
un proyecto de Ayuda y contiene información acerca de cómo 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 instalación local de cierta información de exploración
en el disco duro que permite tener acceso de forma rápida, 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
información que podría 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.
Manual del programador, Parte 7: Crear archivos de Ayuda Página 3 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Archivo.gif Archivos gráficos.
Diseñar el acceso a la Ayuda HTML
Además de crear un archivo de Ayuda HTML que contenga información útil, tiene que
proporcionar
un medio para que los usuarios de su aplicación tengan acceso a dicha Ayuda. Hay tres
maneras de
proporcionar Ayuda:
Un menú Ayuda (un menú que aparece en la barra del menú principal de su aplicación).
Ayuda interactiva (Ayuda que aparece cuando el usuario presiona F1, u otra tecla
especificada,
mientras está seleccionado un objeto, control o opción de menú determinado).
Ayuda "¿Qué es esto?" (Ayuda que aparece cuando el usuario pide Ayuda sobre un
objeto o
control determinado).
La implementación de la Ayuda HTML es similar a la de WinHelp. Las siguientes
secciones
describen cómo puede implementar la Ayuda HTML en sus aplicaciones.
Diseñar el menú Ayuda
El menú Ayuda suele contener comandos que proporcionan acceso a los temas de su
sistema de
Ayuda. Se recomienda que sólo un comando del menú Ayuda abra su sistema de Ayuda
HTML.
Además de dicho comando, puede incluir otros comandos en el menú Ayuda para
proporcionar
información del sistema o la información de derechos de autor y la versión de su aplicación.
Interactividad
La Ayuda interactiva permite que los usuarios tengan acceso a los temas de Ayuda
relacionados con
lo que estén haciendo o viendo en su aplicación en cualquier momento dado. Por ejemplo,
si un
usuario está viendo un formulario de introducción de datos, la Ayuda interactiva podría
proporcionar
un tema relacionado específicamente con dicho formulario.
Usted decide el nivel de detalle de la implementación de la Ayuda interactiva en su
aplicación. Por
ejemplo, puede asociar un tema de Ayuda interactiva con un formulario o puede asociar
temas de
Ayuda más detallados para cada uno de los controles y campos del formulario.
Se suele llegar a la Ayuda interactiva al presionar F1, pero puede especificar que se active
mediante
cualquier tecla con ON KEY LABEL.
Usar la Ayuda interactiva en un formulario
Para implementar Ayuda interactiva, tiene que especificar el archivo de Ayuda de su
aplicación y
después asociar temas de Ayuda determinados con objetos de su aplicación.
Para agregar Ayuda interactiva
1. Especifique el archivo de Ayuda de su aplicación.
2. Asigne un tema de Ayuda a cada objeto para el que vaya a proporcionar Ayuda
interactiva.
Manual del programador, Parte 7: Crear archivos de Ayuda Página 4 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Especificar el archivo de Ayuda
El archivo de Ayuda al que se tiene acceso en su aplicación se determina al incluir el
comando SET
HELP TO archivo en el código, donde archivo es el nombre del archivo de Ayuda. Por
ejemplo, si el
archivo de Ayuda es MiAyuda.chm, puede utilizar el siguiente comando:
SET HELP TO MIAYUDA.CHM
Este comando suele estar incluido en el código de configuración del programa principal de
su
aplicación.
Asignar temas de Ayuda
Puede asignar un tema de Ayuda a objetos específicos de su aplicación de Visual FoxPro.
Para asignar un tema de Ayuda a un objeto
1. En modo Diseño, abra el objeto (por ejemplo, un formulario, un control o una barra de
herramientas) al que vaya a asignar Ayuda interactiva.
2. Vea las propiedades del objeto.
3. Establezca la propiedad HelpContextID al número correspondiente al tema asociado de
su
archivo de Ayuda HTML.
Para obtener más información acerca de la asociación de temas de Ayuda HTML con Id. de
contexto,
consulte la Ayuda de HTML Help Workshop.
Nota Para asignar temas de Ayuda a títulos de menú o a comandos de menú, tiene que
incluir el
comando SET TOPIC TO en el procedimiento asociado con el título de menú o el comando
de menú.
Implementar la Ayuda "¿Qué es esto?"
La Ayuda "¿Qué es esto?" es similar a la Ayuda interactiva puesto que proporciona Ayuda
relacionada con el objeto o control específico que actualmente tiene el enfoque.
En WinHelp, en lugar de invocar el archivo de Ayuda y mostrar el tema de Ayuda en la
ventana de
Ayuda con su tamaño predeterminado, la Ayuda "¿Qué es esto?" presenta el tema en una
pequeña
ventana emergente que desaparece en cuanto el usuario hace clic en cualquier parte de la
pantalla. La
Ayuda "¿Qué es esto?" es útil para proporcionar breves descripciones, definiciones o
sugerencias
sobre controles específicos.
Al contrario que en WinHelp, la Ayuda HTML "¿Qué es esto?" se presenta en la ventana
de Ayuda
con su tamaño predeterminado.
La Ayuda "¿Qué es esto?" se asocia con un formulario, control de formulario o barra de
herramientas
particular estableciendo su propiedad WhatsThisHelpID al número correspondiente al tema
asociado
de su archivo de Ayuda.
Manual del programador, Parte 7: Crear archivos de Ayuda Página 5 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Para implementar la Ayuda "¿Qué es esto?", utilice las siguientes propiedades y métodos:
Propiedad Descripción
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 botón
"¿Qué es esto?" en la barra de título 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 método para mostrar el puntero con la interrogación 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.
Para implementar la Ayuda "¿Qué es esto?"
1. En modo Diseño, abra el formulario en el que vaya a activar la Ayuda "¿Qué es esto?".
2. Establezca la propiedad WhatsThisHelp del formulario a True (.T.).
3. Para mostrar un botón "¿Qué es esto?" en la barra de título del formulario, establezca la
propiedad WhatsThisButton del formulario a True (.T.).
4. Para asociar un tema de Ayuda "¿Qué es esto?" al formulario, establezca la propiedad
WhatsThisHelpID del formulario al Id. correspondiente al tema asociado de su archivo de
Ayuda HTML.
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.
Programar las funciones de Ayuda
Puede programar su aplicación 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 aplicación.
Puede programar su aplicación de Visual FoxPro para utilizar Ayuda gráfica 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 aplicación. SET TOPIC TO establece la palabra clave
identificativa
de un tema del archivo de Ayuda personalizado.
Manual del programador, Parte 7: Crear archivos de Ayuda Página 6 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Reservar F1
Cuando un usuario presiona F1 dentro de su aplicación, 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
estándar
admitido para la Ayuda, no se recomienda la modificación de esta tecla.
Incluir botones de Ayuda en los formularios
Si agrega botones de Ayuda a sus formularios, los usuarios pueden tener acceso a la Ayuda
con más
facilidad. Especialmente, debe considerar la inclusión de un botón de Ayuda si sus usuarios
no son
muy experimentados.
Para establecer la sensibilidad al contexto y agregar un botón de Ayuda
1. En el evento Init de su formulario, establezca la propiedad HelpContextID de todos los
objetos
del formulario al mismo valor, correspondiente a un tema de Ayuda. Por ejemplo, si dicho
valor es 7, podría utilizar el siguiente comando:
THIS.SetAll("HelpContextID", 7)
2. Agregue un botón de comando al formulario.
3. Establezca la propiedad Caption del botón de comando a "Ayuda".
4. En el evento Click del botón de comando, agregue el siguiente comando:
HELP ID THIS.HelpContextID
Sugerencia Guarde el botón de Ayuda como una clase de forma que pueda incluirlo
fácilmente en
cualquier otro formulario. Para obtener más información acerca de cómo guardar objetos
como
clases, vea el capítulo 9, Crear formularios.
Distribuir un sistema de Ayuda HTML compilado
Además del archivo .chm que se crea para el sistema de Ayuda HTML, puede utilizar un
programa de
instalación de uso y distribución gratuita, Hhupd.exe, que instala y registra los
componentes de
ejecución de la Ayuda HTML mostrados a continuación. El Explorador de Internet o el
motor de
ejecución del Explorador de Internet tienen que estar instalados en los equipos de los
usuarios.
Manual del programador, Parte 7: Crear archivos de Ayuda Página 7 de 24
file://C:\temp\~hhCCF2.htm 30/05/2000
Componente Descripción
Hhctrl.ocx Control ActiveX de la Ayuda HTML
Itss.dll Biblioteca de vínculos dinámicos que controla el HTML compilado
Itircl.dll Biblioteca de vínculos dinámicos para búsquedas de texto
Hh.exe Visor de Ayuda HTML
Este programa de instalación se encuentra en la carpeta Redist de la carpeta de instalación
del Taller
de Ayuda HTML. Puede llamar a dicho programa de instalación desde otros programas de
instalación
y ejecutarlo en modo 'silencioso' para que no interfiera con el programa de instalación que
haya
creado. Para obtener la lista completa de las opciones de línea 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 Guía de diseño de Ayudas.
La Guía
de diseño de Ayudas (Hcw.hlp) es un archivo de Ayuda gráfica que contiene gran parte de
la
información necesaria para diseñar sistemas de Ayuda robustos.
Elegir las funciones de Ayuda
Los sistemas WinHelp puede tener algunas o todas las funciones siguientes:
Una página de contenido que proporciona una vista jerárquica de los temas del sistema
de
Ayuda.
Un índice, basado en las palabras clave que usted proporcione, que guía al usuario hasta
una
información específica.
Funciones de búsqueda de texto que permiten que los usuarios busquen palabras o frases
en la
Ayuda.
Texto con varias fuentes, tamaños de fuente y colores.
Gráficos, incluyendo mapas de bits con varias resoluciones.
Macros que automatizan o amplían la operación del sistema de Ayuda.
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).
Hipergráficos segmentados: gráficos con una o varias zonas activas.
Ventanas secundarias.
Menús personalizables.
Gráficos en formato metarchivo de Windows.
.DLLs.
caracteres (es decir, ev_type = 'C'). Todos los demás 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.
Manual del programador, Parte 9: Acceso a las bibliotecas API Página 28 de 31
file://C:\temp\~hh598B.htm 30/05/2000
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.
Los usuarios no deben liberar identificadores que se les han transferido a su ParamBlk.
Precaución Cuando escribe una rutina externa que llama a funciones, asegúrese de seguir
todas las reglas y compruebe los resultados devueltos. Un puntero perdido o una referencia
de
identificador podría dañar las estructuras de datos internas de Visual FoxPro, provocando el
final inmediato o problemas a posteriori, lo cual podría producir pérdida de datos.
Generar y probar bibliotecas y controles ActiveX
Después de crear un proyecto, ya está preparado para generarlo y depurarlo.
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 versión de depuración o una versión final del control o
biblioteca. Por
norma, puede crear versiones de depuración del programa hasta que esté satisfecho de su
funcionamiento y, a continuación, crear una versión final.
Parar especificar una versión de depuración o final
1. En el menú Build, elija Set Default Configuration.
2. Elija si va a crear una versión de depuración o una versión final del control.
3. Elija OK.
Para establecer las opciones del proyecto
1. En el menú Build, elija Settings.
2. En Settings For, elija si va a crear una versión de depuración o final del programa.
3. Haga clic en la ficha C/C++ y, a continuación, elija estas opciones:
En la lista Category, elija Code Generation.
En la lista Calling Convention, elija _fastcall.
En la lista Use run-time library, elija Multithreaded DLL.
4. Elija la ficha Link y, a continuación, en el cuadro de texto Object/Library Modules,
agregue
una de las bibliotecas siguientes:
Si está generando un .ocx, agregue OCXAPI.LIB del directorio API de Visual FoxPro.
Si está generando un .fll, agregue WINAPIMS.LIB del directorio API de Visual FoxPro.
5. Desactive Ignore all default libraries.
Manual del programador, Parte 9: Acceso a las bibliotecas API Página 29 de 31
file://C:\temp\~hh598B.htm 30/05/2000
6. Elija OK.
Para asegurarse de que el compilador puede encontrar los archivos necesarios
1. En el menú Tools, elija Options.
2. Haga clic en la ficha Directories.
3. En la lista Show directories for, elija Include files.
4. En la barra de herramientas Directories, haga clic en el botón Add.
5. Agregue el directorio que contiene 0Pro_ext.h.
6. En la lista Show directories for, elija Library files.
7. En la barra de herramientas Directories, haga clic en el botón Add.
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).
9. En el cuadro de diálogo Options, elija OK.
Después de especificar las opciones, puede compilar y enlazar el programa.
Para compilar y enlazar un archivo .ocx
En el menú Build, elija Build nombreproyecto.ocx.
Cuando compile y enlace el archivo .OCX, Visual C++ registrará automáticamente el
control en el
equipo en el que se generó. Si por alguna razón tiene que registrar el control de otra forma,
puede
hacerlo mediante el siguiente procedimiento.
Para registrar el control ActiveX
En el menú Tools de Visual C++ Developer Studio, elija Register Control.
–O bien–
Declare y llame a DLLRegisterServer( ) desde su programa.
lista
de proyecto.
Como parte de los procedimientos de actualización, Visual FoxPro le pedirá que obtenga
las
versiones más recientes de los archivos. Si ya tiene un archivo desprotegido, como regla
general no
debe obtener la versión más reciente, porque su versión es con seguridad más actual que
una de la
red.
Si va a obtener la versión más reciente de un archivo de texto (como un programa), el
software de
control de código fuente puede intentar combinar las últimas modificaciones con su
versión. Para
obtener más información sobre la combinación de archivos de texto, consulte Proteger
archivos más
adelante en este capítulo.
Cuando haya terminado, los otros programadores también deberían actualizar su lista de
proyecto
(con el mismo procedimiento) para poder trabajar con los archivos que usted haya
agregado.
Quitar un proyecto de control de código fuente
Si ya no quiere controlar los archivos de un proyecto, puede quitar el proyecto del control
de código
fuente. Cuando lo haga, los archivos permanecerán en el proyecto con control de código
fuente de
forma que otros programadores puedan seguir usándolos y para que usted pueda examinar
su historial
o usarlos en otros proyectos.
Si tiene archivos de proyecto en su equipo etiquetados como de sólo lectura, es decir, si
tiene copias
de los archivos pero éstos no están desprotegidos, puede quitarles el atributo de sólo lectura
cuando
se quitan del proyecto del control de código fuente.
Nota Cuando usted quita un proyecto del control de código fuente, rompe el vínculo entre
sus
archivos de proyecto locales y el proyecto con control de código fuente, y sus archivos se
convierten
en archivos de lectura-escritura. Asegúrese de aplicar procedimientos de control manual de
versiones
después de quitar un proyecto o correrá el riesgo inherente al trabajo con archivos que no
están bajo
Manual del programador, Parte 10: Crear soluciones empresariales Página 13 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
después de quitar un proyecto o correrá el riesgo inherente al trabajo con archivos que no
están bajo
control de código fuente.
Para quitar un proyecto de control de código fuente
1. Proteja todos los archivos bajo control de código fuente.
2. En el menú Proyecto, elija Quitar proyecto de control de código.
Quitar archivos de un proyecto con control de código fuente
Puede quitar archivos individuales del control de código fuente si ya no quiere que formen
parte de su
proyecto con control de código fuente. Podría hacer esto, por ejemplo, si un programa o
formulario se
convierte en innecesario y ya no forma parte del proyecto.
Para quitar un archivo del control de código fuente
1. En el Administrador de proyectos, seleccione el archivo que desea quitar.
2. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Quitar
archivos
de control de código.
3. En el cuadro de diálogo Quitar archivos de control de código fuente, seleccione los
archivos
que desea quitar y, a continuación, haga clic en Aceptar.
Si quita un archivo de un proyecto de Visual FoxPro que tiene control de código fuente,
Visual
FoxPro le pedirá como siempre si sólo desea quitar el archivo del proyecto o si desea
eliminarlo del
disco. Una opción del cuadro de diálogo Opciones determina si Visual FoxPro también le
pide que
quite el archivo del proyecto con control de código fuente.
Si Quitar archivos del control de código fuente al quitarlos del proyecto está
activada,
Visual FoxPro también le pedirá que quite el archivo del proyecto con control de código
fuente.
Si Quitar archivos del control de código fuente al quitarlos del proyecto no está
activada,
no se le pide lo anterior y el archivo se deja bajo control de código fuente.
Después de quitar un archivo del control de código fuente, es posible que aún existan
copias del
mismo en los equipos de otros programadores. Si es así, el archivo se tratará como un
archivo local
sólo para estos programadores.
Compartir archivos entre proyectos con control de código fuente
Puede configurar un archivo de forma que forme parte de dos o más proyectos con control
de código
fuente a la vez. Esto es útil si usa archivos comunes, como programas estándar, bibliotecas
o cuadros
de diálogo en más 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 método específico para compartir archivos entre proyectos con control de código fuente
depende
del software de control de código fuente. Si las opciones para compartir no están
incorporadas en su
proveedor de control de código fuente, los comandos para compartir archivos no estarán
disponibles
en el menú.
Manual del programador, Parte 10: Crear soluciones empresariales Página 14 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
en el menú.
El primer paso del procedimiento siguiente se aplica a todos los sistemas de control de
código fuente
que admiten la posibilidad de compartir archivos. Los pasos sucesivos pueden variar, en
función de
su software de control de código fuente.
Para compartir archivos entre proyectos controlados
1. En el menú Proyecto, elija Control de código fuente y, a continuación, Compartir
archivos.
2. En el cuadro de diálogo que aparece, indique qué archivos desea compartir con el
proyecto
actual y a qué proyecto pertenecen actualmente.
Las opciones específicas disponibles en este comando de menú dependen del sistema de
control de código fuente. Para obtener detalles, elija Ayuda en el cuadro de diálogo
Compartir
o consulte la documentación de su sistema de control de código fuente.
Sugerencia En Microsoft Visual SourceSafe puede ver a qué proyectos pertenece un
archivo
mediante el comando Propiedades del proyecto y al elegir la ficha Vínculos.
Administrar archivos de un proyecto con control de
código
fuente
Después de poner un proyecto de Visual FoxPro bajo control de código fuente, puede
trabajar con
archivos individuales o administrar el proyecto como un todo.
Trabajar con componentes multiarchivo
Algunos componentes de proyecto de Visual FoxPro están formados en realidad por varios
archivos:
un archivo principal y uno o más archivos implícitos. Por ejemplo, cuando cree un
formulario, Visual
FoxPro creará un archivo .scx (el archivo principal) y un archivo .sct (el archivo implícito).
Los
siguientes componentes tienen varios archivos:
Componente Tipo de archivo principal Tipos de archivos implícitos
Formulario .scx .sct
Informe .frx .frt
Etiqueta .lbx .lbt
Biblioteca de clases .vcx .vct
Menú .mnx .mnt
Tabla .dbf .fpt, .cdx, .idx
Base de datos .dbc .dct, .dcx
Manual del programador, Parte 10: Crear soluciones empresariales Página 15 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
Cuando un programador desprotege un archivo de componente, como un formulario, Visual
FoxPro
también administra los correspondientes archivos implícitos. Asimismo, cuando se vuelve a
proteger
un archivo o se agrega un archivo nuevo, Visual FoxPro administra los archivos implícitos
automáticamente.
Nota Si genera y compila un menú, también crea archivos .MPR y .MPX. Estos no están
inicialmente bajo control de código fuente, pero puede agregarlos como archivos a su
proyecto y, a
continuación, ponerlos bajo control de código fuente igual que lo haría con otros archivos.
Desproteger archivos
Cuando trabaja en un proyecto con control de código 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 Diseñador de formularios, Visual FoxPro puede
pedirle que
desproteja los archivos del formulario. (Si no desprotege los archivos, el formulario se
muestra en el
Diseñador de formularios, pero es de sólo lectura).
Sin embargo, también puede desproteger los archivos manualmente, lo cuál es útil si desea
acceso
exclusivo al archivo, pero de momento no quiere abrir el editor para el archivo. Podría
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 están
modificando
En la ficha Proyectos del cuadro de diálogo Opciones, asegúrese de que la opción
Desproteger
los archivos al modificarlos está activada y, a continuación, elija Aceptar.
Para hacer que este valor sea el predeterminado, elija Establecer como predeterminado y,
a
continuación, elija Aceptar.
Para desproteger archivos manualmente
1. En el Administrador de proyectos, seleccione el archivo con el que desea trabajar.
2. En el menú Proyecto, elija Control de código fuente y, a continuación, elija
Desproteger.
3. En el cuadro de diálogo Desproteger archivos, seleccione los archivos con los que desea
trabajar y, a continuación, haga clic en Aceptar.
Manual del programador, Parte 10: Crear soluciones empresariales Página 16 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
Proteger archivos
Siempre tiene que proteger los archivos manualmente. Visual FoxPro no protege
automáticamente un
archivo; por ejemplo, no protege un formulario cuando cierra el Diseñador de formularios.
En lugar
de ello, deja el archivo desprotegido de forma que pueda seguir modificándolo, llevárselo
fuera de la
oficina o trabajar con él de otra forma.
El resultado exacto del proceso de protección depende del archivo que está protegiendo y
del
software de control de código fuente. Para formularios, menús, etiquetas, bibliotecas de
clases y otros
tipos de archivos, el archivo se trata como un archivo binario y el software de control de
código
fuente convierte su nueva versión 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 períodos de tiempo, puede impedir que otros programadores
trabajen
con ellos e impedirá que se haga una copia de seguridad de la última versión del archivo
cuando se
realice la copia de seguridad a través de la red.
Para proteger un archivo
1. En el Administrador de proyectos, seleccione el archivo con el que desea trabajar.
2. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Proteger.
3. Escriba un comentario que describa las modificaciones que ha realizado.
4. En el cuadro de diálogo Proteger archivos, seleccione el archivo y, a continuación, elija
Aceptar.
Manual del programador, Parte 10: Crear soluciones empresariales Página 17 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
Proteger archivos de texto
Cuando proteja un archivo de texto, como un archivo .prg, y si hay varias versiones del
archivo
desprotegidas, el software de control de código fuente no se limita a sobrescribir la versión
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 líneas de código en su copia del archivo.
Cuando haya terminado la combinación, el software de control de código fuente también
podría darle
la oportunidad de proteger el archivo. No proteja el archivo inmediatamente, pruebe la
aplicación con
la nueva versión del archivo que incorpore sus modificaciones y las de los otros
programadores. Sólo
cuando esté satisfecho con el funcionamiento de la aplicación deberá proteger el archivo. Si
otros
programadores han realizado modificaciones posteriores al archivo, es posible que tenga
que
combinar, probar y proteger de nuevo.
En algunos casos, el software de control de código fuente puede informar de un conflicto de
combinación, que indica que no puede resolver las modificaciones suyas y las realizadas
por otros
programadores. Esto puede ocurrir, por ejemplo, si usted y otro programador han
actualizado las
mismas líneas del mismo programa. Si el software de control de código fuente no puede
combinar
correctamente, crea una versión del archivo que contiene el texto original junto con sus
modificaciones, marca los conflictos y escribe el archivo en su equipo. (La forma exacta en
que se
marcan los conflictos depende del software de control de código fuente que use). El archivo
aparece
entonces en el Administrador de proyectos con un icono de conflicto de combinación:
Para resolver el conflicto de combinación, tiene que volver a modificar el archivo,
implementar sus
cambios y quitar las marcas de conflicto de combinación. 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 combinación:
Pruebe su aplicación para asegurarse de que las modificaciones funcionan correctamente.
Entonces
podrá intentar proteger el archivo de nuevo. Si no ocurren más conflictos de combinación,
su archivo
se convierte en la versión actual.
Descartar modificaciones
Si ha desprotegido un archivo, pero decide descartar las modificaciones realizadas, puede
deshacer la
desprotección. 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 versión, deshaga la
desprotección en lugar
Manual del programador, Parte 10: Crear soluciones empresariales Página 18 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
error un archivo en lugar de simplemente obtener la última versión, deshaga la
desprotección en lugar
de volver a proteger el archivo. Esto impide que el sistema de control de código fuente
tenga que
crear otra versión del archivo, ahorrando tiempo y espacio.
Sugerencia Si quiere ver un archivo pero no tiene que desprotegerlo, puede obtener su
última
versión. Para obtener detalles, consulte Obtener la última versión de los archivos en la
siguiente
sección.
Para deshacer una desprotección
1. En el Administrador de proyectos, seleccione el archivo con el que va a trabajar.
2. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Deshacer
proteger.
3. En el cuadro de diálogo Deshacer desproteger archivos, asegúrese de que el archivo que
quiere
está seleccionado y, a continuación, haga clic en Aceptar.
Obtener las versiones más recientes de los archivos
Si desea ver la versión más reciente de un archivo, puede desprotegerlo. Sin embargo, si el
archivo ya
está desprotegido o si sólo desea ver el archivo (no modificarlo), puede obtener la última
versión de
un archivo. Cuando lo haga, Visual FoxPro copia la versión desprotegida más actual de un
archivo de
sólo lectura. Puede obtener la última versión de un archivo incluso si actualmente está
desprotegido.
Si el archivo que obtiene es un archivo de texto, el software de control de código fuente
combinará el
más reciente con su versión en lugar de simplemente sobrescribirla.
Nota Para combinar archivos al obtener la última versión, es posible que tenga que activar
esto
como opción en el software de control de código fuente. Para obtener detalles, consulte la
documentación de su software de control de código fuente.
Para obtener la versión más reciente de un archivo
1. En el Administrador de proyectos, seleccione el archivo del que desea la versión más
reciente.
2. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Obtener la
versión más reciente. Si el archivo está actualmente desprotegido, se le pide que
reemplace o
combine su versión desprotegida con la versión actual del proyecto con control de código
fuente.
Importante Si ya tiene desprotegido el archivo, Visual FoxPro le pide que lo desproteja. Si
ha realizado modificaciones en el archivo desde la última vez que lo protegió, elija No
cuando
se le pregunte si desea reemplazar el archivo.
Comparar archivos o proyectos
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 código
fuente. Esto
Manual del programador, Parte 10: Crear soluciones empresariales Página 19 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
de su directorio de trabajo con la copia maestra actual del proyecto con control de código
fuente. Esto
puede ayudarle a determinar si otro usuario ha modificado un archivo o puede ayudarle a
precisar en
dónde se han realizado las modificaciones desde que desprotegió el archivo.
La mayor parte de los sistemas de control de código fuente sólo pueden comparar y mostrar
las
diferencias entre archivos si están 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 sección.
Nota Si su proveedor de control de código fuente no admite las opciones de comparación
de
archivos, no estarán disponibles en el menú.
Para ver diferencias entre proyectos
En el menú Proyecto, elija Control de código fuente y, a continuación, elija Mostrar
diferencias entre proyectos.
El software de control de código fuente produce el informe resultante, de forma que la
información específica proporcionada puede variar. Sin embargo, en general, el sistema de
control de código fuente mostrará una ventana con dos paneles y resaltará o marcará las
diferencias entre las copias local y maestra del archivo.
Para ver diferencias entre archivos o la lista de proyecto
1. Si está viendo diferencias para un único archivo, seleccione en el Administrador de
proyectos
el archivo para el que desea ver las diferencias.
2. Para un único archivo, elija Control de código fuente en el menú Proyecto y, a
continuación,
elija Mostrar diferencias. Para la lista de proyecto, elija Control de código fuente en el
menú
Proyecto y, a continuación, elija Mostrar diferencias de lista de proyectos.
El software de control de código fuente produce el informe resultante, de forma que la
información específica proporcionada puede variar. En general, sin embargo, el sistema de
control de código fuente mostrará las dos versiones lado a lado, y resaltará o marcará las
líneas
nuevas, eliminadas y cambiadas.
Comprobar diferencias en formularios, informes y otros archivos de tabla
En Visual FoxPro, el software de control de código fuente sólo trata como archivos de texto
algunos
tipos de archivo. Entre estos están archivos de código 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 información sobre sus componentes. Por ejemplo, un archivo .scx
de un
formulario es una tabla de los controles del formulario, junto con información sobre el
mismo
formulario. Los archivos de tipo tabla se usan para almacenar información sobre formulario
(archivos
.scx), informes (archivos .frx), menús (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 código
fuente no pueden tratarlos como archivos de texto (el sistema de control de código fuente
los trata
Manual del programador, Parte 10: Crear soluciones empresariales Página 20 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
fuente no pueden tratarlos como archivos de texto (el sistema de control de código fuente
los 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 código 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 código fuente, Visual FoxPro creará una versión de
texto del
archivo, que mantendrá automáticamente mientras usted realiza modificaciones.
Representación de texto de archivos de Visual FoxPro
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.
Para especificar una utilidad de conversión de texto
1. En el cuadro de diálogo Opciones, elija el archivo Proyectos.
2. En el cuadro Generación de texto, escriba el nombre del programa de conversión.
3. Elija Establecer como predeterminado y, a continuación, elija Aceptar.
Visual FoxPro llama automáticamente al programa de conversión de texto siempre que
agregue un
Manual del programador, Parte 10: Crear soluciones empresariales Página 21 de 35
file://C:\temp\~hh11EF.htm 30/05/2000
Visual FoxPro llama automáticamente al programa de conversión de texto siempre que
agregue un
formulario, un informe, un menú, una etiqueta o un archivo a un proyecto con control de
código
fuente. La utilidad genera un archivo de texto que tiene el mismo nombre que el archivo
principal,
pero usa "A" como letra de la extensión. 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) después de modificarlo, el software de control de código fuente crea
automáticamente y
protege el archivo de texto.
Si especifica una utilidad de conversión de texto cuando ya tenga formularios, informes y
archivos
similares en su proyecto con control de código fuente, tiene que quitarlos temporalmente
del proyecto
y, a continuación, volver a agregarlos con la generación de texto activada.
Para generar representaciones de texto para archivos existentes en un proyecto
1. Haga una copia de seguridad de todos los archivos que se verán afectados: formularios,
informes, menús, etiquetas y bibliotecas de clases.
2. Compruebe que los archivos no están ya desprotegidos.
3. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Quitar los
archivos del control de código fuente.
4. Seleccione los archivos que desea quitar del proyecto y, a continuación, elija Aceptar.
5. Active generación de texto, siguiendo los pasos descritos anteriormente.
6. En el menú Proyecto, elija Control de código fuente y, a continuación, elija Agregar
archivos al control de código fuente.
7. Seleccione los archivos que desee agregar y, a continuación, elija Aceptar.
Al poner cada archivo bajo control de código fuente, Visual FoxPro también creará la
correspondiente representación de texto para el archivo.
Mostrar información de archivos y proyectos
Puede mostrar información 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 información disponible incluye normalmente:
El número de versión, que indica cuántas veces se ha protegido una nueva versión del
archivo o
la lista de proyecto.
Quién ha protegido el archivo o archivo de proyecto cada vez.
La fecha y la hora en que se protegió.
Los comentarios que el programador agregó al proteger el archivo o lista de proyecto.