Consultas y Vistas

28
Edmundo A. Cáceres Consultas y Vistas 2007

Transcript of Consultas y Vistas

Page 1: Consultas y Vistas

Edmundo A. Cáceres

Consultas y Vistas

2007

Page 2: Consultas y Vistas
Page 3: Consultas y Vistas

CONSULTAS Y VISTAS 1. Nociones preliminares Consultas y vistas

Una consulta o una vista, similares en la mayoría de sus aspectos, son una instrucción de un lenguaje llamado SQL. Procesan datos de una o más tablas de entrada, produciendo una salida con formato de ta-bla, de existencia temporal. "Temporal" significa que VFP destruye esa salida automáticamente cuando se deja de usar. Por ello no se llama tabla, pues una tabla permanece grabada en disco, sino cursor, porque existe solamente en la memoria interna. Esto no impide que en ocasiones se lo pueda convertir en tabla.

Los registros del cursor de salida pueden ser resultado: (a) de los campos de una tabla de entrada; (b) de los campos de varias tablas de entrada, debidamente combinadas; (c) de resumir grupos de registros de entrada, de una o varias tablas. Obviamente, deberemos precisar qué son combinaciones y grupos.

Los registros de salida pueden obtenerse sin orden alguno, o pueden ordenarse por uno o más cam-pos. A veces se necesita que una vista o consulta trabaje no con todos, sino solamente con algunos regis-tros de las tablas de entrada. En este caso, hay que filtrar los registros de entrada. Los filtros son condi-ciones que deben cumplir los registros de entrada para ser procesados por la consulta o la vista. Digamos que es posible usar, como si fueran tablas de entrada, cursores resultantes de vistas previas.

Estas ideas irán aclarándose si introducimos algunos ejemplos. Sean dos tablas, Clientes y Depósitos, cuyos contenidos se dan en la Figura 1. Como puede verse, Clientes tiene los datos personales de los clientes y Depósitos los importes depositados por ellos.

Tabla Clientes Cliente Nombre Domicilio Provincia CP Teléfono

1 Ruiz, Pedro Salta 1080 N San Juan 5400 433-2550 2 Bustos, Estela San Martín 453 La Rioja 520-3027 3 García, José Jujuy 420 S San Juan 5400 427-5960

Tabla Depósitos Cliente Depósito Fecha Importe

2 30127 10-06-2000 1200 1 30128 12-06-2000 350 1 30129 17-06-2000 800 2 30130 17-06-2000 420 3 30131 18-06-2000 715 2 30132 18-06-2000 420 3 30133 19-06-2000 507

Figura 1. Tablas Clientes y Depósitos

Ejemplo 1. Creemos una consulta que contenga los campos Nombre y Cliente, ordenados por Nombre. En este caso, para "fabricar" la salida solamente hará falta la tabla Clientes. El resultado de la consulta se-rá el mostrado por la Figura 2. Podemos ver que cada registro de salida ha sido formado por cada registro de entrada. Las consultas y vistas permiten indicar los campos de entrada con los cuales queremos traba-jar y por cuáles de ellos queremos ordenar los registros de salida.

Page 4: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

2

Nombre Cliente Bustos, Estela 2 García, José 3 Ruiz, Pedro 1

Figura 2. Cursor salida de la consulta del Ejemplo 1

Ejemplo 2. Creemos una consulta con los campos Cliente, Nombre, Fecha e Importe, ordenada por Clien-te. En este caso, es necesario usar campos de ambas tablas. Notemos que cada registro de la tabla Clien-tes tiene varios registros correspondientes en la tabla Depósitos, como indica el campo en común Cliente. Cuando hay más de una tabla de entrada, la correspondencia que advertimos visualmente se debe explici-tar en la consulta. En SQL no se habla de relación, sino de combinación, queriendo decir que el resultado requerido es una combinación de campos de ambas tablas. La combinación necesita algo en común en ambas tablas para poder lograrse, pero no requiere índices, como pasa en las relaciones de VFP. El resul-tado de la consulta será el que muestra la Figura 3.

Cliente Nombre Fecha Importe 1 Ruiz, Pedro 12-06-2000 350 1 Ruiz, Pedro 17-06-2000 800 2 Bustos, Estela 10-06-2000 1200 2 Bustos, Estela 17-06-2000 420 2 Bustos, Estela 18-06-2000 420 3 García, José 18-06-2000 715 3 García, José 19-06-2000 507

Figura 3. Cursor salida de la consulta del Ejemplo 2

En este ejemplo, aunque la tabla Clientes tiene tres registros, aparece información de ellos en los siete

registros de salida. Esto se debe a que la consulta ha tomado el registro de Clientes cuyo campo Cliente vale 1 y lo ha combinado con dos registros de Depósitos cuyos campos Cliente tienen igual valor. De la misma manera ha combinado los demás registros. La Figura 4 muestra los campos que toma de una y otra tabla de entrada, para lograr los resultados de la Figura 3. Advierta que el campo Cliente de la salida se puede tomar de una u otra de las tablas de entrada.

Tabla Clientes Tabla Depósitos Cliente Nombre Cliente Fecha Importe

1 Ruiz, Pedro 1 12-06-2000 350 1 17-06-2000 800

2 Bustos, Estela 2 10-06-2000 1200 2 17-06-2000 420 2 18-06-2000 420

3 García, José 3 18-06-2000 715 3 19-06-2000 507

Figura 4. Combinaciones de los registros de Clientes con los registros de Depósitos

El resultado de la vista o consulta es una "mezcla" o combinación de campos de ambas tablas, cuando

coinciden en el valor del campo Cliente. De un modo más general, y sin perder exactitud, podemos decir que también se combinan los registros. Con mayor generalidad aún, podemos hablar de combinación de

Page 5: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

3

tablas, entendiendo que es el criterio que ellas deben observar para combinar sus registros. La combinación puede realizarse, como es de suponer, entre dos, tres, cuatro, etc. tablas, para lo cual

hay que observar una regla muy sencilla, que veremos luego. Ejemplo 3. Creemos una vista como la del Ejemplo 2, pero solamente para los clientes 1 y 2. En este ca-so, debemos filtrar los registros de entrada, para que ingresen a la vista solamente los registros de tales clientes. El resultado será el de la Figura 5.

Cliente Nombre Fecha Importe 1 Ruiz, Pedro 12-06-2000 350 1 Ruiz, Pedro 17-06-2000 800 2 Bustos, Estela 10-06-2000 1200 2 Bustos, Estela 17-06-2000 420 2 Bustos, Estela 18-06-2000 420

Figura 5. Cursor de salida de la consulta del Ejemplo 3

Ejemplo 4. Creemos una vista que resuma los depósitos de cada cliente. Por ahora queremos los campos Cliente y la suma de Importe. Nuestra tabla de entrada será Depósitos. Debemos resumir los registros de entrada, es decir "agruparlos", por el campo Cliente. El resultado de la vista será el de la Figura 6.

Cliente Sum _ A 1 1150 2 2040 3 1222

Figura 6. Cursor de salida de la vista del Ejemplo 4

Del ejemplo se infiere que, al agrupar, debemos indicar: (1) por qué campo queremos el agrupamiento

y (2) qué campos queremos resumir. Para agrupar hemos usado el campo Cliente. Para resumir podemos usar funciones de suma, promedio, cuenta, valor máximo o valor mínimo. En este caso, hemos empleado la expresión sum(importe), que la vista toma como un campo de salida.

En la Figura 6 se puede ver que el campo resumen tiene el nombre Sum_A. Esto se debe a que no le hemos dado un nombre apropiado, dejando que la vista invente uno. Si hubiéramos querido que se llama-ra Total, deberíamos haber usado la expresión sum(importe) as total.

En el ejemplo, sería ilógico incluir los demás campos de Depósitos, pues no hay forma de resumir los números de depósito ni las fechas. Esta falta de coherencia no quiere decir que la vista no pueda incluir-los. De haberlo hecho, aparecería en ella el último valor de tales campos en cada grupo.

Note, por otro lado, que el agrupamiento no está limitado a un solo campo, sino que puede usar varios, los cuales se tratan jerárquicamente. Por ejemplo, si agrupa por dos campos, la vista hará grupos por el primer campo; y en cada grupo hará subgrupos por el segundo campo.

Finalmente, observe la diferencia entre el agrupamiento de las vistas y consultas con el agrupamiento de datos de los informes. En las vistas y consultas, al agrupar, necesariamente se produce un solo registro de salida por cada grupo. Así, en el Ejemplo 4, se ha producido un registro para el cliente 1, que tiene dos depósitos, un registro para el cliente 2, que tiene tres depósitos, y un registro para el cliente 3, que tiene dos depósitos. En los informes, por su parte, el agrupamiento permite dar un encabezado para el grupo, el detalle de los registros que lo componen y un pie de grupo, que se usa normalmente para resumirlos.

Page 6: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

4

Ejemplo 5. Sea el mismo problema anterior, pero agregando los nombres de cliente. En este caso, habrá que usar las dos tablas. El resultado será el de la Figura 7.

Cliente Nombre Total 1 Ruiz, Pedro 1150 2 Bustos, Estela 2040 3 García, José 1222

Figura 7. Cursor salida de la vista del Ejemplo 5

Condiciones de combinación

Una condición de combinación es un requisito para combinar dos tablas. Si una consulta o vista usa una sola tabla de entrada, no se puede definir ninguna condición de combinación. Pero si la vista incluye dos o más tablas de entrada, a partir de la segunda es necesario definir una condición de combinación por cada tabla adicional.

