Vous êtes sur la page 1sur 29

Edmundo Cceres

Prctica sobre consultas y vistas




2008
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
1
Consultas
Ejercicio 1
Cree una consulta con los campos ART y NOM de la tabla ART, que muestre los nombres de los artcu-
los ordenados alfabticamente, de menor a mayor.
1. Cree una consulta. Puede hacerlo con ARCHIVO NUEVO CONSULTA NUEVO ARCHIVO. Otra forma
es ubicarse en la categora CONSULTAS de un proyecto, pulsar el botn NUEVO y despus el botn
NUEVA CONSULTA. Una tercera forma es emitir el comando CREATE QUERY seguido por el nombre que
va a tener la nueva consulta. Se abre el DISEADOR DE CONSULTAS, en blanco. Dado que supone-
mos que cuenta con el proyecto FAC, use la segunda forma.
Toda consulta trabaja sobre una o ms tablas y/o vistas de entrada. Por ello, junto al diseador se
abrir un dilogo para seleccionar una de estas entradas. Si hay alguna base de datos (BD) abier-
ta, el dilogo ser AGREGAR TABLA O VISTA, para elegir lo necesitado. Si no hay una BD abierta, el
dilogo ser ABRIR, para agregar la primera tabla. Luego se cierra este dilogo, que es reemplaza-
do por AGREGAR TABLA O VISTA, siempre que la tabla abierta sea de BD. Esto se debe a que VFP ob-
tiene de la primera tabla agregada informacin sobre la BD a que pertenece: esto explica el reem-
plazo del dilogo, dado que el segundo es ms prctico y permite elegir la categora VISTAS. Este
segundo dilogo permanece abierto para seguir agregando tablas o vistas, mediante el botn
AGREGAR. Para cerrarlo se usa el botn CERRAR. Este dilogo se puede abrir posteriormente en
cualquier momento, eligiendo la opcin AGREGAR TABLA del men contextual sobre el DISEADOR DE
CONSULTAS.
El botn OTRAS de AGREGAR TABLA O VISTA sirve para elegir tablas que no pertenezcan a las BD
abiertas, las cuales aparecen en la cuadro combinado BASES DE DATOS. El botn OTRAS presenta el
dilogo ABRIR. Estas tablas adicionales pueden ser libres o de otras BD. En el segundo caso, se
abrir la tabla y la BD a que pertenece, agregndose el nombre de sta a la lista del cuadro combi-
nado.
En AGREGAR TABLA O VISTA, bajo el nombre SELECCIONAR hay dos botones: TABLAS y VISTAS. Estos
botones cambian lo que muestra el cuadro de lista cuya etiqueta dir TABLAS EN LA BASE DE DATOS y
VISTAS EN LA BASE DE DATOS.
2. Agregue la tabla ART, que se ver como un cursor en el panel superior (entorno) del DISEADOR DE
CONSULTAS.
Cada tabla o vista agregada se representa en el panel superior como cursor. En cada uno se listan
verticalmente sus campos, precedidos por un asterisco, que representa todos los campos del cur-
sor. Todos los campos de los cursores agregados aparecen en el cuadro CAMPOS DISPONIBLES de la
ficha CAMPOS, prefijados con el nombre del cursor respectivo.
3. En la ficha CAMPOS, transfiera los campos ART.ART y ART.NOM de la lista CAMPOS DISPONIBLES a la
lista CAMPOS SELECCIONADOS.
Usando CAMPOS DISPONIBLES, la transferencia de un campo se puede hacer seleccionndolo y pul-
sando el botn AGREGAR, dndole doble click o arrastrndolo a la lista CAMPOS SELECCIONADOS.
Usando el cursor, se puede hacer con doble click o arrastrndolo.
Para transferir todos los campos de todos los cursores se usa el botn AGREGAR TODOS. Para trans-
ferir todos los campos de un solo cursor se usa el asterisco, con doble click o arrastre.
Para transferir a la vez algunos campos, se los selecciona en CAMPOS DISPONIBLES o en un cursor y
se usa el botn AGREGAR o el arrastre.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
2
La devolucin de un campo de CAMPOS SELECCIONADOS a CAMPOS DISPONIBLES se hace seleccio-
nndolo y pulsando QUITAR, dndole doble click o arrastrndolo.
La devolucin de todos los campos se hace con el botn QUITAR TODOS.
Para devolver algunos campos de un mismo cursor, se los selecciona y se pulsa QUITAR o se los
arrastra.
Los campos seleccionados son los que la consulta va a producir, contenidos en un cursor que se
ver en la ventana EXAMINAR. En este primer ejemplo no veremos que la consulta hace gran cosa,
porque lo mismo podramos lograr examinando la tabla ART. Sin embargo, a medida que avance-
mos, veremos que tienen mucha potencia.
4. Seleccione la ficha ORDENAR POR y transfiera el campo NOM de CAMPOS SELECCIONADOS a
CRITERIOS DE ORDENACIN. Los recursos para transferir campos son anlogos a los explicados an-
tes. En OPCIONES DE ORDEN active el botn ASCENDENTE.
Las consultas permiten ordenar los registros del cursor de salida por uno o varios de sus campos.
En este caso, solamente ordenamos por uno slo, NOM. Note que los campos por los que podemos
ordenar son los que componen el cursor de salida, no los de los cursores de entrada: los campos
para ordenar son los seleccionados en la ficha CAMPOS.
5. Ejecute la consulta, eligiendo EJECUTAR CONSULTA en el men contextual o en el men CONSULTA.
Veremos el resultado en una ventana EXAMINAR, de slo lectura. Compruebe esto tratando de mo-
dificar el contenido de cualquier campo: se nos dar el mensaje El control es de slo lectura. Ve-
remos luego que el resultado de las vistas tambin es un cursor que se ve en la ventana EXAMINAR,
pero que permite modificar el valor de los campos.
6. Salga de la ventana EXAMINAR con ESC.
7. Guarde la consulta con el nombre CON1 y luego cirrela.
Para guardar puede usar ARCHIVO GUARDAR o ARCHIVO GUARDAR COMO. Si el archivo an no es-
t guardado, GUARDAR llamar al dilogo GUARDAR COMO. Si ya est guardado, guardar las nue-
vas modificaciones. CTRL + S es igual a ARCHIVO GUARDAR. Cierre el diseador con ARCHIVO
CERRAR o con ESC. Si pulsa ESC y an no ha guardado el archivo, VFP preguntar si lo quiere
guardar. Si contesta que s, se presenta el dilogo GUARDAR COMO y despus se cierra el disea-
dor. Otra forma de guardar y salir es con CTRL + W, que pide un nombre para el archivo si todava
no lo tiene.
Ejercicio 2
Cree la consulta CON2, similar a CON1, pero que liste solamente los artculos cuyo cdigo de artculo
(campo ART), comience con la letra C.
1. Para aprovechar el trabajo realizado en CON1, seleccione este archivo en el proyecto FAC y pulse
MODIFICAR. Esto abrir CON1 en el DISEADOR DE CONSULTAS.
2. D el comando ARCHIVO GUARDAR COMO. En el dilogo de igual nombre, denomine CON2 al dupli-
cado a crear. Despus de eso, ver que la consulta que queda en el diseador es CON2, de modo
que vamos a trabajar sobre ella. Para saber sobre qu consulta est trabajando, lea la barra de t-
tulo del diseador.
3. Seleccione la ficha FILTRO. En NOMBRE DE CAMPO elija ART.ART. En CRITERIOS elija el operador = y
en EJEMPLO escriba "C".
4. Guarde la consulta con CTRL + S y luego ejectela. Salga con ESC de la ventana EXAMINAR y vuelva
a dar ESC para salir del diseador.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
3
5. La nueva consulta no aparece en el proyecto, porque si bien fue creada y modificada, no fue agre-
gada a l. Para hacerlo, en el mbito CONSULTAS del proyecto pulse AGREGAR. En el dilogo ABRIR
seleccione el archivo CON2 y pulse ACEPTAR. Luego de ello, la nueva consulta quedar registrada
en el proyecto y se ver dentro del mbito CONSULTAS.
La ficha FILTROS sirve para hacer que algunos registros de entrada entren al proceso de la consulta
y otros no. Para ello se usa un campo, que se compara contra un valor. Si el resultado lgico de la
comparacin es verdadero, el registro entra al proceso; de lo contrario, el registro se ignora y no in-
fluye en el cursor resultante.
Que lo establecido en la ficha FILTROS afecta los registros de entrada se pone de manifiesto en la
lista NOMBRE DE CAMPO, donde se ofrecen todos los campos de entrada, es decir, los mismos de la
lista CAMPOS DISPONIBLES de la ficha CAMPOS o los que se ven en los cursores de entrada. En este
ejercicio, el filtro se aplica al campo ART, que tambin figura en la lista CAMPOS SELECCIONADOS. Pe-
ro podramos haber aplicado el filtro al campo PRE, que no es un campo seleccionado para confec-
cionar el cursor de salida.
La ficha FILTROS permite descartar registros de entrada usando cualquiera de sus campos o expre-
siones construidas sobre ellos, sin darles salida en el cursor resultante. Este campo o expresin se
escribe en NOMBRE DE CAMPO.
El filtro establecido en una consulta es esttico: permanece fijo mientras no lo modifiquemos en la
consulta. Puede darse el caso que usted disee la consulta CON2 para que la ejecuten otras per-
sonas que no saben nada de diseo. Cuando se quiera que la consulta d por resultado los regis-
tros cuyo cdigo de artculo comience con la letra A, B, D, etc., cualquier otra letra distinta a C, us-
ted, el nico experto en este tema, tendr que modificar CON2. Ahora bien, qu pasar cuando
usted no est presente, porque est enfermo o de vacaciones? Los dems no podrn obtener lo
que deseen, hasta que usted no regrese. Este problema no puede solucionarse en las consultas,
sino en las vistas, que usan una tcnica llamada parametrizacin, tema que veremos posteriormen-
te.
En CRITERIOS aparecen distintos operadores, para comparar si un campo es igual, menor, mayor,
etc., que el valor escrito en EJEMPLO. El botn NO sirve para negar el operador elegido, obteniendo
no igual (distinto), no menor (mayor o igual), no mayor (menor o igual), etc.
El operador =, aplicado a caracteres, considera la igualdad parcial del valor del campo y del ejem-
plo, de izquierda a derecha, hasta que se acaba el ejemplo. Por ello, en el ejercicio, los valores
C01, C02, C03, etc., del campo ART, son iguales al valor del ejemplo, C. El operador = puede apli-
carse a campos o expresiones numricas, de fecha, de fechahora y lgicas.
El operador == da por iguales los valores del campo y del ejemplo cuando son totalmente iguales,
no parcialmente iguales.
El operador BETWEEN compara el valor de un campo con un intervalo de valores, que se expresan
en EJEMPLO indicando el menor y el mayor, separados por una coma. As, si en EJEMPLO hubiera
escrito A,D, en el resultado vera todos los artculos cuyo cdigo comienzan con A, B, C y D.
El operador IN compara el valor de un campo con un conjunto de valores no sucesivos, que se ex-
presan en EJEMPLO listndolos, separados por comas. Si en EJEMPLO hubiera escrito A, C, F, slo
vera los artculos cuyo cdigo comienzan con A, C y F. No hace falta que los valores sean escritos
en orden: podra haberlos indicado como A,F,C, como F,A,C o como F,C,A.
El operador LIKE sirve para introducir comodines en el valor de EJEMPLO. A diferencia de los cono-
cidos comodines ? y *, SQL usa _ (subrayado) para representar cualquier valor en una posicin
especfica y % (porcentaje) para representar cualquier valor en en una o ms posiciones. Por
ejemplo, para filtrar los nombres de artculo que comienzan con A, LIKE exige expresar en EJEMPLO
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
4
la expresin A% o "A%". Para filtrar los nombres que tienen una a minscula en la segunda posi-
cin, el filtro se escribe _a% o "_a%". Para filtrar los nombres que tienen dos a minsculas en cual-
quier posicin, el filtro es %a%a% o "%a%a%". Los ejemplos dados evidencian que LIKE distingue
entre maysculas y minsculas.
No comentamos el operador IS NULL, porque no nos interesa trabajar con valores nulos.
Dado que el campo ART es de caracteres, SQL entiende que slo se puede comparar contra carac-
teres, por lo que, si no se escribe entre comillas el valor de EJEMPLO, lo corrige y lo encierra entre
comillas. Para evitar problemas, escrbalo siempre entre comillas.
El botn M / M sirve para distinguir entre maysculas y minsculas, cuando no se activa. Si no lo ac-
tiva y escribe c, no se listar ningn artculo que comience con c minscula. Si lo activa y escribe C
o c, listar todos los artculos que comiencen con esa letra.
Ejercicio 3
Se quiere una consulta CON3 que muestre los artculos cuyo precio, aumentado un 15%, supere $180.
Los campos de salida sern ART, NOM y el nuevo precio.
1. Cree una nueva consulta. Agregue la tabla ART. En la ficha CAMPOS, agregue los campos ART y
NOM.
2. En FUNCIONES Y EXPRESIONES, llame al GENERADOR DE EXPRESIONES con . Cree la expresin
ART.PRE * 1.15. Cierre el generador. La expresin queda en FUNCIONES Y EXPRESIONES.
3. Pulse el botn AGREGAR. Esto transfiere la expresin a CAMPOS SELECCIONADOS, como un campo
calculado.
4. Seleccione la ficha FILTROS. En NOMBRE DE CAMPO seleccione <EXPRESIN>. En el GENERADOR DE
EXPRESIONES escriba ART.PRE * 1.15. En CRITERIOS seleccione > y en EJEMPLO escriba 180.
5. Ejecute la consulta. La columna del nuevo precio dice Exp_1 (o Exp_2, o Exp_3, etc., segn la can-
tidad de campos calculados agregados como campo seleccionado). Este ttulo de la columna no es
para nada claro, por lo que conviene darle otro ms apropiado.
6. En la ficha CAMPOS, seleccione la expresin. Pulse el botn QUITAR, para sacar el campo calculado
de CAMPOS SELECCIONADOS y devolverlo a FUNCIONES Y EXPRESIONES. Pulse . En el GENERADOR
DE EXPRESIONES, corrija la expresin por ART.PRE * 1.15 AS NUEVO_PRECIO. Cierre el generador.
Transfiera la expresin corregida a CAMPOS SELECCIONADOS con el botn AGREGAR.
7. Vuelva a ejecutar la consulta. Ahora la ltima columna tiene un nombre apropiado. Hemos escrito
Nuevo_precio y no Nuevo precio, porque los nombres de campo no aceptan blancos. El guin bajo
salva este problema.
8. Guarde la consulta con el nombre CON3. Para evitar perder el trabajo en caso de corte de energa,
podra haberla guardado en cualquier paso intermedio, repitiendo la operacin cada tanto con con
CTRL + S. No olvide guardarla cuando todo est concluido con xito.
El ttulo de la tercera columna est bien y es completo, pero las otras columnas son ART y NOM,
igual al nombre de los campos. Corrijamos estos ttulos, para que tengan nombres completos.
9. En la ficha CAMPOS devuelva los campos ART y NOM. En FUNCIONES Y EXPRESIONES escriba ART.ART
AS ARTCULO y transfirala a CAMPOS SELECCIONADOS.
10. Haga lo mismo para el campo NOM, escribiendo la expresin ART.NOM AS NOMBRE.
11. En CAMPOS SELECCIONADOS aparecen tres campos calculados, pero no en el orden con que se des-
ea que aparezcan en la ventana EXAMINAR. El que est ms arriba ser la primera columna, el que
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
5
le sigue ser la segunda, y as. Para reordenarlos, mueva la disposicin de los campos selecciona-
dos tomndolos de los botones que los preceden y arrastrndolos hacia arriba o abajo.
12. Ejecute la consulta y gurdela cuando est bien.
Ejercicio 4
Se quiere una consulta CON4 que muestre todos los campos de la tabla LINFAC, agregando un campo
calculado con el producto del precio por la cantidad. De este modo obtendremos el parcial de cada art-
culo que compone cada factura. El resultado debe estar ordenado por nmero de factura y dentro de
cada nmero por el cdigo de artculo.
1. Cree una consulta. Agregue la tabla LINFAC. En la ficha CAMPOS, agregue todos los campos a
CAMPOS SELECCIONADOS.
2. En FUNCIONES Y EXPRESIONES escriba LINFAC.PRE * LINFAC.CAN AS PARCIAL y agrguela a CAMPOS
SELECCIONADOS.
3. En la ficha ORDENAR POR, agregue el campo FAC a CRITERIOS DE ORDENACIN, con orden AS-
CENDENTE. Agregue luego el campo ART en orden ASCENDENTE.
Si quisiramos construir un ndice por los mismos conceptos para la tabla LINFAC, deberamos usar
la expresin STR(LIFAC.FAC,8,0) + LINFAC.ART e indicar si el orden va a ser ascendente o descen-
tente. El orden se aplica a la totalidad de la expresin, es decir, a cada componente. En las consul-
tas cada componente puede tener su propio orden.
Note que, aunque existiera tal ndice, SQL no lo tiene en cuenta, por lo que hay que establecer el
orden en la ficha ORDENAR POR.
4. Guarde y ejecute la consulta.
Ejercicio 5
La consulta CON4 muestra los totales parciales de cada factura, pero no el total general de ellas. Se
quiere una consulta, CON5, con el campo FAC y un campo calculado con la suma de los productos par-
ciales entre cantidad y precio, para obtener el total general de cada factura. Los registros de salida de-
ben estar ordenados por factura.
1. Cree una nueva consulta. Agregue la tabla LINFAC. Haga de FAC un campo seleccionado.
2. Agregue como campo seleccionado la expresin SUM(LINFAC.CAN * LINFAC.PRE) AS TOTAL.
3. Guarde y ejecute la consulta CON5.
Observe que la ventana EXAMINAR muestra un solo registro. Por qu? La funcin SUM( ) suma la
expresin numrica contenida o calculada en cada registro. Esto lo hace con todos los registros de
la tabla LINFAC. Cuando ya no hay ms registros a procesar, da por resultado un solo registro, con
el total de lo calculado. Por eso se dice que SUM( ) es una funcin de agrupamiento.
Si observa el registro resultante, el campo FAC se refiere a una sola factura, pero el campo TOTAL
es el importe de todas las facturas. La informacin de FAC es incoherente, porque usted eligi este
dato para la salida. La incoherencia la genera usted, no SQL. Como SQL debe dar salida a un n-
mero de factura, habiendo muchas facturas dar el nmero de la ltima que encuentre.
Felizmente, dado que usted quiere el total de cada factura, hay una manera de lograrlo.
4. En la ficha AGRUPAR POR, transfiera el campo FAC de CAMPOS DISPONIBLES a CAMPOS AGRUPADOS.
5. Ejecute la consulta. Ahora s los resultados son los esperados.
Observe que CAMPOS DISPONIBLES le ofrece agrupar por cualquier campo de la tabla, est o no se-
leccionado como salida. Si usa para agrupar un campo que no va a figurar en la salida, SQL lo
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
6
agregar por su cuenta a CAMPOS SELECCIONADOS de la ficha CAMPOS. Pero si usted quiere agrupar
por l pero no tenerlo en la salida, puede eliminarlo de esa lista.
Quede claro, entonces, que el agrupamiento afecta los registros de entrada. En el ejemplo, como
se quiere un total por cada factura, SQL ordena los registros de entrada de modo que primero que-
den todos los correspondientes a la factura 1, formando un grupo, luego todos los correspondientes
a la factura 2, etc. Teniendo los registros ordenados de esa manera, SQL puede dar un total co-
rrecto de la factura 1, que muestra como un nico registro en la salida. Lo mismo para la factura 2,
etc.
Insistamos en cmo trabaja el agrupamiento. Cuando se agrupa, SQL ordena los registros de en-
trada por el criterio de ordenamiento, formando grupos. Luego, para todos los registros de un grupo
de entrada, produce un solo registro de salida con lo calculado. Pone en cero lo calculado y repite
el proceso para el grupo siguiente, produciendo otro registro de salida.
La dicho en el prrafo anterior se aclara ms ejemplificando con datos. Suponga que la tabla
LINFAC tiene los siguiente registros, en orden de grabacin.
Linfac
Fac Art Can Pre
1 A05 5 10
2 B01 4 15
3 D03 1 20
1 C02 2 40
2 A05 2 10
1 A04 4 25
3 A02 1 90
3 A06 2 45
2 C01 5 50
Como debe agrupar por FAC, SQL ordena internamente los registros de entrada por tal campo,
quedando:
Linfac ordenada
Fac Art Can Pre
1 A05 5 10
1 C02 2 40
1 A04 4 25
2 B01 4 15
2 A05 2 10
2 C01 5 50
3 D03 1 20
3 A02 1 90
3 A06 2 45
Ahora puede calcular la expresin SUM(LINFAC.PRE * LINFAC.CAN) AS TOTAL. Comenzando por el
grupo de la factura 1, el clculo ir incrementndose como sigue:
Linfac ordenada Clculos
Fac Art Can Pre Linfac.pre * Linfac.can SUM(Linfac.pre * Linfac.can)
1 A05 5 10 50 50
1 C02 2 40 80 130
1 A04 4 25 100 230
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
7
Cuando SQL llega a la factura 2, es porque se ha acabado completamente la factura 1. Entonces
genera un registro de salida para la factura 1.
Cursor de salida
Fac Total
1 230
Con la factura 2 hace lo mismo:
Linfac ordenada Clculos
Fac Art Can Pre Linfac.pre * Linfac.can SUM(Linfac.pre * Linfac.can)
2 B01 4 15 60 60
2 A05 2 10 20 80
2 C01 5 50 250 330
SQL genera un nuevo registro y lo agrega al cursor de salida:
Cursor de salida
Fac Total
1 230
2 330
Finalmente, con la factura 3, SQL realiza los siguientes clculos:
Linfac ordenada Clculos
Fac Art Can Pre Linfac.pre * Linfac.can SUM(Linfac.pre * Linfac.can)
3 D03 1 20 20 20
3 A02 1 90 90 110
3 A06 2 45 90 200
SQL agrega el total de la factura 3 al cursor de salida, en un nuevo registro:
Cursor de salida
Fac Total
1 230
2 330
3 200
Aunque no hemos usado la ficha ORDENAR POR, los registros salen ordenados por factura. Esto es
porque SQL, para hacer el clculo, previamente orden internamente los registros de entrada por
factura, como se ha indicado. Las entradas, entonces, tienen el orden necesitado para la salida. Si
se necesitara otro orden para la salida, por ejemplo por TOTAL descendente, se puede hacer sin
ningn inconveniente usando ORDENAR POR, que, como se ha dicho, ordena los registros de salida.
Otra advertencia es que el agrupamiento se puede hacer por ms de un campo. Por ejemplo, en la
tabla ENCFAC podramos agrupar por los campos CLI y FEC. Cada grupo esara formado por el valor
conjunto de ambos campos, de modo que, a los efectos del clculo, es lo mismo la combinacin
CLI FEC que FEC CLI. Sin embargo, a los efectos del orden interno, que puede ser aprovechado
sin usar la ficha ORDENAR POR, no es lo mismo. Por ello, en CAMPOS AGRUPADOS, cada campo tiene
un botn que permite arrastrarlo hacia arriba o abajo, logrando el ordenamiento adecuado: el cam-
po que est arriba es el que tiene mayor prioridad, la cual desciende por los dems campos de
modo jerrquico.
Ejercicio 6
Se quiere una consulta CON6 que haga bsicamente lo mismo que CON5, pero que solamente genere
registros de totales para las facturas cuyos importes superen $1000.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
8
1. Abra CON5 y gurdela como CON6. Cierre CON5. Agregue CON6 al proyecto y brala para modifi-
carla.
2. En la ficha AGRUPAR POR pulse el botn CONDICIONES. Esto trae un dilogo de igual nombre, que
sirve para filtrar registros de salida.
3. En NOMBRE DEL CAMPO elija el campo calculado TOTAL. En CRITERIOS elija el operador >=. En
EJEMPLO escriba 1000.
4. Ejecute y guarde la consulta.
El botn CONDICIONES de la ficha AGRUPAR POR sirve para establecer filtros para los registros de sa-
lida. Si usted quiere poner filtros a los totales de factura, no puede hacerlo en la ficha FILTROS, por-
que los filtros establecidos en ella se aplican a los registros de entrada. Como los totales son una
suma de los productos precio por cantidad de los registros componentes de cada factura, no exis-
ten como datos de la entrada, sino que resultan de clculos aplicados a cada grupo. Por ello los to-
tales deben filtrarse en los registros de salida, para lo cual existe el dilogo CONDICIONES.
Ejercicio 7
Se quiere CON7 que haga lo mismo que CON5, pero que muestre las 10 facturas cuyo totales sean los
mayores.
1. Guarde CON5 como CON7. Agregue CON7 al proyecto y entre a modificarla.
2. En la ficha ORDENAR POR, agregue SUM(LINFAC.PRE * LINFAC.CAN) AS TOTAL a CRITERIOS DE
ORDENACIN, con opcin de orden DESCENDENTE.
3. Ejecute la consulta.
Aparecen todos los registros, ordenados de mayor a menor por TOTAL. Pero nosotros queremos so-
lamente los 10 primeros registros de esa salida, que tienen los totales mayores.
4. En la ficha VARIOS, desactive el botn TODOS de REGISTROS INCLUIDOS y escriba 10 en NMERO DE
REGISTROS.
5. Ejecute la consulta y gurdela.
Si en lugar de los 10 mejores quisiera el 10% de los registros, deber activar el botn PORCENTAJE.
Ejercicio 8
Cree CON8 para obtener el total vendido de cada artculo.
1. Cree una nueva consulta. Agregue la tabla LINFAC. Seleccione como salida el campo ART y la ex-
presin SUM(LINFAC.PRE * LINFAC.CAN) AS VENDIDO.
2. Agrupe por el campo ART.
3. Ejecute y guarde la consulta.
Ejercicio 9
Cree CON9 para obtener todos los campos de la tabla LINFAC, agregando en cada registro el nombre de
cada artculo, que debe tomar de la tabla ART.
1. Cree una consulta. Agregue la tabla LINFAC. Agregue todos los campos.
2. En el DISEADOR DE CONSULTAS, pulse el botn secundario y elija AGREGAR TABLA.
3. En el dilogo AGREGAR TABLA O VISTA, selecciones la tabla ART y pulse ACEPTAR. Esto abre el dilo-
go CONDICIN DE COMBINACIN, en el que se propone una combinacin interna entre LINFAC.ART y
ART.ART. Pulse ACEPTAR. Cierre el dilogo AGREGAR TABLA O VISTA.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
9
SQL puede fabricar salidas combinando dos tablas. Combinar es parecido a relacionar las tablas,
pero no igual. SQL no maneja relaciones. Las combinaciones consideran situaciones que las rela-
ciones no tienen en cuenta.
Para combinar dos tablas, ambas deben tener algo comn. En el ejemplo, lo comn es el campo
ART, que est en ambas tablas. Lo comn no es que se llamen igual, sino que tengan datos referi-
dos a lo mismo. Si en una tabla el campo se llamara ART y en la otra se llamara ARTIC, la combina-
cin tambin podra hacerse, porque ambos contienen cdigos de artculo.
Al definir la combinacin, se indica un campo de una tabla a la izquierda y un campo de otra tabla a
la derecha. Esto permite hablar de tabla izquierda y tabla derecha. Fjese que izquierda y derecha
hacen referencia a cmo se definen las tablas en el dilogo CONDICIN DE COMBINACIN, no a como
se ven en el entorno. En este panel, los cursores se pueden arrastrar a cualquier lado, de modo
que hablar de tabla izquierda o derecha no tiene sentido, porque el arrastre puede poner la tabla
izquierda a la derecha, una tabla bajo la otra, etc.
Hay varios tipos de combinaciones. El tipo interna indica que SQL se va a preocupar por fabricar
una salida cada vez que un registro de la tabla izquierda coincida con otro de la tabla derecha por
el campo ART. Si un registro de la tabla izquierda no tiene un registro coincidente en la tabla dere-
cha, se ignora. Sera el caso de un cdigo de artculo vendido que fuera errneo, porque no po-
dramos vender algo que no est en la lista oficial de los artculos que comercializamos (tabla ART).
Simtricamente, si un registro de la tabla derecha no tiene un registro coincidente en la tabla iz-
quierda, tambin se ignora. Sera el caso de un artculo de la lista oficial que no se hubiera vendido
nunca.
Sean las tablas LINFAC y ART, con registros hipotticos. Los registros de una tabla sin coincidencia
en la otra aparecen oscurecidos.
Linfac Art
Fac Art Can Pre Art Nom
1 A05 5 10 A01 Camisa
1 A04 4 25 A02 Pantaln
2 A09 4 15 A03 Corbata
2 A05 2 10 A04 Pauelo
2 C01 5 50 A05 Cinto
3 A02 1 90 A06 Zapatos
3 A06 2 45 A07 Medias
SQL producir la salida siguiente:
Cursor de salida
Fac Art Can Pre Nom
1 A05 5 10 Cinto
1 A04 4 25 Pauelo
2 A05 2 10 Cinto
3 A02 1 90 Pantaln
3 A06 2 45 Zapatos
Observe que el registro de ART con cdigo de artculo A05 aparece en las facturas 1 y 2 de LINFAC.
Esto significa que el registro de ART se combina con cada uno de los registros de LINFAC, produ-
ciendo dos registros en el cursor de salida.
Como no hemos ordenado la salida por cdigo de artculo ni por nombre, es confuso. Mejor hubiera
sido ordenar por alguno de estos campos.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
10
4. Guarde y ejecute la consulta.
Ejercicio 10
Cree CON10 para calcular el importe total vendido de cada artculo. La salida debe ordenarse por nom-
bre de artculo.
1. Cree una nueva consulta.
2. Agregue la tabla ART y luego la tabla LINFAC.
3. En el dilogo CONDICIN DE COMBINACIN, acepte la propuesta de combinar internamente ART.ART
con LINFAC.ART. Cierre el dilogo AGREGAR TABLA O VISTA.
A los efectos de lograr el propsito de la consulta, en este caso es indistinto cul tabla estar a la
izquierda y cual a la derecha.
4. En la ficha CAMPOS agregue como campos seleccionados ART.ART, ART.NOM y la expresin
SUM(LINFAC.CAN * LINFAC.PRE) AS VENDIDO.
5. En agrupar por agregue ART.ART como campo agrupado.
6. En ORDENAR POR agregue ART.NOM como criterio de ordenacin.
7. Guarde y ejecute la consulta.
Hemos agrupado por cdigo de artculo y hemos ordenado la salida por nombre de artculo. Po-
dramos haber agrupado por el nombre? En el caso del ejercicio s, porque todos los nombres son
diferentes. Pero en la mayora de los casos, como clientes, alumnos, socios, etc., es muy comn
que dos o ms clientes, alumnos, etc., tengan cdigos distintos, pero se llamen igual. Por ejemplo,
sea que los clientes con cdigo 15 y 49 se llamen Juan Carlos Gonzlez. Si agrupramos por nom-
bre, daramos un solo total para Juan Carlos Gonzlez, lo cual sera un error. Lo correcto sera
agrupar por cdigo de cliente, que es el identificador de cada uno y nunca se repite. Si el cdigo de
cliente se repitiera, dejara de ser identificador.
Con las tablas del ejemplo anterior, SQL ordenara las tablas por ART, para poder agrupar:
Linfac Art
Fac Art Can Pre Art Nom
3 A02 1 90 A01 Camisa
1 A04 4 25 A02 Pantaln
1 A05 5 10 A03 Corbata
2 A05 2 10 A04 Pauelo
3 A06 2 45 A05 Cinto
2 A09 4 15 A06 Zapatos
2 C01 5 50 A07 Medias
Luego producira la combinacin siguiente:
Combinacin
Fac Art Can Pre Nom
3 A02 1 90 Pantaln
1 A04 4 25 Pauelo
1 A05 5 10 Cinto
2 A05 2 10 Cinto
3 A06 2 45 Zapatos
Posteriormente agrupara, produciendo lo siguiente, con los campos solicitados:
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
11
Art Nom Vendido
A02 Pantaln 90
A04 Pauelo 100
A05 Cinto 70
A06 Zapatos 90
Finalmente ordenara por NOM y obtendra el cursor definitivo:
Art Nom Vendido
A05 Cinto 70
A02 Pantaln 90
A04 Pauelo 100
A06 Zapatos 90
Ejercicio 11
Cree CON11 para calcular la cantidad de unidades totales vendidas de cada artculo. Ordene la salida
por nombre de artculo.
1. La consulta a crear es similar a CON10, de modo que crela a partir de ella y agrguela al proyecto.
2. Lo que vara con respecto a CON10 es que no debe calcular el importe total de ventas por artculo,
sino el total de unidades vendidas de cada uno. Elimine el campo seleccionado SUM(LINFAC.CAN *
LINFAC.PRE) AS VENDIDO, reemplazndolo por SUM(LINFAC.CAN) AS UNIDADES.
3. Ejecute y guarde la consulta.
Ejercicio 12
Cree CON12 para que muestre los campos FAC, FEC, CLI de ENCFAC y el total de cada factura.
1. Cree una nueva consulta. Agregue las tablas ENCFAC y LINFAC, combinndolas internamente por el
campo FAC.
2. Agregue como seleccionados los campos FAC, FEC y CLI. Agregue tambin la expresin
SUM(LINFAC.PRE * LINFAC.CAN) AS IMPORTE.
3. Agrupe por ENCFAC.FAC.
4. Guarde y ejecute la consulta.
Ejercicio 13
En una nueva consulta CON13, realice lo mismo que en CON12, pero agregando el nombre de cada
cliente, que debe tomar de la tabla CLI.
1. Cree CON13 a partir de CON12. Agregue CON12 al proyecto y modifquela.
2. Agregue la tabla CLI. Acepte en principio la combinacin interna ENCFAC.CLI con CLI.CLI. Veremos
que esto produce errores, porque cuando hay ms de dos tablas en el panel de entorno, se debe
observar una regla.
3. Agregue CLI.NOM a campos seleccionados. Reubique los campos, para que el cdigo de cliente
salga junto al nombre.
4. Guarde y ejecute la consulta.
Aunque el cdigo de cliente vara, siempre aparece el mismo nombre de cliente. Obviamente hay
un error, debido a las combinaciones. Active la ficha COMBINACIN y ver lo siguiente:

Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
12
Tipo Nombre de campo No Criterios Valor Lgico
Inner Join Encfac.fac = Linfac.fac
Inner Join Encfac.cli = Cli.cli
Hay dos lneas, una por combinacin. Cada botn abre el dilogo CONDICIN DE COMBINACIN pa-
ra la combinacin correspondiente, permitiendo modificarla. En TIPO hay una lista desplegable para
cada combinacin, para elegir su tipo, que se ofrecen en ingls: Inner Join quiere decir combina-
cin interna. En NOMBRE DE CAMPO se define la tabla izquierda y su campo de combinacin. En
CRITERIOS, en principio, debe definir el operador =, que es el ofrecido inicialmente. En VALOR se de-
fine la tabla derecha con su campo. NO niega el criterio, que por lo dicho, en principio no se usa,
pues negara el =, dando distinto. LGICO sirve para elegir los operadores AND y OR, permitiendo
lograr combinaciones compuestas.
Cuando hay varias tablas, la que est a la derecha en una combinacin debe estar a la izquierda
en la combinacin siguiente. Esta regla no se ha observado y es lo que produce el error. El esque-
ma de combinaciones, aplicando la regla, debe ser el siguiente:
Tipo Nombre de campo No Criterios Valor Lgico
Inner Join Cli.cli = Encfac.cli
Inner Join Encfac.fac = Linfac.fac
Otra forma de combinar las tablas, tambin correcta, es:
Tipo Nombre de campo No Criterios Valor Lgico
Inner Join Linfac.fac = Encfac.fac
Inner Join Encfac.cli = Cli.cli
Usemos el primer equema. Hay varias formas de corregir el error. Una es seleccionar cada lnea de
combinacin en el panel de entorno, pulsar la tecla SUPRIMIR y trazarla de nuevo, arrastrando del
campo de la tabla izquierda al campo de la tabla derecha. Recuerde que izquierda y derecha no se
refieren a cmo estn dispuestos los cursores en el panel, sino a las tablas de partida y llegada,
respectivamente. Para no confundirse, puede mover los cursores para que visualmente queden a la
izquierda y derecha, de acuerdo al arrastre.
Otra forma es eliminar cada lnea en la ficha COMBINACIN, ubicndose en ella y pulsando el botn
QUITAR. Posteriormente se puede construir cada combinacin definiendo su tipo y las tablas y cam-
pos izquierdos y derechos.
Otra forma es pulsar el botn de cada combinacin y tratar de modificarla en el dilogo
CONDICIN DE COMBINACIN. Esto no siempre es posible, porque como la condicin ya est definida
y se la quiere editar, las posibilidades de tablas izquierdas son todas las que no estn como tabla
derecha, porque una tabla no se puede combinar consigo misma. Lo mismo sucede con la tabla
derecha. Pero si fuera posible usar este dilogo, quizs resulte que las combinaciones estn co-
rrectas pero mal ubicadas, infringiendo la regla. Queda todava el recurso de intercambiarlas, arras-
trndolas hacia arriba o hacia abajo con el botn que aparece a la izquierda de cada combinacin.
Use la primera o segunda formas para corregir el error y lograr el primer esquema.
5. Guarde y ejecute la consulta.
Ejercicio 14
Cree Con14 para que muestre el nombre de los clientes y el total comprado por cada uno. Ordene por
nombre.
1. Cree una nueva consulta. Agregue las tablas CLI, ENCFAC y LINFAC. Dado que las combinaciones
propuestas son correctas, acptelas.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
13
2. Agregue como campo de salida CLI.NOM y SUM(LINFAC.CAN * LINFAC.PRE) AS COMPRADO.
3. Agrupe por CLI.CLI.
4. Ordene por CLI.NOM.
5. Guarde y ejecute la consulta.
Ejercicio 15
Cree CON15 para obtener lo comprado por cada cliente en cada factura. Se debe ordenar por nombre
de cliente y nmero de factura.
1. Cree una nueva consulta. Agregue las tablas CLI, ENCFAC y LINFAC. Acepte las combinaciones pro-
puestas, porque son correctas.
2. Agregue como salida CLI.NOM, ENCFAC.FAC y SUM(LINFAC.CAN * LINFAC.PRE) AS COMPRADO.
3. Agrupe por CLI.CLI y ENCFAC.FAC.
4. Ordene por CLI.NOM y ENCFAC.FAC.
5. Guarde y ejecute la consulta.
Ejercicio 16
Cree CON16 para obtener el total de ventas en cada provincia. Ordene por nombre de provincia.
1. Cree una nueva consulta. Agregue las tablas PROV, CLI, ENCFAC y LINFAC. Las condiciones de
combinacin pueden ser como indica cualquiera de los siguientes esquemas:
Prov.prv = Cli.prv Linfac.fac = Encfac.fac
Cli.cli = Encfac.cli Encfac.cli = Cli.cli
Encfac.fac = Linfac.fac Cli.prv = Prov.prv
Para qu usar cuatro tablas, si cuando la informacin a obtener proviene solamente de dos? Por-
que, para poder llegar de PROV a LINFAC, las tablas con la informacin necesitada, debemos usar
como "puentes" las tablas CLI y ENCFAC.
2. Agregue como salida PROV.NOM y SUM(LINFAC.PRE*LINFAC.CAN) AS VENTAS.
3. Agrupe por PROV.PRV. Tambin podra agrupar por PROV.NOM, porque ningn nombre de provincia
se repite.
4. Ordene por PROV.NOM.
5. Ejecute y guarde la consulta.
Ejercicio 17
Cree CON17 para que calcule cuntas compras ha hecho cada cliente, sabiendo que cada factura es
una compra. Incluya el nombre del cliente y ordene la salida por este concepto.
1. Cree una nueva consulta. Agregue las tablas ENCFAC y CLI, combindolas por el campo CLI.
2. Agregue como salida el campo CLI.NOM y la expresin COUNT(ENCFAC.FAC) AS FACTURAS.
La funcin COUNT( ) suma 1 por cada factura de cada cliente, obteniendo cuntas son.
3. Agrupe por CLI.CLI o por ENCFAC.CLI.
4. Ordene por CLI.NOM.
5. Guarde y ejecute la consulta.

Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
14
Ejercicio 18
Cree CON18 para saber cunto ha vendido cada vendedor de cada artculo.
1. Cree una nueva consulta. Agregue las tablas VEN, ENCFAC, LINFAC y ART. Las combinaciones pue-
den ser cualquiera de los dos esquemas siguientes:
Ven.ven = Encfac.ven Art.art = Linfac.art
Encfac.fac = Linfac.fac Linfac.fac = Encfac.fac
Linfac.art = Art.art Encfac.ven = Ven.ven
2. Agregue como campos de salida las expresiones VEN.NOM AS VENDEDOR, ART.NOM AS ARTCULO y
SUM(LINFAC.CAN*LINFAC.PRE) AS PRODUCCIN.
3. Dado que conviene no usar los nombres para agrupar, debe usar los campos VEN y ART. Tiene va-
rias posibilidades:
Primer campo (arriba) Segundo campo (abajo)
Ven.ven Linfac.art
Ven.ven Art.art
Encfac.ven Linfac.art
Encfac.ven Art.art
Linfac.art Ven.ven
Linfac.art Encfac.ven
Art.art Ven.ven
Art.art Encfac.ven
Cualquiera de las posibilidades anteriores es vlida, porque se producir un grupo por cada valor
diferente de ambos componentes. El orden final de los registros se har por los nombres de ven-
dedor y de artculo.
4. Ordene por nombre de vendedor y nombre de artculo.
5. Guarde y ejecute la consulta.
Ejercicio 19
Se quiere una consulta CON19 que calcule el total de ventas de cada vendedor a cada cliente. Debe
dar el nombre del vendedor, el nombre del cliente y el total.
El esquema de combinaciones desde un punto de vista lgica sera:
Ven.ven = Encfac.ven
Encfac.fac = Linfac.fac
Encfac.cli = Cli.cli
Esquemticamente, los cursores y combinaciones se veran as (se muestran los nombres de los curso-
res y de los campos de combinacin):
Encfac Linfac
Ven Fac Fac
Ven Ven Cli
Cli Cli
Este entorno es dificultoso de establecer, porque habra que eliminar las combinaciones y volverlas a
trazar por arrastre. Lo que es peor, la consulta no funcionara, debido a que no se cumple la regla: la
tabla derecha de la segunda combinacin no es la tabla izquierda de la tercera.
El problema se soluciona si ENCFAC se agregar otra vez al entorno. Una tabla se puede agregar varias
veces, sin confundir a SQL, porque les da un alias diferente: la primera vez el alias ser igual al nombre
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
15
de la tabla, ENCFAC; pero en adelante el alias ser ENCFAC_A, ENCFAC_B, etc. El esquema de combina-
cin correcto, entonces, es:
Ven.ven = Encfac.ven
Encfac.fac = Linfac.fac
Linfac.fac = Encfac_a.fac
Encfac_a.cli = Cli.cli
Los cursores quedarn como las perlas de un collar, unidos por una cadena de combinaciones:
Ven Encfac Linfac Encfac_a Cli
Ven Ven Cli Cli
Fac Fac Fac
La disposicin generalizada del dibujo expresa la regla, que llamamos regla de la cadena.
La solucin indicada funciona en este caso, porque la tercera combinacin es 1 1: cada valor de fac-
tura en los registros de LINFAC tiene un solo registro correspondiente en ENCFAC_A. Si fuera una combi-
nacin 1 N, SQL no la podra manejar adecuadamente y producira resultados errneos, por lo que
habra que buscar otra solucin.
1. Cree una nueva consulta. Agregue las tablas y combinaciones del ltimo esquema.
2. Seleccione como campos las expresiones VEN.NOM AS VENDEDOR, CLI.NOM AS CLIENTE y SUM(
LINFAC.PRE * LINFAC.CAN ) AS IMPORTE.
3. Agrupe por VEN.VEN y CLI.CLI o por CLI.CLI y VEN.VEN.
4. Elimine en la ficha CAMPOS los campos seleccionados VEN.VEN y CLI.CLI, para que no aparezcan en
el cursor de salida.
5. Ordene por VEN.NOM y CLI.NOM.
6. Guarde la consulta y ejectela.
Ejercicio 20
Se quiere una consulta que calcule el total vendido de cada artculo, por cada vendedor, a cada cliente.
Un esquema de combinaciones, lgico pero complicado e ineficaz, sera:
Ven.ven = Encfac.ven
Encfac.fac = Linfac.fac
Linfac.fac = Art.art
Art.art = Linfac_a.art
Linfac_a.fac = Encfac_a.fac
Encfac_a.cli = Cli.cli
Este esquema produce resultados errneos, porque se producen combinaciones 1 N incorrectas.
Veamos dnde est el error.
Sea que el artculo A01 se ha vendido en las facturas 15 y 28, como nico artculo en cada factura. La
factura 15 tiene vendedor 8 y cliente 14. La factura 28 tiene vendedor 55 y cliente 49. Esto queda ms
claro en el siguiente cuadro:
Factura Vendedor Cliente nico
15 8 14 A01
28 55 49 A01
Cuando se procesa la factura 15 del vendedor 8 se producen las siguientes combinaciones:
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
16
Ven Encfac Linfac Art Linfac_a Encfac_a Cli
Ven Ven Fac Fac Art Art Art Fac Fac Cli Cli
8 8 15 15 A01 A01 A01 15 15 14 14
8 8 15 15 A01 A01 A01 28 28 49 49
Al combinar ART con LINFAC_A, SQL combina el artculo A01 de ART con cada aparicin de tal cdigo
en LINFAC_A, olvidando que debe pertenecer al vendedor 8 y a la factura 15. Esto produce clculos
errneos, pues se atribuye a la factura 15 el importe de la factura 28.
Para solucionar este problema, conviene dividir el problema en dos consultas. La primera, que llama-
remos CON20A, producir una tabla de salida con los campos VEN.NOM, CLI.CLI, ART.NOM y
SUM(LINFAC.CAN * LINFAC.PRE) AS IMPORTE. La segunda, que llamaremos CON20B, tendr como entrada
la tabla resultante de CON20A y la tabla CLI, dando como resultado los campos anteriores, pero reem-
plazanco CLI.CLI con CLI.NOM.
Cuando se presentan combinaciones similares a las explicadas, ms que analizar las causas de error
conviene dividir el problema en dos o ms consultas. Veremos ms tarde que las vistas son ms ade-
cuadas que las consultas para estos casos.
Creemos primero la consulta CON20A.
1. Cree una consulta. Agregue las tablas VEN, ENCFAC, LINFAC y ART. Combnelas como indican las
tres primeras lneas del esquema anterior, es decir:
Ven.ven = Encfac.ven
Encfac.fac = Linfac.fac
Linfac.fac = Art.art
2. Agregue como salida los campos VEN.NOM AS VENDEDOR, ENCFAC.CLI, ART.NOM AS ARTCULO y
SUM(LINFAC.CAN * LINFAC.PRE) AS IMPORTE.
3. Agrupe por VEN.VEN, ENCFAC.CLI y ART.ART.
4. Ejecute la consulta para ver los resultados en la ventana EXAMINAR.
5. En el men CONSULTA, seleccione DESTINO DE LA CONSULTA.
6. En el dilogo DESTINO DE LA CONSULTA pulse el botn TABLA. Aparece el campo NOMBRE DE TABLA.
Escriba CON20A y pulse ACEPTAR.
7. Ejecute la consulta para generar la tabla CON20A y guarde la consulta como CON20A.
Por defecto, las consultas producen un cursor que se ve en la ventana EXAMINAR. Ese cursor tiene
un nombre que calcula SQL a partir del reloj del sistema, de modo que nunca obtiene dos nombres
iguales. Los cursores son similares a las tablas en estructura, pero no admiten ndices y son des-
truidos automticamente cuando se da cualquier comando que cierre las tablas abiertas o cuando
se sale de VFP. Tienen extensin TMP, abreviatura de temporal.
Puede suceder que el usuario necesite que la consulta no produzca ese cursor, sino que cree un
cursor o una tabla con los nombres que l les d. Las consultas permiten tales salidas, definiendo
los destinos CURSOR y TABLA, que solicitan un nombre. Estos cursores o tablas no van a la ventana
EXAMINAR, pero quedan abiertos. Al darse un comando para cerrar las tablas, lo cursores, como se
ha dicho, desaparecen, pero las tablas quedan en disco.
La tabla que produce una ejecucin de la consulta es generada nuevamente por otra ejecucin, sin
que se advierta que ya existe.
Creemos finalmente la consulta CON20B.
1. Cree una consulta. Agregue las tablas CON20A y CLI. Combine por el campo CLI.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
17
2. Agregue como salida los campos CON20A.VENDEDOR,CLI.NOM AS CLIENTE, CON20A.ARTCULO y
CON20A.IMPORTE.
3. Ordene por VENDEDOR, CLIENTE y ARTCULO.
4. Guarde la consulta como CON20B y ejectela.
Dividir el problema ha simplificado la tarea. Pero trabajar con una tabla generada por una consulta tiene
inconvenientes. Primero, para tener una versin actualizada de la tabla CON20A, debemos ejecutar la
consulta CON20A antes de ejecutar CON20B. Si olvidamos hacerlo, SQL buscar la tabla existente, lo
cual puede dar resultados desactualizados. Segundo, si eliminamos la tabla CON20A para ganar espa-
cio, necesariamente deberemos ejecutar la consulta CON20A antes de CON20B, que usa esa tabla como
entrada.
Veremos ms adelante que estos inconvenientes se evitan con las vistas.
Ejercicio 21
Hemos visto que las consultas son muy verstiles para combinar tablas y obtener gran variedad de re-
sultados. Una pregunta que usted puede plantear es si los formularios y los informes pueden aprove-
char el producto de las consultas. La respuesta es afirmativa. Para ilustrar someramente esta respuesta
vamos a desarrollar algunos ejemplos.
Vamos a crear un formulario que contenga un GRID cuyo RECORDSOURCE sea el cursor resultante de
una consulta. Los campos del Grid sern los campos del cursor, para lo cual debemos crear primero la
consulta. Esos campos sern cdigo de cliente, nmero de factura y total general de factura. Primero
creemos la consulta.
1. Cree una consulta. Agregue las tablas ENCFAC y LINFAC, combinadas por el campo FAC.
2. Agregue como salida ENCFAC.CLI, ENCFAC.FAC y SUM(LINFAC.CAN * LINFAC.PRE) AS IMPORTE.
3. Agrupe por ENCFAC.CLI y ENCFAC.FAC.
4. Ejecute la consulta, para ver el resultado en le ventana EXAMINAR.
5. Elija CURSOR como destino de la consulta y llame CON21 a ese cursor.
6. Guarde la consulta como CON21.
7. Ejecute CON21. Ahora no aparece el resultado en la ventana EXAMINAR. El resultado se ha enviado
al cursor CON21, que debe todava estar abierto.
8. Compruebe que el cursor est abierto: abra la ventana SESIN DE DATOS y observe que en el listado
ALIAS figura Con21. Seleccione el cursor y pulse CERRAR. Salga de SESIN DE DATOS con ESC.
Continuemos ahora con el formulario.
9. Cree un formulario.
10. Agregue un GRID. Configure las siguientes propiedades:
Objeto Propiedad Valor
Grid RecordSourceType 3 Consulta (.QPR)
RecorSource Con21
ColumnCount 3
DeleteMark .F. Falso
ScrollBars 2 - Vertical
Width 195
Column1 ControlSource Cli
Width 50
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
18
Header Caption Cliente
Column2 ControlSource Fac
Width 50
Header Caption Factura
Column3 ControlSource Importe
Width 60
Header Caption Importe
El valor 3 CONSULTA (.QPR) de RECORDSOURCETYPE indica que se va a usar como entrada el re-
sultado de una consulta. El nombre de ella se escribe en RECORDSOURCE. El valor CONTROLSOURCE
de cada columna es cada campo del cursor CON21 generado por la consulta. Oserve que los cam-
pos definidos en CONTROLSOURCE no estn prefijados con el alias del cursor. Hemos observado
que, colocndoselo, a veces se producen resultados incorrectos.
11. Agregue un botn de comando, con CAPTION y NAME SALIR.
12. Pulse doble click en el botn SALIR y en el evento CLICK de ese objeto escriba:
close tables all
thisform.release
13. Guarde el formulario con el nombre CON21 y ejectelo.
Hemos introducido el botn SALIR no slo para que sea ms fcil de pulsar que el botn de cierre
del formulario, sino para que cierre las tablas y cursores abiertos con el comando CLOSE TABLES ALL.
Aunque es innecesario cerrar el cursor CON21, lo hemos hecho para que compruebe, luego de eje-
cutar el formulario, que ya no aparece en la ventana SESIN DE DATOS.
Ejercicio 22
El sencillo formulario CON21 es poco prctico, porque el GRID no muestra el nombre de los clientes, si-
no los cdigos. Por otro lado, el GRID muestra todos los cdigos de cliente, y no uno en particular que
nos interese.
Sera preferible un formulario que presente en un LISTBOX, COMBOBOX o GRID los nombres de los clien-
tes y sus cdigos, en orden alfabtico, tomndolos de la tabla CLI. Elegido un cliente especfico, otro
GRID, mostrara todas sus facturas, con las fechas e importes. Podramos usar una consulta para cons-
truir un cursor con los campos a mostrar en cada columna de este segundo GRID, ms el campo CLI,
para filtrar el cliente a mostrar.
Creemos primero la consulta.
1. Cree una consulta. Agregue las tablas ENCFAC y LINFAC.
2. Agregue como salida ENCFAC.FAC, ENCFAC.FEC, SUM(LINFAC.CAN * LINFAC.PRE) AS IMPORTE y
ENCFAC.CLI.
3. Agrupe por ENCFAC.CLI y ENCFAC.FAC.
4. Ejecute la consulta para controlar los resultados en la ventana EXAMINAR.
5. Enve el resultado de la consulta al cursor CON22.
6. Guarde la consulta como CON22.
Ahora creemos el formulario.
1. Cree un formulario, que se llamar CON22. Agrguele un LISTBOX, un GRID y un botn de comando.
2. En el entorno de datos agregue la tabla CLI. Establezca la propiedad ORDER al ndice NOM.
3. Defina las siguientes propiedades:
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
19
Objeto Propiedad Valor
ListBox ColumnWidths 150,0
ColumnCount 2
RowSource Cli.Nom,Cli
RowSourceType 6 - Campos
Width 178
Grid RecordSource Con22
RecordSourceType 3 Consulta (.QPR)
ColumnCount 2
DeleteMark .F. - Falso
ScrollBars 2 - Vertical
Width 248
Column1 ControlSource Fac
Width 60
Header Caption Factura
Column2 ControlSource Fec
Width 75
Header Caption Fecha
Column3 ControlSource Importe
InputMask 999,999.99
Width 80
Header Caption Importe
CommandButton Caption Salir
Name Salir
Puede preguntarse por qu no definir las propiedades que subordinaran el GRID a la tabla CLI. El
problema radica en que no se puede definir la propiedad CHILDORDER, porque siendo el cursor
CON22 de lectura, no se puede crear un ndice para l.
Debemos, en consecuencia, apelar a un filtro de registros sobre el cursor. Este filtro se aplicar ca-
da vez que se elija un cliente en el LISTBOX, en el evento CLICK de este objeto.
4. En el evento CLICK del LISTBOX, escriba:
select con22
set filter to cli=cli.cli
go top
thisform.grid1.refresh
5. En el evento CLICK del botn SALIR, escriba:
close tables all
thisform.release
6. Ejecute el formulario. Gurdelo como CON22.
Ejercicio 23
Veamos otra forma de realizar lo mismo que hace CON22, pero sin definir el entorno de datos y usando
comandos para crear el cursor CON23 y abrir la tabla CLI.
1. Cree el formulario CON23 a partir del formulario CON22.
2. Abra el entorno de datos y elimine el cursor de la tabla CLI.
3. En el GRID, cambie el valor de la propiedad RECORDSOURCETYPE por 1 ALIAS y el de la propiedad
RECORDSOURCE por CON23.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
20
4. En el evento LOAD del formulario, escriba:
close tables all
use cli in 0 order nom noupdate
En el men VENTANA elija la ventana ADMINISTRADOR DE PROYECTOS FAC. Seleccione la consulta
CON22 y pulse el botn MODIFICAR. En el DISEADOR DE CONSULTAS pulse el botn secundario y elija
VER SQL. Se abre la ventana CON22.QPR [SLO LECTURA], donde aparece el comando SELECT pro-
ducido por lo definido en el diseador. Seleccione todo el texto y cpielo. Cierre la ventana y el di-
seador con ESC. Vuelva a la ventana CDIGO del evento LOAD del formulario. Al final del texto pe-
gue el comando Select de SQL. Corrija la ltima lnea, reemplazando CON22 por CON23. El texto
definitivo debe quedar como sigue:
close tables all
use cli in 0 order nom noupdate
SELECT Encfac.fac, Encfac.fec, SUM(Linfac.can*Linfac.pre) AS importe,;
Encfac.cli;
FROM fac!encfac INNER JOIN fac!linfac ;
ON Encfac.fac = Linfac.fac;
GROUP BY Encfac.cli, Encfac.fac;
INTO CURSOR con23
5. En el evento CLICK del LISTBOX, modifique la primera lnea, cambiando CON22 por CON23.
6. Ejecute el formulario.
Hemos creado la consulta CON23 sin necesidad de usar el diseador correspondiente. Esto se de-
be a que el diseador de consultas produce en definitiva un comando SELECT de SQL, que es lo
esencial. El diseador es un recurso intermedio que facilita la construccin de SELECT, pero SELECT
se puede escribir directamente. En este ejemplo, hemos copiado el SELECT correcto de la consulta
CON22, lo hemos pegado donde nos hace falta y lo hemos corregido ligeramente.
Ejercicio 24
El formulario CON23 muestra los importes comprados en cada factura del cliente elegido en el LISTBOX,
pero no el total general de esos importes. Este podra aparecer al pie del GRID, en un TEXTBOX. Para
calcularlo, podramos duplicar el comando SELECT, con leves modificaciones. El primer SELECT sera
igual al original, cambiando el nombre del cursor a CON24A. El segundo SELECT producira el cursor
CON24B, que debera agrupar solamente por cliente.
1. Cree CON24 a partir de CON23.
2. Corriga la propiedad RECORDSOURCE de GRID1 por CON24A.
3. Entre a la ventana CDIGO del evento LOAD del formulario, seleccione todo el comando SELECT, c-
pielo y pguelo al final. Corrija las lneas que se ven en negrita en el texto definitivo siguiente:
close tables all
use cli in 0 order nom noupdate
SELECT Encfac.fac, Encfac.fec, SUM(Linfac.pre*Linfac.can) AS importe,;
Encfac.cli;
FROM fac!encfac INNER JOIN fac!linfac ;
ON Encfac.fac = Linfac.fac;
GROUP BY Encfac.cli, Encfac.fac;
INTO CURSOR con24a
SELECT Encfac.cli, SUM(Linfac.pre*Linfac.can) AS general;
FROM fac!encfac INNER JOIN fac!linfac ;
ON Encfac.fac = Linfac.fac;
GROUP BY Encfac.cli;
INTO CURSOR con24b
4. Agregue un LABEL y un TEXTBOX al pie del GRID. Modifique las siguiente propiedades:
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
21
Objeto Propiedad Valor
Label Caption Total general
AutoSize .T. Verdadero
InputMask 999,999,999.99
Width 100
TextBox ControlSource con24b.general
Name general
5. Modifique el evento CLICK del LISTBOX, para que quede como sigue:
select con24a
set filter to cli=cli.cli
go top
thisform.grid1.refresh
select con24b
set filter to cli=cli.cli
go top
thisform.general.refresh
6. Ejecute el formulario.

