Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
(Segundo Nivel)
1
Introducción
La versión 9.0 de Visual FoxPro cuenta con el SP1 en la que hay algunas
nuevas características y especialmente brinda estabilidad al producto.
Clases
Una clase se puede explicar como "la definición teórica del objeto"; ya que es
una especificación genérica para objetos que comparten el mismo
comportamiento, una clase contiene las bases para la construcción del objeto
definiendo cuáles serán las propiedades, métodos y eventos que este
contendrá, cuáles serán públicos y cuáles privados.
Como hemos visto hasta ahora las clases son una parte fundamental de la
programación orientada a objetos, todo lenguaje que se defina como "orientado
a objetos" nos ofrece una librería de clases de base sobre la cual se puede
comenzar a trabajar.
Las clases visuales son las que derivan en objetos que forman parte de la
interfaz grafica con el usuario; dentro de lo que son las clases visuales que nos
ofrece VFP tenemos el formulario y casi todos sus controles (botones, líneas,
labels, etc.); cada una de estas clases tiene en sus propiedades métodos y
eventos básicos que le corresponden a su tipo, y además pueden ser
personalizadas agregándoles según nuestra necesidad nuevas propiedades y
métodos (no eventos).
67
En contrapartida con las clases visuales, tenemos las clases NO visuales;
éstas son definiciones de objetos que utilizaremos dentro del desarrollo de
nuestra aplicación con el propósito de representar en este modo cada una de
las entidades de nuestro sistema (por ejemplo: cliente, factura, proveedor, etc.),
y cada acción que esté relacionada con dichas entidades estará codificada
dentro de esta clase, del mismo modo que cada dato identificativo de ella
estará depositado en una propiedad (ver el ejemplo de cliente anteriormente
creado).
Parámetros
ClassLibraryName
Especifica el nombre de la biblioteca de clases visuales que se va a
crear. Si ya existe una biblioteca de clases visuales con el nombre que
especifique y SET SAFETY está establecido en ON, Visual FoxPro le
pregunta si desea sobrescribir la biblioteca de clases visuales existente.
Si SET SAFETY está establecido en OFF, el archivo existente se
sobrescribe automáticamente.
Ejemplo
CREATE CLASS myform OF libcls AS "Form" (Crea una nueva clase dentro
de la librería de clases myclslib
68
ADD CLASS (Comando)
Parámetros
ClassName
Especifica el nombre de la definición de clase agregada a la biblioteca
de clases visuales .vcx ClassLibraryName2.
OF ClassLibraryName1
Especifica una biblioteca de clases visuales .vcx desde la que se copia
la definición de clase.
TO ClassLibraryName2
Especifica la biblioteca de clases visuales .vcx a la que se agrega la
definición de clase. Si especifica una biblioteca de clases visuales .vcx
que no existe, Visual FoxPro la creará y le agregará la definición de
clases.
OVERWRITE
Especifica que una definición de clase con el mismo nombre que la
definición de clase especificada con ClassName se sobrescribe. Se
generará un mensaje de error si omite OVERWRITE y ya existe una
definición de clase con el mismo nombre que ClassName en la biblioteca
de clases visuales .vcx.
Observaciones
Utilice ADD CLASS para agregar una definición de clase a una biblioteca de
clases o para copiar una definición de clase de una biblioteca de clases
visuales .vcx a otra. No es posible agregar una definición de clase desde un
programa o aplicación de Visual FoxPro (.prg o .app), ni tampoco desde un
archivo de procedimiento.
RELEASE CLASSLIB
Cierra una biblioteca de clases visuales .vcx que contiene definiciones de clase.
[, ClassLibraryName2 | ALIAS AliasName2 …]
69
RELEASE CLASSLIB ClassLibraryName1 | ALIAS AliasName1
Parámetros
Observaciones
Las bibliotecas de clases visuales .vcx se abren con SET CLASSLIB. Una vez
abierta la biblioteca, las definiciones de clase de la biblioteca de clases visuales
están disponibles para programas y desde la ventana Comandos.
Para cerrar todas las bibliotecas de clases visuales abiertas, ejecute SET
CLASSLIB TO sin argumentos adicionales.
Ejemplo
Parámetros
ClassName
Especifica el nombre de la definición de clase que desea quitar de la
biblioteca de clases visuales.
70
OF ClassLibraryName
Especifica el nombre de la biblioteca de clases visuales .vcx que
contiene la definición de clase que desea quitar. Si no se incluye la
extensión de archivo en ClassLibraryName, se utiliza la extensión .vcx.
Observaciones
Parámetros
ClassName1
Especifica el nombre de la definición de clase a la que se va a cambiar
el nombre.
OF ClassLibraryName
Especifica el nombre de la biblioteca de clases visuales .vcx que
contiene la definición de clase cuyo nombre desea cambiar. Si no
especifica una extensión de arc hivo en ClassLibraryName, Visual
FoxPro asignará automáticamente la extensión .vcx.
TO ClassName2
Especifica el nuevo nombre de la definición de clase.
Observaciones
Ejemplo
71
Aplicaciones Cliente Servidor
72
Visual Fox Pro nos ofrece acceso a los más diversos orígenes de datos, ODBC,
ADO, XML etc., para poder acceder a los mencionados repositorios de datos,
debemos según la tecnología de que se trate realizar la correspondiente
conexión.
El cual nos ofrece acceso a una base de datos SQL, a través del mismo,
nosotros tenemos la posibilidad de abrir una conexión con dic ho origen de
datos y ejecutar sentencias sobre este que devuelvan algún resultado, veamos
un rápido ejemplo de la forma de efectuar esto:
nConnHandle = SQLCONNECT("Prueba")
SQLEXEC(nConnHandle, "Select * from Customers", "Clientes")
73
Luego de ejecutar esto, tranquilamente podemos pedir un browse de los datos
recuperados, pruébalo, éste se verá así:
74
esta especificación de manejo de documentos y podemos recibir, procesar y
enviar documentos multi tabla en forma jerárquica y, lo más importante
establecer una comunicación de igual a igual con la arquitectura .NET a través
de esta metodología de transporte de datos.
Conexiones
Para recuperar datos desde un origen de datos remoto, use vistas remotas,
estas usan sintaxis SQL remota para seleccionar información de tablas
almacenadas en un origen de datos ODBC.
Nota Para crear una conexión es imprescindible tener abierta una base de
datos.
–O bien–
75
–O bien–
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:
76
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 canalización.
Cuando use una vista cuya información de inicio de sesión 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.
–O bien–
77
Usar una conexión existente
Puede utilizar una conexión con nombre ya existente para crear una vista
remota. Puede ver una lista de las conexiones disponibles en la base de datos
y utilizar el Administrador de proyectos o el comando DISPLA Y
CONNECTIONS.
–O bien–
Antes de que pueda crear vistas remotas o usar un paso a través de SQL, tiene
que instalar un controlador ODBC y configurar el origen de datos ODBC.
Para instalar los controladores ODBC para estos tipos de datos, use el
programa de instalación de Visual FoxPro. Si elige la opción de instalación
Completa, se instalan todos los controladores.
78
Para obtener información acerca de cómo configurar un origen de datos
específico del controlador elegido, elija el botón Ayuda en el cuadro de diálogo
Configuración de ODBC.
79
Utilizar la tecnología de paso a través de SQL
Vistas remotas
Paso a través de SQL
Las vistas remotas proporcionan el método más común y más fácil para tener
acceso a datos remotos y actualizarlos. Los asistentes para conversión pueden
crear automáticamente vistas remotas en la base de datos como parte del
conversión, o puede usar Visual FoxPro para crear vistas remotas después de
hacer la conversión. Para obtener más información acerca de las vistas
remotas.
80
persistente en bases de datos. para cursor de paso a través de SQL,
sobre la base de propiedades de
sesiones.
Utiliza búsqueda progresivaEs compatible con búsqueda asíncrona a
asíncrona al ejecutar SQL. través de programa.
Para usar el paso a través de SQL para conectarse a un origen de datos ODBC
remoto, debe llamar en primer lugar a la función SQLCONNECT( ) de Visual
FoxPro para crear una conexión. Una vez hecho esto, use las funciones de
paso a través de SQL para enviar comandos al origen de datos remoto para su
ejecución.
81
Para usar funciones de paso a través de SQL de Visual FoxPro
nConnectionHandle =
SQLCONNECT('sqlremote','<userid>','<password>')
? SQLEXEC(nConnectionHandle,"select * from
authors","mycursorname")
BROWSE
La siguiente tabla muestra las funciones SQL de Visual FoxPro que admiten el
trabajo con orígenes de datos remotos, agrupados según la tarea.
82
Control y ejecución SQLCANCEL( ) Cancelar una consulta SQL
de instrucciones que se ejecuta de forma
SQL asíncrona en una conexión
activa.
SQLEXEC( ) Ejecutar una consulta de
paso a través de SQL en una
conexión activa; devuelve el
número de conjuntos de
resultados generados o 0 si
SQLEXEC( ) se sigue
ejecutando (procesamiento
asíncrono).
SQLMORERESULTS( ) Colocar otro conjunto de
resultados en un cursor.
Devuelve 0 si la instrucción
que crea el conjunto de
resultados se sigue
ejecutando.
SQLPREPARE( ) Precompilar la instrucción
SQL en el origen de datos y
vincular los parámetros de
Visual FoxPro, es decir,
guardar las expresiones de
parámetros reales para todos
los parámetros de la
instrucción SQL.
SQLCOMMIT( ) Solicitar una confirmación de
transacción.
SQLROLLBACK( ) Solicitar que se deshaga una
transacción.
Información deSQLCOLUMNS( ) Almacenar una lista de
origen de datos nombres de columnas e
información acerca de cada
una en un cursor. Devuelve 1
si la función tiene éxito o 0 si
la función se sigue
ejecutando.
SQLTABLES( ) Almacenar los nombres de
tablas del origen en un
cursor. Devuelve 1 si la
función tiene éxito o 0 si la
función se sigue ejecutando.
Control variado SQLGETPROP( ) Obtener una propiedad de
conexión de una conexión
activa.
SQLSETPROP( ) Establecer una propiedad de
una conexión activa.
83
Las instrucciones SQLEXEC( ), SQLMORERESULTS( ), SQLTABLES( ) y
SQLCOLUMNS( ) se pueden cancelar en modo síncrono al presionar ESC si
SET ESCAPE está activado. Puede cancelar estas instrucciones en cualquier
momento en modo asíncrono si ejecuta SQLCANCEL( ). Todas las demás
instrucciones de paso a través de SQL funcionan de forma síncrona y no se
pueden interrumpir.
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 la sintaxis nativa del servidor.
–O bien–
84
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:
85
OPEN DATABASE testdata
CREATE SQL VIEW product_remote_view ;
CONNECTION remote_01 ;
AS SELECT * FROM products
Para tener acceso a los datos remotos de una vista, puede usar una conexión
existente o crear una conexión para usar la nueva vista.
–O bien–
También puede crear una vista remota con un Asistente para vistas. Para
configurar una vista actualizable mediante tablas de un origen de datos ODBC,
utilice el Asistente para vistas remotas.
86
Para crear una vista remota con un asistente
87
Propiedades de cursor de Visual FoxPro
88
del cursor se envían a las tablas
en las que se basa el cursor.
BatchUpdateCount Especifica el número de
instrucciones de actualización
enviadas al servidor backend
para tablas almacenadas en
búfer.
Tables* Lista delimitada por comas de
nombres de tablas del origen de
datos; se usa para definir el
alcance de las propiedades
UpdateNameList y
UpdatableFieldsList.
KeyFieldList* Lista delimitada por comas de
campos de Visual FoxPro que
representan la clave principal
del conjunto de resultados
utilizado para las
actualizaciones.
UpdateNameList* Lista delimitada por comas que
combina los campos de Visual
FoxPro del cursor con los
nombres de tabla y columna de
los campos a los que desea
enviar las actualizaciones.
UpdatableFieldList* Lista delimitada por comas de
los campos de Visual FoxPro
para los que se envían
actualizaciones.
Almacenamiento enEspecifica el tipo de
búfer almacenamiento en búfer que
se ejecuta en el cursor.
UpdateType Especifica si se debe realizar
una actualización utilizando
cláusulas UPDATE o DELETE,
y luego INSERT.
WhereType Especifica qué se debe incluir
en la cláusula WHERE para las
actualizaciones de los datos de
la tabla.
89
Usar la ficha Datos remotos del cuadro de diálogo Opciones
Cuando cree un cursor, éste heredará los valores de sus propiedades, tales
como UpdateType y UseMemoSize, del cursor del entorno o del cursor 0 de la
sesión actual. Puede cambiar estos valores predeterminados de las
propiedades mediante la función CURSORSETPROP( ) con 0 como número de
cursor.
90
Tras crear un cursor de vista con paso a través de SQL, puede modificar los
valores de las propiedades del cursor activo mediante la función
CURSORSETPROP( ) para el cursor de vista. Los cambios que realice con
CURSORSETPROP( ) serán temporales: los valores temporales de la vista
activa desaparecen cuando se cierra dicha vista y los valores temporales del
cursor 0 se eliminan cuando se cierra la sesión de Visual FoxPro.
Tanto los cursores de vista de paso a través de SQL como las conexiones con
nombre pueden utilizar un origen de datos ODBC con nombre. Si utiliza un
origen de datos ODBC en un cursor de vista de paso a través de SQL, la
conexión heredará sus propiedades de los valores predeterminados de la
sesión.
91
Herencia de las propiedades de cursor y conexión de paso a través de
SQL (SPT)
92
Actualizar datos
–O bien–
CURSORSETPROP('Buffering', 2)
93
El ejemplo siguiente muestra cómo actualizar registros cuando está activado el
almacenamiento pesimista de registros en búfer.
Código Comentarios
OPEN DATABASE testdata En el código Init del
USE customers formulario, abre la tabla y
CURSORSETPROP('Buffering', 2) activa el almacenamiento
pesimista de registros en
búfer.
lModified = .F.
FOR nFieldNum = 1 TO FCOUNT() Se desplaza por campos y
IF GETFLDSTATE(nFieldNum) = 2 comprueba los que se han
lModified = .T. modificado.
EXIT
ENDIF Nota Este código podría
ENDFOR estar en el evento Click de
un botón de comando
"Guardar" o "Actualizar".
IF lModified Busca el siguiente registro
nResult = MESSAGEBOX; modificado.
("El registro fue modigiaco. Guardarlo?", ;
4+32+256, "Datos cambiaron")
IF nResult = 7 Muestra el valor actual y da
TABLEREVERT (.F.) al usuario la posibilidad de
ENDIF invertir el cambio del
ENDIF campo actual.
SKIP
IF EOF()
MESSAGEBOX( "already at bottom")
SKIP -1 SKIP garantiza que se
ENDIF escribe el último cambio.
THISFORM.Refresh
94
Ajustar segmentos de código
Visual FoxPro proporciona tres comandos y una función para administrar una
transacción:
Para Utilice
Iniciar una transacción BEGIN TRANSACTION
Determinar el nivel actual de la transacción TXNLEVEL( )
Invertir todos los cambios realizados desde laROLLBACK
instrucción BEGIN TRANSACTION más reciente
Bloquear registros, grabar en disco todos losEND TRANSACTION
cambios realizados en tablas de la base de datos
desde la instrucción BEGIN TRANSACTION más
reciente y, a continuación, desbloquear los
registros
95
transacción, podrá deshacer una actualización errónea, resolver la causa del
error y, a continuación, volver a intentar TABLEUPDATE( ) sin perder datos. De
este modo se asegurará de que la actualización se produce como una
operación de "todo o nada".
BEGIN TRANSACTION
* Update records
IF lSuccess = .F. && an error occurs
ROLLBACK
ELSE && commit the changes
* Validate the data
IF && error occurs
ROLLBACK
ELSE
END TRANSACTION
ENDIF
ENDIF
Usar transacciones
96
No es posible utilizar el comando INDEX si sobrescribe un archivo de
índice existente o si hay abierto algún archivo de índice .cdx.
Las transacciones pertenecen al ámbito de las sesiones de datos.
Anidar transacciones
97
Observe en el ejemplo siguiente que, puesto que los cambios en una
transacción anidada no se escriben en disco, sino en el búfer de transacciones,
la transacción más interna sobrescribirá los cambios realizados en los mismos
campos STATUS de la transacción anterior:
Código Comentarios
DO WHILE TXNLEVEL( ) > 0 Limpia el entorno de otras
ROLLBACK transacciones.
ENDDO
CLOSE ALL Establece el entorno para
SET MULTILOCKS ON el almacenamiento en
SET EXCLUSIVE OFF búfer.
OPEN DATABASE test
USE mrgtest1
CURSORSETPROP('buffering',5) Activa el almacenamiento
GO TOP optimista de tablas en
búfer.
REPLACE fld1 WITH "changed" Cambia un registro.
SKIP
REPLACE fld1 WITH "another change" Cambia otro registro.
MESSAGEBOX("modify first field of both" + ;
"records on another machine")
BEGIN TRANSACTION Inicia la transacción 1 e
lSuccess = TABLEUPDATE(.T.,.F.) intenta actualizar todos los
registros modificados que
no están vigentes.
98
IF lSuccess = .F. Si se producen errores en
ROLLBACK la actualización, deshace la
AERROR(aErrors) transacción.
DO CASE Obtiene un error de
CASE aErrors[1,1] = 1539 AERROR( ).
... Determina la causa del
CASE aErrors[1,1] = 1581 error.
... Si un desencadenante ha
CASE aErrors[1,1] = 1582 producido errores,
soluciona el problema.
Si un campo no acepta
valores nulos, soluciona el
problema.
Si se ha infringido una
regla de campo, soluciona
el problema.
CASE aErrors[1,1] = 1585 Si otro usuario ha
nNextModified = getnextmodified(0) modificado un registro,
DO WHILE nNextModified <> 0 localiza el primer registro
GO nNextModified modificado.
RLOCK() Hace un bucle a través de
FOR nField = 1 to FCOUNT() todos los registros
cField = FIELD(nField) modificados, comenzando
con el primero.
if OLDVAL(cField) <> CURVAL(cField) Bloquea cada registro para
asegurarse de que se
puede actualizar.
Comprueba si hay cambios
en cada campo.
Compara el valor
almacenado en búfer con
el valor en disco; a
continuación, muestra un
cuadro de diálogo al
usuario.
nResult = MESSAGEBOX;
("Data was changed " + ;
"by another user — keep"+ ;
"changes?", 4+48, ;
"Modified Record")
IF nResult = 7 Si el usuario responde
TABLEREVERT(.F.) "No", invierte el registro
UNLOCK record nNextModified uno y lo desbloquea.
ENDIF
EXIT Sale del bucle "FOR
99
ENDIF nField...".
ENDFOR
ENDDO Obtiene el siguiente
registro modificado.
BEGIN TRANSACTION Inicia la transacción 2 y
TABLEUPDATE(.T.,.T.) actualiza todos los
END TRANSACTION registros no invertidos que
UNLOCK están en vigor.
Finaliza la transacción 2.
Libera el bloqueo.
CASE aErrors[1,1] = 109 Si el registro está en uso
... por otro usuario, soluciona
CASE aErrors[1,1] = 1583 el problema.
...
CASE aErrors[1,1] = 1884 Si se ha infringido una
... regla de fila, soluciona el
OTHERWISE problema.
MESSAGEBOX( "Unknown error "+;
"message: " + STR(aErrors[1,1])) Si hubo una infracción de
ENDCASE índice único, soluciona el
problema.
De lo contrario, muestra un
cuadro de diálogo al
usuario.
ELSE
END TRANSACTION Termina la transacción 1.
ENDIF
100
Mediante el almacenamiento en búfer es posible detectar y resolver fácilmente
conflictos en operaciones de actualización de datos: el registro actual se copia
a una ubicación de memoria o de disco administrada por Visual FoxPro. Los
demás usuarios podrán seguir eniendo t acceso al registro original
simultáneamente. Cuando se desplace fuera del registro o intente actualizarlo
mediante programación, Visual FoxPro intentará bloquear el e r gistro,
comprobará que otros usuarios no hayan realizado cambios y, a continuación,
escribirá las modificaciones. Después de intentar actualizar los datos, deberá
resolver los conflictos que impiden que las modificaciones se escriban en la
tabla original.
101
de actualización de datos que realizan otros usuarios en un entorno
multiusuario.
102
Para activar Utilice este valor
Sin almacenamiento en búfer. El alor
v 1
predeterminado.
CURSORSETPROP("Buffering", 2)
103
Para activar el bloqueo optimista de registros en el área de trabajo actual
CURSORSETPROP("Buffering", 3)
CURSORSETPROP("Buffering", 4)
CURSORSETPROP("Buffering", 5)
Visual FoxPro escribe los registros en un búfer y permite modificarlos hasta que
se ejecute un comando TABLEUPDATE( ). A continuación, Visual FoxPro
llevará a cabo la siguiente secuencia en cada registro del búfer:
104
Cuando se activa el almacenamiento de tablas en búfer, Visual FoxPro sólo
intentará realizar actualizaciones después de que se ejecute el comando
TABLEUPDATE( ).
Nota Las tablas con valores de campo auto incremental agrega registros con
búfer de tabla aproximadamente un 35% más lento que las tablas sin valores
de campo auto incremental, lo cual podría afectar el rendimiento. Cuando utilice
búfer de tabla, la cabecera de la tabla se bloquea cuando se agrega el registro.
105
2. Utilice el comando DELETE para marcar el registro para su eliminación.
3. Utilice el comando TABLEREVERT( ) para quitar el registro del búfer.
Recupera datos de una o más tablas. El comando SELECT SQL está incluido
en Visual FoxPro como cualquier otro comando de Visual FoxPro. Cuando
utilice SELECT para hacer una consulta, Visual FoxPro interpreta la consulta y
recupera los datos especificados de las tablas. Puede crear un consulta
SELECT en la siguiente forma:
Ventana de Comandos
Programa de Visual FoxPro como con cualquier otro comando de Visual
FoxPro
Diseñador de consultas
106
Parámetros
SELECT
Especifica los campos, constantes y expresiones que se mostrarán en el
resultado de la consulta.
ALL
De forma predeterminada, se muestran todas las filas del resultado de la
consulta.
DISTINCT
Excluye duplicados de cualquier fila del resultado de la consulta. Puede
utilizar DISTINCT únicamente una vez por cada cláusula SELECT.
[Alias.] Select_Item
Califica nombres de elementos coincidentes. Select_Item especifica un
elemento que se incluirá en el resultado de la consulta. Un elemento
puede ser uno de los siguientes:
107
Una expresión que puede ser el nombre de una función definida
por el usuario (FDU).
[AS] Column_Name
Especifica el título de una columna en el resultado de la consulta.
Column_Name puede ser una expresión, pero no puede contener
caracteres (por ejemplo, espacios) que no estén permitidos para
nombres de campos de tablas.
[[AS] Local_Alias]
Especifica un nombre temporal para la tabla indicada en Table. Si
especifica un alias local, debe utilizar el alias local en lugar del nombre
de la tabla en toda la instrucción SELECT.
108
las filas que coincidan procedentes de la tabla a la derecha de la palabra
clave JOIN. La palabra clave OUTER es opcional; se puede incluir para
resaltar que se ha creado una combinación externa.
INTO Destination
109
Incluya DATABASE DatabaseName para especificar una base de
datos a la que se agregará la tabla.
PREFERENCE PreferenceName
Si el resultado de una consulta se envía a una ventana Examinar,
guarda los atributos y opciones de la ventana Examinar para utilizarlos
después. Para más información acerca de como funcion a
PREFERENCE vea la sección Observaciones.
NOCONSOLE
Impide que el resultado de la consulta se envíe a un archivo, a la
impresora o a la ventana principal de Visual FoxPro.
PLAIN
Impide que aparezcan los encabezados de las columnas al mostrar los
resultados de la consulta. PLAIN puede utilizarse tanto si está presente
una cláusula TO como si no. Si se incluye una cláusula INTO, se pasará
por alto PLAIN.
NOWAIT
Continúa la ejecución del programa después de abrir la ventana
Examinar y de dirigir a ella los resultados de la consulta. El programa no
esperará a que la ventana Examinar se cierre, sino que continuará con
la ejecución de la línea de programa inmediatamente siguiente a la
110
instrucción SELECT. Para una explicación sobre como puede utilizar
NOWAIT, vea la sección Observaciones.
WHERE JoinCondition
Especifica que Visual FoxPro sólo debe incluir en los resultados de la
consulta los registros que satisfagan los criterios especific ados.
JoinCondition especifica los campos que vinculan las tablas de al
cláusula FROM. Para más información acerca de especificar
condiciones de combinación, vea la sección Observaciones.
FilterCondition
Especifica los criterios que deben satisfacer los registros para ser
incluidos en los resultados de la consulta. Una consulta puede incluir
tantas condiciones de filtro como desee, conectadas con el operador
AND y OR. También puede utilizar el operador NOT para invertir el valor
de una expresión lógica o utilizar EMPTY( ) para comprobar si hay
campos vacíos.
111
Puede utilizar una instrucción SELECT conteniendo una cláusula
HAVING sin incluir una cláusula GROUP BY si SELECT no contiene
funciones de agrupación. La cláusula HAVING sin una cláusula GROUP
BY actúa como una cláusula WHERE. Si la cláusula HAVING no
contiene funciones de campo, utilice la cláusula WHERE para acelerar el
rendimiento.
Cuando una de las columnas tiene tipo Memo o General, las uniones de
diferentes tipos de columna no está permitida.
112
DESC especifica un orden descendente para los resultados de la
consulta.
Observaciones
Si no hay una tabla abierta cuando se usa la cláusula FROM, Visual FoxPro
muestra el cuadro de diálogo Abrir para que se pueda especificar la ubicación
del archivo. Una vez abierta, la tabla permanece abierta después de completar
la consulta.
113
PreferenceName la primera vez, crea las preferencias. Ejecutar después
SELECT con el mismo nombre para preferencia restaura la ventana Examinar
con las preferencias establecidas. Cuando la ventana Examinar se cierra, las
preferencias se actualizan. Si sale de una ventana Examinar presionando
CTRL+Q+W, no se guardan en el archivo de recursos los cambios que haya a
la ventana.
Si incluye más de una tabla en una consulta, deberá especificar una condición
de combinación para cada tabla después de la primera.
Operador Comparación
= Igual
== Exactamente igual
LIKE SQL LIKE
<>, !=, # Distinto de
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
114
comparaciones de cadenas. Vea SET ANSI y SET EXACT para obtener
información adicional acerca de cómo realiza Visual FoxPro las comparaciones
de cadenas.
Las siguientes funciones de campo están disponibles para ser utilizadas con un
elemento seleccionado que sea un campo o una expresión que incluya a un
campo:
115
Cuando se obtiene el resultado de una consulta, las columnas se denominan
según las siguientes reglas:
116
Si prueba y descubre una manipulación teóricamente prohibida que
funciona correctamente en una versión determinada de FoxPro, eso no
significa que también funcione en versiones posteriores.
117
contiene 100 códigos postales vacíos e INVOICE contiene 400 códigos
postales vacíos, el resultado de la consulta contendrá 40.000 registros
más, como resultado de los campos vacíos. Use la función EMPTY( )
para eliminar los registros vacíos del resultado de la consulta.
El número de combinaciones que puede utilizar está limitado. Por cada
instrucción SELECT se admiten nueve combinaciones como máximo.
118
Currency Currency Currency
Date Date Date
Date DateTime DateTime
DateTime DateTime DateTime
Double (N) Float (X,Y) Float (MAX(MAX(8,Y),2))
Double (N) Integer Double (N)
Double (N) Numérico (X,Y) Double (MAX(MAX(8,Y),2))
Double (X) Double (Y) Double (MAX(X,Y))
Float (N,M) Double (X) Float (20, MAX(M,X))
Float (N,M) Float (X,Y) Float (MAX(N,M), MAX(X,Y))
Float (N,M) Numérico (X,Y) Float (MAX (N,X),
MAX(M,Y))
Integer Currency Currency
Integer Double (X) Double (X)
Integer Float (X,Y) Float (MAX(11,X), Y)
Integer Integer Integer
Integer Numérico (X,Y) Numérico (MAX(11,X), Y)
Logical Logical Logical
Numérico (N,M) Double (X) Numérico (20, MAX(M,X))
Numérico (N,M) Float (X,Y) Float (MAX(N,X), MAX(M,Y))
Numérico (N,M) Numérico (X,Y) Numérico (MAX(N,X),
MAX(M,Y))
Ejemplos
Ejemplo 1
customer.cust_id = orders.cust_id
Ejemplo 2
119
Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición
de comparación para todos los valores generados por la subconsulta antes de
que se incluya el registro en el resultado de la consulta.
company < ANY (SELECT company FROM customer WHERE country = "UK")
Ejemplo 4
company < ANY (SELECT company FROM customer WHERE country = "UK")
Ejemplo 5
Este ejemplo comprueba si los valores del campo están dentro de un intervalo
de valores especificado.
EXISTS ;
(SELECT * FROM orders WHERE customer.postalcode = orders.postalcode)
Ejemplo 7
Cuando una condición de filtro incluye IN, el campo debe contener uno de los
valores antes de que el registro se incluya en los resultados de la consulta.
120
Ejemplo 8
Aquí, el campo debe contener uno de los valores devueltos por la subconsulta
antes de que su registro se incluya en los resultados de la consulta.
customer.cust_id IN ;
(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
Ejemplo 9
Esta condición de filtro busca cada uno de los campos que coinciden con
cExpression. Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como
parte de cExpression. El signo de porcentaje representa a cualquier secuencia
de caracteres desconocidos en la cadena. El subrayado representa un solo
carácter desconocido en la cadena.
Los siguientes ejemplos ilustran como utilizar funciones definidas por el usuario
con el comando SELECT SQL:
Ejemplos
Ejemplo 1
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT customer.company ;
FROM customer
121
Ejemplo 2
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
INNER JOIN orders y ON x.cust_id = y.cust_id
Ejemplo 3
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT DISTINCT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id
Ejemplo 4
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT country, postalcode, company ;
FROM customer ;
ORDER BY country, postalcode, company
Ejemplo 5
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
122
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id ;
INTO TABLE custship.dbf
BROWSE
Ejemplo 6
El ejemplo 6 muestra únicamente los registros con una fecha de pedido anterior
al 16/02/1994.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x, orders y ;
WHERE x.cust_id = y.cust_id ;
AND y.order_date < {^1994-02-16}
Ejemplo 7
El ejemplo 7 muestra todos los clientes, pero sólo las órdenes con una fecha
anterior a 02/16/1994.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT x.company, y.order_date, y.shipped_on ;
FROM customer x ;
LEFT JOIN orders y ;
ON x.cust_id = y.cust_id ;
AND y.order_date < {^1994-02-16}
Ejemplo 8
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT company FROM customer x WHERE ;
EXISTS (SELECT * FROM orders y WHERE x.postalcode = y.postalcode)
Ejemplo 9
123
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.country LIKE "U_"
Ejemplo 10
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer x WHERE x.country LIKE "U_"
Ejemplo 11
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT UPPER(city) AS CityList FROM customer
Ejemplo 12
Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el
carácter de porcentaje, esta consulta no devolverá ningún resultado.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\_%" ESCAPE "\"
Ejemplo 13
124
Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el
carácter de subrayado, esta consulta no devolverá ningún resultado.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%\_%" ESCAPE "\"
Ejemplo 14
Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el
carácter de signo de porcentaje, esta consulta no devolverá ningún resultado.
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer;
WHERE company LIKE "%-%--%" Escape "-"
125