De modo similar a una relación permanente o temporal, cada condición de combinación une dos tablas. Tiene el siguiente formato:

Tabla izquierda.Campo izquierdo Operador Tabla derecha.Campo derecho

Tabla izquierda, Tabla derecha son los nombres de dos tablas distintas, libres o de base de datos. También pueden ser vistas previas. La inclusión de los nombres de las tablas es necesaria para precisar de dónde provienen los campos. Deben separarse de los campos con un punto.

Campo izquierdo, Campo derecho son dos campos, uno de cada tabla, que deben ser comparables. Esto significa que ambos deben tener el mismo tipo de datos o tipos compatibles. Por ejemplo, si campo izquierdo es de caracteres, campo derecho también debe serlo; si campo izquierdo es de fecha, campo derecho debe ser de fecha o fecha-hora. No es necesario que ambos campos tengan el mismo nombre. En una condición de combinación, además de ser de tipo igual o compatible, los campos deben tener con-tenidos que versen sobre lo mismo. Por ejemplo, podemos comparar números de alumno de la tabla iz-quierda con números de alumno de la tabla derecha. No sería razonable comparar números de alumno de la tabla izquierda con sueldos de la tabla derecha. Los campos izquierdo y derecho pueden incluirse como campos de salida en la vista o consulta, pero no es necesario que sea así. Su propósito es combinar las tablas. Que se los incluya como salida depende de la información que se desea producir.

Operador es un operador relacional, como =, >, <, etc., que establece una comparación entre campo izquierdo y campo derecho. Prácticamente, el único que tiene sentido es el operador =.

¿Por qué no usar relaciones, permanentes o transitorias, como las definidas en el Diseñador de base de datos o las trazadas en el entorno de un formulario o informe? Los diseñadores de consultas y vistas convierten la información que se les brinda a la instrucción Select del lenguaje SQL, no a comandos "nati-vos" de VFP. SQL es una normativa para "interrogar" conjuntos de datos y obtener resultados muy flexi-bles. Fue definida por expertos, incluyendo a los fabricantes de software. Con el tiempo, los fabricantes fueron introduciendo la normativa SQL en su propio software. Dada su importancia y amplio uso, los fabri-cantes de VFP desde hace mucho incluyeron instrucciones de SQL entre sus comandos, pero observando las exigencias originales. SQL une dos tablas no por una relación, sino por una condición de combinación.

Para aclarar qué es una condición de combinación, recurramos a la intersección de dos conjuntos. La intersección se da cuando se produce igualdad de contenido en los campos izquierdo y derecho. Como ta-les campos integran registros determinados, entenderemos que la intersección incluye la totalidad de esos registros. Los registros de tabla izquierda cuyo campo izquierdo no tiene igualdad con ningún contenido de campo derecho quedan fuera de la intersección, en el conjunto izquierdo. Los registros de tabla derecha

Page 7: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

5

cuyo campo derecho no tiene igualdad con ningún contenido de campo izquierdo quedan fuera de la inter-sección, en el conjunto derecho. Para ilustrar esto, usaremos las tablas mostradas en la Figura 8.

Tabla Izquierda Tabla Derecha Socio Profesión Profesión Descripción Alberto 1 1 Ingeniería Julián 2 3 Medicina

Figura 8. Tablas de ejemplo para los tipos de combinaciones

La intersección de las tablas anteriores por el campo Profesión, da lugar a la ilustración de la Figura 9.

Tabla Izquierda Intersección Socio Profesión Socio Profesión Julián 2 Alberto 1 Tabla Derecha Profesión Descripción Profesión Descripción 1 Ingeniería 3 Medicina

Figura 9. Intersección de las tablas Izquierda y Derecha por el campo Profesión

A partir de la intersección, se definen cuatro tipos de combinación, según los registros que se quieran

obtener: interna, izquierda, derecha y completa. Hay un quinto tipo, ninguna, usado para continuar una combinación compleja, cuyo tipo puede ser cualquiera de los cuatro primeros. Combinación interna. Trabaja únicamente con los registros de la intersección. Si combinamos interna-mente las tablas anteriores por el campo Profesión, queriendo como salida los campos Socio, Profesión y Descripción, el resultado será el cursor de la Figura 10, con un solo registro.

Socio Profesión Descripción Alberto 1 Ingeniería

Figura 10. Cursor resultante de la combinación interna

Combinación izquierda. Trabaja con todos los registros izquierdos, más los derechos de la intersección. Si unos y otros coinciden, produce registros de salida completos. Si los izquierdos no tienen igual en los derechos, los registros resultantes tendrán contenido en los campos provenientes de la tabla izquierda; pe-ro los provenientes de la tabla derecha serán nulos. Por ejemplo, si combinamos por izquierda ambas ta-blas, el resultado será el cursor de la Figura 11.

Socio Profesión Descripción Alberto 1 Ingeniería Julián 2 .NULL.

Figura 11. Cursor resultante de la combinación izquierda

Page 8: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

6

Combinación derecha. Trabaja con todos los registros derechos, más los izquierdos de la intersección. Si unos y otros coinciden, produce registros de salida completos. Si los derechos no tienen igual en los iz-quierdos, los registros resultantes tendrán contenido en los campos provenientes de la tabla derecha; pe-ro los provenientes de la tabla izquierda serán nulos. Por ejemplo, si combinamos por derecha ambas ta-blas, el resultado será el de la Figura 12.

Socio Profesión Descripción Alberto 1 Ingeniería .NULL. 3 Medicina

Figura 12. Cursor resultante de la combinación derecha

Combinación completa. Obtiene todos los registros de ambas tablas. Si hay coincidencia entre los iz-quierdos y derechos, los registros resultantes tendrán todos sus campos con los valores tomados de aqué-llos. Si no la hay, los registros resultantes tendrán valores de los campos izquierdos o derechos, según el caso, y los demás campos nulos. Por ejemplo, si combinamos completamente ambas tablas, el resultado será el cursor de la Figura 13.

Socio Profesión Descripción Alberto 1 Ingeniería Julián 2 .NULL. .NULL. 3 Medicina

Figura 13. Cursor resultante de la combinación completa

Ninguna. Hay veces en que hace falta más de un campo para lograr una combinación correcta entre dos tablas. Estudie las tablas de la Figura 14, donde P es el código de provincia y C el código de ciudad.

Tabla Ciudades Tabla Socios P C Ciudad P C Socio 1 1 Venado Tuerto 1 1 Pedro 1 2 Rosario 1 2 Alberto 2 1 Villa María 1 2 Alicia 2 2 Río Cuarto 2 1 Juan 2 3 Villa Dolores 2 1 Gustavo 2 2 Inés

Figura 14. Tablas para ejemplificar el tipo Ninguna

Sea una vista que dé como resultante los socios de cada ciudad. Usaremos los campos de entrada P,

C, Ciudad y Socio. Ordenaremos los registros de salida por los dos primeros campos. Si establecemos una combinación interna entre ambas tablas por P, obtendremos el resultado de la Fi-

gura 15. No es lo deseado, porque SQL combinará cada registro de Ciudades con los registros de Socios que tienen igual valor en P. Por ejemplo, el registro de Venado Tuerto, de la provincia 1, con los registros de Pedro, Alberto y Alicia; y el registro de Rosario, también de la provincia 1, otra vez con los registros de Pedro, Alberto y Alicia. Si nos diéramos por satisfechos, estaríamos cometiendo un error.

Si establemos la combinación interna por C, obtendremos el resultado de la Figura 16. Tampoco es lo deseado, porque SQL combina cada de registro de Ciudades con los registros de Socios que tienen igual valor en C. Por ejemplo, la ciudad de Venado Tuerto, codificada como 1, se combina con Pedro, Juan y Gustavo y la ciudad de Villa María, también 1, también se combina otra vez con Pedro, Juan y Gustavo.

Page 9: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

7

¡Pero Pedro vive en la provincia de Santa Fe, y Juan y Gustavo en la provincia de Córdoba! Como conclusión, es evidente que ninguna combinación por un solo campo es suficiente para solucio-

nar nuestro problema. Si hiciéramos dos combinaciones, ambas internas, una por P y otra por C, el resul-tado sería más errado, como ilustra la Figura 17.