Vistas
Ejercicio 1
Cree la vista VIS1 para que produzca un cursor con solamente los artculos cuyo cdigo de artculo
(campo ART) se indique al momento de la ejecucin.
Este ejercicio es similar al Ejercicio 2 de Consultas. Cada vez que se examina, CON2 da salida a los ar-
tculos cuyo nombre comienza con C. Lo mismo se puede hacer en las vistas, pero para darles mayor
flexibilidad se las puede construir con parmetros. Los parmetros son cualquier nombre vlido prece-
dido por un signo ? que se usan para construir filtros sobre los registros de entrada y de salida. Se co-
locan en la columna EJEMPLO de la ficha FILTRO y del dilogo CONDICIONES. Cada vez que se examina
una vista que posee parmetros, antes de comenzar a trabajar, SQL pide un valor especfico para cada
parmetro.
1. Ubquese en la categora VISTAS LOCALES y pulse el botn NUEVO. Esto abre el DISEADOR DE
VISTAS, que es muy parecido al diseador de consultas, aunque hay algunas diferencias.
2. Agregue la tabla ART. En la ficha CAMPOS agregue los campos ART.ART y ART.NOM.
3. Seleccione la ficha FILTRO. En NOMBRE DE CAMPO elija ART.ART. En CRITERIOS elija el operador = y
en EJEMPLO escriba ?INICIAL.
4. Guarde la consulta con CTRL + S, llamndola VIS1.
5. Examnela con EJECUTAR CONSULTA del men secundario. Aparece el dilogo PARMETRO DE VISTA,
con el texto Escriba un valor para Inicial. En el campo en blanco escriba "C". Pulse ACEPTAR. Ahora
se abre la ventana EXAMINAR, con los registros cuyo nombre comienza con C. Salga con ESC.
6. Vuelva a examinar la vista, pero ahora escriba el valor A para el parmetro. El proceso se repite,
pero los registros mostrados comienzan ahora con A.
7. Salga del diseador. VIS1 aparece registrada en la categora VISTAS LOCALES.
A diferencia de las consultas, las vistas no se guardan en archivos por separado, sino en la base
de datos actual. Las consultas pueden agregarse a un proyecto. Tambin pueden quitarse de l,
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
22
permaneciendo como archivos independientes. Las vistas no pueden agregarse a una base de da-
tos, sino crearse en ellas; si se quitan, se eliminan definitivamente.
Las vistas tienen como destino nico un cursor que se ve en la ventana EXAMINAR. SQL crea el
nombre de este cursor desde el reloj de la computadora. A diferencia de las consultas, el cursor es
de lectura y escritura, es decir, permite modificar campos, agregar nuevos registros o marcarlos pa-
ra destruir. Para probar esta propiedad, examine la vista otra vez.
De lo dicho en el prrafo anterior, surge inmediatamente la pregunta sobre el sentido de las altas,
bajas y cambios en un cursor que va a desaparecer al dar un comando que cierre tablas. La res-
puesta es que existe la posibilidad de mandar a las tablas de entrada las modificaciones hechas en
el cursor. Veremos este tema ms adelante.
Al reconocer que INICIAL es un parmetro, porque va precedido por un signo de pregunta, SQL pide
el valor que le queremos dar en el dilogo PARMETRO DE VISTA. Para que nos indique cul es el ti-
po de datos del parmetro, debemos hacer lo que dice el punto siguiente.
8. Para indicar el tipo de datos del parmetro, emita el comando CONSULTA PARMETROS DE VISTA.
Esto abre el dilogo de igual nombre. En la columna NOMBRE escriba INICIAL. En la columna TIPO
seleccione CARCTER.
9. Examine la vista.
Ahora el dilogo PARMETRO DE VISTA es ms especfico, pues dice Escriba un valor de tipo carcter
para Inicial. Esta especificacin es ms til, porque nos orienta sobre si debemos introducir nme-
ros, caracteres, fechas, etc. Cuando una vista usa muchos parmetros, habr uno de estos dilo-
gos para cada uno, donde la aclaracin del tipo de datos facilita la tarea.
10. Guarde los cambios.
Note que, al estar activo el diseador de vistas, no aparece ningn men VISTA, sino el ya conocido
CONSULTA. Del mismo modo, para producir la vista, no hay una opcin EJECUTAR VISTA, sino la ya
conocida EJECUTAR CONSULTA.
Ejercicio 2
Cree la vista VIS2 para que muestre las facturas de un vendedor y un cliente parametrizados. Trabaje
solamente con la tabla ENCFAC. Ordene la salida por factura.
1. Cree una vista. Agregue la tabla ENCFAC y todos sus campos.
2. En la ficha FILTRO, escriba los filtros siguientes:
Encfac.ven = ?Vendedor
Encfac.cli = ?Cliente
3. En CONSULTA PARMETROS DE VISTA especifique que VENDEDOR y CLIENTE son numricos.
4. En ORDENAR POR seleccione el campo ENCFAC.FAC.
5. Guarde y examine la vista. Aparecen dos dilogos PARMETRO DE VISTA, uno por parmetro.
6. En el diseador, con el botn secundario pulse VER SQL. Aunque usted no lo ha definido, el opera-
dor que une ambos filtros es AND, por ser el operador por defecto. Ello se ve en la clusula WHERE
del comando SELECT, donde dice:
WHERE Encfac.cli = ?Cliente;
AND Encfac.ven = ?Vendedor
Ejercicio 3
Cree la vista VIS3, similar a VIS2, pero que agregue el importe total vendido por el vendedor al cliente.
Trabaje solamente con las tablas ENCFAC y LINFAC. Ordene la salida por factura.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
23
1. Cree VIS2 a partir de VIS1.
2. Agregue la tabla LINFAC, combinndola con ENCFAC por el campo FAC.
3. Agregue SUM(LINFAC.CAN * LINFAC.PRE) AS TOTAL como campo de salida.
4. Guarde y examine la vista.
Note que no ha hecho falta agrupar por vendedor y cliente, porque los filtros han reducido el universo
de registros a los de un solo vendedor y un solo cliente.
Ejercicio 4
Cree la vista VIS4 que muestre los campos ART, NOM y PRE de la tabla ART y permita actualizar indirec-
tamente el campo PRE de tal tabla. Con indirectamente queremos decir que, si cambiamos el campo
PRE del cursor de salida, ese cambio modifique el valor PRE de la tabla ART. En qu registro de la ta-
bla ART se producir ese cambio indirecto? Pues exactamente en el registro que origina el registro que
modificamos en el cursor de salida.
Primero, vamos a corregir el campo PRE de la tabla ART, exigiendo mediante la regla de validacin que
no pueda ser nulo ni negativo. Si esto sucede, queremos que VFP d el mensaje "Precio debe contener
un valor positivo". Esta modificacin la introducimos para explicar una caracterstica de las vistas.
1. En el ADMINISTRADOR DE PROYECTOS elija la tabla ART y pulse el botn MODIFICAR.
2. En la ficha CAMPOS del DISEADOR DE TABLAS elija el campo PRE.
3. En REGLA de validacin escriba la expresin PRE > 0.
4. En MENSAJE de validacin escriba "PRECIO DEBE CONTENER UN VALOR POSITIVO".
5. Pulse ACEPTAR.
6. Examine la tabla ART. Ubquese en algn campo PRE y escriba 0. Al tratar de salir del campo, apa-
recer el mensaje de error. Pulse el botn VOLVER, para reponer el valor anterior. Este experimento
ha servido para ver cmo funciona una regla de validacin de campo.
Ahora cree la vista VIS4.
1. Agregue la tabla ART al panel de entorno.
2. Agregue todos los campos a CAMPOS SELECCIONADOS.
3. Seleccione PRE en CAMPOS SELECCIONADOS y pulse el botn PROPIEDADES. Esto abre el dilogo
PROPIEDADES DEL CAMPO DE LA VISTA.
Dado que queremos que el campo PRE pueda ser modificado en el cursor de salida, mandando el
nuevo valor a la tabla ART, podra suceder que en el cursor reemplacemos un precio por un valor
nulo o negativo. Pero el cursor funcionara incorrectamente si aceptara esto, ya que estara en
desacuerdo con la tabla. Lo correcto sera que el cursor tuviera una regla y un mensaje de valida-
cin del campo PRE, similares a los que tiene el campo PRE de la tabla ART.
Para eso, precisamente, sirve el dilogo PROPIEDADES DEL CAMPO DE LA VISTA. Funcionalmente es
exactamente igual a las posibilidades que se ven en la ficha CAMPOS de una tabla base, debajo de
las definiciones de campos, tipos, anchos, etc. En el DISEADOR DE TABLAS elegimos el campo en la
columna NOMBRE. Como en el dilogo PROPIEDADES DEL CAMPO DE LA VISTA no aparece esa colum-
na, la forma de elegirlo es abriendo la lista desplegable CAMPO y seleccionando el deseado.
4. Abra la lista CAMPO y elija ART.PRE.
5. En REGLA escriba PRE > 0.
6. En MENSAJE escriba "PRECIO DEBE CONTENER UN VALOR POSITIVO".
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
24
Ahora entender para qu modificamos inicialmente la tabla ART, introduciendo una regla y un
mensaje de validacin para el campo PRE. No sera congruente que, en la tabla, el campo PRE es-
tuviera sujeto a una regla de validacin y una vista permitiera modificar indirectamente su conteni-
do sin observar tal regla.
Como los cursores de salida permiten modificar cualquier campo, nos queda definir que slo las
modificaciones del campo PRE del cursor se enven al campo PRE de la tabla ART.
7. Seleccione la ficha CRITERIOS DE ACTUALIZACIN del DISEADOR DE VISTAS.
En la lista desplegable TABLA aparece ART. Esta lista muestra las tablas del panel de entorno. En
este ejercicio, slo trabajamos con la tabla ART, por lo que no aparece ninguna otra.
El cuadro central est dividido en tres columnas, una encabezada por un cono , otra por un co-
no y la ltima llamada NOMBRE DEL CAMPO. En esta ltima columna se ven los campos del cur-
sor, uno por lnea.
La columna Llave muestra una tilde en la lnea de ART. Esto indica que este campo se va a usar
como clave para buscar en la tabla de entrada ART el registro cuyo campo PRE debe ser modificado
con el valor modificado en el campo PRE del cursor. Que sea clave quiere decir que identifique el
registro a modificar de modo inequvoco.
El campo ART es precisamente el campo clave de la tabla ART, que nos ha permitido construir el
ndice principal de esa tabla. Ntese que, sin hacer nosotros nada, este campo apareci con tilde
en la columna Llave. Esto se debe a que hay un ndice principal por l. Si en lugar de principal fue-
ra un ndice candidato, VFP no supone que es clave. Esta es una diferencia de funcionamiento en-
tre ndices principales e ndices candidatos.
La columna Lpiz muestra una tilde en la lnea de NOM y otra en la lnea de PRE. Esto indica que
las modificaciones en los valos de estos campos se van a enviar a la tabla. En principio, SQL su-
pone que todos los campos, excepto los campos clave, van a ser de este tipo. En nuestro caso,
como slo queremos que esto suceda con el campo PRE, deberemos destildar el campo NOM.
Ntese que la lnea de ART no tiene tilde en la columna Lpiz. Esto se debe a una actitud prudente
de SQL. Aunque los cambios de clave se pueden enviar a la tabla, esto puede traer varios proble-
mas que necesitan ser tratados adecuadamente. Como es un tema complejo, nos limitamos a re-
comendar seguir con la prudencia de SQL, es decir, nunca hacer actualizables los campos clave.
Si por equivocacin destildamos campos clave y no recordamos cules son, podemos recurrir al
botn RESTABLECER CLAVES, que vuelve a marcarlos, teniendo en cuenta que forman la expresin
de ndices principales.
Si destildamos campos actualizables y queremos volver a marcarlos todos, el botn ACTUALIZAR
TODOS realiza esta tarea.
El hecho de marcar algunos o todos los campos como actualizables no los hace inmediatamente
tales, sino que es necesario poner en vigencia esta modalidad. Para ello se usa la casilla de verifi-
cacin ENVIAR ACTUALIZACIONES (SQL).
La porcin derecha de la ficha CRITERIOS DE ACTUALIZACIN, que incluye los rubros LA CLUSULA
SQL WHERE INCLUYE y ACTUALIZAR USANDO no nos interesan, por referirse principalmente a vistas
remotas.
8. Controle que tenga tilde la columna Llave en el campo ART y la columna LPIZ solamente en el
campo PRE.
9. Active la casilla ENVIAR ACTUALIZACIONES (SQL).
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
25
10. Guarde y examine la vista.
Tome nota de algunos cdigos de artculo y modifique el precio. Cierre la vista. Examine la tabla
ART y compruebe que los precios que modific en el cursor de salida han cambiado tambin en la
tabla.
Si quiere comprobar el efecto de ENVIAR ACTUALIZACIONES (SQL), modifique la vista VIS4 desacti-
vando esta casilla. Si examina nuevamente la vista y cambia otros precios, cuando salga de ella y
examine la tabla, ver que tales cambios no la han modificado.
Ejercicio 5
Veamos cmo realizar una vista que realice lo mismo que la consulta del Ejercicio 20. ste calcula el
total vendido de cada artculo, por cada vendedor, a cada cliente. Para lograr este propsito, disea-
mos dos consultas, CON20A y CON20B, que creaban una tabla "inevitable", CON20A. Trabajando con
vistas esa tabla es innecesaria. Por otro lado sera imposible de crearla, porque las vistas tienen como
nico destino un cursor de nombre no controlable que se ve en la ventana EXAMINAR.
Cree primero la vista VIS5A.
1. Agregue las tablas VEN, ENCFAC, LINFAC y ART. Combnelas como indica este esquema:
Ven.ven = Encfac.ven
Encfac.fac = Linfac.fac
Linfac.fac = Art.art
2. Agregue como salida los campos VEN.NOM AS VENDEDOR, CLI.CLI, ART.NOM AS ARTCULO y
SUM(LINFAC.CAN * LINFAC.PRE) AS IMPORTE.
3. Agrupe por VEN.VEN, ENCFAC.CLI y ART.ART. Elimine estos campos de CAMPOS SELECCIONADOS de la
ficha CAMPOS.
4. Examine la vista para ver los resultados en la ventana EXAMINAR.
Cree ahora cree la vista VIS5B.
1. Agregue la vista VIS5A y la tabla CLI. Combine por el campo CLI.
2. Agregue como salida los campos VIS5A.VENDEDOR,CLI.NOM AS CLIENTE, VIS5A.ARTCULO y
VIS5A.IMPORTE.
3. Ordene por VENDEDOR, CLIENTE y ARTCULO.
4. Examine la vista.
Cuando una vista 2 incluye en el panel de entorno otra vista 1, SQL debe ejecutar la vista 1 pre-
viamente a ejecutar la vista 2, puesto que una de sus entradas es precisamente el cursor resultante
de la vista 1. Esta inclusin de una vista dentro de otra puede repetirse varias veces.
La inclusin de vistas permite ir obteniendo cursores de salida que quedan abiertos (recuerde que
se eliminan si se emite un comando para cerrar las tablas abiertas, comandos que en la ejecucin
sucesiva no se utilizan). Si una vista 1 produce un cursor 1, ste queda abierto y puede ser tomado
como entrada para una vista 2; si sta produce como salida un cursor 2, puede tomarse como en-
trada para una vista 3, y as sucesivamente.
Tcnicamente, una vista es un comando Select de SQL. En el caso de una vista que incluye otra
vista, es en realidad un comando Select que incluye otro comando Select.
El empleo inmediato de un cursor generado por una vista como entrada de otra vista evita generar
tablas y preocuparse por eliminarlas.

Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
26
Ejercicio 6
Creemos un formulario similar a una factura impresa en papel. Queremos elegir en un COMBOBOX la
factura a desplegar. Cuando se haga esto, se ver la fecha, el nombre del cliente y el total de la factura
en respectivos TEXTBOXES. El detalle de cada artculo vendido, incluyendo cdigo, nombre, cantidad,
precio e importe parcial, se vern en un GRID.
Las opciones del ComboBox se construirn a partir de una vista, que contendr los campos factura, fe-
cha, cliente e importe total de la factura.
El aspecto del formulario ser como el siguiente:

