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.