P C Ciudad Socio P C Ciudad Socio P C Ciudad Socio 1 1 Venado Tuerto Pedro 1 1 Venado Tuerto Pedro 1 1 Venado Tuerto Pedro 1 1 Venado Tuerto Alberto 1 1 Venado Tuerto Juan 1 1 Venado Tuerto Pedro 1 1 Venado Tuerto Alicia 1 1 Venado Tuerto Gustavo 1 1 Venado Tuerto Alberto 1 2 Rosario Pedro 1 2 Rosario Alberto 1 1 Venado Tuerto Alberto 1 2 Rosario Alberto 1 2 Rosario Alicia 1 1 Venado Tuerto Alicia 1 2 Rosario Alicia 1 2 Rosario Inés 1 1 Venado Tuerto Alicia 2 1 Villa María Juan 2 1 Villa María Pedro 1 2 Rosario Pedro 2 1 Villa María Gustavo 2 1 Villa María Juan 1 2 Rosario Pedro 2 1 Villa María Inés 2 1 Villa María Gustavo 1 2 Rosario Alberto 2 2 Río Cuarto Juan 2 2 Río Cuarto Alberto 1 2 Rosario Alberto 2 2 Río Cuarto Gustavo 2 2 Río Cuarto Alicia 1 2 Rosario Alicia 2 2 Río Cuarto Inés 2 2 Río Cuarto Inés 1 2 Rosario Alicia 2 3 Villa Dolores Juan 2 1 Vila María Juan 2 3 Villa Dolores Gustavo Figura 16. Combinación por C 2 1 Vila María Juan 2 3 Villa Dolores Inés 2 1 Vila María Gustavo 2 1 Vila María Gustavo Figura 15. Combinación por P 2 1 Vila María Inés 2 1 Vila María Inés 2 2 Río Cuarto Juan 2 2 Río Cuarto Juan 2 2 Río Cuarto Gustavo 2 2 Río Cuarto Gustavo 2 2 Río Cuarto Inés 2 2 Río Cuarto Inés 2 3 Villa Dolores Juan 2 3 Villa Dolores Juan 2 3 Villa Dolores Gustavo 2 3 Villa Dolores Gustavo 2 3 Villa Dolores Inés 2 3 Villa Dolores Inés Figura 17. Dos combinaciones,

una por P y otra por C

La solución al problema es combinar simultáneamente por ambos campos, P y C. La combinación debe seguir siendo interna. Estamos ante el caso de una combinación compleja, la cual, al igual que una expre-sión compleja de cualquier tipo, se logra mediante el uso de los conectivos lógicos AND, OR, NOT. Para nuestro caso, la combinación compleja es

Ciudades.P = Socios.P AND Ciudades.C = Socios.C

Usando la combinación anterior, el resultado será el del la Figura 18, que es lo querido.

Page 10: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

8

P C Ciudad Socio 1 1 Santa Fe Pedro 1 2 Rosario Alberto 1 2 Rosario Alicia 2 1 Córdoba Juan 2 1 Córdoba Gustavo 2 2 Río Cuarto Inés

Figura 18. Combinación compleja por P y C.

Hasta aquí, lo que hay que hacer está resuelto. Otro problema es cómo escribir esta condición en los

diseñadores. Para ello, como veremos más adelante, hay que usar la ficha Combinación. Esta ficha exige definir cada condición simple componente de la condición compleja en una línea por separado. Para nues-tro problema, habría que escribir lo siguiente en tal ficha, bajo los títulos que se indican.

Tipo Nombre de campo Criterios Valor Lógico Interna Ciudades.P = Socios.P AND Ninguna Ciudades.C = Socios.C

El valor Ninguna en la segunda línea indica que ella es una continuación de la línea anterior, la cual

tiene definido el valor Interna para toda la condición compleja. El uso de la ficha Combinación, aunque to-davía no le resulte claro, será tratado posteriormente. Por ahora, lo importante es que entienda cuándo se usa el tipo Ninguna. Diferencias entre consultas y vistas

Aunque las consultas y vistas son similares en muchos aspectos, tienen las diferencias que siguen. • Las consultas pueden enviar sus resultados a un cursor con un nombre específico, no al generado por

defecto, que se ve en la ventana Examinar. También pueden mandar la salida a tablas permanentes, a gráficos, a impresora, etc. Las vistas no pueden hacer esto. Su salida siempre es un cursor que se vi-sualiza en una ventana Examinar.

• Los campos de salida de las vistas pueden ser modificados manualmente en la ventana Examinar, en-

viando las modificaciones a las tablas de entrada. Para ser coherentes con las variedades de formato, máscara de entrada, título, valor predeterminado, regla y mensaje de validación que tienen las tablas, los campos de salida que se van a enviar a ellas pueden configurarse con iguales variedades. Las con-sultas no permiten modificaciones, es decir, son solamente de lectura.

• Las vistas admiten parámetros, recurso que las hace muy flexibles. Las consultas no los admiten. • Las consultas se guardan en archivos independientes, que se pueden registrar en los proyectos. Las

vistas no tienen archivos propios, sino que residen en las bases de datos.

Page 11: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

9

2. Diseñadores de consultas y vistas

Los diseñadores de consultas y vistas son ventanas cuyo propósito es crear y modificar instrucciones Select de SQL, no directamente, sino de un modo bastante sencillo. Las ventanas están compuestas por dos paneles, uno superior y otro inferior. Cuando se activa cualquiera de estos diseñadores, aparece el menú Consulta en la barra de menús. Puede además que aparezcan las barras de herramientas Diseña-dor de consultas o Diseñador de vistas, según corresponda. Panel superior

El panel superior, o panel de entorno, se representan las tablas de entrada de la vista o consulta. Al abrirse el diseñador, automáticamente se abre el diálogo Agregar tabla o vista, para incluir aquéllas que sean necesarias. Luego de cerrado, este diálogo puede abrirse en cualquier momento, de varias formas. Recuerde que por tabla de entrada se entienden no sólo tablas, sino también vistas. Cada tabla se repre-senta en el panel como una pequeña ventana cuyo título es el nombre de la tabla y cuyo contenido son los campos, uno por línea. La primera línea es un asterisco, que representa todos los campos. El tamaño de cada ventana se puede cambiar por arrastre. Dado que, si se agregan varias tablas, es necesario definir condiciones de combinación entre ellas, éstas se representan en el panel de entorno como líneas que unen parejas de tablas por los campos de combinación. Las tablas y líneas pueden seleccionarse hacien-do click sobre ellas. Ambas pueden eliminarse seleccionándolas y pulsando Delete. Para crear una condi-ción de combinación, se puede arrastrar del campo conceptualmente izquierdo al conceptualmente dere-cho, no importa cómo estén ubicadas las tablas en el panel. Dando doble click sobre una línea se activa el diálogo Condición de combinación.

El tamaño del panel superior se puede ser aumentar, de modo que ocupe toda la ventana del diseña-dor. Luego se puede reducir al tamaño inicial. Para hacer esto hay varios procedimientos, siendo el más sencillo dar doble click en el panel, donde no haya tablas ni líneas. Panel inferior

El panel inferior está formado por varias fichas, cada una con su nombre, las cuales permiten definir los campos, filtros, etc., para diseñar la vista o consulta. Las fichas son comunes a consultas y vistas, excepto Criterios de actualización, exclusiva de las vistas. Las fichas son las siguientes. Campos. Sirve para establecer qué campos de entrada, funciones de agregados y otras expresiones de-ben ser procesados por la consulta o vista, produciendo campos de salida. Las funciones de agregados, o de agrupamiento, o de conjuntos, son sum( ), count( ), avg( ), max( ) y min( ), que se emplean para produ-cir un valor único a partir de varios. La palabra "agregado" se usa como sinónimo de grupo. Combinación. Sirve para crear y modificar condiciones de combinación, para aparear los registros de dos tablas de entrada. Filtro. Sirve para definir las condiciones que deben cumplir los registros de entrada para ser considerados por la consulta o vista. Ordenar por. Sirve para indicar los campos por los cuales ordenar los registros resultantes. Sólo se puede ordenar por campos de los registros de salida (campos seleccionados). Agrupar por. Sirve para indicar los campos que se utilizarán para formar grupos. Un grupo es un conjunto de registros con igual contenido en tales campos. Cada grupo da lugar a un solo registro de salida. Los

Page 12: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

10

campos de agrupación son de entrada (campos disponibles), que pueden o no aparecer en la salida. Criterios de actualización. Sirve para definir las condiciones bajo las cuales se actualizarán las tablas de entrada, cuando se modifiquen los campos de una vista. Esta ficha es exclusiva del Diseñador de vistas. Varios. Sirve para establecer si se admiten registros de salida duplicados, cuántos registros de salida se desean o qué porcentaje de ellos. Dos registros se consideran duplicados cuando los valores de todos sus campos, uno a uno, son iguales. 3. Fichas de los diseñadores Campos

Esta ficha permite indicar los campos que se tomarán de las tablas entrada, y también definir funciones de agregados y otras expresiones, todo lo cual servirá para preparar los campos de los registros de salida. Es común a ambos diseñadores. Sus componentes son los siguientes. Campos disponibles. Es un cuadro de lista con todos los campos de todas las tablas y vistas incluidas en el panel de entorno. Para incluir uno de estos campos en la consulta o vista, primero hay que ubicarlo en la lista. Luego se puede: (1) seleccionarlo y oprimir el botón Agregar; (2) darle doble click; (3) arrastrarlo hasta Campos seleccionados. Otra forma de hacer lo mismo es trabajar con el panel de entorno. Primero hay que ubicar el campo en la tabla. Luego se puede: (4) darle doble click; (5) arrastrarlo hasta Campos seleccionados. Cualquiera de estos procedimientos agrega el campo elegido a Campos seleccionados y atenúa el color del campo en Campos disponibles. Funciones y expresiones. Es un cuadro de texto que permite escribir una expresión que se incluirá como campo en los registros de salida. Para facilitar la creación de la expresión, a la derecha del cuadro de texto hay un botón con tres puntos que invoca al Generador de expresiones. Por ejemplo, si quiere calcular un descuento del 10 por ciento de un supuesto campo Importe, deberá es-cribir la expresión 0.1*importe o importe*0.1. Esto producirá un campo “calculado” que se agregará al cur-sor resultante. Como no le ha dado nombre, VFP inventará uno. Para darle un nombre significativo, por ejemplo, debe escribir 0.1*importe as descuento, lo que producirá que el campo se llame Descuento en el cursor de salida. Si quiere el promedio del campo Importe, con el nombre Promedio, deberá escribir la ex-presión avg(importe) as promedio. Una vez escrita la expresión, para agregarla a Campos seleccionados hay que dar click en el botón Agregar.