Creemos la vista VIS6 con los campos indicados. Esta vista no puede ser la hija de una relacin tempo-
ral , porque necesitara un ndice que no sabemos generar. Pero s puede ser la madre de una relacin
temporal, porque una relacin temporal necesita uno o ms campos de la tabla madre y un ndice en la
tabla hija. Las tablas hijas van a ser CLI, para obtener el nombre del cliente, y LINFAC, para obtener las
lneas componentes de la factura. Cuando elijamos una factura en el COMBOBOX, podremos "refrescar"
directamente los campos fecha e importe total, porque sern parte del mismo registro del cursor produ-
cido por la vista, e indirectamente el nombre del cliente y el GRID, por relaciones temporales con las ta-
blas CLI y LINFAC. Notemos que, para obtener la descripcin de los artculos, deberemos trazar una re-
lacin temporal de LINFAC a ART, relacin que se materializar en cada registro del Grid y que no inter-
viene en la subordinacin de CLI y LINFAC a VIS6.
1. Cree la nueva vista agregando las tablas ENCFAC y LINFAC al panel de entorno, combinndolas por
el campo comn FAC.
2. Seleccione los campos FAC, FEC, CLI y SUM(LINFAC.CAN * LINFAC.PRE) AS IMPTOT.
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
27
3. Agrupe por ENCFAC.FAC (o por LINFAC.FAC).
4. Guarde la vista como Vis6 y ejectela para controlar que todo va bien.
Cree ahora el formulario.
1. Agregue los objetos que muestra el grfico anterior.
2. Defina las siguientes propiedades:
Objeto Propiedad Valor
Form1 Caption Despliegue de facturas
Label1 Caption Factura
AutoSize .T. Verdadero
ComboBox RowSource Vis6.Fac
RowSourceType 6 Campos
ColumnCount 1
ColumnWidths 75
Label2 Caption Fecha
AutoSize .T. Verdadero
TextBox1 ControlSource Vis6.Fec
Name Fecha
Label3 Caption Cliente
AutoSize .T. Verdadero
TextBox2 ControlSource Cli.Nom
Name Cliente
Width 200
Grid1 RecordSource Linfac
ColumnCount 5
DeleteMark .F.
ScrollBars 2- Vertical
Name Linfac
Column1 ControlSource Linfac.Art
Width 30
Header1 Alignment 2 Medio centro
Caption Art
Column2 ControlSource Art.Nom
Width 200
Header1 Alignment 2 Medio centro
Caption Descripcin
Column3 ControlSource Linfac.Can
Width 60
Header1 Alignment 2 Medio centro
Caption Cantidad
Column4 ControlSource Linfac.Pre
Header1 Alignment 2 Medio centro
Caption Precio
Column5 ControlSource linfac.can*linfac.pre
Alignment 2 Medio centro
Caption Importe
Label4 AutoSize .T. Verdadero
Caption Total
Edmundo A. Cceres Prctica sobre consultas y Vistas 2008
28
TextBox3 ControlSource Vis6.Imptot
InputMask 999,999.99
Name Imptot
CommandButton1 Autosize .T. Verdadero
Caption Salir
Name Salir
3. En el entorno de datos agregue la vista Vis6 y las tablas Cli, Linfac y Art.
4. Trace las siguientes relaciones:
Tabla madre Campo Tabla hija ndice
Vis6 Fac Linfac Fac
Vis6 Cli Cli Cli
Linfac Art Art Art
5. En el evento CLICK del COMBOBOX, escriba:
thisform.fecha.refresh
thisform.cliente.refresh
thisform.imptot.refresh
6. En el evento Click del CommandButton, escriba:
thisform.release
7. Guarde el formulario como Vis6 y ejectelo.

Vous aimerez peut-être aussi