Si por alguna razón quiere incluir un campo con un nombre diferente al que tiene en la tabla, use Fun-ciones y expresiones para escribir el nombre del campo, la palabra as y el nombre con que desea que aparezca en la salida. Campos seleccionados. Es un cuadro de lista con los campos que se desean como resultado de la con-sulta o vista, uno por línea. Como se ha visto, éstos pueden ser los mismos campos de las tablas de en-trada, pero también pueden ser funciones o expresiones, con o sin nombre. Cada línea va acompañada por un botón con una flecha . Cada botón sirve para arrastrar el campo correspondiente hacia arriba o abajo, con lo cual se modifica su posición relativa con respecto a los demás campos. Agregar. Es un botón de comando que agrega a Campos seleccionados el campo o campos selecciona-dos en Campos disponibles o la expresión escrita en Funciones y expresiones. Agregar todos. Es un botón de comando que agrega todos los campos de Campos disponibles a Campos

Page 13: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

11

seleccionados. Si solamente se quieren agregar todos los campos de una tabla, se debe ubicar el asteris-co que aparece como primera línea de la tabla en el panel de entorno y arrastrarlo a Campos selecciona-dos, o darle doble click. Quitar. Es un botón de comando que elimina el campo o campos que se hayan seleccionado en Campos seleccionados. Si se trata de campos de una tabla, son devueltos a Campos disponibles, lo cual se advier-te porque toman el color habitual. Si se trata de otra expresión, es devuelta a Funciones y expresiones. Quitar todos. Es un botón de comando que elimina todos los campos de Campos seleccionados. Propiedades. Es un botón de comando que activa el diálogo Propiedades del campo de la vista. Este diá-logo tiene opciones análogas a las que aparecen en la ficha Campos del Diseñador de tablas, cuando se modifica o crea una tabla de base de datos, no una tabla libre. Estas opciones están debajo de donde se definen los nombres de campo, tipos, tamaños, decimales, etc. El botón Propiedades sólo está disponible en el Diseñador de vistas. Dado que una vista permite modificar los campos de salida y enviar los cambios a las tablas de entrada, es posible validar lo que se ingresa a ellos, darles un formato, una máscara de en-trada, etc. Combinación

Esta ficha muestra las condiciones de combinación entre parejas de tablas de entrada, generadas cada vez que se agrega una segunda tabla, una tercera, etc., al panel de entorno. También permite crear nue-vas condiciones o modificar las existentes. Si el panel de entorno tiene una sola tabla, esta ficha se verá en blanco. La ficha es común a ambos diseñadores. Sus componentes son los siguientes. Movimiento. Es un botón con una flecha , que aparece junto a cada condición. Se lo puede arrastrar hacia arriba o abajo, cambiando la posición de la condición asociada con respecto a las demás. La posi-ción de las condiciones es de importancia fundamental para que la consulta o vista trabaje bien. Aunque estén acertadamente definidos todos los componentes de una consulta o vista, a veces no se obtienen los resultados esperados por la incorrecta secuencia de estas condiciones. Condición. Tiene forma de flecha , una por condición. Al dar click sobre alguna, se activa el diálogo Condición de combinación para la condición correspondiente. Tipo. Es un cuadro combinado que sirve para elegir un tipo de condición: Ninguna, Interna, Derecha, Iz-quierda y Completa. Para una discusión sobre los tipos, vea Condiciones de Combinación. Nombre de campo. Es un cuadro combinado que presenta una lista de campos de la tabla izquierda, donde se puede elegir el campo izquierdo de la condición. Si ésta se creó en el diálogo Condición de com-binación, Nombre de campo es inaccesible. Si se está creando una condición, el cuadro presenta una lista de todos los campos de todas las tablas de entrada. Hay además una última entrada que permite crear una expresión, para lo cual se activa automáticamente el Generador de expresiones. No. Es un botón que, al ser activado, invierte el criterio de la condición. Por ejemplo, si el criterio fuera =, activar el botón daría No =, es decir, distinto. La activación del botón se ve como una tilde. Sólo es accesi-ble cuando se crea una condición. Criterios. Es un cuadro combinado que presenta una lista de operadores relacionales. Sólo es accesible cuando se crea una condición. Si la condición se creó en el diálogo Condición de combinación, el operador siempre es =. Los operadores relacionales son iguales a los de la ficha Filtro, que se trata más adelante.

Page 14: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

12

Aunque están disponibles todos los operadores, el que en la práctica resulta más lógico es =. Sin embar-go, los demás operadores también funcionan. Sean por ejemplo, las antiguas tablas Clientes y Depósitos de la Figura 1, que hemos reducido en la Figura 19, para simplificar los resultados.

Tabla Clientes Cliente Nombre Domicilio Provincia CP Teléfono

1 Ruiz, Pedro Salta 1080 N San Juan 5400 433-2550 2 Bustos, Estela San Martín 453 La Rioja 520-3027 3 García, José Jujuy 420 S San Juan 5400 427-5960

Tabla Depósitos Cliente Depósito Fecha Importe

1 30128 12-06-2000 350 2 30127 10-06-2000 1200 3 30131 18-06-2000 715

Figura 19. Tablas Clientes y Depósitos reformuladas

Sea que queremos una vista (o consulta) con los campos Cliente as Cliente_izquierdo y Nombre de la

tabla Clientes y los campos Cliente as Cliente_derecho e Importe de la tabla Depósitos. Si combinamos por los campos Cliente, con operador =, el resultado será el de la Figura 20.

Cliente_izquierdo Nombre Cliente_derecho Importe 1 Ruiz, Pedro 1 350 2 Bustos, Estela 2 1200 3 García, José 3 715

Figura 20. Combinación con el operador =

Pero si combinamos, por ejemplo, con operador No =, el resultado será el de la Figura 21.

Cliente_izquierdo Nombre Cliente_derecho Importe

1 Ruiz, Pedro 2 1200 1 Ruiz, Pedro 3 715 2 Bustos, Estela 1 350 2 Bustos, Estela 3 715 3 García, José 1 350 3 García, José 2 1200

Figura 21. Combinación con el operador No =

La Figura 21 muestra que el operador funciona bien. El problema es, ¿cómo darle sentido al resultado?

En algunas ocasiones difíciles de imaginar, puede ser necesario obtener un resultado semejante. Valor. Es un cuadro combinado que lista los todos los campos de todas las tablas, excepto aquéllos de la tabla que ha servido para elegir el campo izquierdo en Nombre de campo, porque una tabla no puede combinarse consigo misma. Hay también una última entrada que permite crear una expresión, para lo cual se activa automáticamente el Generador de expresiones. Si la condición fue creada por el diálogo Condi-ción de combinación, el cuadro Valor es inaccesible.

Page 15: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

13

Lógico. Es un cuadro combinado que permite agregar o eliminar un operador AND u OR entre dos condi-ciones, convirtiéndolas en una condición compleja. Vea Condiciones de combinación. Insertar. Es un botón de comando que intercala una condición en blanco, en el lugar de la condición se-leccionada, desplazando ésta y las siguientes hacia abajo. Este “hueco” debe ser llenado o eliminado, pues la consulta o vista no acepta condiciones indefinidas. Quitar. Es un botón de comando que elimina la condición seleccionada. Filtro

Esta ficha permite definir condiciones que filtren los registros de entrada. Todo registro que satisfaga las condiciones pasará el filtro y entrará a la consulta o vista para su procesamiento. En caso contrario, no será tenido en cuenta. La ficha es común a ambos diseñadores. Sus componentes son los siguientes. Movimiento. Es un botón con una flecha . Arrastrándolo hacia arriba o abajo se cambia la posición rela-tiva de la condición filtro con respecto a los demás. Nombre de campo. Es un cuadro combinado con todos los campos de todas las tablas de entrada. Hay también una última entrada que permite crear una expresión, activando automáticamente el Generador de expresiones. En Nombre de campo se define el primer operando de la condición filtro. Dado que los filtros actúan sobre los campos de entrada, el campo filtrado puede o no incluirse como campo de salida. No. Es un botón que, al ser activado, invierte el criterio de la condición. La activación del botón se ve como una tilde. Criterios. Es un cuadro combinado que lista los siguientes operadores relacionales. = Ambos operadores deben tener el mismo valor. Por ejemplo, cliente = 132 tendrá en cuenta so-

lamente los registros cuyo campo Cliente contenga el valor 132.

Like El primer operando debe tener caracteres iniciales que coincidan con los caracteres del segun-do. Por ejemplo, nombre Like ‘Gu’ dejará pasar solamente los registros cuyo campo Nombre contenga ‘Gutiérrez’, ‘Guzmán’, ‘Guerrero’, y similares.

== El primer operando debe tener un contenido exactamente igual al contenido del segundo, carác-ter a carácter. Por ejemplo, nombre == ‘Ruiz, Pedro’ tomará en cuenta solamente los registros cuyo campo Nombre contenga ‘Ruiz, Pedro’, pero ignorará los que tengan el valor ‘Ruiz, Pedro Juan’ o 'Ruiz, Pedro Luis', o cualquier otro valor, como 'Quiroga, Esteban'.

> El primer operando debe tener un contenido mayor que el contenido del segundo. Por ejemplo, importe > 5000 solamente considerará los registros cuyo campo Importe tenga contenidos ma-yores que 5000.

>= El primer operando debe tener un contenido mayor o igual al contenido del segundo. Por ejem-plo, importe >= 5000 sólo considerará los registros cuyo campo Importe contenga 5000 ó más.

< El primer operando debe tener un contenido menor que el contenido del segundo. Por ejemplo, importe < 5000 sólo considerará los registros cuyo campo Importe tenga un contenido menor que 5000.

Page 16: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

14

<= El primer operando debe tener un contenido menor o igual al contenido del segundo. Por ejem-

plo, importe <= 5000 solamente considerará los registros cuyo campo Importe sea 5000 o me-nos.

Is NULL El primer operando debe tener un contenido nulo. Si un campo de caracteres tiene un espacio o una tabulación, por ejemplo, tiene un contenido definido. Si un campo numérico tiene un cero, también es un contenido definido. Contenido nulo es la carencia de contenido, que VFP y SQL representan como .NULL.

Between El contenido del primer operando debe caer en el intervalo establecido por el segundo. En el se-gundo operando, los dos valores del intervalo deben separarse por una coma. Por ejemplo, fe-cha Between {01/01/2000},{31/12/2000} tomará en cuenta solamente los registros cuyo campo Fecha contengan fechas del año 2000.

In El primer operando debe tener un valor que coincida con uno de los valores listados en el se-gundo. En el segundo operando, los valores de la lista se separan con comas. Por ejemplo, fac-tura In 10, 210, 300, 1910, tomará en cuenta solamente los registros cuyo campo Factura con-tengan valores 10, 210, 300 ó 1910.

Negando estos operadores mediante el botón No, se amplían las posibilidades de comparación. Note que los operadores Between e In son idénticos en propósito a las funciones Between( ) e Inlist( )

de VFP. La diferencia es dónde se coloca el primer operando. En los operadores, se coloca en Nombre de campo. En las funciones, se coloca dentro de los paréntesis, en primer lugar. Ejemplo. Es un cuadro de texto que sirve para definir el segundo operando de la condición. Generalmente es un valor literal, como un número, una fecha o una expresión de caracteres concretas. En el caso de vis-tas, se pueden definir parámetros, que son nombres precedidos por el signo de interrogación. Como los parámetros no tienen un valor literal, podría pensarse que la vista no se puede ejecutar. Sin embargo, al comenzar la ejecución de la vista, se solicita un valor literal para cada parámetro. Esto da gran flexibilidad, porque la vista termina de completar sus definiciones en el momento de la ejecución. M/m. Es un botón de opción. Cuando está activado, se ve con una tilde. En este caso, las comparaciones se realizan respetando literalmente las mayúsculas y minúsculas del segundo operando. Por ejemplo, artí-culo = ‘Ca’ filtrará los registros cuyo campo Artículo sea ‘Cama’ o ‘Carro’, pero ignorará aquéllos que con-tengan ‘cama’ y ‘carro’. Lógico. Es un cuadro combinado que permite agregar o quitar un operador AND u OR entre dos condicio-nes. Las opciones son Ninguna, AND y OR. Si se elige Ninguna o no se usa este cuadro combinado, se genera un operador AND en la instrucción Select. Insertar. Es un botón de comando que intercala una línea en blanco donde está la condición selecciona-da, desplazando a ésta y a las restantes hacia abajo. El “hueco” debe ser llenado o eliminado, pues no se aceptan condiciones indefinidas. Quitar. Es un botón de comando que elimina la condición seleccionada. Ordenar por

Esta ficha permite ordenar los registros de salida por los campos que se indiquen. El ordenamiento se

Page 17: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

15

puede hacer únicamente por campos de salida, pues lo que se ordena son los registros del cursor resul-tante. Recuerde que los campos de salida pueden corresponder a campos de entrada; pero también pue-den ser funciones de agregados u otras expresiones. La ficha es común a ambos diseñadores. Sus com-ponentes son los siguientes. Campos seleccionados. Es un cuadro de lista con los campos de salida, es decir, aquéllos incluidos en el cuadro de igual nombre de la ficha Campos. Sirve para seleccionar un campo y usarlo como criterio de or-denación. Como sucede con los índices, la ordenación de registros puede ser por varios campos. En esta situación, los campos se toman jerárquicamente. Esto significa que se ordena por el campo de mayor je-rarquía, formando lotes de registros. Cada lote tiene el mismo valor en ese campo. Cada lote, a su vez, se ordena por el campo siguiente en jerarquía, formando sublotes. Cada sublote tiene el mismo valor en tal campo. El proceso es igual, si hay tres, cuatro, etc., campos ordenadores. La diferencia con los índices es que cada campo ordenador puede tener su propio sentido, ascendente o descendente. Esto no es posible con los índices, ya que el sentido se aplica a la totalidad de los campos que componen la expresión. Criterios de ordenación. Es un cuadro de lista con los campos que se van a usar como criterios para or-denar los registros de salida. Cada campo va acompañado a la izquierda por una flecha o , que indican orden ascendente o descendente. La flecha es una indicación visual, no un botón. El sentido se establece con Opciones de orden. También cada campo va acompañado por un cuadro de movimiento, a la izquier-da de la flecha. Este cuadro puede ser arrastrado hacia arriba o abajo, variando la ubicación relativa del campo ordenador dentro de la lista. Esto es importante, puesto que la jerarquía de los campos ordenado-res obedece a su ubicación relativa: el que está más arriba es el primero en jerarquía, el que sigue el se-gundo en jerarquía, etc. Opciones de orden. Es un grupo de opciones que permite dar el sentido de ordenación a cada campo or-denador. Tiene dos botones de opción, Ascendente y Descendente.

Ascendente. Establece que el campo seleccionado en Criterios de ordenación sea ordenado en sen-tido ascendente.

Descendente. Establece que el campo seleccionado en Criterios de ordenación sea ordenado en sentido descendente.

Agregar. Es un botón de comando que agrega el campo seleccionado en Campos seleccionados a Crite-rios de ordenación. Se obtiene igual resultado si se da doble click sobre el campo a agregar. Quitar. Es un botón de comando que elimina el campo seleccionado en Criterios de ordenación. Agrupar por

Esta ficha permite agrupar los registros de entrada, produciendo en la salida un solo registro por cada grupo. Esta idea debe quedar bien clara: si una vista o consulta usa agrupación, obtiene un registro de sa-lida por cada grupo.

Las Figuras 22, 23 y 24 ejemplifican cómo se las arregla SQL para obtener, a partir de la tabla de en-trada Depósitos, una salida con lo comprado por los distintos clientes. Para ello se debe agrupar por Clien-te, y se debe incluir en la salida un campo con la suma de lo comprado por cada uno, por ejemplo, sum(importe) as total.

La tabla Depósitos, ya conocida, es la que muestra la Figura 22. El proceso que sigue SQL es muy lógico. Primero ordena los registros de entrada por Cliente, para ob-

Page 18: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

16

tener los distintos grupos. Esto lo muestra la Figura 23, aunque en la realidad esto no se ve, porque es un proceso interno.

Tabla Depósitos Cliente Depósito Fecha Importe

2 30127 10-06-2000 1200 1 30128 12-06-2000 350 1 30129 17-06-2000 800 2 30130 17-06-2000 420 3 30131 18-06-2000 715 2 30132 18-06-2000 420 3 30133 19-06-2000 507

Figura 22. Tabla Depósitos, tal como está grabada.

Tabla Depósitos, ordenada por Cliente Cliente Depósito Fecha Importe

1 30128 12-06-2000 350 1 30129 17-06-2000 800 Grupo del cliente 1

2 30127 10-06-2000 1200 2 30130 17-06-2000 420 Grupo del cliente 2 2 30132 18-06-2000 420 3 30131 18-06-2000 715 3 30133 19-06-2000 507 Grupo del cliente 3

Figura 23. Tabla Depósitos, ordenada por Cliente, obteniendo tres grupos

Luego, SQL produce los registros de salida, calculando el resultado de la función de agregado

sum(importe) as total, que ocupará un campo, como muestra la Figura 24, que es lo que se observará en la ventana Examinar.

Cliente Total 1 1150 2 2040 3 1222

Figura 24. Cursor de salida, con un registro por cada grupo

El agrupamiento tiene sentido cuando el registro de salida correspondiente a un grupo de registros de

entrada los resume de algún modo. El resumen puede ser: (1) contar cuántos son los registros o los cam-pos no nulos; (2) sumar o promediar campos numéricos; (3) encontrar el valor menor o mayor contenido en campos numéricos, de caracteres o de fecha. Para lograr estos resúmenes, existen las funciones de agregados. En el ejemplo anterior, la función usada para obtener los totales de cada cliente fue sum(importe) as total.

La ficha Agrupar por es común a ambos diseñadores. Sus componentes son los siguientes. Campos disponibles. Es un cuadro de lista con todos los campos de las tablas de entrada más todas las funciones definidas mediante Funciones y expresiones de la ficha Campos. Sirve para seleccionar un campo o expresión y usarlo como criterio de agrupamiento. El agrupamiento, en realidad, es una ordena-ción interna, ya que sólo se pueden formar grupos si los registros están ordenados. Es posible agrupar por

Page 19: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

17

uno o más campos o expresiones. Es importante observar que el agrupamiento se hace con los registros de entrada, no con los de salida. Por esta razón, en Campos disponibles aparecen todos los campos de todas las tablas de entrada.

Para mayor claridad, veamos otro ejemplo. Sean las tablas de la Figura 25.

Tabla Ventas Tabla Clientes Cliente Venta Cliente Nombre Domicilio

1 200 1 Mónica Rioja 49 S 1 150 2 Esteban Jujuy 320 N 2 100 2 200 2 300

Figura 25. Tablas para ejemplificar agrupamientos

Queremos una vista con los campos Cliente, sum(Venta) as Vendido, Nombre y Domicilio. La condición

de combinación debe establecerse por los campos Cliente de ambas tablas. Ordenemos la salida por Nombre, en sentido ascendente. Agrupemos por Cliente. En este caso, el campo agrupador también es un campo de salida, pero podría no serlo. El resultado de la vista es el de la Figura 26. Observe que se ha ob-tenido un solo registro para cada valor de Cliente y que los registros están ordenados por Nombre.

Cliente Vendido Nombre Domicilio 2 600 Esteban Jujuy 320 N 1 350 Mónica Rioja 49 S

Figura 26. Salida donde el campo ordenador aparece como salida.

Creemos otra vista similar, pero sin el campo Cliente en la salida. El lector podrá notar que, al definir

agrupamiento, los campos agrupadores se colocan automáticamente como campos de salida; pero luego los podemos quitar. El resultado es el de la Figura 27. Como el agrupamiento se sigue haciendo por Clien-te, también se obtiene el resumen de los registros de entrada, aun cuando tal campo no figure en la salida.

Vendido Nombre Domicilio 600 Esteban Jujuy 320 N 350 Mónica Rioja 49 S

Figura 27. Salida donde el campo ordenador no aparece como salida.

Cuando se agrupa por varios campos, éstos se toman jerárquicamente. Primero se agrupa por el cam-

po de mayor jerarquía, formando lotes de registros. Cada lote tiene el mismo valor en ese campo. Cada lo-te, a su vez, se agrupa por el campo siguiente en jerarquía, formando sublotes. Cada sublote tiene el mis-mo valor en tal campo. El proceso es igual, si hay tres, cuatro, etc., campos agrupadores. Campos agrupados. Es un cuadro de lista donde se pueden incluir cualquier campo de entrada, funcio-nes de agregados y otras expresiones, es decir, cualquier campo disponible. Si hay varios agrupadores, la jerarquía viene dada por la posición de cada uno en Campos agrupados. El que está más arriba es el de mayor jerarquía; el siguiente es el de jerarquía de segundo orden; y así. Junto a cada agrupador hay un cuadro de movimiento que se puede arrastrar hacia arriba o abajo, modificando la ubicación relativa del agrupador con respecto a los demás.

Page 20: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

18

Agregar. Es un botón de comando que agrega el campo o expresión seleccionado en Campos disponibles a Campos agrupados. La transferencia se puede lograr también haciendo doble click sobre el campo o ex-presión o arrastrándolo hacia Campos agrupados. Quitar. Es un botón de comando que elimina el agrupador seleccionado en Agrupar por campos. Condiciones. Es un botón de comando que activa el diálogo Condiciones. Este diálogo es similar a la fi-cha Filtro, con una diferencia en cuanto a lo que afectan. La ficha Filtro permite definir filtros sobre los re-gistros de entrada. El diálogo Condiciones permite definir filtros sobre los registros de salida resultantes del agrupamiento. Así, si filtráramos mediante este diálogo el ejemplo de la Figura 26, con la condición sum(Venta) > 500, sólo veríamos el primer registro, el del cliente 2.

Filtrar el total comprado por cada cliente sólo se puede hacer en el resultado, porque las ventas indi-vuales de la tabla Ventas de la Figura 25 son todas menores a 500. Es muy importante que el lector ad-vierta esta diferencia, lo que le hará usar adecuadamente la ficha Filtro y el botón Condiciones. Criterios de actualización

Los cursores resultantes de las vistas pueden ser modificados, como se hace con las tablas en la ven-tana Examinar. Esto no sucede con los cursores resultantes de las consultas, que son inmodificables en esa ventana. El lector puede preguntar qué sentido tiene modificar una vista, dado que su eliminación au-tomática al ser cerrada perdería para siempre todos los cambios. La respuesta es que, mediante la ficha Criterios de actualización, puede lograrse que los cambios introducidos en la vista se transfieran a las ta-blas de entrada. Para ejemplificar, considere la Figura 28.

Tabla Rendimientos Tabla Alumnos Matrícula Año Índice Matrícula Nombre Domicilio

1 2001 85 1 Mónica Rioja 49 S 1 2002 70 2 Esteban Jujuy 320 N 2 2001 90 2 2002 85 2 2003 90

Cursor de salida Matrícula_a Año Índice Matrícula_b Nombre

1 2001 85 1 Mónica 1 2002 70 1 Mónica 2 2001 90 2 Esteban 2 2002 85 2 Esteban 2 2003 90 2 Esteban

Figura 28. Tablas para ejemplificar criterios de actualización

Puede ver que, en la salida, se ha incluido dos veces la matrícula: Matrícula_a proviene de la tabla

Rendimientos y Matrícula_b de la tabla Alumnos. El subrayado y la letra que sigue a cada nombre de campo son agregados automáticamente, para diferenciarlos, dado que se han agregado sin cláusula as. Parece una redundancia, pero las matrículas repetidas son necesarias para las explicaciones siguientes.

Si en el cursor resultante cambiamos el valor del campo Índice y queremos que ese cambio se refleje en la tabla Rendimientos, deberemos definir tal campo como actualizable. Por ejemplo, si en el registro con Matrícula_a igual a 1 y Año igual a 2001 cambiamos 85 por 80, estaremos cambiando el registro co-

Page 21: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

19

rrespondiente de Rendimientos. También tendremos que indicar que el registro a modificar en Rendimien-tos debe ser ubicado por los campos Matrícula_a y Año, que se tomarán como claves para establecer la correspondencia entre el registro de la vista y el registro de la tabla Rendimientos. Matrícula_a, por sí solo, no permite ubicar cuál es exactamente el registro a modificar, porque hay dos matrículas 1. Por esto hay que ampliar la clave, usando el campo Año. El campo Año por sí solo tampoco puede servir para individua-lizar el registro a modificar en la tabla Rendimientos, porque aparece dos veces.

Como queremos actualizar campos de entrada, los campos correspondientes en la salida deben ser originados estrictamente por ellos, no por funciones de agregados, ni por cualquier otra expresión, ni por agrupamientos. Dado que los registros de salida pueden estar compuestos por campos provenientes de varias tablas de entrada, la actualización se hará con precisión en la tabla de donde provenga el campo que se modifica, no en las otras. Esto explica por qué hay que introducir valores clave de cada tabla a mo-dificar, aunque se repitan en el resultado.

También podríamos hacer actualizable el campo Nombre de la tabla Alumnos. En este caso, la clave debe ser Matrícula_b. Vemos que Mónica y Esteban aparecen en varios registros de salida. Si queremos cambiar Mónica por Gloria, lo hagamos en una sola línea. Las demás aparecerán con el valor viejo, Móni-ca, aunque realmente la modificación se ha producido en la tabla original. El cursor de salida no se actuali-za en los restantes registros de Mónica, salvo que cerremos la ventana Examinar y volvamos a ejecutar la vista. Si intentamos cambiar todas las líneas de Mónica por Gloria, se producirá un conflicto de actualiza-ción, tema complicado que no veremos. Basta con seguir el consejo de elegir uno de los registros de Mó-nica para realizar en él los cambios.

La ficha Criterios de actualización sirve para indicar cuáles campos de entrada serán actualizados cuando los campos de salida correspondientes sean modificados y cuáles serán las claves. Es una ficha exclusiva del Diseñador de vistas. Sus componentes son los siguientes. Tabla. Es un cuadro combinado que permite seleccionar una tabla de entrada cuyos campos pueden ser modificados a través de los correspondientes campos de la vista. Cuando se elige una tabla, sus campos son los únicos que se ven en Nombre de campo. Cuando se termina con una tabla de entrada, se puede seleccionar otra. La opción Todas las tablas muestra todos los campos de todas las tablas en Nombre de campo, lo cual puede resultar incómodo, por la extensión de la lista de campos. Restablecer claves. Es un botón de comando que selecciona los campos de índice principal de las tablas como claves para la vista, lo cual se ve como tildes en la columna Clave del cuadro Nombre de Campo, junto a los campos correspondientes. Las claves sirven para buscar en la tabla de entrada el registro que contiene el campo cuyo correspondiente se modifica en la vista. Si el índice principal está construido por varios campos y se incluyen todos ellos en la vista, todos ellos son tildados. Si las tablas no tienen un índi-ce principal, no hay efecto alguno. En este caso, habrá que usar la columna Clave para tildar manualmente el o los campos necesarios para transformarlos en clave.

Hay que ser cuidadosos al establecer las claves. Así, un índice principal de clave compuesta por mu-chos campos, es el único cuyas campos aparecen tildados como claves. Pero esto ocurre si se incluyen todos los campos componentes o solamente algunos. En el último caso, se puede creer que los campos tildados son suficientes para actuar como claves, lo cual es erróneo. Para evitar el error, lo seguro es sa-ber con exactitud cómo está compuesta la expresión del índice principal, para incluir todos esos campos en la salida de la vista.

Lo dicho en el párrafo anterior se aplica a todas las situaciones donde deba identificarse los registros de una tabla mediante varios campos clave. Aunque no formen parte de un índice principal, hay que tener conocimiento de cómo identificar exactamente un registro de la tabla de entrada a modificar Actualizar todos. Selecciona todos los campos que no sean clave para actualizarlos, colocando una tilde

Page 22: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

20

en la columna Actualizable de Nombre de Campo. Los campos usados como clave también pueden ser actualizables, aunque no es conveniente hacerlo. La actualización de una clave puede provocar conflictos. Enviar actualizaciones SQL. Es un botón de opción que activa el envío de los cambios a las tablas origi-nales. Si el botón no está activado, la vista podrá modificarse, pero no habrá efecto en las tablas. Nombre de campo. Es un cuadro que muestra los campos seleccionados para salida de la vista. Tiene las tres columnas siguientes.

Clave (símbolo de llave). Es un botón de opción junto a cada campo. Si no está visible, hay que hacer click en el lugar correspondiente. Cuando se activa, indica que el campo asociado servirá de clave. Actualizable (símbolo de lápiz). Es un botón de opción junto a cada campo. Si no está visible, hay que hacer click en el lugar correspondiente. Cuando se activa, indica que el campo será actualizable. Nombre de campo. Lista los campos seleccionados para salida de la vista.

Hay otras opciones, cuya complejidad escapan al propósito de esta obra, por lo que no las veremos.

Varios

Esta ficha sirve para indicar condiciones para seleccionar registros no incorporadas en las demás fi-chas, tales como eliminar registros duplicados o incluir una cantidad o porcentaje de registros en la salida. La ficha es común a ambos diseñadores. Sus componentes son los siguientes. Sin duplicados. Es un botón de verificación que elimina los registros duplicados en la salida, dejando uno solo. Se dice que hay registros duplicados cuando todos sus campos, par a par, tienen igual contenido. Los registros resultantes de agrupamiento nunca están duplicados, porque hay uno por grupo y cada gru-po es diferente. Crear tabla de referencias cruzadas. Es un botón de verificación exclusivo de las consultas que puede activarse solamente cuando se han definido tres campos de salida. Uno representa los distintos valores del eje X; el otro los distintos valores del eje Y; el tercero el valor de un determinado X y un determinado Y. El resultado de la consulta sirve para diseñar gráficos usando Microsoft Graph. Como el tema escapa al propósito de esta obra, no daremos más detalles. Registros incluidos. Es un título que agrupa las tres posibilidades siguientes.

Todos. Es un botón de verificación que, activado, incluye todos los registros resultantes de la vista o consulta en la salida. Cuando no lo está, permite indicar cuántos o qué porcentaje de registros resultan-tes se quieren en la salida. Número de registros. Es un cuadro numérico que permite definir una cantidad. Este valor será el nú-mero de registros que se desea en la salida. Porcentaje. Es un botón de verificación que cambia el valor introducido en Número de registros a por-centaje. Note que los valores válidos para porcentaje varían entre 0,1 y 99.

Page 23: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

21

4. Herramientas auxiliares

Incluimos bajo este título otras posibilidades que brindan los diseñadores de vistas y consultas: el menú Consulta, las barras de herramientas Diseñador de consultas y Diseñador de vistas y el diálogo Condición de combinación. Menú Consulta

Contiene comandos para crear, modificar y ejecutar consultas. Aparece en la barra de menús cuando están abiertos el Diseñador de consultas o el Diseñador de vistas. Agregar tabla o vista. Activa el diálogo Agregar tabla o vista, donde se puede elegir la tabla o vista que se quiere agregar al panel de entorno. Quitar tabla. Elimina la tabla seleccionada del panel de entorno. Quitar condición de combinación. Elimina la combinación seleccionada. Campos de salida. Activa la ficha Campos. Combinación. Activa la ficha Combinación. Filtro. Activa la ficha Filtro. Ordenar por. Activa la ficha Ordenar por. Agrupar por. Activa la ficha Agrupar por. Criterios de actualización. Activa la ficha Criterios de actualización. Esta opción aparece cuando está abierto el Diseñador de vistas. Varios. Activa la ficha Varios. Destino de la consulta. Activa el diálogo Destino de la consulta, que permite enviar el resultado de una consulta a siete salidas diferentes. Esta opción aparece cuando está abierto el Diseñador de consultas. Ver SQL. Muestra en una ventana la instrucción Select de SQL, creada hasta el momento con lo definido en las distintas fichas. La ventana es de sólo lectura, pero la instrucción se puede copiar y pegar, por ejemplo, en un formulario o informe. Opciones avanzadas. Está relacionado con actualizaciones en redes. Parámetros de vista. Activa el diálogo Parámetros de vista. Esta opción aparece cuando está abierto el Diseñador de vistas. Comentarios. Activa el diálogo Comentarios, donde se pueden escribir notas que documenten la vista o consulta. Ejecutar consulta. Ejecuta la instrucción Select de SQL, generada hasta el momento.

Page 24: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

22

Barras de herramientas Diseñador de consultas y Diseñador de vistas

Si previamente no fueron cerradas, estas barras aparecen automáticamente al abrir el Diseñador de consultas o el Diseñador de vistas, según corresponda. Si están cerradas, se pueden abrir con Ver – Barra de herramientas. Contienen los botones siguientes. Agregar tabla o vista. Activa el diálogo Agregar tabla o vista, donde se puede elegir la tabla o vista que se quiere agregar al panel de entorno. Quitar tabla. Elimina la tabla seleccionada en el panel de entorno. Agregar combinación. Permite agregar una condición de combinación. Ver SQL. Muestra en una ventana la instrucción Select de SQL creada hasta el momento con lo definido en las distintas fichas. La ventana es de sólo lectura. Maximizar/Minimizar panel superior. Amplía o reduce el panel de entorno. Destino de la consulta. Activa el diálogo Destino de la consulta, que permite enviar el resultado de la consulta a siete salidas diferentes. Es un botón exclusivo del Diseñador de consultas. Diálogo Condición de combinación

Permite definir una condición de combinación entre dos tablas. Se activa al agregar una segunda tabla, una tercera, etc. a la consulta o vista. Si la pareja de tablas tiene una relación permanente, se ofrece com-binarlas por lo que ella indica. Si no la hay, pero sí hay un campo con igual nombre en ambas tablas, se sugiere combinarlas por él. Esto no siempre es correcto, pues los campos pueden no servir para la rela-ción. Quizás se ofrezca combinar la primera tabla con la tercera, cuando lo correcto en un caso particular sería combinar la segunda con la tercera. El usuario, entonces, debe controlar la condición de combinación y corregirla, si fuera necesario, antes de aceptarla. Lista de campos izquierda. Contiene los campos de todas las tablas agregadas previamente. Permite se-leccionar el campo izquierdo de la combinación. Lista de campos derecha. Contiene los campos de la última tabla agregada. Permite seleccionar el cam-po derecho de la combinación. Tipo de combinación. Es un cuadro de lista que permite definir un tipo de combinación. Las opciones de la lista son Interna, Izquierda, Derecha, Completa y Ninguna. 5. Uso de parámetros

Ya dijimos al pasar que el Diseñador de vistas permite usar parámetros. Ahora los trataremos espe-cialmente. Los parámetros se usan en el cuadro de texto Ejemplo de las fichas Filtro y Condiciones. Un pa-rámetro es un nombre cualquiera que se escribe precedido por un signo ?. Como regla práctica, no dé a un parámetro el mismo nombre que un campo ni el de una expresión nombrada con la palabra as.

La cantidad de parámetros a usar en una condición filtro depende del operador relacional escrito en Cri-terios. Con excepción de Between e In, los operadores relacionales necesitan uno solo. Between, que fija un rango de valores entre un límite inferior y otro superior, puede llevar uno o dos parámetros, como sigue:

Page 25: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

23

Límite inferior Límite superior parámetro parámetro parámetro valor literal valor literal parámetro

In, que establece una lista de valores, puede llevar todos en forma de parámetros o una mezcla de pa-

rámetros y valores literales. Los parámetros son simples nombres, sin contenido. Pero como las vistas necesitan filtros con valores

definidos, al ejecutar una vista con parámetros, lo primero que acontece es que SQL solicita valores espe-cíficos para cada parámetro usado. En una ejecución, se dan tales valores para los parámetros; en otra ejecución, se dan otros valores, y así. Esto hace que las vistas con parámetros sean muy flexibles.

Sea, para ejemplificar, una tabla Empleados. Un día nos encargan diseñar una vista que liste Nombre, Domicilio, Teléfono, etc., de esa tabla, pero solamente de empleados cuyos nombres comiencen con F. Deberemos escribir la siguiente condición filtro:

Empleados.Nombre = F Otro día nos piden modificar la vista, para que liste empleados cuyos nombres comiencen con B. Ten-

dremos que modificar la condición filtro de la siguiente forma: Empleados.Nombre = B

Luego nos piden listar empleados cuyos nombres comiencen con M, con P, con S, etc., lo cual supone modificar la condición filtro cada vez. ¿No habrá una solución a tanta variabilidad? Precisamente los pará-metros son la solución. Si escribimos la condición filtro como sigue

Empleados.Nombre = ? letras el problema está resuelto. Ahora, cada vez que ejecutemos la vista, lo primero que aparecerá será un cua-dro de diálogo que pide un valor para el parámetro letras. Si escribimos S como respuesta, listará los em-pleados cuyos nombres comiencen con S. Si escribimos Z, los que comiencen con Z. Si escribimos Mo, los nombres que comiencen con esas dos letras, como Molina, Morales, etc.

Para que los parámetros funcionen, basta con introducirlos en la ficha Filtro. Sin embargo, podrá obser-var que, cuando está en el Diseñador de vistas, aparece el comando Parámetros de vista en el Menú Con-sulta. ¿Para qué sirve este comando? Es sencillo y útil. Si una vista usa, por ejemplo, el parámetro Matrí-cula, cuando se ejecuta pide un valor para él, en un cuadro de diálogo cuyo mensaje dice:

Ingrese el valor para Matrícula Con esta petición, sabemos a qué le daremos valor, pero no sabemos el tipo de datos a ingresar. Si

usamos Consulta – Parámetros de vista, se abre un cuadro de diálogo donde podemos introducir el nom-bre de los parámetros que usamos y sus tipos de datos. En nuestro ejemplo, introduciremos el nombre Matrícula y el tipo carácter. Si ahora ejecutamos la vista, el mensaje será más específico, pues dirá:

Ingrese un valor de tipo carácter para Matrícula Esta aclaración elimina toda duda sobre tl tipo de datos.

6. Más sobre condiciones de combinación

Antes de terminar, conviene que considere algunos puntos importantes sobre las condiciones de com-binación, que creemos de gran utilidad.

Page 26: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

24

Cadena de tablas

Si en el panel de entorno hay más de dos tablas, controle que las condiciones de combinación sigan la disposición siguiente.

Tabla1.campo1 = Tabla2.campo1

Tabla2.campo2 = Tabla3.campo2

Tabla3.campo3 = Tabla4.campo3

Observe, en el esquema anterior, que: • La tabla derecha de la primera condición es la misma que la tabla izquierda de la segunda condición. • La tabla derecha de la segunda condición es la misma que la tabla izquierda de la tercera condición.

La representación gráfica de las tablas y combinaciones en el panel de entorno del esquema anterior, se vería así:

Si hubiera más tablas, el esquema deberá repetirse, formando una “cadena” de una tabla a la otra. La cadena asegura obtener combinaciones correctas. Para conseguirla, a veces basta con cambiar de posi-ción las combinaciones, mediante el botón Movimiento.

Nunca haga que las tablas izquierdas sean la misma, salvo que se trate de una combinación compleja. Por ejemplo, si se introducen al panel de entorno Tabla1, Tabla2 y Tabla3, y se combinan Tabla1.campo1 con con Tabla2.campo1 y Tabla1.campo2 con Tabla3.campo2, habrá un error, que producirá resultados incorrectos. En la ficha Combinación verá lo siguiente:

Tabla1.campo1 = Tabla2.campo1 Tabla1.campo2 = Tabla3.campo2

Puede ver que que no se observa la regla estipulada. En el panel superior, las tablas y combinaciones se verán como sigue, donde es evidente que no hay una cadena.

Observe que como tablas izquierda se ha usado Tabla1 en las dos condiciones. Para arreglar este pro-blema, el botón Movimiento no sirve. La solución más fácil es eliminar la primera condición y trazar en el

Tabla1 Tabla2 Tabla3

Tabla1

Tabla1

Tabla1

Page 27: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

25

panel de entorno una combinación desde Tabla2.campo1 a Tabla1.campo1. Ahora puede usar el botón Movimiento, para dejar la cadena de la siguiente forma:

Tabla2.campo1 = Tabla1.campo1 Tabla1.campo2 = Tabla3.campo2

Otra solución igualmente válida es hacer: Tabla3.campo2 = Tabla1.campo2 Tabla1.campo1 = Tabla2.campo1

La regla es sencilla de lograr, como ha podido ver. La corrección de los errores es muy simple: basta seleccionar las combinaciones incorrectas, eliminarlas con Delete y volver a trazarlas.

Observe finalmente que por "izquierda" y "derecha" debe entenderse no la disposición gráfica de las tablas en el panel de entorno, sino desde dónde parte la combinación y a dónde llega. Este movimiento queda reflejado en la ficha Combinación, donde se ve qué es lo que está a la izquierda y qué a la derecha. Agregado de una misma tabla varias veces

Sean las tablas Alfa, Beta, Gamma y Delta. Las combinaciones deben ser: Alfa.uno con Beta.uno, Al-fa.dos con Gamma.dos y Alfa.tres con Delta.tres. Por más que nos esforcemos, sería imposible crear una cadena correcta, como muestran los ejemplos siguientes:

Beta.uno = Alfa.uno Beta.uno = Alfa.uno Alfa.dos = Gamma.dos Alfa.dos = Gamma.dos Alfa.tres = Delta.tres Delta.tres = Alfa.tres

El primer ejemplo repite Alfa como izquierda en dos condiciones y no hay cadena entre la segunda y tercera combinaciones. En el segundo tampoco hay cadena entre la segunda y tercera combinaciones.

¿Cómo solucionar este problema? Un poco artificiosamente. Hay que agregar Alfa una segunda vez al panel de entorno. Para no confundirse, SQL le da un alias diferente, Alfa_a. Ahora tiene dos versiones de la misma tabla, que SQL considera como si fueran distintas. En total, entonces, hay cinco tablas. La cade-na ahora puede armarse con toda facilidad, como sigue.

Beta.uno = Alfa.uno Alfa.dos = Gamma.dos Gamma.dos = Alfa_a.dos Alfa_a.tres = Delta.tres

En el panel de entorno veremos:

No obstante, incluso hay veces que esta solución no produce los resultados deseados, porque el es-quema no "ve" todos los registros involucrados en las combinaciones. En este caso, hay otra solución, también bastante sencilla. Inclusión de vistas

El problema anterior tiene otra solución. Primero, podemos crear una vista que use como entrada Alfa,

Beta Alfa Gamma Alfa_a Delta

Page 28: Consultas y Vistas

EDMUNDO A. CÁCERES — CONSULTAS Y VISTAS — 2007

26

Beta y Gamma. Llamémosla Vista1. La combinación será la siguiente: Beta.uno = Alfa.uno Alfa.dos = Gamma.dos

Observe que la cadena es correcta. La vista resultante, Vista1, debe incluir los campos Uno, Dos y Tres. Este último campo, proveniente de Alfa, es necesario para el paso que daremos a continuación.

Luego creemos una segunda vista, Vista2, cuyas entradas sean Delta y Vista1. Recuerde que el panel de entorno no sólo acepta tablas, sino también vistas. La combinación será:

Delta.tres = Vista1.tres

Cuando ejecutemos Vista2, ésta encontrará que una de sus entradas es Vista1. Automáticamente la ejecutará y luego, una vez que la tenga generada, seguirá con la ejecución de Vista2. 7. Destinos de las consultas

Veamos por último un tema tratado de paso anteriormente: qué destinos puede producir una consulta, es decir, dónde se quiere que la coloque SQL.

Por defecto, el resultado de las consultas y las vistas se coloca en un cursor que se ve automáticamen-te en la ventana Examinar. Para las vistas, es el único destino posible. Para las consultas, es uno de los posibles, porque puede haber otros.

El cursor resultante de una vista o consulta tiene, como hemos dicho, la estructura de una tabla, pero no se guarda en disco, sino en memoria interna. Esto hace que VFP lo destruya cuando se deje de usar. Dejar de usar significa emitir un comando que cierre todas las tablas abiertas: el cursor, que es una tabla virtual abierta, se cierra, pero como no se guarda en disco, se pierde. Cerrar VFP produce el mismo efecto.

Ahora bien, como quasi tabla, el cursor debe tener un nombre. A lo largo de esta obra no nos hemos ocupado de este aspecto, porque VFP inventa un nombre para cada cursor. Incluso el nombre del cursor producido por una misma vista o consulta depende del momento en que se las ejecuta, porque VFP lo de-riva del reloj del sistema operativo. Un nombre producido de esta forma tiene la propiedad de no repetirse nunca.

La pregunta es: ¿cómo dar un nombre fijo a un cursor? Este nombre podría necesitarse para referirse al cursor en la programación, luego de ejecutar la vista o consulta, mientras exista en la memoria, o para guardar en forma permanente el resultado en una tabla. La solución la contemplan únicamente las consul-tas, que permiten mandar el resultado a otros destinos, como a un cursor con nombre establecido por el programador humano, o a una tabla, o a un informe.

Además del destino Examinar, de todos los otros nos interesan los destinos Cursor y Tabla. Para po-derlos establecer se debe usar el botón Destino de la consulta de la barra de herramientas Diseñador de consultas, el comando Consulta — Destino de la consulta o la opción Configuración de salida que aparece con el botón secundario. Estos procedimientos abren un cuadro de diálogo con diferentes botones para di-ferentes destinos. Los botones Cursor y Tabla presentan un cuadro de texto para definir el nombre que se desea. Establecidos estos destinos, cuando se ejecute la consulta no se abrirá la ventana Examinar, pero el cursor o la tabla estarán abiertos y se podrán acceder por su nombre para lo que se necesite.

Las vistas, aunque tienen la ventaja de los parámetros, no pueden producir cursores con nombre ni ta-blas directamente. Para aprovechar las ventajas de las vistas y obtener cursores con nombre o tablas, se puede primero diseñar una vista y después diseñar una consulta que tome como entrada esa vista y ob-tenga como resultado exactamente los mismos componentes, mandándolo al destino necesitado.