Semana 3 Procedimientos Almacenados II Parmetros de entrada y salida
Semana 4 Procedimientos almacenados III Vistas
Semana 5 Practica I
Semana 6 Acceso a datos con ADO NET
Semana 7- 8 Ado Net con Procedimientos Almacenados
Semana 9 Practica II
Semana 10.. Examen Parcial
Semana 11......... Clases y creacin de libreras
Semana 12.. LIBRERA DE CLASES CON BD
Semana 13 14.. Aplicaciones con 3 Capas
Semana 15.. Practica III
Semana 16.. CREACIN DE REPORTES
Semana 17.. CREACIN DE SUB REPORTES
Semana 18 . PRESENTACION DE TRABAJO FINAL
Semana 19.. Examen Final
Semana 20.. Examen Sustitutorio
Ing. Alberto Moreno C.
Semana 1 Manipulacin de datos en SQL 2005
La sentencia Select
La sentencia Select es una sentencia SQL, que pertenece al conjunto del Lenguaje de Manipulacin de Datos, y que sirve para recuperar registros de una o varias tablas, de una o varias bases de datos. Su sintaxis es la siguiente:
Donde las maysculas representan palabras reservadas, y lo encerrado entre corchetes es opcional, puede ser omitido. Una vez vista la anterior forma de representacin, vamos a detenernos en la sintaxis de la sentencia Select. Se compone de tres partes:
SELECT <atributos>: permite hacer una proyeccin de las tablas, es decir, seleccionar los campos que deseamos recuperar de la base de datos, separados por comas. Si se especifica el smbolo *, se obtendrn todos los campos de la tabla.
FROM <tablas>: permite especificar la tabla de la cual se desean obtener los datos. Si se especifica ms de una tabla, stas irn separadas por comas.
WHERE <condicin>: permite establecer una condicin de recuperacin de las filas de la/s tabla/s. Slo se obtendrn aquellas consultas que verifiquen dicha condicin, que ser opcional. En el caso de que se omita esta parte, se recuperarn todas las filas.
GROUP BY <atributos>: permite establecer una seleccin de campos cuando se utilizan funciones escalares o de conteo (ya se ver ms adelante lo que significa.
HAVING <condicin>: establece una condicin para los atributos obtenidos como resultado de la aplicacin de funciones escalares.
ORDER BY <atributos>: permite obtener el resultado de la consulta ordenado por los atributos especificados.
En el caso de que se especifiquen varias tablas, en la clusula FROM, ser conveniente denotar los campos de la clusula SELECT precedidos por el SELECT <atributos> FROM <tablas> [WHERE <condicion>] [GROUP BY <atributos>] [HAVING <condicin>] [ORDER BY <atributos>]
nombre de la tabla donde se encuentra y un punto, para que, en el caso de que dicho campo exista en ms de una tabla, se sepa en cada momento a cul de ellos nos estamos refiriendo, evitando en este caso el problema de ambigedad.
Si por ejemplo, deseamos obtener todos los valores de los atributos title y price de la tabla titles, deberamos escribir el siguiente Cdigo fuente.
De esta manera, obtenemos todas las filas, ya que no hemos dado ninguna condicin, de la tabla titles (especificada en la clusula FROM), de las cuales slo visualizaremos los valores de los atributos title y price (especificados en la clusula SELECT). Si por el contrario, deseamos obtener todos los atributos de dicha tabla, deberamos escribir el siguiente Cdigo fuente.
Puesto que hemos especificado el literal * dentro de la clusula SELECT, la anterior sentencia nos devuelve todos los atributos de todas las filas de la tabla titles, es decir, nos devuelve toda la informacin almacenada en ella.
La clusula Where
La forma de usar el Transact SQL para realizar consultas realizando una proyeccin horizontal (es decir, seleccionando las filas), es mediante la opcin WHERE. A continuacin de esta palabra reservada, se debe especificar la condicin lgica que se debe evaluar, para obtener aquellas filas que la cumplen.
Para expresar una expresin lgica se pueden emplear cualquiera de los operadores de Transact SQL cuyo resultado devuelva un valor lgico, aunque tambin se pueden utilizar operadores de cadena. Estos operadores sern vistos en detalle en el siguiente captulo, pero bsicamente son los siguientes:
>: Compara si una expresin es mayor que otra
<: Compara si una expresin es menor que otra
>=: compara si una expresin es mayor o igual que otra
<=: compara si una expresin es menor o igual que otra <>: Compara si una expresin es distinta que otra
SELECT * FROM titles SELECT title, price FROM titles LIKE: compara todas las cadenas que verifican un patrn de bsqueda
NOT LIKE: compara todas las cadenas que no verifican un patrn de bsqueda BETWEEN: compara todas las cadenas que estn comprendidas en un rango de valores
IN: compara todas las cadenas que estn contenidas en una lista Por ejemplo, si queremos obtener los ttulos cuyos derechos de autor sean mayores del 10 %, digitaremos el siguiente Cdigo.
De la misma forma, si queremos obtener todos los ttulos cuyo precio no supere los 2$, ejecutaremos el Cdigo siguiente.
Si queremos obtener el nombre de los autores cuya primera letra este comprendida entre la C y la H, y que a continuacin tenga el literal 'urry', ejecutamos el Cdigo siguiente.
O si queremos obtener la ciudad de todos los autores, que se corresponda con San Francisco o con Salt Lake City, ejecutaremos el Cdigo siguiente.
Si se desea conocer todos los ttulos cuyo precio oscila entre 1 y 2 dlares, ejecutaremos el Cdigo siguiente.
La clusula Group By
La clusula GROUP BY agrupa, como su propio nombre indica, filas que tienen el mismo valor para un atributo, en grupos distintos. Por ejemplo, si queremos obtener el apellido de todos los autores, ejecutamos el Cdigo siguiente.
SELECT au_lname FROM autors SELECT title FROM titles WHERE price BETWEEN 1 AND 2
SELECT city FROM authors WHERE city in ('San Francisco','Salt Lake City')
SELECT au_fname FROM authors WHERE au_fname LIKE '[C- H]urry' SELECT * FROM titles WHERE price <= 2 SELECT * FROM titleauthor WHERE royaltyper > 10 Si nos fijamos en el resultado obtenido, tenemos que existen dos autores, cuyo apellido es el mismo, Ringer. Por lo tanto, se muestran dos filas iguales para este apellido, una por cada autor que se apellida Ringer. Supongamos ahora, que lo nico que nos interesa es obtener todos los apellidos que sean distintos. Para ello deberemos agrupar los autores cuyo apellido sea el mismo en un nico grupo, y a continuacin mostrar los grupos, en lugar de las filas. Con esto garantizamos que slo se mostrar una fila por cada apellido distinto, ya que slo mostramos una fila del grupo, en lugar de todas. Esto que parece tan complicado, se resume en una sentencia, usando la clusula GROUP BY.
En ella, lo que se hace es simplemente un select, pero no de las filas de la tabla, sino de los grupos obtenidos a partir de la clusula GROUP BY. Puesto que deseamos agrupar o el apellido, detrs de esta clusula se debe determinar el atributo au_lname, garantizando as que todas las filas cuyo valor de este atributo sea igual, irn al mismo grupo.
La clusula Having
La clusula HAVING es similar a la clusula WHERE, salvo que aquella se usa como condicin de bsqueda cuando se especifica la clusula GROUP BY. Por lo tanto el funcionamiento es similar al ya visto para WHERE. La nica diferencia es que HAVING se aplica a condiciones de grupo. Por ejemplo, si dada la anterior sentencia de agrupacin, deseamos que slo se muestre el autor cuyo apellido sea Ringer, ejecutaremos el Cdigo siguiente.
La clusula Order By
La clusula ORDER BY determina el orden de visualizacin de las filas obtenidas en la sentencia SELECT. A continuacin de dicha palabra reservada, se debe especificar el atributo o los atributos por los cuales se ordenar el resultado obtenido en la consulta.
Por ejemplo, si queremos mostrar el nombre y apellido de todos los autores de nuestra base de datos pubs, bastar con ejecutar la sentencia que aparece en el siguiente Cdigo fuente donde el atributo especificado a continuacin de la clusula ORDER BY, es decir, au_lname, determina cmo se ordenarn las filas que se mostrarn, en este caso alfabticamente por el apellido.
SELECT au_lname, au_fname FROM authors ORDER BY au_lname SELECT au_lname FROM authors GROUP BY au_lname HAVING au_lname = 'Ringer' SELECT au_lname FROM authors GROUP BY au_lname
Funciones escalares para Select
Entendemos por funciones escalares, todas aquellas que permiten realizar operaciones de conteo de filas, suma de atributos, obtencin de medias, etc. Dichas funciones se especifican a continuacin de la palabra reservada SELECT. Las funciones que soporta la sentencia SELECT en el Transact SQL son las siguientes:
SUM: Realiza una suma acumulativa de un atributo para todas las filas accedidas mediante una consulta SQL. Por ejemplo, supongamos que tenemos una tabla de pedidos, con los atributos cod_cliente, cod_material y precio. Si queremos obtener la suma del precio de todos los pedidos almacenados, bastar con realizar una funcin de tipo SUM, como la que vemos en el Cdigo siguiente.
La anterior consulta obtiene la suma del precio para todas las filas de la tabla pedido, ya que no hemos especificado ninguna condicin en la clusula WHERE. Si ahora queremos obtener la suma total de todos los pedidos realizados por el cliente cuyo cdigo es "R12CE", debemos realizar la misma consulta, pero especificando una condicin para obtener nicamente las filas cuyo cod_cliente es "R12CE":
COUNT: Cuenta todas las filas de las tablas accedidas mediante una consulta SQL. Por ejemplo, si tenemos una tabla cliente, con todos los clientes de una empresa de servicios, con los atributos DNI, nombre, apellidos, direccin y poblacin, y queremos saber todos los clientes que tenemos, deberemos realizar un count, para obtener todas el nmero de filas de la tabla ejecutamos el Cdigo siguiente.
En el anterior ejemplo, al existir el mismo nmero de filas, sea cual sea el atributo que seleccionemos, podramos haber escogido cualquier otro. En general, se suele escribir el siguiente Cdigo fuente.
SELECT count(*) FROM cliente SELECT count(DNI) FROM cliente SELECT sum(precio) FROM pedido WHERE cod_cliente = "R12CE" SELECT sum(precio) FROM pedido Si ahora queremos saber el nmero de clientes que viven en Madrid, deberemos realizar un conteo de todas las filas con la condicin de que el atributo poblacin sea Madrid.
Si queremos saber cuntos ttulos tenemos en nuestra base de datos, digitaremos el siguiente Cdigo fuente.
Y si queremos saber cuntos ttulos tenemos, cuyo precio es mayor de 20 $, deberemos realizar lo mismo, pero especificando esta condicin en la clusula WHERE. Al resultado de la bsqueda le llamaremos caros.
AVG: Realiza una media aritmtica de los atributos para todas las filas accedidas mediante la consulta SQL. Si por ejemplo tenemos una tabla de materiales, con los atributos cod_material, descripcin, precio y cantidad_pedida, y queremos saber la cantidad media pedida de todos los materiales, deberemos realizar una media aritmtica, teniendo en cuenta todas las filas de la tabla:
La anterior sentencia, internamente, realiza primero una suma de todos los valores, y a continuacin la divide por el nmero total de filas accedidas, es decir, realiza la media aritmtica. Volviendo a nuestra cultural base de datos pubs, si queremos saber la media del precio de los ttulos que tenemos disponibles, deberemos ejecutar el Cdigo siguiente.
MAX: Obtiene el mximo valor del atributo especificado, de entre todas las filas seleccionadas mediante la sentencia SQL. Supngase, por ejemplo, que tenemos la tabla de materiales descrita anteriormente. Si queremos saber el material ms caro, deberemos realizar un SELECT con la clusula Max, que obtenga el mayor valor para el atributo precio de todas las filas.
SELECT avg(price) media FROM titles
SELECT avg(cantidad_pedida) FROM material
SELECT count(*) caros FROM titles WHERE price > 20
SELECT count(*) FROM titles
SELECT count(*) FROM cliente WHERE poblacion = "Madrid"
Para nuestro ejemplo, si queremos saber cul es el libro ms caro, ejecutaremos el Cdigo siguiente.
MIN: Obtiene el mnimo valor del atributo especificado, de entre todas las filas seleccionadas mediante la sentencia SQL. Si queremos saber cul es el libro ms barato de nuestra base de datos, deberemos ejecutar el Cdigo siguiente.
La sentencia Insert
La otra gran sentencia de manipulacin de datos es INSERT. Si SELECT nos permita recuperar datos, INSERT nos va a permitir aadirlos al esquema, es decir, con esta sentencia podemos aadir informacin a la base de datos. Recordemos que estamos en el modelo relacional, por lo que la informacin se aadir a una tabla en forma de filas. Si slo queremos insertar un valor para un atributo, el resto de los de la tabla deber contener el valor nulo (NULL). Sin embargo, habr ciertas ocasiones en que esto no ser posible, cuando el atributo est definido como NO NULO, en cuyo caso deberemos especificar un valor para ste. La sintaxis de esta sentencia es:
Donde tabla especifica la tabla en la cual se aadir la fila, atributos es una lista de atributos separados por comas que determinan los atributos para los cuales se darn valores, y que se darn para estos atributos, separados por comas. Por ejemplo, si queremos aadir un nuevo autor a nuestra base de datos, deberemos ejecutar el Cdigo siguiente.
Destacar que si el valor a introducir es alfanumrico, deber ir encerrado entre comillas, mientras que si es numrico no. Pues bien, si ejecutamos la anterior sentencia, tenemos el siguiente error:
Server: Msg 515, Level 16, State 2, Line 1 Cannot insert the value NULL into column 'contract', table 'pubs.dbo.authors'; column does not allow nulls. INSERT fails. The statement has been terminated.
INSERT INTO authors (au_id, au_lname, au_fname) VALUES ('409-99-9876', 'Pepe', 'Perez') INSERT INTO tabla (atributos) VALUES (valores) SELECT min(price) barato FROM titles
SELECT max(price) caro FROM titles
La razn es que no hemos dado valor al atributo contract, que ha sido definido como no nulo. Por lo tanto, rectificamos el Cdigo anterior, para dar un valor al campo contract.
El valor que hemos dado al atributo contract es un 1, ya que est definido como tipo binario, es decir, slo admite dos valores, 0 para especificar que no est contratado, y 1 para el caso contrario. Al ejecutar esta sentencia, obtenemos como resultado
(1 row(s) affected)
Lo que nos indica que la fila se ha insertado con xito. Podemos comprobarlo ejecutando un SELECT sobre dicha fila.
La sentencia Update
El objetivo de la sentencia UPDATE es actualizar los valores de una o varias filas de una tabla, sin necesidad de borrarla e insertarla de nuevo. La sintaxis es la siguiente:
Donde tabla especifica la tabla donde se encuentran las filas que queremos actualizar, condicin especifica la condicin que se debe cumplir para actualizar las filas, y lo que viene a continuacin de SET especifica la asignacin de los nuevos valores a los atributos. Por lo tanto se actualizarn todas las filas que cumplan la condicin especificada. Si queremos cambiar el nombre al autor que hemos insertado en el anterior apartado, deberemos escribir el Cdigo siguiente.
Lo que hacemos con la anterior sentencia es buscar el autor insertado, por el cdigo (condicin where), y a continuacin actualizar el valor del atributo nombre de la fila obtenida a Pepito. Si ejecutamos la anterior sentencia, obtenemos el resultado: (1 row(s) affected) lo que quiere decir que la fila ha sido actualizada con xito.
UPDATE authors SET au_fname = 'Pepito' WHERE au_id = '409- 99-9876' UPDATE tabla SET atributo1 = valor1, atributo2 = valor2,... WHERE Condicin
SELECT * FROM authors WHERE au_id = '409-99-9876' INSERT INTO authors (au_id, au_fname, au_lname, contract) VALUES ('409-99-9876', 'Pepe', 'Perez', 1) Podemos comprobarlo ejecutando el Cdigo.
La sentencia Delete
El objeto de la sentencia DELETE es el de borrar filas de una tabla. Para poder borrar filas en una tabla se deben cumplir las condiciones de seguridad determinadas por el administrador, y deben de cumplirse tambin las reglas de integridad referencial. La sintaxis es la siguiente:
Donde tabla especifica la tabla sobre la cual queremos borrar las filas, y condicin especifica la condicin que se debe cumplir para que se borren las filas. Si omitimos la condicin, se borrarn todas las filas de la tabla, es decir, la sentencia que aparece en el Cdigo siguiente borra todas las filas de la tabla authors.
Por ejemplo, si queremos borrar la fila que hemos creado en la tabla autores, deberemos ejecutar el siguiente Cdigo fuente. Obteniendo el siguiente resultado:
(1 row(s) affected)
Lo que viene a decir que la fila se ha borrado. Para comprobarlo, ejecutamos la sentencia que muestra el Cdigo siguiente. cuyo resultado es: (0 row(s) affected), lo que quiere decir que la fila no se encuentra en la tabla, es decir, ha sido borrada.
Sentencias condicionales
Las sentencias condicionales son aquellas que permiten discriminar entre diversas sentencias, segn se cumpla el valor de una expresin lgica. Existen dos tipos de sentencias condicionales. La primera de ellas tiene la siguiente sintaxis:
SELECT * FROM authors WHERE au_id = '409-99-9876' DELETE FROM authors WHERE au_id = '409-99- 9876' DELETE authors DELETE FROM tabla WHERE condicin
SELECT * FROM authors WHERE au_id = '409-99-9876'
La sentencia 1 slo se ejecutar si el resultado de la evaluacin de la expresin lgica es verdadero. En otro caso, se ejecutar la sentencia 2, correspondiente a la parte ELSE (opcional). Si se desea especificar un conjunto de sentencias, en lugar de una sola, stas debern ir encerradas entre las palabras reservadas BEGIN y END. Si deseamos obtener los ttulos almacenados cuando stos superen las 10 unidades, y el nmero de ellos cuando no lo superen, ejecutaremos el Cdigo siguiente.
En definitiva, la sentencia SELECT title FROM titles slo se ejecuta cuando se cumple la condicin (SELECT count(*) FROM titles) > 10. En otro caso, se ejecutar la rama ELSE, que devuelve el nmero de ttulos almacenados en la tabla titles.
Otra forma de ejecutar sentencias de forma condicional, corresponde a la sentencia CASE. La sintaxis es la siguiente:
La anterior sentencia compara la expresin 1, con el resto de expresiones especificadas a continuacin de la palabra reservada WHEN. Si alguna de estas expresiones se cumple, se devolver el resultado correspondiente especificado a continuacin de la palabra reservada THEN. Si llegados al final, no ha verificado ninguna de las expresiones, se devolver el resultado especificado a continuacin del ELSE.
Por ejemplo, si queremos saber el nombre de los estados de los autores, en lugar de las inciales, podemos ejecutar el siguiente Cdigo fuente.
CASE expresion1 WHEN expresion2 THEN resultado1 WHEN expresion3 THEN resultado2 ... [ELSE resultado3] IF (SELECT count(*) FROM titles) > 10 BEGIN SELECT title FROM titles END ELSE BEGIN SELECT count(*) FROM titles END IF expresion_logica sentencia1 [ELSE sentencia2]
En este caso se comprueba el valor del atributo state, y si este es igual a CA, se devolver California, si es OR se devolver Oregon, y en otro caso se devolver el literal 'Otro'.
SELECCIN DE TODAS LAS COLUMNAS
A veces es conveniente visualizar el contenido de todas las columnas de una tabla. Esto puede ser particularmente til cuando uno va a utilizar por primera vez una base de datos y desea obtener una rpida comprensin de su estructura y de los datos que contiene. Por conveniencia, SQL permite utilizar un asterisco (*) en lugar de la lista de seleccin como abreviatura de todas las columnas.
Muestra todos los datos de la Tabla OFICINAS.
FILAS DUPLICADAS (DINSTINCT)
Si una consulta incluye la clave primaria de una tabla en su lista de seleccin, entonces cada fila de resultados ser nica (ya que la clave primaria tiene un valor diferente en cada fila). El DINSTINCT hace que el valor de las filas no se repita
Listar los aos de las facturas, pero los aos no se deben de repetir
El resultado ser
RESUMEN La sentencia SELECT se utiliza para expresar una consulta SQL. Toda sentencia SELECT produce una tabla de resultados que contienen una o ms columnas y cero o ms filas. select distinct year(OrderDate) as Ao from orders SELECT * FROM OFICINAS SELECT state = CASE state WHEN 'CA' THEN 'California' WHEN 'OR' THEN 'Oregon' ELSE 'Otro' END FROM authors
La clusula FROM especifica la(s) tabla(s) que contiene(n) los datos a recuperar por una consulta.
La clusula SELECT especifica la(s) columna(s) de datos a incluir en los resultados de la consulta, que pueden ser columnas de datos de la base de datos o columnas calculadas.
La clusula WHERE selecciona las filas a incluir en los resultados aplicando una condicin de bsqueda a las filas de la base de datos.
Una condicin de bsqueda puede seleccionar filas mediante comparacin de valores, mediante comparacin de un valor con un rango o un grupo de valores, por correspondencia con un patrn de cadena o por comprobacin de valores NULL.
Las condiciones de bsqueda simples pueden combinarse mediante AND, OR y NOT para formar condiciones de bsqueda ms complejas.
La clusula ORDER BY especifica que los resultados de la consulta deben ser ordenados en sentido ascendente o descendente, basndose en los valores de una o ms columnas.
Las consultas resumen utilizan funciones de columna SQL para condensar una columna de valores en un nico valor que resuma la columna.
Las funciones de columna pueden calcular el promedio, suma, el valor mnimo y mximo de una columna, contar el nmero de valores de datos de una columna o contar el nmero de filas de los resultados de la consulta.
Una consulta resumen sin una clusula GROUP BY genera una nica fila de resultados, resumiendo todas las filas de una tablas o de un conjunto compuestos de tablas.
Una consulta resumen con una clusula GROUP BY genera mltiples filas de resultados.
Modelo de Base de Datos para el desarrollo de las Practicas
Ejercicios Prcticos
Usar la BD Ventas
Se desea saber cuntas veces a facturado cada Empleado, mostrar los campos Cod_Emp,nombre,[Facturas Emitidas].
Mostrara todas las Facturas pares emitida en los meses impares por empleado ms antiguo, mostrar los campos Num_Fact,Sub_Total,Igv,Total, [meses en letras].
Mostrar los 2 Productos ms vendidos de todas las facturas.
Mostrar los clientes cuyo total de facturacin sea mayor 1200, los campos a mostrar son Cod_cli,nom_cli,[Total Facturado].
Mostrar todas las facturas emitidas y su cantidad de productos vendidos de todos los empleados cuya antiguedad de trabajo sea mayor a 14 aos. Los campos a mostrar son Num_fact,Sub_total,igv,total,[Cantida de productos].
Mostrar los productos cuya segunda letra inicie con 'a' y su stock sea mayor a 300.
Mostrar los 3 productos ms vendidos de todas las facturas en entre el mes enero y marzo en letras.
Mostrar las facturas impares emitidas al cliente 'C0003'.
Mostrar las facturas pares emitidas por el empleado menos antiguo.
Mostrar el Empleado que no ha emitido ningn tipo de facturacin.
Mostrar las 2 facturas con mayor y menor total, los campos a mostrar son num_fact,Sub_total,igv,total.
Mostrar la antiguedad laboral de cada empleado, los campos a mostrar son Cod_Emp, Nombre, Fecha_ing,[Antiguedad Laboral].
Usando el Charindex(expresion1,expresion2[,posicion inicial]) devuelve la posicin inicial de la expresin especificada en una cadena de caracteres. Listar solo los nombres de los clientes, usando Charindex. nom_cli Nombres ------------------------------------ ------------------ Gianmarco, Sanchez Zavala Gianmarco Listar solo los apellidos materno y paterno de los clientes. Nom_cli Apellidos -------------------------------------- ------------------------------ Gianmarco, Sanchez Zavala Sanchez Zavala Listar solo el apellido paterno de los Clientes. Nom_Cli Apellido Paterno ------------------------------ ------------------------------ Gianmarco, Sanchez Zavala Sanchez Mostrar los productos con mayor y menor cantidad vendida de todas las facturas emitidas. Cod_Prod descrip precio stock -------- ------------------------------ ------------------------------------------------- ------ P0001 Leche evaporada 2.0 23 P0003 Azucar 1.8 465
Ejercicios Propuestos
Usar la BD Ventas
Mostrar todos los productos que no posean un comentario en el campo TxMtvEli.
Mostrar todas las columnas de la tabla detalle ordenado por cod_prod en forma descendente y num_fact en forma ascendente.
Mostrar todas las facturas excepto la factura '000002'.
Mostrar las facturas que se encuentran en el rango '000004' hasta el numero '000010' mostrar en el resultado solo los campos Num_fact,Sub_Total,igv,total.
Mostrar solo las siguientes facturas '000002','000007','000009','000012', en el cual incluya en el resultado los campos Num_Fact,Cod_Cli,Cod_Emp,Total.
Mostrar todas las Facturas Excepto las siguientes facturas '000005','000003'.
Mostrar los Clientes cuyo nombre inicien con la letra 'C' o la letra 'A'.
Mostrar los Clientes cuyo nombres termine con letra 'A' y 'O'
LIKE=> Determina si una cadena de caracteres dada coincide o no con un determinado modelo. Un modelo puede incluir caracteres normales y carcter comodn. % carcter comodn.
Sintaxis: match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Usando Like mostrar los nombres de los empleados cuyo nombre inicie con la letra 'M'.
Usando Like mostrar los nombres de los empleados cuya segunda letra de su nombre inicie con la letra 'A'.
Usando Like, mostrar los Empleados cuyo nombre termine con la letra Z.
Usando Like mostrar los Empleados cuyo apellido paterno inicie con la letra 'S' Sabiendo que el nombre tiene este formato Julio, Saavedra Rondon.
Usando Like mostrar todos los empleados excepto los empleados cuyo apellido paterno inicie con la letra A.
Usando Like mostrar todos los Empleados cuyo nombre no inicie con la letra C la letra M.
Mostrar todos los productos que fueron ingresados el ao 1994.
Mostrar todas las facturas que fueron registrados en Enero de 1997.
Mostrar el nmero de factura, el da Facturado en letras, y el Mes facturado en letras de la tabla facturas. El resultado ser as:
Num_Fact Dia Mes -------- ------------------------------ ------------------------------ 000001 Martes Enero 000002 Viernes Enero
Mostrar el nmero de Factura, y la fecha completa en cadena de caracteres. El resultado ser as:
Num_Fact Fecha -------- ---------------------------------------------- 000001 Lima Martes 2 de Enero de 1996 000002 Lima Viernes 5 de Enero de 1996
Mostrar el cdigo del empleado, la edad del empleado y la fecha de nacimiento de la tabla empleado.
Mostrar los productos cuya primera letra inicie con 'A', el stock sea mayor a 100 y la fecha de ingreso sea el ao 1994.
Mostrar el detalle de los productos vendidos de la Factura Nro.'000001', los campos a mostrar son Num_Fact,Descrip,precio,cant,total=(precio * cant).
Mostrar el nombre y precio ms alto de la tabla producto. Mostrar el promedio, l mximo y el mnimo del campo precio de la tabla producto.
Mostrar cuantos aos se han emitido las facturas a la fecha, mostrar el campo Num_fact, Fecha, [Total de aos].
Mostrar el total de productos vendidos de la Factura Nro.'000001'.
Mostrar la cantidad de facturas emitidas por cada cliente, mostrar los campos cod_cli,[Cantidad de facturas].
Mostrar los clientes que hayan tenido ms de 10 facturas emitidas, los campos a mostrar son Nom_Cli,[Cantidad de Facturas].
Mostrar todos los productos vendidos por un ao de venta. Campos a mostrar cod_prod,descrip,[cantidad de productos].
Subconsultas:
Una subconsulta es una consulta SELECT que devuelve un valor nico y est anidada en una instruccin SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una subconsulta se puede utilizar en cualquier parte en la que se permita una expresin.
Usando subconsultas, mostrar todas las columnas del producto ms caro. Mostrar los 3 productos ms caros, los campos a mostrar son cod_prod, descrip, precio.
Mostrar las facturas del Empleado ms antiguo, los campos a mostrar son Num_Fact,Sub_total,igv,total.
Mostrar los clientes que no han sido facturado.
Mostrar los productos que no se han vendido.
Mostrar la Actividad de la factura por medio del campo FgEli que es de tipo bit(0,1), si es 0 "Emitida",si es 1 "Cancelado", los campos a mostrar son num_fact,Sub_total,igv,total, [Estado de Factura]. Usando el Charindex(expresion1,expresion2[,posicion inicial]) devuelve la posicin inicial de la expresin especificada en una cadena de caracteres.
Mostrar todos los clientes cuyo apellido inicie con la letra 'A'
Cod_Cli nom_cli --------- ------------------------------ C0010 Williams, Anderson Lorin Semana 2 Procedimientos Almacenados I Vimos que SQL Server ofrece dos alternativas para asegurar la integridad de datos, la integridad: DECLARATIVA, mediante el uso de restricciones (constraints), valores predeterminados (defaults) y reglas (rules) y
PROCEDIMENTAL, mediante la implementacin de procedimientos almacenados y desencadenadores (triggers).
Nos detendremos ahora en procedimientos almacenados
Un procedimiento almacenado es un conjunto de instrucciones a las que se les da un nombre, que se almacena en el servidor. Permiten encapsular tareas repetitivas.
SQL Server permite los siguientes tipos de procedimientos almacenados: del sistema: estn almacenados en la base de datos "master" y llevan el prefijo "sp_"; permiten recuperar informacin de las tablas del sistema y pueden ejecutarse en cualquier base de datos.
locales: los crea el usuario.
temporales: pueden ser locales, cuyos nombres comienzan con un signo numeral (#), o globales, cuyos nombres comienzan con 2 signos numeral (##). Los procedimientos almacenados temporales locales estn disponibles en la sesin de un solo usuario y se eliminan automticamente al finalizar la sesin; los globales estn disponibles en las sesiones de todos los usuarios.
extendidos: se implementan como bibliotecas de vnculos dinmicos (DLL, Dynamic-Link Libraries), se ejecutan fuera del entorno de SQL Server. Generalmente llevan el prefijo "xp_". No los estudiaremos.
Al crear un procedimiento almacenado, las instrucciones que contiene se analizan para verificar si son correctas sintcticamente. Si no se detectan errores, SQL Server guarda el nombre del procedimiento almacenado en la tabla del sistema "sysobjects" y su contenido en la tabla del sistema "syscomments" en la base de datos activa. Si se encuentra algn error, no se crea.
Un procedimiento almacenado puede hacer referencia a objetos que no existen al momento de crearlo. Los objetos deben existir cuando se ejecute el procedimiento almacenado. Ventajas: comparten la lgica de la aplicacin con las otras aplicaciones, con lo cual el acceso y las modificaciones de los datos se hacen en un solo sitio.
permiten realizar todas las operaciones que los usuarios necesitan evitando que tengan acceso directo a las tablas.
reducen el trfico de red; en vez de enviar muchas instrucciones, los usuarios realizan operaciones enviando una nica instruccin, lo cual disminuye el nmero de solicitudes entre el cliente y el servidor.
Creacin, modificacin y eliminacin de Store Procedure
Los procedimientos almacenados se crean en la base de datos seleccionada, excepto los procedimientos almacenados temporales, que se crean en la base de datos "tempdb".
En primer lugar se deben tipear y probar las instrucciones que se incluyen en el procedimiento almacenado, luego, si se obtiene el resultado esperado, se crea el procedimiento.
Los procedimientos almacenados pueden hacer referencia a tablas, vistas, a funciones definidas por el usuario, a otros procedimientos almacenados y a tablas temporales.
Un procedimiento almacenado pueden incluir cualquier cantidad y tipo de instrucciones, excepto: Create default, create procedure, create rule, create trigger y create view. Se pueden crear otros objetos (por ejemplo ndices, tablas), en tal caso deben especificar el nombre del propietario; se pueden realizar inserciones, actualizaciones, eliminaciones, etc.
Si un procedimiento almacenado crea una tabla temporal, dicha tabla slo existe dentro del procedimiento y desaparece al finalizar el mismo. Lo mismo sucede con las variables.
Hemos empleado varias veces procedimientos almacenados del sistema ("sp_help", "sp_helpconstraint", etc.), ahora aprenderemos a crear nuestros propios procedimientos almacenados.
Para crear un procedimiento almacenado empleamos la instruccin "create procedure".
La sintaxis bsica parcial es: Create procedure NOMBREPROCEDIMIENTO as INSTRUCCIONES a realizar; Para diferenciar los procedimientos almacenados del sistema de los procedimientos almacenados locales use un prefijo diferente a "sp_" cuando les el nombre.
Con las siguientes instrucciones creamos un procedimiento almacenado llamado "pa_libros_limite_stock" que muestra todos los libros de los cuales hay menos de 10 disponibles:
Create proc pa_libros_limite_stock as select *from libros where cantidad <=10;
Entonces, creamos un procedimiento almacenado colocando "create procedure" (o "create proc", que es la forma abreviada), luego el nombre del procedimiento y seguido de "as" las sentencias que definen el procedimiento.
"create procedure" debe ser la primera sentencia de un lote.
Para ejecutar el procedimiento almacenado creado anteriormente tipeamos: exec pa_libros_limite_stock; Entonces, para ejecutar un procedimiento almacenado colocamos "execute" (o "exec") seguido del nombre del procedimiento.
Cuando realizamos un ejercicio nuevo, siempre realizamos las mismas tareas: eliminamos la tabla si existe, la creamos y luego ingresamos algunos registros. Podemos crear un procedimiento almacenado que contenga todas estas instrucciones:
Create procedure pa_crear_libros as if object_id('libros')is not null drop table libros; create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2), primary key(codigo) ); insert into libros values('Uno','Richard Bach','Planeta',15); insert into libros values('Ilusiones','Richard Bach','Planeta',18); insert into libros values('El aleph','Borges','Emece',25); insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',45); insert into libros values('Matemtica estas ahi','Paenza','Nuevo siglo',12); insert into libros values('Java en 10 minutos','Mario Molina','Paidos',35);
Y luego lo ejecutamos cada vez que comenzamos un nuevo ejercicio y as evitamos tipear tantas sentencias: exec pa_crear_libros;
Los procedimientos almacenados se eliminan con "drop procedure".
Sintaxis: drop procedure NOMBREPROCEDIMIENTO;
Eliminamos el procedimiento almacenado llamado "pa_libros_autor":
drop procedure pa_libros_autor;
Si el procedimiento que queremos eliminar no existe, aparece un mensaje de error, para evitarlo, podemos emplear esta sintaxis:
if object_id('NOMBREPROCEDIMIENTO') is not null drop procedure NOMBREPROCEDIMIENTO;
Eliminamos, si existe, el procedimiento "pa_libros_autor", si no existe, mostramos un mensaje:
if object_id('pa_libros_autor') is not null drop procedure pa_libros_autor else select 'No existe el procedimiento "pa_libros_autor"'; "drop procedure" puede abreviarse con "drop proc".
Se recomienda ejecutar el procedimiento almacenado del sistema "sp_depends" para ver si algn objeto depende del procedimiento que deseamos eliminar.
Podemos eliminar una tabla de la cual dependa un procedimiento, SQL Server lo permite, pero luego, al ejecutar el procedimiento, aparecer un mensaje de error porque la tabla referenciada no existe.
Aplicaciones prcticas Problema: Trabajamos con la tabla "libros" de una base de datos llamada librera.
--Eliminamos la tabla si existe y la creamos nuevamente: if object_id('libros') is not null drop table libros; Create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2), primary key(codigo) );
--Ingresamos algunos registros: insert into libros values ('Uno','Richard Bach','Planeta',15); insert into libros values ('Ilusiones','Richard Bach','Planeta',12); insert into libros values ('El aleph','Borges','Emece',25); insert into libros values ('Aprenda PHP','Mario Molina','Nuevo siglo',50); insert into libros values ('Matematica estas ahi','Paenza','Nuevo siglo',18); insert into libros values ('Puente al infinito','Bach Richard','Sudamericana',14); insert into libros values ('Antologa','J. L. Borges','Paidos',24); insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI',45); insert into libros values ('Cervantes y el quijote','Borges- Casares','Planeta',34);
--Eliminamos el procedimiento almacenado "pa_libros_autor" si existe: if object_id('pa_libros_autor') is not null drop procedure pa_libros_autor;
--Creamos el procedimiento para que reciba el nombre de un autor y muestre todos los libros del --autor solicitado: Create procedure pa_libros_autor @autor varchar(30) as select titulo, editorial,precio from libros where autor= @autor;
--Ejecutamos el procedimiento: exec pa_libros_autor 'Richard Bach';
--Empleamos la otra sintaxis (por nombre) y pasamos otro valor: exec pa_libros_autor @autor='Borges';
--Eliminamos, si existe, el procedimiento "pa_libros_autor_editorial": if object_id('pa_libros_autor_editorial') is not null drop procedure pa_libros_autor_editorial;
--Creamos un procedimiento "pa_libros_autor_editorial" que recibe 2 parmetros, el nombre de un autor y el de una editorial: Create procedure pa_libros_autor_editorial @autor varchar(30), @editorial varchar(20) as select titulo, precio from libros where autor= @autor and editorial=@editorial;
--Ejecutamos el procedimiento enviando los parmetros por posicin: exec pa_libros_autor_editorial 'Richard Bach','Planeta';
--Ejecutamos el procedimiento enviando otros valores y lo hacemos por nombre: exec pa_libros_autor_editorial @autor='Borges',@editorial='Emece';
--Si ejecutamos el procedimiento omitiendo los parmetros, aparecer un mensaje de error. --Eliminamos, si existe, el procedimiento "pa_libros_autor_editorial2": if object_id('pa_libros_autor_editorial2') is not null drop procedure pa_libros_autor_editorial2;
--Creamos el procedimiento almacenado "pa_libros_autor_editorial2" que recibe los --mismos parmetros, esta vez definimos valores por defecto para cada parmetro: Create procedure pa_libros_autor_editorial2 @autor varchar(30)='Richard Bach', @editorial varchar(20)='Planeta' as select titulo,autor,editorial,precio from libros where autor= @autor and editorial=@editorial;
--Ejecutamos el procedimiento anterior sin enviarle valores para verificar que usa los --valores por defecto:
exec pa_libros_autor_editorial2;
--Muestra los libros de "Richard Bach" y editorial "Planeta" (valores por defecto). --Enviamos un solo parmetro al procedimiento:
exec pa_libros_autor_editorial2 'Planeta';
--SQL Server asume que es el primero, y no hay registros cuyo autor sea "Planeta". --Especificamos el segundo parmetro, enviando parmetros por nombre: exec pa_libros_autor_editorial2 @editorial='Planeta';
--Muestra los libros de "Richard Bach" (valor por defecto para "autor") de la editorial --enviada como argumento ("Planeta"). --Ejecutamos el procedimiento enviando parmetros por nombre en distinto orden:
--Definimos un procedimiento empleando patrones de bsqueda (antes verificamos si --existe para eliminarlo):
if object_id('pa_libros_autor_editorial3') is not null drop procedure pa_libros_autor_editorial3;
Create proc pa_libros_autor_editorial3 @autor varchar(30) = '%', @editorial varchar(30) = '%' as select titulo,autor,editorial,precio from libros where autor like @autor and editorial like @editorial;
--Ejecutamos el procedimiento enviando parmetro por posicin, asume que es el primero:
exec pa_libros_autor_editorial3 'P%';
--La sentencia anterior ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" ---enviando un valor que es asumido como el primero y para el segundo parmetro toma el --valor por defecto; muestra los libros cuyo autor comience con "P", de cualquier editorial.
--Ejecutamos el procedimiento especificando que el valor corresponde al segundo --parmetro:
exec pa_libros_autor_editorial3 @editorial='P%';
--La sentencia anterior ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" ---enviando un valor para el segundo parmetro, para el primer parmetro toma el valor por --defecto; muestra los libros de cualquier autor cuya editorial comience con "P".
--La sentencia siguiente muestra lo mismo que la anterior:
exec pa_libros_autor_editorial3 default, 'P%';
Ejercicios Propuestos Usar la base de datos Ventas 1. Crear un procedimiento almacenado que muestre los datos del cliente que tiene mayor cantidad de facturas emitidas. 2. Crear un procedimiento almacenado que incremente a 25% al producto ms barato. 3. Crear un procedimiento almacenado que reciba varios parmetros de entrada, que permita la insercin de un empleado, y a la vez genere el cdigo del empleado, junto con la insercin del registro. 4. Crear un procedimiento almacenado que reciba como parmetro de entrada un intervalo de fechas y un cdigo de cliente, y muestre como resultado las 3 facturas con mayor precio de ese cliente, los campos a mostrar son : num_fac, sub_total, igv, total 5. Crear un procedimiento almacenado que muestre todas las facturas que fueron emitidos solo en los meses pares. 6. Crear un procedimiento almacenado que muestre las utilidades ganada por factura, sabiendo que la utilidad es igual a ((precio-pre_cos)*cant), los campos a mostrar num_fac, [utilidad de factura]. 7. Crear un procedimiento almacenado que muestre los datos de la factura con mayor utilidad ganada. 8. Crear un procedimiento almacenado que reciba varios parmetros de entrada, que permita la insercin, y a la vez genere el cdigo del producto, junto con la insercin del producto. 9. Crear un procedimiento almacenado que permita mostrar el detalle de una o ms facturas, este procedimiento almacenado debe de permitir el ingreso de una o varias facturas.
Por ejemplo [nombre del procedimiento] '000001','000002','000003'
10. Crear un procedimiento almacenado que muestre las facturas que tiene mayor y menor total de venta, utilice la tabla facturas
Semana 3 Procedimientos Almacenados II Parmetros de entrada y salida DE ENTRADA Los procedimientos almacenados pueden recibir y devolver informacin; para ello se emplean parmetros, de entrada y salida, respectivamente. Veamos los primeros. Los parmetros de entrada posibilitan pasar informacin a un procedimiento. Para que un procedimiento almacenado admita parmetros de entrada se deben declarar variables como parmetros al crearlo. La sintaxis es: create proc NOMBREPROCEDIMIENTO @NOMBREPARAMETRO TIPO =VALOR POR DEFECTO as SENTENCIAS a realizar.
Los parmetros se definen luego del nombre del procedimiento, comenzando el nombre con un signo arroba (@). Los parmetros son locales al procedimiento, es decir, existen solamente dentro del mismo. Pueden declararse varios parmetros por procedimiento, se separan por comas. Cuando el procedimiento es ejecutado, deben explicitarse valores para cada uno de los parmetros (en el orden que fueron definidos), a menos que se haya definido un valor por defecto, en tal caso, pueden omitirse. Pueden ser de cualquier tipo de dato (excepto cursor).
Luego de definir un parmetro y su tipo, opcionalmente, se puede especificar un valor por defecto; tal valor es el que asume el procedimiento al ser ejecutado si no recibe parmetros. Si no se coloca valor por defecto, un procedimiento definido con parmetros no puede ejecutarse sin valores para ellos. El valor por defecto puede ser "null" o una constante, tambin puede incluir comodines si el procedimiento emplea "like".
Creamos un procedimiento que recibe el nombre de un autor como parmetro para mostrar todos los libros del autor solicitado:
Create procedure pa_libros_autor @autor varchar(30) as select titulo, editorial,precio from libros where autor= @autor;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del procedimiento y un valor para el parmetro:
exec pa_libros_autor 'Borges';
Creamos un procedimiento que recibe 2 parmetros, el nombre de un autor y el de una editorial: Create procedure pa_libros_autor_editorial @autor varchar(30), @editorial varchar(20) as select titulo, precio from libros where autor= @autor and editorial=@editorial;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del procedimiento y los valores para los parmetros separados por comas:
Los valores de un parmetro pueden pasarse al procedimiento mediante el nombre del parmetro o por su posicin. La sintaxis anterior ejecuta el procedimiento pasando valores a los parmetros por posicin. Tambin podemos emplear la otra sintaxis en la cual pasamos valores a los parmetros por su nombre:
Cuando pasamos valores con el nombre del parmetro, el orden en que se colocan puede alterarse.
No podramos ejecutar el procedimiento anterior sin valores para los parmetros. Si queremos ejecutar un procedimiento que permita omitir los valores para los parmetros debemos, al crear el procedimiento, definir valores por defecto para cada parmetro:
Create procedure pa_libros_autor_editorial2 @autor varchar(30)='Richard Bach', @editorial varchar(20)='Planeta' as select titulo, autor,editorial,precio from libros where autor= @autor and editorial=@editorial;
Podemos ejecutar el procedimiento anterior sin enviarle valores, usar los predeterminados.
Si enviamos un solo parmetro a un procedimiento que tiene definido ms de un parmetro sin especificar a qu parmetro corresponde (valor por posicin), asume que es el primero. Es decir, SQL Server asume que los valores se dan en el orden que fueron definidos, no se puede interrumpir la secuencia.
Si queremos especificar solamente el segundo parmetro, debemos emplear la sintaxis de paso de valores a parmetros por nombre: exec pa_libros_autor_editorial2 @editorial='Paidos';
Podemos emplear patrones de bsqueda en la consulta que define el procedimiento almacenado y utilizar comodines como valores por defecto:
Create proc pa_libros_autor_editorial3 @autor varchar(30) = '%', @editorial varchar(30) = '%' as select titulo,autor,editorial,precio from libros where autor like @autor and editorial like @editorial;
La sentencia siguiente ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" enviando un valor por posicin, se asume que es el primero.
exec pa_libros_autor_editorial3 'P%';
La sentencia siguiente ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" enviando un valor para el segundo parmetro, para el primer parmetro toma el valor por defecto:
exec pa_libros_autor_editorial3 @editorial='P%';
Tambin podramos haber tipiado:
exec pa_libros_autor_editorial3 default, 'P%'; DE SALIDA Los procedimientos almacenados pueden devolver informacin; para ello se emplean parmetros de salida. El valor se retorna a quien realiz la llamada con parmetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "output" al crear el procedimiento:
CREATE PROCEDURE NOMBREPROCEDIMIENTO @PARAMETROENTRADA TIPO =VALORPORDEFECTO, @PARAMETROSALIDA TIPO=VALORPORDEFECTO output as SENTENCIAS select @PARAMETROSALIDA=SENTENCIAS;
Los parmetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.
Creamos un procedimiento almacenado al cual le enviamos 2 nmeros y retorna el promedio:
Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el procedimiento envindole 2 valores y mostramos el resultado.
La instruccin que realiza la llamada al procedimiento debe contener un nombre de variable para almacenar el valor retornado. Creamos un procedimiento almacenado que muestre los ttulos, editorial y precio de los libros de un determinado autor (enviado como parmetro de entrada) y nos retorne la suma y el promedio de los precios de todos los libros del autor enviado:
Create procedure pa_autor_sumaypromedio @autor varchar(30)='%', @suma decimal(6,2) output, @promedio decimal(6,2) output as select titulo,editorial,precio from libros where autor like @autor select @suma=sum(precio) from libros where autor like @autor select @promedio=avg(precio) from libros where autor like @autor;
Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos los parmetros de salida del procedimiento:
Podemos ingresar datos en una tabla con el resultado devuelto por un procedimiento almacenado. La instruccin siguiente crea el procedimiento "pa_ofertas", que ingresa libros en la tabla "ofertas": Create proc pa_ofertas as select titulo,autor,editorial,precio from libros where precio<50;
La siguiente instruccin ingresa en la tabla "ofertas" el resultado del procedimiento "pa_ofertas": insert into ofertas exec pa_ofertas; Las tablas deben existir y los tipos de datos deben coincidir.
Aplicaciones prcticas Problema: Trabajamos con la tabla "libros" de una librera. --Eliminamos la tabla si existe y la creamos nuevamente: if object_id('libros') is not null drop table libros;
Create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2), primary key(codigo) );
--Ingresamos algunos registros: insert into libros values ('Uno','Richard Bach','Planeta',15); insert into libros values ('Ilusiones','Richard Bach','Planeta',12); insert into libros values ('El aleph','Borges','Emece',25); insert into libros values ('Aprenda PHP','Mario Molina','Nuevo siglo',50); insert into libros values ('Matemtica estas ahi','Paenza','Nuevo siglo',18); insert into libros values ('Puente al infinito','Richard Bach','Sudamericana',14); insert into libros values ('Antologa','J. L. Borges','Paidos',24); insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI',45); insert into libros values ('Antologa','Borges','Planeta',34);
--Eliminamos la tabla "ofertas" si existe y la creamos con los mismos campos de la tabla "libros":
if object_id('ofertas') is not null drop table ofertas;
create table ofertas( titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2) );
--Eliminamos el procedimiento llamado "pa_ofertas", si existe:
if object_id('pa_ofertas') is not null drop procedure pa_ofertas;
--Creamos el procedimiento para que seleccione los libros cuyo precio no supera los 30 pesos:
Create proc pa_ofertas as select titulo,autor,editorial,precio from libros where precio<=30;
--Vamos a ingresar en la tabla "ofertas" el resultado devuelto por el procedimiento --almacenado "pa_ofertas":
insert into ofertas exec pa_ofertas;
--Veamos el contenido de "ofertas":
select *from ofertas;
--Eliminamos la tabla "libros_por_editorial" si existe y luego creamos la tabla con dos campos: nombre de editorial y cantidad:
if object_id('libros_por_editorial') is not null drop table libros_por_editorial;
Create table libros_por_editorial( editorial varchar(20), cantidad int );
--Eliminamos el procedimiento llamado "pa_libros_por_editorial", si existe:
if object_id('pa_libros_por_editorial') is not null drop procedure pa_libros_por_editorial;
--Creamos el procedimiento para que cuente la cantidad de libros de cada editorial:
Create proc pa_libros_por_editorial as select editorial,count(*) from libros group by editorial;
--Vamos a ingresar en la tabla "libros_por_editorial" el resultado devuelto por el procedimiento almacenado "pa_libros_por_editorial": insert into libros_por_editorial exec pa_libros_por_editorial; --Veamos el contenido de la tabla "libros_por_editorial": select *from libros_por_editorial;
Ejercicios Propuestos
Usar la base de datos Neptuno
1. Crear un SP que muestre cuales son los productos que tienen el mayor precio de la tabla productos. Los campos a mostrar son: Ejemplo: Exec usp_ProductoMayor
2. Crear un SP que muestre todos los Pedidos de un cliente ingresado. Los datos a mostrar son: Ejemplo: Exec usp_PedidosporCliente 'ALFKI'
3. crear un SP que muestre la cantidad de pedidos vendidos por un empleado ingresado. Ejemplo: Exec usp_PedidosporEmpleado 1
4. Crear un SP que muestre todos los Productos cuyo pais de proveedor sea ingresado, y la unidad de precio sea mayor al dato ingresado.Mostrara el siguiente resultado. Ejemplo: Exec usp_ProductosporPaisyPrecioUnidad 'Estados Unidos',20
5. Crear un SP que permita mostrar todos los datos de una tabla ingresada. Set Quoted_Identifier off --los literales deben delimitarse con comillas dobles. Set Quoted_Identifier on --los literales deben delimitarse con comillas simples. Ejemplo: Exec usp_MostrarTablas 'Empleados'
6. Crear un SP que que permita mostrar todos los productos cuya segunda palabra del nombre del producto inicia por una letra ingresada,el precio unidad sea mayor al dato ingresado, y las unidades en existencia sea mayor al dato ingresado. Ejemplo: Exec usp_Productospor3Parametros 'd',40,50
7. Crear un SP que muestre cuantos productos existen cuyo precio unidad este entre 15 y 50. Utilice un parametro de salida OUTPUT para obtener el resultado. Ejemplo de ejecucion del procedimiento almacenado con parametro de salida: Declare @precio int Exec usp_CantidadProductos @precio Output print 'Existen '+ convert(varchar(2),@precio)+' Productos'
8. Crear un SP que permita la insercion de un registro en la tabla alumnos.
Nombre de Campo Tipo de Dato Longitud Alu_cod Char 5 Alu_dir Varchar 50 Alu_edad Int Alu_fecing Smalldatetime
9. Crear un SP que permita la insercion de un registro en la tabla alumnos y a la vez genere el codigo alfanumerico del alumnos como 'A0000'. 10. Crear un SP que permita la actualizacion de todos los datos de un alumno por medio de un codigo ingresado. 11. Crear un SP que permita eliminar un alumno por medio de un codigo ingresado. 12. Crear un SP que permita eliminar uno o mas alumnos mediante el ingreso de uno o mas codigo de alumnos. 13. Crear un procedimiento que permita realizar la busqueda de productos por uno o mas palabras. Ejemplo: Exec usp_busquedaProductos 'Ta'
Semana 4 Procedimientos almacenados III Vistas INTRODUCCION
Las tablas de una base de datos definen la estructura y organizacin de sus datos. Sin embargo, SQL tambin permite mirar los datos almacenados de otros modos mediante la definicin de vistas alternativas de datos. Una vista es una consulta SQL que est permanentemente almacenada en la base de datos y a la que se le asigna un nombre. Los resultados de una consulta almacenada son visibles a travs de la vista y SQL permite acceder a estos resultados como si fueran, de hecho, una tabla real en la base de datos.
Las vistas son parte importante de SQL, por varias razones:
Las vistas permiten acomodar el aspecto de una base de datos de modo que diferentes usuarios la vean desde diferentes perspectivas. Las vistas permiten restringir acceso a los datos, permitiendo que diferentes usuarios slo vean ciertas filas o ciertas columnas de una tabla. Las vistas simplifican el acceso a la base de datos mediante la presentacin de la estructura de los datos almacenados del modo que sea ms natural a cada usuario.
Qu es una vista?
Una vista es una tabla virtual en la base de datos cuyos contenidos estn definidos por una consulta. Para el usuario de la base de datos, la vista aparece igual que una tabla real, con un conjunto de columnas designadas y filas de datos. Pero a diferencia de una tabla real, una vista no existe en la base de datos como conjunto almacenado de valores. En su lugar, las filas y columnas de datos visibles a travs de la vista son los resultados producidos por la consulta que define la vista. SQL crea la ilusin de la vista dndole a sta un nombre semejante a un nombre de tabla y almacenando la definicin de la vista en la base de datos.
Ventajas de las vistas
Seguridad. Cada usuario puede obtener permiso para acceder a la base de datos nicamente a travs de un pequeo conjunto de vistas que contienen los datos especficos que el usuario est autorizado a ver, restringiendo as el acceso del usuario a los datos almacenados. Simplicidad de consulta. Una vista puede extraer datos de varias tablas diferentes y presentarlos como una nica tabla, haciendo que consultas multi tabla se formulen como consultas de una sola tabla con respecto a la vista. Simplicidad estructurada. Las vistas pueden dar a un usuario una visin personalizada de la estructura de la base de datos presentando sta como un conjunto de tablas virtuales que tienen sentido para ese usuario. Aislamiento frente al cambio. Una vista puede presentar una imagen consistente inalterada de la estructura de la base de datos incluso si las tablas fuentes subyacentes se dividen, reestructuran o cambian de nombre. Integridad de datos. Si se accede a los datos y se introducen a travs de una vista, el DBMS puede comprobar automticamente los datos para asegurarse que satisfacen restricciones de integridad especificadas.
Desventajas de las vistas
Rendimiento. Las vistas crean la apariencia de una tabla, pero el DBMS debe traducir las consultas con respecto a la vista en consultas con respecto a las tablas fuente subyacente. Restricciones de actualizacin. Cuando un usuario trata de actualizar filas de una vista, el DBMS debe traducir la peticin a una actualizacin sobre las filas de las tablas fuente subyacente.
Creacin De Una Vista (Create View)
La sentencia CREATE VIEW se utiliza para crear una vista. La sentencia asigna un nombre a la vista y especifica la consulta que define la vista. Para crear la vista con xito es preciso tener permiso para acceder a todas las tablas referenciadas en la consulta. Solamente se especifican los nombres de las columnas; el tipo de datos, la longitud y las otras caractersticas de cada columna se deducen de la definicin de las columnas en las tablas fuente. Si la lista de nombres de columnas se omite de la sentencia CREATE VIEW, cada columna de la vista adopta el nombre de la columna correspondiente de la consulta. La lista de nombres de columnas debe ser especificada si la consulta incluye columnas calculadas o si produce dos columnas con nombres idnticos.
Aunque todas las vistas se crean del mismo modo en la prctica se utilizan diferentes tipos de vistas para propsitos diferentes.
1. Vistas horizontales
Un uso comn de las vistas es restringir el acceso de un usuario a las filas seleccionadas de una tabla. Por ejemplo, puede ser deseable que un director de ventas solamente vea filas de REPVENTAS correspondientes a los vendedores de la regin propia del director. Para lograr esto, se pueden definir dos vistas, del modo siguiente:
Crea una vista que muestre a los vendedores de la regin Este.
Define una vista que contiene nicamente las oficinas de la regin Este.
2. Vistas verticales
Otro uso habitual de las vistas es restringir el acceso de un usuario a slo ciertas columnas de una tabla. Por ejemplo, en nuestra base de datos, el departamento de procesamiento de pedidos puede necesitar acceder al CREATE VIEW OFICINASESTE AS SELECT *FROM OFICINAS WHERE REGION = 'Este' CREATE VIEW REPESTE AS SELECT * FROM REPVENTAS WHERE OFICINA_REP IN (11, 12, 13) nmero de empleado, su nombre y la asignacin de oficina. Sin embargo, no hay necesidad de que el personal de procesamiento de pedidos vea las ventas actuales del vendedor o su cuota. Esta vista selectiva de la Tabla REPVENTAS puede ser construida con la vista siguiente:
Crea una vista mostrando informacin seleccionada de cada vendedor.
Define una vista de la Tabla OFICINAS para el personal de procesamiento de pedidos que incluye la ciudad, el nmero de oficina y regin.
3. Vistas con subconjuntos fila/columna
Es bastante habitual definir una vista que divida una tabla fuente tanto por la dimensin horizontal como por la vertical, como en este ejemplo:
Define una vista que contiene el nmero de cliente, el nombre de empresa y el lmite de crdito de todos los clientes asignados a Bill Adams (empleado nmero 105)
Los datos visibles a travs de esta vista son un subconjunto fila/columna de la Tabla CLIENTES. Slo las columnas explcitamente designadas en la lista de seleccin de la vista y las filas que satisfacen la condicin de bsqueda son visibles a travs de la vista.
ELIMINACION DE UNA VISTA
Debido a que las vistas se comportan como tablas, y una vista no puede tener el mismo nombre que una tabla, muchos productos DBMS utilizan la sentencia DROP TABLE para eliminar vistas. Otras implementaciones SQL proporcionan la sentencia DROP VIEW:
RESUMEN
Una vista es una tabla virtual definida mediante una consulta. La CREATE VIEW CLIEBILL AS SELECT NUM_CLIE, EMPRESA, LIMITE_CREDITO FROM CLIENTES WHERE REP_CLIE = 105 CREATE VIEW INFOOFICINA AS SELECT OFICINA, CIUDAD, REGION FROM OFICINAS CREATE VIEW INFOREP AS SELECT NUM_EMPL, NOMBRE, OFICINA_REP FROM REPVENTAS vista `parece contener filas y columnas de datos, al igual que una tabla real, pero los datos visibles a travs de la vista son, de hecho, los resultados de la consulta.
Una vista puede ser un subconjunto simple fila/columna de una nica tabla, puede sumarizar una tabla (una vista agrupada) o puede extraer sus datos de dos o ms tablas (una vista compuesta).
Una vista puede ser referenciada como una tabla real en una sentencia SELECT, INSERT, DELETE o UPDATE. Sin embargo, las vistas ms complejas no pueden ser actualizadas; son vistas de slo lectura.
Las vistas suelen utilizarse para simplificar la estructura aparente de una base de datos, para simplificar consultas y para proteger ciertas filas y/o columnas frente a acceso no autorizado.
Ejercicios Propuestos
Usar la base de datos Neptuno
1. Crear una vista que permita visualizar los 2 empleados con mayor cantidad de Pedidos. (usar tablas Empleados y Pedidos)
2. Crear una vista que permita visualizar todos productos por Proveedor.(Usar tablas Proveedores y Productos)
3. Crear una vista que permita visualizar los datos del empleado mas joven. (Usar tabla Empleados)
4. Crear una vista que permita visualizar todos los empleados con mas aos de trabajo y los empleados con menor aos trabajo. (Usar tabla Empleados) 5.
6. Crear una vista que permita visualizar los productos y su categoria, cuya unidad de precio sea mayor al promedio de precios de unidad. ( Usar tablas Categorias y Productos)
Semana 6 Acceso a datos con ADO NET
ADO .NET es la nueva versin del modelo de objetos ADO (ActiveX Data Object), es decir la estrategia que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado para cubrir todas las necesidades que ADO no ofreca, y est diseado para trabajar con conjuntos de datos desconectados, lo que permite reducir el trfico de red. ADO .NET utiliza XML con formato universal de transmisin de los datos.
Estructura del modelo de objetos
mbitos con nombre de ADO .NET
La instalacin por defecto de la plataforma .NET aporta cinco mbitos con nombre namespaces relacionados con ADO.NET, a los cuales habra que aadir uno o ms por cada proveedor adicional que pudiramos instalar despus. Estos cinco mbitos son:
System.Data: Aloja las clases independientes del origen de datos, as como las interfaces que deben implementar las clases dependientes.
System.Data.Common: Contiene clases que facilitan la implementacin de las interfaces existentes en System,.Data por parte de los distintos proveedores de datos, asi como otras compartidas por todos los proveedores. System.Data.OleDb : Corresponde al proveedor ADO.NET que permite utilizar cualquier controlador OLE DB para conectar con un origen de datos. En el se encuentran implementaciones especificas de clases para comunicarse mediante OLE DB.
System.Data.SqlClient : Como el anterior, alberga clases especificas para operar sobre un determinado origen de datos, en este caso SQL Server.
System.Data.OracleClient : Correspondiente al proveedor nativo para acceso a datos Oracle. Al igual que System.Data.SqlClient o Sytem.Data.OleDb, contiene implementaciones especificas de clases que facilitan la conexin y comunicacin con este RDBMS (Sistema de administracin de base de datos Relacional).
Proveedores de acceso a datos
Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al acceso de datos y es la responsable de establecer la comunicacin con las fuentes de datos.
En este conjunto de nombres de espacio, encontraremos casi siempre las clases Connection, Command, DataAdapter y DataReader como las clases ms generales, las cuales nos permiten establecer la conexin con la fuente de datos.
Proveedor de acceso a datos de .NET Framework
Dentro del entorno .NET Framework, encontramos un nutrido conjunto de proveedores de acceso a datos. Estos son los siguientes:
ODBC .NET Data Provider OLE DB .NET Data Provider Oracle Client .NET Data Provider SQL Server .NET Data Provider
Estos proveedores de acceso a datos incluidos en Microsoft .NET Framework, los podemos encontrar en los nombres de espacio:
El objeto Connection Este objeto es el encargado de establecer una conexin fsica con una base de datos determinada.
Para establecer la conexin con una determinada fuente de datos, no slo debemos establecer la cadena de conexin correctamente, sino que adems deberemos usar los parmetros de conexin y el proveedor de acceso a datos adecuado.
Con este objeto, podremos adems abrir y cerrar una conexin.
Dentro del objeto Connection tenemos
Provider: Se utiliza para indicar el nombre del proveedor de datos. El proveedor de datos es el programa desde donde vas a obtener la informacin que vas a manejar en tu aplicacin y puede ser SQL, Access, MySQL, Oracle, etc.
DataSource: Se utiliza para indicar el nombre del servidor donde se encuentra la base de datos a conectare. El servidor es la computadora donde se ha instalado por ejemplo el SQL Server. En los objetos SQLConnection se puede utilizar tambin el parmetro Server.
Initial Catalog: Se utiliza para indicar el nombre de la bases de datos a la cual nos queremos conectar. En los objetos SQLConnection se puede utilizar tambin el parmetro DataBase.
User ID: Se utiliza para indicar el nombre del usuario que se conecta a la base de datos.
Pwd: Se utiliza para indicar la clave del usuario que esta conectndose a la base de datos.
Integrated Security: Permite indicar si la conexin a la base de datos va a tener seguridad integrada, es decir, si dentro de la cadena de conexin se va a especificar el Id del usuario y su contrasea. Cuando le asignamos el valor False a este parmetro de conexin, se debe especificar el Id del usuario y su contrasea. Cuando le asignamos el valor True significa que no vamos a indicar el Id del usuario ni su contrasea. En este caso, SQL Server utiliza los datos nombre de usuario y contrasea que ingresaste al iniciar Windows. El valor SSPI es el valor recomendado para este parmetro porque es similar al valor True e indica que se va a utilizar autenticacin Windows.
El objeto Command
Este objeto es el que representa una determinada sentencia SQL o un Stored Procedure.
Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos conjuntamente con el objeto DataAdapter que es el encargado de ejecutar la instruccin indicada.
El objeto DataAdapter
Este objeto es quizs el objeto ms complejo y a la vez complicado de todos los que forman parte de un proveedor de acceso a datos en .NET.
Cuando deseamos establecer una comunicacin entre una fuente de datos y un DataSet, utilizamos como intermediario a un objeto DataAdapter. A su vez, un DataAdapter contiene 4 objetos que debemos conocer: SelectCommand es el objeto encargado de realizar los trabajos de seleccin de datos con una fuente de datos dada.
En s, es el que se encarga de devolver y rellenar los datos de una fuente de datos a un DataSet.
DeleteCommand es el objeto encardago de realizar las acciones de borrado de datos.
InsertCommand es el objeto encardago de realizar las acciones de insercin de datos.
UpdateCommand es el objeto encardago de realizar las acciones de actualizacin de datos.
Los objetos DeleteCommand, InsertCommand y UpdateCommand son los objetos que se utilizan para manipular y transmitir datos de una fuente de datos determinada, al contrario del objeto SelectCommand que tan slo interacta con la fuente de datos para recuperar una porcin o todos los datos indicados en el objeto Command anteriormente comentado.
El objeto DataReader
Este objeto es el utilizado en una sla direccin de datos. Establece una conexin en un modo de solo lectura. Se trata de un objeto de acceso a datos muy rpido.
Este objeto puede usar a su vez el objeto Command o el mtodo ExecuteReader.
La clase DataSet
Puede que sea la capa ms externa e importante del modelo ADO.NET, pero es la que contiene quizs, el modelo de colecciones y trabajo que ms le puede resultar familiar al programador de Visual Basic 6, sobre todo a los anteriormente comentados RecordSets.
El DataSet contiene en s, un conjunto de datos que han sido volcados desde el proveedor de datos.
De esa forma, podemos trabajar con. De hecho, por marcar una similitud con el RecordSet, el DataSet est preparado para trabajar con fuentes de datos desconectadas.
La clase DataView
Este objeto nos permite crear mltiples vistas de nuestros datos, adems de permitirnos presentar los datos.
Es la clase que nos permite representar los datos de la clase DataTable, permitindonos editar, ordenar y filtrar, buscar y navegar por un conjunto de datos determinado.
La clase DataTable
Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos interactuar con ella.
A la hora de trabajar con este objeto, debemos tener en cuenta el nombre con el cul definamos una determinada tabla, ya que los objetos declarados en el DataTable es sensitivo a maysculas y minsculas.
Lo que s est claro es que el modelo de datos de ADO.NET que hemos visto, quedara resumido en cuanto a la conectividad de la manera en la que se representa en la figura.
Semana 7- 8 Ado Net con Procedimientos Almacenados
Ejercicio Prctico Nro. 1
Lo primero que vamos a hacer es abrir el Visual Studio 2005.
Ahora vamos a crear un Proyecto, para ellos nos vamos a Archivo y luego seleccionamos Nuevo Proyecto
Ahora seleccionamos Visual Basic y seleccionamos Aplicacin para Windows (se le asigna el nombre de Mantenimiento_Clientes)
Ahora crearemos el siguiente diseo.
Ahora importamos el Proveedor de la Base de Datos, en este caso ser el SQL
Ahora crearemos nuestra cadena de conexin
Crearemos un Procedimiento en el SQL cual se encargara de mostrar el Listado de todos los Clientes
Imports System.Data.SqlClient Public Class Form1 Dim cn As New SqlConnection("Server=(local);Integrated Security=yes;Database=BDFactura")
Imports System.Data.SqlClient Public Class Form1
Ahora en el Visual Studio creamos un procedimiento el cual se encargara de mostrar el listado de los clientes
Ahora realizaremos el llamado a nuestro procedimiento para que cuando cargue el formulario me liste los Clientes
A continuacin crearemos un Procedimiento Limpiar, el cual se encargara de Limpiar todas las cajas de texto
Ahora crearemos un Procedimiento almacenado en el SQL el cual me generara el cdigo del cliente, dicho cdigo ser parmetro de salida
Sub Limpiar() 'Creamos una variable de tipo control Dim ctrl As Control 'Recorreremos todos los controles que 'existen dentro de mi GroupBox1 For Each ctrl In Me.GroupBox1.Controls 'Preguntaremos si son TextBox If TypeOf ctrl Is TextBox Then ctrl.Text = "" End If Next End Sub Private Sub Form1_Load() Handles MyBase.Load Listado() End Sub Sub Listado() Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) DataGridView1.DataSource = dt End Sub ----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre,cli_telefono,cli_ruc,cli_direccion from Clientes
Ahora programaremos el Botn Nuevo
Ahora crearemos un procedimiento almacenado en el SQL, el cual me registre al Cliente
----------Grabar_Cliente------------ ------------------------------------ --Creamos Ahora el Procedimiento create procedure Grabar_Cliente @cod varchar(5), @nom varchar(25), @tel int, @ruc varchar(11), @dir varchar(30) as insert into clientes values(@cod,@nom,@tel,@ruc,@dir) Private Sub btnnuevo_Click() Handles btnnuevo.Click Limpiar() Dim cmd As New SqlCommand("Genera_Codigo", cn) cmd.CommandType = CommandType.StoredProcedure
Dim paramResultado As SqlParameter = New SqlParameter("@cod_cli", SqlDbType.Char, 5)
paramResultado.Direction = ParameterDirection.Output cmd.Parameters.Add(paramResultado) cn.Open() cmd.ExecuteReader() cn.Close() lblcod.Text = paramResultado.Value End Sub ----------Genera_Codigo---------------- --Creamos Ahora el Procedimiento Create procedure Genera_Codigo @cod_cli char(5) Output AS Set @cod_cli=(Select Max(Cli_codigo) From Clientes) set @cod_cli=isnull(@cod_cli,'0000') Set @cod_cli='C'+right('0000'+rtrim(right(@cod_cli,4)+1),4) Go --Vamos a comprobar el Procedimiento Declare @codigo char(5) Exec Genera_Codigo @codigo Output print @codigo
Ahora programaremos en el Botn Grabar
Private Sub btngrabar_Click() Handles btngrabar.Click
If (MsgBox("Desea Grabar", 4 + 32, "Mensaje") = 6) Then Dim cod, nom, ruc, dir As String Dim tel As Integer : cod = lblcod.Text : nom = txtnom.Text ruc = txtruc.Text : dir = txtdir.Text : tel = txttel.Text
Dim cmd As New SqlCommand("Grabar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod",SqlDbType.VarChar,5).Value = cod cmd.Parameters.Add("@nom",SqlDbType.VarChar,25).Value = nom cmd.Parameters.Add("@tel",SqlDbType.Int).Value = tel cmd.Parameters.Add("@ruc",SqlDbType.VarChar,11).Value = ruc cmd.Parameters.Add("@dir",SqlDbType.VarChar, 30).Value = dir
Dim rpta As Integer '1 Grabo 0 No Grabo 'Abrimos la conecion cn.Open() : rpta = cmd.ExecuteNonQuery() : cn.Close()
If (rpta = 1) Then MsgBox("Se Grabo Correctamente", 32, "Mensaje") Listado() Else MsgBox("Error al Grabar", 16, "Mensaje") End If
End If End Sub
Ahora pasaremos los datos del DatagridView a las cajas del Textos para realizar las modificaciones
Nota: MsgBox("Desea Grabar", 4 + 32, "Mensaje") 4 Botones Yes o No 32 Icono de Informacion 6 Si le dimos Yes 7 Si le dimos No
Ahora crearemos un procedimiento almacenado en el SQL, el cual se encargara de la actualizacin de los datos del cliente
Ahora programaremos en el botn Modificar
Private Sub btnactualiz_Click() Handles btnactualiz.Click If (MsgBox("Desea Actualizar", 4 + 32, "Mensaje") = 6) Then Dim cod, nom, ruc, dir As String Dim tel As Integer : cod = lblcod.Text:nom = txtnom.Text:ruc = txtruc.Text dir = txtdir.Text :tel = txttel.Text Dim cmd As New SqlCommand("Actualizar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar, 5).Value = cod cmd.Parameters.Add("@nom", SqlDbType.VarChar, 25).Value = nom cmd.Parameters.Add("@tel", SqlDbType.Int).Value = tel cmd.Parameters.Add("@ruc", SqlDbType.VarChar, 11).Value = ruc cmd.Parameters.Add("@dir", SqlDbType.VarChar, 30).Value = dir Dim rpta As Integer cn.Open() rpta = cmd.ExecuteNonQuery() cn.Close() If (rpta = 1) Then MsgBox("Se Actualizo Correctamente", 32, "Mensaje") Listado() Else MsgBox("Error al Actualizar", 16, "Mensaje") End If : End If : End Sub ----------Actualizar_Cliente------- --Creamos Ahora el Procedimiento create procedure Actualizar_Cliente @cod varchar(5),@nom varchar(25), @tel int,@ruc varchar(11), @dir varchar(30) as update clientes set cli_nombre=@nom,cli_telefono=@tel, cli_ruc=@ruc,cli_direccion=@dir where cli_codigo=@cod
Private Sub DataGridView1_CurrentCellChanged() Handles DataGridView1.CurrentCellChanged
Try Dim posi As Integer 'Fila Seleccionada posi = DataGridView1.CurrentCell.RowIndex lblcod.Text = DataGridView1(0, posi).Value txtnom.Text = DataGridView1(1, posi).Value txttel.Text = DataGridView1(2, posi).Value txtruc.Text = DataGridView1(3, posi).Value txtdir.Text = DataGridView1(4, posi).Value Catch ex As Exception End Try End Sub Ahora crearemos un procedimiento almacenado en el SQL, el cual se encargara de eliminar a un cliente
Ahora programaremos en el botn Eliminar
Ahora compilaremos nuestro formulario presionando F5 Private Sub btneliminar_Click() Handles btneliminar.Click If (MsgBox("Desea Eliminar", 4 + 32, "Mensaje") = 6) Then Dim cod As String cod = lblcod.Text Dim cmd As New SqlCommand("Eliminar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar, 5).Value = cod Dim rpta As Integer cn.Open() rpta = cmd.ExecuteNonQuery() cn.Close() If (rpta = 1) Then MsgBox("Se Elimino Correctamente", 32, "Mensaje") Else MsgBox("Error al Elimino", 16, "Mensaje") End If End If End Sub ----------Eliminar_Cliente------ --Creamos Ahora el Procedimiento create procedure Eliminar_Cliente @cod varchar(5) as delete from clientes where cli_codigo=@cod
Ejercicio Prctico Nro. 2
Lo primero que vamos hacer es crear los procedimientos almacenados en el SQL
use northwind go ----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Empleado as select EmployeeID,LastName + ' , '+ FirstName as Nombre_apellido from Employees go ----------Facturas vendidas---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Facturas_Empleado @codven int as select OrderID,convert(char(10),OrderDate,103) Fecha,ShipCountry from Orders where EmployeeID=@codven go ----------Facturas vendidas---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Mostrar_Foto @codven int as select Photo from Employees where EmployeeID=@codven go
Ahora lo que vamos a hacer es abrir el Visual Studio 2005
Ahora vamos a crear un Proyecto, para ellos nos vamos a Archivo y luego seleccionamos Nuevo Proyecto
Ahora seleccionamos Visual Basic y seleccionamos Aplicacin para Windows Se le dara erl nombre de Consultas
Ahora realizaremos el siguiente diseo:
Lo primero que realizaremos es importar estas 2 libreras
A continuacin crearemos nuestra cadena de conexin Imports System.Data.SqlClient Imports System.IO 'MemoryStream
Ahora programaremos para que cuando cargue el formulario me liste los empleados
Crearemos nuestro procedimiento para Mostrar la foto
Ahora programaremos en el ListBox, para que cuando seleccionemos uno de los empleados nos visualice las fotos y las facturas vendidas por dicho empleado Sub Mostrar_imagen(ByVal cod As Integer) Dim cmd As New SqlCommand("Mostrar_Foto", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@codven", SqlDbType.Int).Value = cod
Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt)
Dim imagen() As Byte imagen = dt.Rows(0)(0) Dim ms As New MemoryStream Dim offset As Integer = 78 'estableciendo un desplazamiento de bytes es un buffer '//donde se debe de comenzar la escritura Escribimos los datos en memoria ms.Write(imagen, offset, imagen.Length - offset) Dim bmp As Bitmap bmp = New Bitmap(ms) 'Bitmap bmp = new Bitmap(ms); ms.Close() 'cierra la secuencia de memoria y libera recursos '//Bitmap es un objeto usado para trabajar con imagenes 'definidas por datos en pixel. PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage PictureBox1.Image = bmp End Sub Private Sub Consulta_Load() Handles MyBase.Load Dim da As New SqlDataAdapter("Listado_Empleado", cn) Dim dt As New DataTable da.Fill(dt) ListBox1.DataSource = dt ListBox1.DisplayMember = "Nombre_apellido" ListBox1.ValueMember = "EmployeeID" 'StretchImage ajusta la imagen al tamao del PictureBox1 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage End Sub Imports System.Data.SqlClient Imports System.IO 'MemoryStream Public Class Consulta Dim cn As New SqlConnection("Server=(local);Integrated Security=yes;database=northwind")
Presionamos finalmente F5
Ejercicio Prctico Nro. 3
Lo primero que vamos hacer es crear los procedimientos almacenados en el SQL use BDfactura go ----Facturas Realizadas create procedure Lista_Facturas as select fac_numero, convert(char(10),fac_fecha,103) Fecha Private Sub ListBox1_SelectedIndexChanged() Handles ListBox1.SelectedIndexChanged
Try Dim cod As Integer = CInt(ListBox1.SelectedValue) Dim cmd As New SqlCommand("Facturas_Empleado", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@codven", SqlDbType.Int).Value = cod
Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) DataGridView1.DataSource = dt Mostrar_imagen(cod) Catch ex As Exception End Try End Sub from fac_cabe go
--Detalle de las Facturas Seleccionadas set quoted_identifier off go
create procedure Lista_Detalle @fac varchar(255) as exec("select fac_numero,a.art_codigo,art_nombre,art_precio,art_cantidad, (art_precio*art_cantidad) Total from articulos as a,fac_deta fd where a.art_codigo=fd.art_codigo and fac_numero in ("+@fac+")") go --probamos el procedimiento
Lista_Detalle "'F0001','F0002','F0003'"
Ahora lo que vamos a hacer es abrir el Visual Studio 2005
Ahora vamos a crear un Proyecto, para ellos nos vamos a Archivo y luego seleccionamos Nuevo Proyecto
Ahora seleccionamos
Ahora crearemos el siguiente diseo
Ahora en el primer DataGridView1 nos vamos a la esquina de la parte superior y nos debe quedar de la siguiente manera
Ahora seleccionamos la opcin Editar columnas
A continuacin vamos agregar las columnas, para ello seleccionamos
Ahora vamos agregar una columna con CheckBox y le damos agregar
Ahora vamos agregar una columna el cual nos va a mostrar el cdigo de la Factura
Y en sus propiedades, colocamos fac_numero porque es el campo que queremos visualizar
Ahora agregaremos otro para la fecha de la columna
Al final nos quedara de la siguiente manera
Ahora lo primero que realizaremos es importar nuestra librera para poder conectarnos al SQL
A continuacin crearemos nuestra cadena de conexin
A continuacin programaremos para que cuando cargue el formulario me llene el 1er DatagridView con todas las facturas realizadas
Ahora programaremos en el botn
Private Sub DatagridViewCheckBox_Load() Handles MyBase.Load Dim da As New SqlDataAdapter("Lista_Facturas", cn) Dim dt As New DataTable da.Fill(dt) DataGridView1.DataSource = dt End Sub Dim cn As New SqlConnection("Server=(local);Integrated Security=yes;database=BDfactura") Imports System.Data.SqlClient
Finalmente presionamos F5
Ejercicios Propuestos
1. Realizar el siguiente formulario bajo las siguientes condiciones: Cuando se d clic en cualquier RadioButton realizara la bsqueda por las letras comprendidas entre ellas, la caja de texto podr ser la bsqueda pero solo de los rangos de la letra que han sido seleccionado, mostramos los clientes seleccionados en un Listview, Private Sub btnMostrar_Click() Handles btnMostrar.Click Dim codigos As String = "" For a As Integer = 0 To DataGridView1.Rows.Count - 1 'Ahora preguntamos si se le dio Checked If (DataGridView1(0, a).Value = True) Then 'Trim extrae espacios en Blanco codigos += "'" & Trim(DataGridView1(1, a).Value) & "'," End If Next 'por Ejm si seleccionamos 'F0001','F0002','F0003', If (codigos.Length >= 1) Then 'Si seleccionamos algo 'Para eliminar la ultima coma Dim tamao As Integer tamao = codigos.Length - 1 Dim codfinal As String = Mid(codigos, 1, tamao) Dim cmd As New SqlCommand("Lista_Detalle", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fac", SqlDbType.VarChar).Value = codfinal Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) DataGridView2.DataSource = dt End If seleccionamos un cliente y nos mostrara las facturas realizadas por ese cliente.
2. En un Listview nos mostrara todos los proveedores, cuando seleccionamos uno o ms proveedores con el botn Mostrar nos listara todos los productos que tienen los proveedores seleccionados
3. Mostrar en un ListBox las regiones, cuando seleccionamos una regin nos mostrara los territorios de dicha regin, cuando seleccionamos la regin nos mostrara los empleados que viven en dicha regin, seleccionamos un empleado y nos mostrara las ventas realizadas por dicho empleado.
4. Mostrar un listado de categoras, cuando seleccionamos la categora nos visualizara la foto respectiva, y a la vez nos mostrara los productos que se encuentran en dicha categora. Tambin nos permitir hacer un filtrado de las facturas que son mayores al monto ingresado.
Ejercicios Propuestos
Har uso de la base de datos Northwind
Aplicacin 1:
Desarrollara esta aplicacin bajo las siguientes consideraciones:
1. Cuando cargue el formulario, se deber demostrar en un Listbox1 2 campos el cdigo y los nombres de los empleados, tanto el primero como el ltimo nombre del empleado. 2. Al seleccionar un Item del listbox1, se deber mostrar en un dataGridView1 las 5 rdenes ms caras pares, que se hayan emitido en los meses impares del empleado seleccionado. Mostrando en los resultados el total por orden emitida. 3. Y por ltimo se deber demostrar la suma de toda la columna Total del dataGridView1, en un label.
APLICACIN 2:
Desarrollar esta aplicacin bajos las siguientes condiciones:
1. Cuando cargue el formulario, se deber demostrar en un comboBox1, todos los pases de la tabla Customers. 2. Cuando seleccione un pas del ComboBox1, se deber demostrar en el dataGridView1, todas las ciudades del pas seleccionado, y a la vez la cantidad de cdigos postales que tiene dicha ciudad. 3. Cuando seleccione una ciudad del dataGridView1, se deber demostrar en el dataGridView2 todos los clientes que pertenece a esa ciudad. Muestre solo 4 campos. 4. Y por ltimo se deber de visualizar en un label, la cantidad de clientes que existen por pas.
Aplicacin 3:
Realice una bsqueda de clientes mediante cadenas en una caja de texto, el resultado los mostrara en un control DataGridView1, el campo Tipo Cliente ser Cliente VIP cuando el cliente tenga ms de 10 Ordenes compradas, si no ser un tipo de cliente Normal. Al seleccionar un cliente en el DataGridview1 mostrara las ordenes vendidas en un Listbox, mostrando los campos concatenados.
Semana 11 Clases y creacin de libreras
Ejercicio Prctico Nro. 1
Lo primero que vamos a hacer es abrir el Visual Studio 2005. Ahora vamos a crear un Proyecto, para ellos nos vamos a Archivo y luego seleccionamos Nuevo Proyecto
Este ser el modelo a desarrollar
Lo primero que vamos a realizar es crear nuestros procedimientos almacenados en el SQL
Nuestro primer procedimiento almacenado me listara el cdigo y nombre del cliente pero solo de los clientes que tengan facturas
Ahora crearemos un procedimiento almacenado el cual me listara las facturas del cliente dependiendo del cdigo del cliente ----------Facturas_Cliente----------------
--Creamos Ahora el Procedimiento create Procedure Facturas_Cliente @cod varchar(5) as select fac_numero from fac_cabe where cli_codigo=@cod go Por ltimo crearemos un procedimiento el cual nos mostrara el detalle de la factura dependiendo de la factura ingresada
----------Detalle de la Factura-----------
--Creamos Ahora el Procedimiento create procedure Detalle_Factura @fac varchar(5) as select fac_numero,a.art_codigo,art_nombre,art_precio,art_cantidad, (art_precio* art_cantidad) as Total from Articulos as a, Fac_deta as fd where a.art_codigo = fd.art_codigo and fd.fac_numero=@fac go
Ahora crearemos nuestro diseo en el Visual Studio Net el siguiente diseo ----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre from clientes where cli_codigo in(select distinct cli_codigo from ac_cabe) go
Una vez creado el diseo del formulario, ahora vamos agregar una clase a nuestro proyecto, para ello seleccionamos el Proyecto y luego Clic Agregar y finalmente seleccionamos Clase
Ahora a nuestra clase lo llamaremos clsconexion
En esta clase crearemos una funcin el cual me devuelva mi cadena de conexin, y as poder usarla en todas las dems clases
Ahora crearemos otra clase el cual llamaremos a todos nuestros procedimientos almacenados, adems llamaremos a nuestra clase clsconexion ya que en ella est mi conexin
Y ahora programaremos lo siguiente
Imports System.Data.SqlClient
Public Class clsfunciones Dim clase As New clsconexion 'clase.cn llamo a mi cadena de conexion Dim cn As New SqlConnection(clase.cn)
'Esta funcion me Listara a los clientes q tengan Facturas Function Lista_Cliente() As DataTable Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) Imports System.Data.SqlClient Public Class clsconexion Function cn() As String Dim cadena As String cadena = "Server=(local);Integrated Security=SSPI;" cadena += "Database=bdfactura" Return cadena End Function End Class Return dt End Function
'Esta funcion nos mostrara la facturas del cliente Function Facturas_Clientes(ByVal cod As String) As DataTable Dim cmd As New SqlCommand("Facturas_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = cod Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Return dt End Function
'Esta funcion nos mostrara el detalle de la facturas Function Detalle_Factura(ByVal fac As String) As DataTable Dim cmd As New SqlCommand("Detalle_Factura", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fac", SqlDbType.VarChar).Value = fac Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Return dt End Function End Class
Ahora en el formulario vamos a importar
Ahora llamaremos a nuestra clase clsfunciones
Ahora programaremos para que cuando cargue el formulario me liste los clientes.
Private Sub Form1_Load() Handles MyBase.Load Dim dtcliente As New DataTable dtcliente = funcion.Lista_Cliente 'creamos un TreeNode principal el cual 'tendra el listado de Clientes Dim padre As New TreeNode Imports System.Data.SqlClient Public Class Form1 Dim funcion As New clsfunciones Imports System.Data.SqlClient Tvclientes.Nodes.Clear() For a As Integer = 0 To dtcliente.Rows.Count - 1 padre = New TreeNode(dtcliente.Rows(a)(1)) Tvclientes.Nodes.Add(padre) 'Facturas de cada Cliente Dim dt As New DataTable : 'dr(0) tiene el codigo del Cliente dt = funcion.Facturas_Clientes(dtcliente.Rows(a)(0)) For b As Integer = 0 To dt.Rows.Count - 1 'Agregamos las subnodos del padre padre.Nodes.Add(dt.Rows(b)(0).ToString) Next Next End Sub
Ahora programaremos en el Tvclientes
Finalmente presionamos F5 y nos debe quedar de la siguiente manera Private Sub Tvclientes_AfterSelect() Handles Tvclientes.AfterSelect Try If (Tvclientes.SelectedNode.Level = 0) Then 'si seleccionamos el Cliente limpiamos 'el dgfacturas dgfacturas.DataSource = DBNull.Value End If
'Si seleccionamos la Factura If (Tvclientes.SelectedNode.Level = 1) Then 'Capturamos el nro de la Factura seleccionada Dim fac As String = Tvclientes.SelectedNode.Text Dim dt As New DataTable dt = funcion.Detalle_Factura(fac) dgfacturas.DataSource = dt lblsuma.Text = dt.Compute("sum(Total)", "") End If Catch ex As Exception End Try End Sub
Ejercicio Prctico Nro. 2
Lo primero que vamos a hacer es abrir el Visual Studio y crear una aplicacion de Windows
Este ser el modelo a desarrollar
Lo primero que vamos a realizar es crear nuestros procedimientos almacenados en el SQL
Nuestro primer procedimiento almacenado nos listara el cdigo y nombre del cliente pero solo de los clientes que tengan facturas.
--Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre from clientes where cli_codigo in(select distinct cli_codigo from fac_cabe) go
Ahora crearemos un procedimiento almacenado el cual me listara todas las facturas de todos los clientes, esto depender de los cdigos que le mandemos como parmetros.
----------Facturas_Varios_Cliente---------------- ----------------------------------------- --Habilita el uso de las comillas set quoted_identifier off --Creamos Ahora el Procedimiento create Procedure Facturas_Varios_Cliente @codigos varchar(255) as exec("select fac_numero,c.cli_codigo,cli_nombre "+ "from fac_cabe as fc,clientes as c "+ "where fc.cli_codigo=c.cli_codigo and "+ "c.cli_codigo in(" +@codigos +") "+ "order by c.cli_codigo asc") Go
Ahora vamos a probar como funciona nuestro procedimiento almacenado, como nos daremos cuenta los cdigos estn dentro de las comillas
Ahora crearemos nuestro diseo en el Visual Studio Net el siguiente diseo
Una vez creado el diseo del formulario, ahora vamos agregar una clase a nuestro proyecto, para ello seleccionamos el Proyecto y luego Clic Agregar y finalmente seleccionamos Clase
Ahora a nuestra clase lo llamaremos clsconexion
En esta clase crearemos una funcin el cual me devuelva mi cadena de conexin, y as poder usarla en todas las dems clases.
Imports System.Data.SqlClient
Public Class clsconexion Function cn() As String Dim cadena As String cadena = "Server=(local);Integrated Security=SSPI;" cadena += "Database=bdfactura" Return cadena End Function End Class
Ahora crearemos otra clase el cual llamaremos a todos nuestros procedimientos almacenados, adems llamaremos a nuestra clase clsconexion ya que en ella est mi conexin
Imports System.Data.SqlClient
Public Class clsfunciones Dim clase As New clsconexion Dim cn As New SqlConnection(clase.cn) 'Esta funcion me Listara a los clientes q tengan Facturas Function Lista_Cliente() As DataTable Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) Return dt End Function
'Esta funcion nos mostrara las facturas de los cliente Function Facturas_varios_Clientes(ByVal cod As String) As DataTable Dim cmd As New SqlCommand("Facturas_Varios_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@codigos", SqlDbType.VarChar).Value = cod Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Return dt End Function End Class
Ahora volvemos al diseo de nuestro formulario, para ello vamos a importar
Ahora llamaremos a nuestra clase clsfunciones
Ahora programaremos para que cuando cargue el formulario me liste los clientes
Ahora vamos a programar en el botn para que nos muestre las facturas de los clientes seleccionado
Private Sub Form2_Load() Handles MyBase.Load Dim dt As New DataTable formato() Dim lstitem As ListViewItem dt = clase.Lista_Cliente For a As Integer = 0 To dt.Rows.Count - 1 lstitem = ListView1.Items.Add(dt.Rows(a)(0)) lstitem.SubItems.Add(dt.Rows(a)(1)) Next End Sub 'Procedimiento que le da formato al ListView1 Sub formato() With ListView1 .CheckBoxes = True 'Mostramos CheckBoxes en el ListView1 .View = View.Details 'Vista Detalle .GridLines = True 'Lineas de separacion filas y columnas .Columns.Add("Codigo del Cliente", 120, HorizontalAlignment.Center) .Columns.Add("Nombre del Cliente", 300, HorizontalAlignment.Left) End With End Sub Imports System.Data.SqlClient Public Class Form1 Dim clase As New clsfunciones Imports System.Data.SqlClient
A continuacin presionamos F5
Private Sub BtnBuscar_Click() Handles BtnBuscar.Click Dim cod, codigo As String Dim tamao As Integer cod = "" Try For a As Integer = 0 To ListView1.Items.Count - 1 If (ListView1.CheckedItems(a).Checked = True) Then cod = cod & "'" & ListView1.CheckedItems(a).Text & "'," End If Next Catch ex As Exception End Try tamao = cod.Length 'Tamao de la cadena 'Le quitamos uno por la coma que sobra codigo = Mid(cod, 1, tamao - 1)
Dim dt As New DataTable dt = clase.Facturas_varios_Clientes(codigo) DataGridView1.DataSource = dt 'A la columna 2 le damos un ancho de 200 DataGridView1.Columns(2).Width = 200 End Sub Ejercicio Prctico Nro. 3
Lo primero que vamos a realizar es crear nuestros procedimientos almacenados que vamos a utilizar.
use BDfactura --LISTADO de las Facturas create procedure Lista_Facturas as select fac_numero, convert(char(10),fac_fecha,103) Fecha from fac_cabe go
--Detalle de las Facturas Seleccionadas create procedure Lista_Detalle @fac varchar(255) as select fac_numero,a.art_codigo,art_nombre,art_precio,art_cantidad, (art_precio*art_cantidad) Total from articulos as a,fac_deta fd where a.art_codigo=fd.art_codigo and fac_numero=@fac go
Ahora a continuacin vamos a abrir el Visual Studio 2005, Ahora vamos a crear un Proyecto, para ellos nos vamos a Archivo y luego seleccionamos Nuevo Proyecto CON EL NOMBRE DE
Ahora crearemos el siguiente diseo
Ahora nos vamos al primer DatagridView y en la parte superior, en la esquina y le damos editar columnas
Ahora vamos agregar un LinkColumn y en sus propiedades ponemos
Ahora agregamos un campo para la fecha
Al final nos debe quedar de la siguiente manera
Una vez creado el diseo del formulario, ahora vamos agregar una clase a nuestro proyecto.
Ahora a nuestra clase lo llamaremos clsconexion
En esta clase crearemos una funcin el cual me devuelva mi cadena de conexin, y as poder usarla en todas las dems clases
Ahora crearemos otra clase el cual llamaremos clsfunciones, ah estarn todos nuestros procedimientos almacenados, adems llamaremos a nuestra clase clsconexion. Imports System.Data.SqlClient Public Class clsconexion Function cn() As String Dim cadena As String cadena = "Server=(local);Integrated Security=SSPI;" cadena += "Database=bdfactura" Return cadena End Function End Class
Ahora en el formulario vamos a llamar a nuestra clase
Ahora programaremos para que cuando cargue el formulario me liste las facturas
Ahora programaremos en el datagridView1 Private Sub Link_datagridview_Load() Handles MyBase.Load Dim dt As New DataTable dt = funciones.Listado_facturas DataGridView1.DataSource = dt End Sub Public Class Link_datagridview Dim funciones As New clsfunciones Imports System.Data.SqlClient Public Class clsfunciones Dim clase As New clsconexion Dim cn As New SqlConnection(clase.cn) Function Listado_facturas() As DataTable Dim da As New SqlDataAdapter("Lista_Facturas", cn) Dim dt As New DataTable da.Fill(dt) Return dt End Function
Function Detalle_Facturas(ByVal fac As String) As DataTable Dim cmd As New SqlCommand("Lista_Detalle", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fac", SqlDbType.VarChar).Value = fac
Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Return dt End Function End Class
Finalmente presionamos F5
Ejercicio Prctico Nro. 4
Almacenamiento de imgenes mediante carpeta.
Paso 1: Creacin de Procedimientos Almacenados en una base de datos de su eleccin.
Private Sub DataGridView1_CellContentClick() Handles DataGridView1.CellContentClick 'Pregunto si seleccionamos la 1ra columna If (e.ColumnIndex = 0) Then Dim p As Integer p = DataGridView1.CurrentCell.RowIndex Dim fac As String = DataGridView1(0, p).Value
Dim dt As New DataTable dt = funciones.Detalle_Facturas(fac) DataGridView2.DataSource = dt End If End Sub Create procedure usp_EmpleadosImagen As Select * from Empleadosimagen Go
Create procedure usp_busEmpleadosimagen @Emp_cod char(5) As Select * from EmpleadosImagen Where Emp_cod=@Emp_cod Go
Create procedure usp_generacodigoEmpleado @Emp_cod varchar(5) Output As Set @Emp_cod=(select max(Emp_cod) from EmpleadosImagen) Set @Emp_cod='E'+Right('0000'+ltrim(right(isnull(@Emp_cod,'00000'),4)+1),4) Go
Create procedure usp_insertarEmpleadoimagen @Emp_cod char(5),@Emp_nom varchar(100) As Insert Into EmpleadosImagen values(@Emp_cod,@Emp_nom) Go
Paso 2: Creacin de Proyectos
Paso 3: Crear una carpeta en la unidad C para este ejemplo y guardar las imgenes ah. Unidad C:\imagenes
Paso 4: Cdigo fuente en el proyecto Librera de Clase LibreriadeNegocio
Clase ClsFunciones.vb Imports System.Data
Imports System.Data.SqlClient
Public Class Clsfunciones Public cn As New SqlConnection("Server=(local);Integrated Security=SSPI;Database=Neptuno") Public Function MostrarEmpleados() As DataTable Dim da As New SqlDataAdapter("usp_EmpleadosImagen", cn) Dim tbl As New DataTable da.Fill(tbl) Return tbl End Function
Public Function BusquedaEmpleado(ByVal emp_cod As String) As DataTable Dim cmd As New SqlCommand("usp_busEmpleadosimagen", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@Emp_cod", SqlDbType.VarChar, 5).Value = emp_cod cn.Open() Dim tbl As New DataTable tbl.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection)) Return tbl End Function
Public Function MostrarCodigoGenerado() As String Dim cmd As New SqlCommand("usp_generacodigoEmpleado", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@Emp_cod", SqlDbType.VarChar, 5).Direction = ParameterDirection.Output cn.Open() cmd.ExecuteNonQuery() cn.Close() Return cmd.Parameters("@Emp_cod").Value End Function
Public Function GrabarEmpleado(ByVal emp_cod As String, ByVal emp_nom As String) As Integer Dim cmd As New SqlCommand("usp_insertarEmpleadoimagen", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@Emp_cod", SqlDbType.VarChar, 5).Value = emp_cod cmd.Parameters.Add("@Emp_nom", SqlDbType.VarChar, 100).Value = emp_nom cn.Open() Dim nresp As Integer = cmd.ExecuteNonQuery() cn.Close() Return nresp End Function End Class
Paso 5: Creacion de la interfaz de la aplicacin, sin olvidar referenciar el proyecto librera de clase al proyecto Aplicacin Windows.
Codigo Fuente:
Imports System.data
Public Class Form1 Dim obj As New LibreriadeNegocio.Clsfunciones Dim rutafolderimagen As String = "" Dim tblempl As DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load lblcodigo.Text = obj.MostrarCodigoGenerado MostrarImagen() End Sub
Sub MostrarImagen() DataGridView1.Columns.Clear() tblempl = obj.MostrarEmpleados DataGridView1.DataSource = tblempl Dim colimag As New DataGridViewImageColumn colimag.ImageLayout = DataGridViewImageCellLayout.Normal DataGridView1.Columns.Add(colimag) DataGridView1.Columns(2).HeaderText = "Foto" For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Item(2, i).Value = Image.FromFile("c:\imagenes\" + tblempl.Rows(i)(0) + ".jpg") Next DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells) End Sub
Private Sub CmdNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdNuevo.Click lblcodigo.Text = obj.MostrarCodigoGenerado txtnombres.Clear() PictureBox1.Image = Nothing End Sub
Private Sub CmdBuscarImagen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdBuscarImagen.Click Dim fileimagen As New OpenFileDialog fileimagen.Filter = "Archivo imagen(*.bmp,*.jpg,*.gif)|*.jpg" fileimagen.ShowDialog() If String.IsNullOrEmpty(fileimagen.FileName) Then MessageBox.Show("Seleccione una imagen", "Busqueda de Imagen") Exit Sub End If rutafolderimagen = "c:\imagenes\" Dim nombreimagen As String = fileimagen.FileName.Substring(fileimagen.FileName.LastIndexOf("\") + 1) PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage PictureBox1.Image = Image.FromFile(nombreimagen) End Sub
Private Sub CmdGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdGrabar.Click Try If String.IsNullOrEmpty(txtnombres.Text) Then MessageBox.Show("Ingrese un nombre del Empleado", "Empleado") Exit Sub End If If PictureBox1.Image Is Nothing Then MessageBox.Show("Seleccione una imagen", "Imagen") Exit Sub End If Dim nresp As Integer = obj.GrabarEmpleado(lblcodigo.Text, txtnombres.Text) If nresp = 1 Then MessageBox.Show("El empleado ha sido registrado", "Registro") End If MostrarImagen() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
Private Sub CmdBusqueda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdBusqueda.Click Dim codigo As String = InputBox("Ingrese un codigo", "Busqueda de Empleados", "E0001") If String.IsNullOrEmpty(codigo) Then MessageBox.Show("Ingrese un codigo de Empleado", "Busqueda de Empleado") Exit Sub End If Dim tbl As DataTable = obj.BusquedaEmpleado(codigo) lblcodigo.Text = tbl.Rows(0)(0).ToString txtnombres.Text = tbl.Rows(0)(1).ToString Dim mostrarimagen As String = "" If rutafolderimagen = "" Then mostrarimagen = "c:\imagenes\" + tbl.Rows(0)(0).ToString + ".jpg" Else mostrarimagen = rutafolderimagen + tbl.Rows(0)(0).ToString + ".jpg" End If PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage PictureBox1.Image = Image.FromFile(mostrarimagen) End Sub
Private Sub CmdCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdCerrar.Click If MessageBox.Show("Desea Salir", "Imagenes", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = 6 Then Exit Sub End If End Sub End Class
Ejercicios Propuestos
Desarrollar la siguiente aplicacin con estas consideraciones:
Ejercicio 1: Cuando cargue el formulario, se deber de mostrar en un listos 2 campos el cdigo y los nombres de los empleados. Al seleccionar un tem del listbox debe mostrar en el datagridview las 5 ordenes ms caras pares, que se han emitido en los meses impares del empleado seleccionado mostrando el total por orden emitida.
Tambin debe mostrar la suma de toda la columna total del datagridview en un label.
Ejercicio 2:
Cuando se cargue el formulario, se debe mostrar en un combobox, todos los pases de la tabla customers.
Cuando seleccione el pas mostrara en un datagridview todas las ciudades del pas as como la cantidad de cdigos postales de dicha ciudad. Cuando seleccione la ciudad del datagridview debe mostrar en otro datagridview todos los clientes que pertenecen a esa ciudad. (trabajar solo con 4 campos ).
Ejercicio 3.
Realizar una bsqueda de clientes por una o ms letras coincidentes. El cual mostrara como resultado todos los clientes con su cantidad de rdenes emitidas, al seleccionar una orden, deber mostrar la cantidad de rdenes en un listbox.
Semana 12 LIBRERA DE CLASES CON BD
Primero vamos a crear los procedimientos almacenados que vamos a utilizar en el sql. use bdfactura go ----------Listado_Cliente---------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre from Clientes go ----------Facturas_Cliente---------------- --Creamos Ahora el Procedimiento create Procedure Facturas_Cliente @cod varchar(5) as select fac_numero from fac_cabe where cli_codigo=@cod go ----------Detalle de la Factura----------- --Creamos Ahora el Procedimiento create procedure Detalle_Factura @fac varchar(5) as select fac_numero,a.art_codigo,art_nombre,art_precio,art_cantidad, (art_precio* art_cantidad) as Total from Articulos as a, Fac_deta as fd where a.art_codigo = fd.art_codigo and fd.fac_numero=@fac go
Lo primero que vamos a hacer es abrir el Visual Studio 2005,Ahora crearemos una solucin en blanco el cual contendr 2 proyectos
Ahora crearemos una librera de clases, para ello agregaremos a la solucin un proyecto de librera de clases
Y ahora seleccionaremos
Ahora a nuestra clase le llamaremos clsclase
Ahora programaremos lo siguiente.
Imports System.Data.SqlClient
Public Class clsclase Dim cn As New SqlConnection("Server=(local);Integrated Security=SSPI;Database=bdfactura")
'Esta funcion me Listara a los clientes en el Combo Function Lista_Cliente() As SqlDataReader Dim dr As SqlDataReader : Dim cmd As New SqlCommand("Listado_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cn.Open() : dr = cmd.ExecuteReader : Return dr End Function
'Esta funcion nos mostrara la facturas del cliente Function Facturas_Clientes(ByVal cod As String) As DataTable 'Si la conexion esta Abierta La cerramos If (cn.State = ConnectionState.Open) Then cn.Close() End If Dim cmd As New SqlCommand("Facturas_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = cod Dim da As New SqlDataAdapter(cmd) : Dim dt As New DataTable da.Fill(dt) : Return dt End Function
'Esta funcion nos mostrara el detalle de la facturas Function Detalle_Factura(ByVal fac As String) As DataTable 'Si la conexion esta Abierta La cerramos If (cn.State = ConnectionState.Open) Then cn.Close() End If Dim cmd As New SqlCommand("Detalle_Factura", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fac", SqlDbType.VarChar).Value = fac Dim da As New SqlDataAdapter(cmd) : Dim dt As New DataTable : da.Fill(dt) Return dt End Function End Class
Una vez terminado de crear todas las funciones vamos a generar la DLL
Si nos damos cuenta, nuestro proyecto ha generado una DLL,
A continuacin vamos agregar un Proyecto Windows en nuestra solucin
Al cual le llamaremos Mi_Proyecto
A continuacin agregaremos a nuestro proyecto la DLL que hemos creado, para ello vamos agregar una referencia
Ahora buscamos nuestra DLL y le damos OK
Ahora importamos a nuestro Proyecto
Ahora instanciaremos el nombre de nuestra librera
Ahora programaremos para que cuando cargue mi formulario me liste los clientes Private Sub Form1_Load() Handles MyBase.Load Dim dr As SqlDataReader dr = milibreria.Lista_Cliente While (dr.Read) Cbocliente.Items.Add(dr(0) & " " & dr(1)) End While Imports System.Data Public Class Form1 Dim milibreria As New Libreria_Clases.clsclase
Imports System.Data Public Class Form1 Cbocliente.SelectedIndex = 0 End Sub Ahora programaremos en el combo Private Sub Cbocliente_SelectedIndexChanged() Handles Cbocliente.SelectedIndexChanged
Try Dim cod As String 'Extraemos los 5 Primeros caracteres cod = Mid(Cbocliente.Text, 1, 5) 'Ahora LLenaremos las Facturas del Cliente Dim dt As New DataTable dt = milibreria.Facturas_Clientes(cod) With Lstcliente .DataSource = dt .ValueMember = "fac_numero" .DisplayMember = "fac_numero" .SelectedIndex = 0 End With 'Llamamos al Evento de Lstcliente_SelectedIndexChanged Lstcliente_SelectedIndexChanged(sender, e) Catch ex As Exception End Try End Sub
Y Finalmente programaremos en el Listbox
Private Sub Lstcliente_SelectedIndexChanged() Handles Lstcliente.SelectedIndexChanged.
Try 'Capturamos el Valor del ListBox(Lstcliente) Dim fac As String = Lstcliente.SelectedValue Dim dt As New DataTable dt = milibreria.Detalle_Factura(fac) dgfacturas.DataSource = dt Catch ex As Exception End Try End Sub
Finalmente presionamos F5 y nos debe salir de la siguiente manera:
Ejercicio Propuesto
Usando la base de datos Ventas
Proyecto Aplicacin Windows
Utilizando la base de datos ventas, creara una aplicacin que permita realizar un clculo de hora trabajadas de los empleados. Tablas : Empleado, Empl_hor y das.
En el clculo de horas usted considerara los minutos trabajados tambin. Por ejemplo: Si el empleado Pedro trabajo los siguientes das: Lunes: 8:10 AM 15:30 PM -- Hora trabajadas: 7 horas y 20 minutos. Martes: 8:20 AM 15:30 PM Horas trabajadas: 7 horas y 10 minutos. Total de horas trabajadas: 14 horas 30 minutos. Formulario Propuesto:
Nota: Para este ejemplo de la base de datos ventas, los empleados no tienen minutos de tardanza y de salida. Pero usted considerara en su programacin los minutos trabajados. (Dado que en eso se basara la revisin del trabajo, modifique la tabla empl_hor, agregando minutos de trabajos para ver el resultado).
Semana 13 y 14 Aplicaciones con 3 Capas
Ejercicio Prctico Nro. 1
Lo primero que vamos a realizar es crear los procedimientos almacenados en SQL. use BDFACTURA go
----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre,cli_telefono,cli_ruc,cli_direccion from Clientes go
----------Genera_Codigo---------------- ----------------------------------------- --Creamos Ahora el Procedimiento Create procedure Genera_Codigo @cod_cli char(5) Output AS Set @cod_cli=(Select Max(Cli_codigo) From Clientes) set @cod_cli=isnull(@cod_cli,'0000') Set @cod_cli='C'+right('0000'+rtrim(right(@cod_cli,4)+1),4) Go --Vamos a comprobar el Procedimiento Declare @codigo char(5) Exec Genera_Codigo @codigo Output print @codigo go
----------Grabar_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create procedure Grabar_Cliente @cod varchar(5), @nom varchar(25), @tel int, @ruc varchar(11), @dir varchar(30) as insert into clientes values(@cod,@nom,@tel,@ruc,@dir) go ----------Actualizar_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create procedure Actualizar_Cliente @cod varchar(5), @nom varchar(25), @tel int, @ruc varchar(11), @dir varchar(30) as update clientes set cli_nombre=@nom,cli_telefono=@tel, cli_ruc=@ruc,cli_direccion=@dir where cli_codigo=@cod go ----------Eliminar_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create procedure Eliminar_Cliente @cod varchar(5) as delete from clientes where cli_codigo=@cod go
Ahora vamos a crear una solucin en blanco a la cual la llamaremos Solucion 1
Ahora le agregamos una biblioteca de clases le llamaremos Capa De Datos
Por defecto este proyecto nos crea una clase, nosotros le cambiaremos de nombre y lo llamaremos capa de datos
Ahora programaremos lo siguiente.
Imports System.Data.SqlClient
Public Class Capa_Datos Dim cn As New SqlConnection("Server=(local);Integrated Security=yes; Database=bdfactura")
Function D_Listado_Clientes() As DataTable Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) Return dt End Function
Function D_Grabar_Cliente(ByVal cod As String, ByVal nom As String, ByVal tel As Integer, ByVal ruc As String, ByVal dir As String) As Integer Dim cmd As New SqlCommand("Grabar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = cod cmd.Parameters.Add("@nom", SqlDbType.VarChar).Value = nom cmd.Parameters.Add("@tel", SqlDbType.Int).Value = tel cmd.Parameters.Add("@ruc", SqlDbType.VarChar).Value = ruc cmd.Parameters.Add("@dir", SqlDbType.VarChar).Value = dir cn.Open() Dim p As Integer = 0 p = cmd.ExecuteNonQuery Return p End Function
Function D_Actualizar_Cliente(ByVal cod As String, ByVal nom As String, ByVal tel As Integer, ByVal ruc As String, ByVal dir As String) As Integer Dim cmd As New SqlCommand("Actualizar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = cod cmd.Parameters.Add("@nom", SqlDbType.VarChar).Value = nom cmd.Parameters.Add("@tel", SqlDbType.Int).Value = tel cmd.Parameters.Add("@ruc", SqlDbType.VarChar).Value = ruc cmd.Parameters.Add("@dir", SqlDbType.VarChar).Value = dir cn.Open() Dim p As Integer = 0 p = cmd.ExecuteNonQuery Return p End Function
Function D_Eliminar_Cliente(ByVal cod As String) As Integer Dim cmd As New SqlCommand("Eliminar_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = cod cn.Open() Dim p As Integer = 0 p = cmd.ExecuteNonQuery Return p End Function
Function D_Genera_Codigo() As String Dim cmd As New SqlCommand("Genera_Codigo", cn) cmd.CommandType = CommandType.StoredProcedure Dim paramResultado As SqlParameter = New SqlParameter("@cod_cli", SqlDbType.Char, 5) paramResultado.Direction = ParameterDirection.Output cmd.Parameters.Add(paramResultado) cn.Open() cmd.ExecuteReader() cn.Close() Return paramResultado.Value End Function End Class
Ahora vamos a generar el proyecto
Ahora a la solucin que creamos anteriormente, ahora agregaremos otro proyecto
Ahora a este proyecto le llamaremos Capa de Negocio
Al final debe quedar de la siguiente manera
Ahora al proyecto capa de negocio hay que agregar una referencia, para ello seleccionamos Capa_Negocio y le damos clic derecho
Ahora seleccionamos la DLL generada en la capa de datos
Ahora en la capa de negocio programaremos lo siguiente.
Imports System.Data.SqlClient
Public Class Capa_Negocio 'Ahora referenciamos a la capa de datos Dim objdatos As New Capa_Datos.Capa_Datos
Function N_Listado_Clientes() As DataTable Return objdatos.D_Listado_Clientes() End Function
Function N_Grabar_Cliente(ByVal cod As String, ByVal nom As String, ByVal tel As Integer, ByVal ruc As String, ByVal dir As String) As Integer Return objdatos.D_Grabar_Cliente(cod, nom, tel, ruc, dir) End Function
Function N_Actualizar_Cliente(ByVal cod As String, ByVal nom As String, ByVal tel As Integer, ByVal ruc As String, ByVal dir As String) As Integer Return objdatos.D_Actualizar_Cliente(cod, nom, tel, ruc, dir) : End Function
Function N_Eliminar_Cliente(ByVal cod As String) As Integer Return objdatos.D_Eliminar_Cliente(cod) End Function
Function N_Genera_Codigo() As String Return objdatos.D_Genera_Codigo() End Function End Class
Ahora a la solucin agregaremos un proyecto y lo llamaremos Capa de Presentacin.
Ahora en la capa de presentacin agregaremos la referencia
Seleccionamos
Ahora tenemos que configurar para que se ejecute desde la capa de presentacin
Ahora agregaremos un
Ahora vamos a editar el ToolStrip, para ello seleccionamos el ToolStrip y le damos clic derecho
Ahora agregaremos 5 botones
En sus propiedades a cada botn escogeremos
Name btnnuevo ToolTipText Nuevo Image Seleccionamos una imagen
Al final nos debe quedar de la siguiente manera
Ahora vamos a importar a la capa de negocio
Ahora programaremos para que cuando cargue el formulario me liste los Clientes
Public Class Form1 Dim objnegocio As New Capa_Negocio.Capa_Negocio
Ahora programaremos en el botn Nuevo
Private Sub btnnuevo_Click() Handles btnnuevo.Click Dim ctrl As New Control 'recorremos todos los controles que estan dentro 'del GroupBox1 For Each ctrl In GroupBox1.Controls 'Preguntamos si es TextBox If TypeOf ctrl Is TextBox Then ctrl.Text = "" End If Next Dim codigo As String : codigo = objnegocio.N_Genera_Codigo lblcod.Text = codigo : txtnom.Focus() End Sub
Ahora programaremos en el botn Grabar
Private Sub btnGrabar_Click() Handles btnGrabar.Click If (MsgBox("Desea Grabar", 4 + 32, "Mensaje Sistema") = 6) Then Dim cod, nom, ruc, dir As String : Dim tel As Integer cod = lblcod.Text : nom = txtnom.Text : ruc = txtruc.Text dir = txtdir.Text : tel = CInt(txttel.Text) : Dim p As Integer p = objnegocio.N_Grabar_Cliente(cod, nom, tel, ruc, dir) If (p > 0) Then MsgBox("Se Grabo Correctamente", 32, "Mensaje del Sistema") listado() Else MsgBox("Error al Grabar", 4, "Mensaje del Sistema") End If End If End Sub
Ahora programaremos para que cuando seleccionemos el DataGridView1 pasen los datos a las cajas de textos.
Private Sub Form1_Load() Handles MyBase.Load listado() End Sub
Sub listado() Dim dt As New DataTable dt = objnegocio.N_Listado_Clientes DataGridView1.DataSource = dt End Sub Private Sub DataGridView1_CellClick() Handles DataGridView1.CellClick Try Dim f As Integer 'capturamos la fila seleccionada f = DataGridView1.CurrentCell.RowIndex lblcod.Text = DataGridView1(0, f).Value : txtnom.Text = DataGridView1(1, f).Value txttel.Text = DataGridView1(2, f).Value : txtruc.Text = DataGridView1(3, f).Value txtdir.Text = DataGridView1(4, f).Value Catch ex As Exception : End Try End Sub
Ahora programaremos en el botn Modificar
Private Sub btnmodificar_Click() Handles btnmodificar.Click If (MsgBox("Desea Modificar", 4 + 32, "Mensaje") = 6) Then Dim cod, nom, ruc, dir As String : Dim tel As Integer cod = lblcod.Text : nom = txtnom.Text ruc = txtruc.Text : dir = txtdir.Text : tel = CInt(txttel.Text) : Dim p As Integer p = objnegocio.N_Actualizar_Cliente(cod, nom, tel, ruc, dir) If (p > 0) Then MsgBox("Se Modifico Correctamente", 32, "Mensaje Sistema") listado() Else MsgBox("Error al Modificar", 4, "Mensaje Sistema") End If End If End Sub
Ahora programaremos en el botn Eliminar
Private Sub btneliminar_Click() Handles btneliminar.Click If (MsgBox("Desea Eliminar", 4 + 32, "Mensaje") = 6) Then Dim cod As String cod = lblcod.Text Dim p As Integer p = objnegocio.N_Eliminar_Cliente(cod) If (p > 0) Then MsgBox("Se Elimino Correctamente", 32, "Mensaje") listado() Else MsgBox("Error al Elimino", 4, "Mensaje") End If End If End Sub Y por ultimo programaremos en botn Salir
Finalmente le damos F5
Ejercicio Prctico Nro. 2
Lo primero que vamos a realizar es crear los procedimientos almacenados en SQL.
use BDfactura ----Facturas Realizadas
create procedure Lista_Facturas as select fac_numero, convert(char(10),fac_fecha,103) Fecha from fac_cabe go
--Detalle de las Facturas Seleccionadas set quoted_identifier off go
create procedure Lista_Detalle @fac varchar(255) Private Sub btnSalir_Click() Handles btnSalir.Click Me.Close() End Sub as exec("select fac_numero,a.art_codigo,art_nombre,art_precio,art_cantidad, (art_precio*art_cantidad) Total from articulos as a,fac_deta fd where a.art_codigo=fd.art_codigo and fac_numero in ("+@fac+")") go
--probamos el procedimiento Lista_Detalle "'F0001','F0002','F0003'"
Ahora en el visual Studio vamos a crear una nueva solucin en blanco la cual le ponemos el nombre de Consulta_Solucion. Dentro de la solucin, ahora agregaremos un proyecto de biblioteca de clases, la cual llamaremos Capa de Datos
Ahora programaremos lo siguiente.
Imports System.Data.SqlClient
Public Class Capa_Dato Dim cn As New SqlConnection("Server=(local);Integrated Security=yes;Database=bdfactura")
Function D_Facturas_Clientes() As DataTable Dim da As New SqlDataAdapter("Lista_Facturas", cn) Dim dt As New DataTable : da.Fill(dt) : Return dt End Function
Function D_Detalle_Facturas(ByVal fac As String) As DataTable Dim cmd As New SqlCommand("Lista_Detalle", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@fac", SqlDbType.VarChar).Value = fac Dim da As New SqlDataAdapter(cmd) : Dim dt As New DataTable : da.Fill(dt) Return dt End Function End Class
Y una vez generado la capa de datos, ahora a la solucin agregaremos un proyecto y lo llamaremos capa_negocio
Ahora al proyecto capa de negocio agregaremos una referencia que es la Capa_Datos
Ahora programaremos lo siguiente
Una vez generado la capa de negocio, ahora agregaremos un proyecto a la solucin, la llamaremos Capa de presentacin
Ahora realizaremos el siguiente diseo
A continuacin a la capa de presentacin le agregaremos una referencia que es la Capa_Negocio
Public Class Capa_Negocio Dim objdatos As New Capa_Datos.Capa_Dato
Function N_Facturas_Clientes() As DataTable Return objdatos.D_Facturas_Clientes() End Function
Function N_Detalle_Facturas(ByVal fac As String) As DataTable Return objdatos.D_Detalle_Facturas(fac) End Function End Class
Lo primero que debemos hacer es realizar la referencia de la capa de negocio
Ahora programaremos para que cuando cargue el formulario nos liste las facturas realizadas
Ahora programaremos en el botn Ver Facturas
Private Sub Form1_Load() Handles MyBase.Load Dim dt As New DataTable dt = objnegocio.N_Facturas_Clientes() CheckedListBox1.MultiColumn = True For a As Integer = 0 To dt.Rows.Count - 1 CheckedListBox1.Items.Add(dt.Rows(a)(0)) Next End Sub Public Class Form1 Dim objnegocio As New Capa_Negocio.Capa_Negocio
Finalmente presionamos F5
Ejercicio Prctico Nro. 3
Lo primero que vamos a realizar es crear los procedimientos almacenados en SQL. use bdfactura
create procedure Lista_Ranking @cant int as Private Sub btnver_Click() Handles btnver.Click Dim cod, codigo, fac As String Dim tamao As Integer fac = "" : cod = ""
For a As Integer = 0 To CheckedListBox1.Items.Count - 1 If (CheckedListBox1.GetItemChecked(a) = True) Then fac += "'" & CheckedListBox1.Items.Item(a).ToString.Trim & "'," End If Next
tamao = fac.Length 'Tamao de la cadena If (tamao > 0) Then 'Le quitamos uno por la coma que sobra codigo = Mid(fac, 1, tamao - 1) Dim dt As New DataTable dt = objnegocio.N_Detalle_Facturas(codigo) DataGridView1.DataSource = dt End If End Sub if @cant=0 --Si es Cero nos mostrara todos los Clientes con --sus respectivas cantidades de Facturas select c.cli_codigo,cli_nombre,count(fac_numero) Total_ventas from clientes as c, fac_cabe as fc where c.cli_codigo=fc.cli_codigo group by c.cli_codigo,cli_nombre order by Total_ventas desc else --Nos mostrar solo las cantidades de clientes que se le envia como parametro select top (@cant) with ties c.cli_codigo,cli_nombre, count(fac_numero) Total_ventas from clientes as c, fac_cabe as fc where c.cli_codigo=fc.cli_codigo group by c.cli_codigo,cli_nombre order by Total_ventas desc go
-----Mostrar las Facturas por Cliente create procedure Mostrar_Facturas @cod varchar(5) as select fac_numero,convert(char(10),fac_fecha,103) Fecha,fac_total from fac_cabe as fc,clientes as c where c.cli_codigo=fc.cli_codigo and c.cli_codigo=@cod go
Ahora en el visual Studio vamos a crear una nueva solucin en blanco llamada Consulta_Solucion Dentro de la solucin, ahora agregaremos un proyecto de biblioteca de clases, la cual llamaremos Capa de Datos
Ahora a la capa de datos vamos a crear una clase la cual contendr mi conexin a la BD Y lo llamaremos Clsconexion Ahora programaremos lo siguiente
Ahora agregaremos una clase ms a la biblioteca Capa_Datos y la llamaremos D_datos Y ahora programaremos lo siguiente.
Imports System.Data.SqlClient
Public Class D_Datos Dim cone As New Clsconexion 'cone.conexion_SQL llamamos a la Cadena de conexion que hicimos en la clase Clsconexion Dim cn As New SqlConnection(cone.conexion_SQL)
Function D_Muestra_Ranking(ByVal cant As Integer) As DataTable Dim cmd As New SqlCommand("Lista_Ranking", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cant", SqlDbType.Int).Value = cant Dim da As New SqlDataAdapter(cmd) : Dim dt As New DataTable da.Fill(dt) : Return dt End Function
Function D_Facturas_Cliente(ByVal codcli As String) As DataTable Dim cmd As New SqlCommand("Mostrar_Facturas", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cod", SqlDbType.VarChar).Value = codcli Dim da As New SqlDataAdapter(cmd) : Dim dt As New DataTable da.Fill(dt) : Return dt End Function End Class
Ahora en la solucin creada vamos agregar otra biblioteca de clases la llamaremos capa_Negocio Imports System.Data Public Class Clsconexion Public Function conexion_SQL() As String Dim cn As String cn = "Server=(local);Integrated Security=yes;Database=bdfactura" Return cn End Function End Class
Ahora en la capa de negocio agregaremos una referencia que vine de la capa de Datos
Ahora programaremos lo siguiente
Luego de haber generado la capa de negocio, ahora a la solucin agregaremos un proyecto y la llamaremos capa Presentacin
Public Class Capa_Negocio Dim objdato As New Capa_Datos.D_Datos
Function N_Muestra_Ranking(ByVal cant As Integer) As DataTable Return objdato.D_Muestra_Ranking(cant) End Function
Function N_Facturas_Cliente(ByVal codcli As String) As DataTable Return objdato.D_Facturas_Cliente(codcli) End Function End Class
A continuacin realizaremos el siguiente diseo
Ahora en la capa de presentacin agregaremos la referencia de la capa_Negocio
Lo primero que debemos hacer en el formulario es hacer la referencia de la capa_Negocio
Public Class Form1 Dim objnegocio As New Capa_Negocio.Capa_Negocio Ahora vamos a programar para darle valores mximos y mnimos del NumericUpDown1
Ahora programaremos en el botn Filtrar
Ahora programaremos en el DatagridView1 para que cuando le demos Clic nos muestre las facturas en el DatagridView2
Ahora presionamos F5
Private Sub DataGridView1_CellClick() Handles DataGridView1.CellClick
Dim p As Integer p = DataGridView1.CurrentCell.RowIndex Dim cod As String = DataGridView1(0, p).Value Dim dt As New DataTable dt = objnegocio.N_Facturas_Cliente(cod) DataGridView2.DataSource = dt End Sub Private Sub btnfiltrar_Click() Handles btnfiltrar.Click Dim cant As Integer If (rbtodos.Checked = True) Then cant = 0 Else cant = NumericUpDown1.Value End If
Dim dt As New DataTable dt = objnegocio.N_Muestra_Ranking(cant) DataGridView1.DataSource = dt End Sub Private Sub Form1_Load() Handles MyBase.Load 'Vamos a darle El maximo y minimo valor al NumericUpDown1 NumericUpDown1.Maximum = 10 NumericUpDown1.Minimum = 1 End Sub
Ejercicio Prctico Nro. 4
Lo primero que vamos a realizar es crear los procedimientos almacenados en SQL use bdfactura go ----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente as select cli_codigo,cli_nombre from clientes where cli_codigo in(select distinct cli_codigo from fac_cabe) go ----------Facturas_Varios_Cliente---------------- ----------------------------------------- --Habilita el uso de las comillas set quoted_identifier off go
--Creamos Ahora el Procedimiento create Procedure Facturas_Varios_Cliente @codigos varchar(255) as exec("select fac_numero,c.cli_codigo,cli_nombre "+ "from fac_cabe as fc,clientes as c where fc.cli_codigo=c.cli_codigo and "+ "c.cli_codigo in(" +@codigos +") "+ "order by c.cli_codigo asc") go
--Probamos el Proc Almacenado Facturas_Varios_Cliente "'C0001','C0002','C0003'"
Ahora en el visual Studio vamos a crear una nueva solucin en blanco llamada Consulta_Solucion.
Dentro de la solucin, ahora agregaremos una biblioteca de clases, la cual llamaremos Capa de Datos
Ahora a la capa de datos vamos a crear una clase la cual contendr mi conexin a la BD con el nombre de Clsconexion
Ahora programaremos lo siguiente
Imports System.Data
Public Class Clsconexion Public Function conexion_SQL() As String Dim cn As String cn = "Server=(local);Integrated Security=yes;Database=bdfactura" Return cn End Function End Class
Ahora agregaremos una clase ms a la biblioteca y la llamaremos D_datos Y ahora programaremos lo siguiente
Imports System.Data.SqlClient Public Class D_Datos Dim cone As New Clsconexion 'cone.conexion_SQL llamamos a la Cadena de conexion que hicimos en la clase Clsconexion Dim cn As New SqlConnection(cone.conexion_SQL)
Function D_Lista_Cliente() As DataTable Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) Return dt End Function
Function D_Fact_Cli_Varios(ByVal codcli As String) As DataTable Dim cmd As New SqlCommand("Facturas_Varios_Cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@codigos", SqlDbType.VarChar).Value = codcli Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) Return dt End Function End Class Una vez generada la capa de datos, Ahora en la solucin creada vamos agregar otra biblioteca de Clases y la llamaremos capa_Negocio Ahora en la capa de negocio agregaremos una referencia que vine de la capa de Datos
Ahora programaremos lo siguiente
Luego de haber generado la capa de negocio, ahora a la solucin agregaremos un proyecto y la llamaremos capa Presentacin
A continuacin realizaremos el siguiente diseo
Public Class Capa_Negocio Dim objdato As New Capa_Datos.D_Datos
Function N_Lista_Cliente() As DataTable Return objdato.D_Lista_Cliente() End Function
Function N_Fact_Cli_Varios(ByVal codcli As String) As DataTable Return objdato.D_Fact_Cli_Varios(codcli) End Function End Class
Ahora en la capa de presentacin agregaremos la referencia de la capa_Negocio Ahora realizaremos una referencia a la capa de Negocio
Ahora programaremos para Listar los clientes a penas cargue el formulario
Ahora programaremos en el Botn Ver Facturas Private Sub Form1_Load() Handles MyBase.Load Dim dt As New DataTable formato() Dim lstitem As ListViewItem dt = objnegocio.N_Lista_Cliente() For a As Integer = 0 To dt.Rows.Count - 1 lstitem = ListView1.Items.Add(dt.Rows(a)(0)) lstitem.SubItems.Add(dt.Rows(a)(1)) Next End Sub
Sub formato() 'Formato del ListView1 With ListView1 .CheckBoxes = True 'Mostramos CheckBoxes en el ListView1 .View = View.Details 'Vista Detalle .GridLines = True 'Muestre Lineas de separacion entre filas y columnas .Columns.Add("Codigo del Cliente", 120, HorizontalAlignment.Center) .Columns.Add("Nombre del Cliente", 250, HorizontalAlignment.Left) End With End Sub Public Class Form1 Dim objnegocio As New Capa_Negocio.Capa_Negocio
Finalmente presionamos F5
Private Sub Btnver_Click() Handles Btnver.Click Dim cod, codigo As String Dim tamao As Integer cod = "" Try
For a As Integer = 0 To ListView1.Items.Count - 1 If (ListView1.CheckedItems(a).Checked = True) Then cod = cod & "'" & ListView1.CheckedItems(a).Text & "'," End If Next Catch ex As Exception End Try
tamao = cod.Length 'Tamao de la cadena 'Le quitamos uno por la coma que sobra codigo = Mid(cod, 1, tamao - 1) Dim dt As New DataTable : dt = objnegocio.N_Fact_Cli_Varios(codigo) DataGridView1.DataSource = dt 'A la columna 2 le damos un ancho de 200 DataGridView1.Columns(2).Width = 200 End Sub Ejercicios Propuestos Aplicacin 1:
Realizar el siguiente programa siguiente las siguientes consideraciones: Cuando inicie el programa, se deber demostrar en el Combobox1 (CboAo) los aos que fueron emitidas todas las ordenes, a la vez agregara los elementos al Lisbox1 (A-C,E-G,H-KI,L-O,P-S,T-Z), el cual se deber demostrar por columnas, y por ultimo creara la estructura del Listview1 con los campos (ProductID,CompanyName,UnitPrice,Quantity,Total).
Cuando seleccione ambos parmetros un ao y un rango de letras y haga clic en el botn Buscar Clientes por , se deber demostrar en el Listbox2 los clientes que le fueron emitidas sus rdenes. Cuando seleccione un cliente del Listbox2, se deber demostrar en el Listbox3 las ordenes pares que le fueron emitidas al cliente seleccionado, mostrara los siguientes campos concatenados (OrderID,OrderID,ShippedDate,Dias_Envio (Diferencia en das de ambos campos fechas)).
Y cuando seleccione un elemento del Listbox3, deber de capturar la orden emitida, y deber demostrar en el Listview1, su detalle de venta de esa orden.
Aplicacin 2:
Se pide a usted que cree una aplicaron que permita realizar una consulta de datos bajo las siguientes consideraciones:
Cuando seleccione cualquier Radiobuttons, deber demostrar todos los Customers que se encuentran mediante el rango de letras seleccionado.
Antes de presionar el botn Bsqueda de Ordenes, deber de tener como parmetro el cdigo del Customers seleccionado, y las fechas ingresadas. Y deber demostrar como resultado en el ListView1, todas las Ordenes emitidas por los parmetros dados, mostrando los siguientes campos bajo las siguientes consideraciones:
El campo OrderID. El campo RequiredDate, que es la fecha que se requera el producto. Creara un campo TotalVenta, que es la suma del producto de UnitPrice * Quantity.
Creara un campo DiasEnvio, que es la diferencia de ShippedDate OrderDate.
Creara un campo EstadoEnvio, que viene a mostrar un mensaje bajo el siguiente criterio:
Si los das de envi es mayor o igual a 10, entonces Fuera de fecha.
Si los das de envi es menor de 10, entonces Entrega inmediata.
Y por ultimo al seleccionar una fila del ListView1, deber de capturar el nmero de orden, que le servir como parmetro para mostrar todos los productos vendidos por esa orden seleccionada en el ListView2, mostrando los campos de la imagen.
Semana 16 CREACIN DE REPORTES Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se escribe para controlar un tipo de base de datos especfico o la tecnologa de acceso a bases de datos. Modelos de extraccin e insercin: Con el fin de ofrecer el acceso a datos ms flexible para los programadores, los controladores de base de datos de Crystal Reports se han diseado para proporcionar un modelo de extraccin e insercin de acceso a datos. Modelo de extraccin
En un modelo de extraccin, el controlador se conectar a la base de datos y extraer datos cuando se necesiten. Con este modelo, Crystal Reports controla tanto la conexin a la base de datos como el comando SQL que se ejecuta para obtener los datos y no necesita ninguna codificacin del programador. Si no se escribe ningn cdigo especial en tiempo de ejecucin, se utiliza el modelo de extraccin.
Modelo de insercin
En comparacin, el modelo de insercin necesita que el programador escriba cdigo para conectarse a la base de datos, ejecutando un comando SQL para crear un conjunto de registros o de datos que se ajusten a los campos del informe y enviando ese objeto al informe. Este mtodo le permite crear recursos compartidos de conexin en la aplicacin y filtrar los datos antes de que Crystal Reports los reciba. Los controladores de bases de datos se utilizan durante el tiempo de creacin y de procesamiento. Durante el tiempo de creacin, el controlador de la base de datos se utiliza para identificar el esquema de los datos. Con los controladores OLEDB, ODBC y Access/Excel, este proceso implica la conexin a una base de datos y la seleccin de las tablas, vistas o procedimientos almacenados para especificar el esquema. Con los controladores ADO.NET y de definicin de campos, este proceso implica la seleccin de un esquema con la forma de un archivo XML (*.xml) o de un archivo de definicin de datos (*.ttx). Durante el tiempo de procesamiento, el informe utilizar el mismo controlador de base de datos utilizado para crear el informe. No obstante, si los datos se insertan en el informe, el informe seleccionar el controlador adecuado para controlar el conjunto de registros o el conjunto de datos. Controladores de bases de datos con Crystal Reports para Visual Studio .NET. Controlador de base de datos Base de datos a las que se tiene acceso Mtodo de acceso a datos OLEDB Cualquier base de datos que tenga un proveedor OLEDB. Admite tanto la extraccin de datos de la base de datos como la insercin de datos en el informe de un conjunto de registros ADO.
ODBC Cualquier base de datos que tenga un proveedor ODBC. Admite tanto la extraccin de datos de la base de datos como la insercin de datos en el informe de un conjunto de registros RDO.
Access/Excel Bases de datos de Microsoft Access y libros de Microsoft Excel. Admite tanto la extraccin de datos de la base de datos como la insercin de datos en el informe de un conjunto de registros DAO. ADO.NET Cualquier base de datos con un proveedor gestionado. Admite la insercin de datos en el informe desde un conjunto de datos ADO.NET. Este controlador no extraer datos por s mismo. Definicin de campo Ninguna. Este controlador especial se utiliza para crear informes basados nicamente en un esquema sin El controlador se incluye principalmente para la compatibilidad con versiones anteriores y slo se utiliza durante el proceso de creacin de informes. En tiempo de ejecucin, debe datos reales. enviarse un conjunto de registros o un conjunto de datos a un informe creado con el controlador. Objeto de datos Crystal (CDO) Ninguna. Este controlador especial obtiene acceso a datos que no residen en una base de datos tradicional. Este controlador se incluye principalmente para la compatibilidad con versiones anteriores. Este controlador slo admite la insercin de datos en un informe desde un conjunto de registros CDO; no extraer datos por s mismo. Utilice la biblioteca de objetos de datos Crystal para llenar un conjunto de registros CDO. Nota Este controlador no est disponible durante el perodo de creacin del informe. Seleccione uno de los controladores disponibles para crearlo.
REPORTES EN .NET CON CRYSTAL REPORTS
Visual Studio .NET incluye Crystal Reports como un mecanismo "oficial" de creacin de reportes. Crystal Reports es un producto muy desarrollado y complejo para la creacin de reportes, y cuenta con una infinidad de opciones. En este artculo, nos vamos a concentrar en crear reportes relativamente sencillos, pero mostrando los detalles especficos de la versin .NET, tanto en aplicaciones WinForms como en aplicaciones WebForms (ASP.NET). Este artculo considera que usted ya posee alguna familiaridad con Visual Studio .NET y tambin con ADO.NET.
Crear un reporte:
Independientemente de cmo se har la presentacin, el reporte se define en un archivo ".RPT", que forma parte de su proyecto. Ese archivo especifica el modo en que se har la presentacin del reporte, pero no incluye los datos propiamente dichos. Los datos se definirn en el tiempo de ejecucin. Crystal Reports se basa en un concepto muy comn de la definicin de reportes: los reportes se componen de "secciones", y cada seccin es un espacio horizontal en la pgina. Existen diversos tipos de secciones, por ejemplo:
Encabezado del reporte, aparece en la primera pgina. Encabezado de pgina, aparece en la parte superior de todas las pginas. Detalle: lo ms importante. En el tiempo de ejecucin, se genera una de estas secciones para cada lnea (registro) en la base de datos. Pie de pgina, aparece en la parte inferior de todas las pginas. Pie de reporte, aparece al final del reporte. En un principio, todos los reportes presentan estas cinco secciones. Otras secciones son opcionales, como por ejemplo: Encabezado de grupo, aparece antes de un grupo. Pie de grupo, aparece al final del grupo. Se podr omitir una o ms secciones, en caso de que no sean necesarias. Acceder a la base de datos.
Antes de crear el reporte, hay que decidir cul ser el mecanismo utilizado para acceder a la base de datos. Crystal Reports puede obtener datos de una infinidad de fuentes, pero una buena cantidad de ellas, como DAO, ADO y OLE/DB, no est "administrada", o sea, es cdigo .NET "puro". En una aplicacin .NET, probablemente sea deseable realizar el acceso a travs de ADO.NET. Para ello, lo ms fcil es definir un Conjunto de datos tipificado, aun antes de crear el reporte.
Ejercicio Prctico Nro. 1
Primero vamos a crear nuestro procedimiento almacenado en el SQL Use northwind go
Create procedure Lista_Clientes as select CustomerID,CompanyName,ContactName,ContactTitle from customers go
Ahora si ejecutamos nuestro procedimiento almacenado nos listara todos los clientes
Ahora lo que haremos es aprender a mostrar esos clientes en un reporte, para ello lo primero que realizaremos es crear un proyecto
Ahora en nuestro proyecto agregamos un CrystalReportViewer a nuestro formulario
Al final nos deber quedar de la siguiente manera
Ahora en el proyecto le damos clic derecho y agregamos lo siguiente
A Continuacin vamos aceptar la licencia del CrystalReports 1
Ahora seleccionamos
Ahora lo que vamos a realizar es establecer la conexin a la BD
A continuacin seleccionamos el proveedor de la BD, en este caso es el SQL Server
Ahora configuramos para seleccionar
Y por ultimo le damos Finalizar
Ahora seleccionamos los procedimientos almacenados que puedan existir en la BD
Dentro de los procedimientos almacenados, seleccionamos el procedimiento almacenado que hemos creado y le damos siguiente.
Como nos damos cuenta nos salen los campos que va a visualizar nuestro procedimiento almacenado, ahora vamos a seleccionar los campos a vizualizar
Una vez agregado los campos, le damos siguiente
Como no vamos agruparlo, le damos finalizar.
Y nos quedara de la siguiente manera
Ahora si queremos cambiar el formato de las etiquetas, le damos Clic derecho
Le damos el respectivo formato y finalmente Aceptar
Nos quedara de la siguiente manera
Ahora vamos agregar un titulo general a nuestro Reporte, para ello
Y finalmente nos quedara de la siguiente manera
Si queremos ver cmo va quedando nuestro reporte, le damos en
Ahora en muestro formulario programaremos en el evento Load, para que nos muestre nuestro reporte, y a la vez vamos a deshabilitar para que no aparezca el DisplayGroupTree
Ahora programaremos lo siguiente
Finalmente presionamos F5 y nos deber mostrar
Private Sub Form1_Load() Handles MyBase.Load 'vamos a instanciar el nombre de nuestro Reporte Creado Dim rpt As New Rpt_Clientes 'Pasamos nuestro reporte creado al CrptReporte CrptReporte.ReportSource = rpt 'Desabilitamos la vizualizacion en grupos CrptReporte.DisplayGroupTree = False End Sub
Ejercicio Prctico Nro. 2
Primero vamos a crear nuestro procedimiento almacenado en el SQL
Ahora si ejecutamos nuestro procedimiento
use northwind go -----------------Si existe lo Eliminamos-------------- set dateformat dmy --formato dia,mes,ao go -----------------Creamos el Procedimiento------------- create procedure Listado_Ordenes @fe1 datetime, @fe2 datetime as select OrderID,c.CustomerID,CompanyName,convert(char(10), OrderDate,103) as Fecha from orders as o,Customers as c where OrderDate between @fe1 and @fe2 and c.CustomerID=o.CustomerID order by Fecha desc go Listado_Ordenes '01-07-1996','30-07-1996' Ahora lo que haremos es aprender a mostrar esos clientes en un reporte, para ello lo primero que realizaremos es crear un proyecto
Ahora en nuestro proyecto agregamos un CrystalReportViewer a nuestro formulario
Vamos agregar 2 MaskedTextBox y vamos a darle una mascara
Ahora seleccionamos el tipo Fecha
Y por ultimo agregamos un CrystalReportViewer donde se va a visualizar mi reporte, al final nos quedara de la siguiente manera
Ahora en el proyecto le damos clic derecho y agregamos un Crystal Report
A Continuacin vamos aceptar la licencia del CrystalReports
Ahora seleccionamos
Ahora lo que vamos a realizar es establecer la conexin a la BD
A continuacin seleccionamos el proveedor de la BD, en este caso es el SQL Server
Ahora configuramos para seleccionar al servidor y la base de datos.
Y por ultimo le damos Finalizar
Ahora seleccionamos los procedimientos almacenados que puedan existir en la BD
Dentro de los procedimientos almacenados, seleccionamos el procedimiento almacenado que hemos creado
Nos saldr un cuadro de dialogo, el cual nos indica que nuestro procedimiento almacenado tiene 2 parmetros de entrada, finalmente le damos ok
Y nos quedara de la siguiente manera, le damos siguiente
Como nos damos cuenta nos salen los campos que va a visualizar nuestro procedimiento almacenado, ahora vamos a seleccionar los campos a visualizar (todos)
Como no vamos agruparlo, le damos finalizar.
Y nos quedara de la siguiente manera
Ahora si queremos cambiar el formato, clic derecho
Le damos el respectivo formato y finalmente Aceptar
Si queremos ver cmo va quedando nuestro reporte le damos en
Ahora en muestro formulario programaremos en el evento Load, para que nos muestre nuestro reporte, y a la vez vamos a deshabilitar para que no aparezca el DisplayGroupTree
Ahora programaremos lo siguiente
Ahora
Private Sub Form1_Load() Handles MyBase.Load 'Estilo para la ubicacion de nuestro CrptReporte CrptReporte.Dock = DockStyle.Bottom 'Desabilitamos la vizualizacion en grupos CrptReporte.DisplayGroupTree = False End Sub
Finalmente presionamos F5 y nos deber mostrar
Ejercicio Prctico Nro. 3
Lo primero que vamos a realizar es crear los procedimientos almacenados en SQL
use bdfactura go ----------Listado_Cliente---------------- ----------------------------------------- --Creamos Ahora el Procedimiento create Procedure Listado_Cliente Private Sub BtnFiltrar_Click() Handles BtnFiltrar.Click Dim fecha1, fecha2 As Date fecha1 = CDate(mktxtini.Text) fecha2 = CDate(mktxtfin.Text)
'vamos a instanciar el nombre de nuestro Reporte Creado Dim rpt As New Rpt_Ordenes 'los parametros que recibe rpt.SetParameterValue("@fe1", fecha1) rpt.SetParameterValue("@fe2", fecha2) 'Pasamos nuestro reporte creado al CrptReporte CrptReporte.ReportSource = rpt End Sub as select cli_codigo,cli_nombre from clientes where cli_codigo in(select distinct cli_codigo from fac_cabe) go ----------Facturas_Varios_Cliente---------------- ----------------------------------------- --Habilita el uso de las comillas set quoted_identifier off
--Creamos Ahora el Procedimiento create Procedure Facturas_Varios_Cliente @codigos varchar(255) as exec("select fac_numero,c.cli_codigo,cli_nombre,convert(char(10), fac_fecha,103) Fecha, fac_igv,fac_total from fac_cabe as fc,clientes as c where fc.cli_codigo=c.cli_codigo and c.cli_codigo in(" +@codigos +") order by c.cli_codigo asc") go
--Probamos el Proc Almacenado Facturas_Varios_Cliente "'C0001','C0002','C0003'"
Ahora en el visual Studio vamos a crear una nueva solucin en blanco
Dentro de la solucin, ahora agregaremos una biblioteca de clases, la cual llamaremos Capa de Datos
Ahora a la capa de datos vamos a crear una clase la cual contendr mi conexin a la BD
Y lo llamaremos Clsconexion
Ahora programaremos lo siguiente
Ahora agregaremos una clase ms al proyecto Capa_Datos y lo llamaremos D_datos
Y ahora programaremos lo siguiente
Imports System.Data Public Class Clsconexion Public Function conexion_SQL() As String Dim cn As String cn = "Server=(local);Integrated Security=yes;Database=bdfactura" Return cn End Function End Class
Una vez generada la capa de datos, Ahora en la solucin creada vamos agregar una Nueva Biblioteca de calses y la llamaremos capa_Negocio
Ahora en la capa de negocio agregaremos una referencia que vine de la capa de Datos
Ahora programaremos lo siguiente
Luego de haber generado la capa de negocio, ahora a la solucin agregaremos un proyecto de windows y la llamaremos capa Presentacin
A continuacin realizaremos el siguiente diseo
Public Class Capa_Negocio Dim objdato As New Capa_Datos.D_Datos
Function N_Lista_Cliente() As DataTable Return objdato.D_Lista_Cliente() End Function End Class Imports System.Data.SqlClient Public Class D_Datos Dim cone As New Clsconexion 'cone.conexion_SQL llamamos a la Cadena de conexion que hicimos en la clase Clsconexion Dim cn As New SqlConnection(cone.conexion_SQL)
Function D_Lista_Cliente() As DataTable Dim da As New SqlDataAdapter("Listado_Cliente", cn) Dim dt As New DataTable da.Fill(dt) Return dt End Function End Class
Ahora en la capa de presentacin agregaremos la referencia de la capa_Negocio
Ahora en nuestro proyecto Capa_Presentacion, vamos agregar un reporte al cual llamaremos Rpt_Facturas_Clientes
A Continuacin vamos aceptar la licencia del CrystalReports y su Reports Wizard
Ahora debes realizar la conexin a la BD
A continuacin seleccionamos el proveedor de la BD, en este caso es el SQL Server
Ahora configuramos para seleccionar el servidor y la base de datos.
Y por ultimo le damos Finalizar
Ahora seleccionamos los procedimientos almacenados que puedan existir en la BD
Dentro de los procedimientos almacenados, seleccionamos el procedimiento almacenado que hemos creado
Nos saldr un cuadro de dialogo, el cual nos indica que nuestro procedimiento almacenado tiene 1 parmetros de entrada, si queremos que por defecto tenga un valor le mandamos un cdigo (Se le puso apostrofe por que nuestro procedimiento se le mandaba de esa manera) y finalmente le damos ok
En tablas seleccionadas debe mostrar los siguiente
le damos siguiente
Como nos damos cuenta nos salen los campos que va a visualizar nuestro procedimiento almacenado, ahora vamos a seleccionar los campos a visualizar (agregar todos).
Una vez agregado los campos, le damos siguiente
Y ahora lo vamos agrupar por el cdigo del Cliente
Y nos quedara de la siguiente manera
A continuacin vamos a darle formato a nuestro Reporte
Si queremos ver cmo va quedando nuestro reporte le damos en
Y nos pedir los parmetros, le damos por ejemplo
Y nos quedara de la siguiente manera
Ahora vamos a programar en nuestro formulario, para ello realizaremos una referencia a la capa de Negocio
Ahora programaremos para Listar los clientes a penas cargue el formulario
Private Sub Form1_Load() Handles MyBase.Load CrystalReportViewer1.Dock = DockStyle.Bottom
Dim dt As New DataTable formato() Dim lstitem As ListViewItem dt = objnegocio.N_Lista_Cliente() For a As Integer = 0 To dt.Rows.Count - 1 lstitem = ListView1.Items.Add(dt.Rows(a)(0)) lstitem.SubItems.Add(dt.Rows(a)(1)) Next End Sub
Sub formato() 'Formato del ListView1 With ListView1 .CheckBoxes = True 'Mostramos CheckBoxes en el ListView1 Public Class Form1 Dim objnegocio As New Capa_Negocio.Capa_Negocio .View = View.Details 'Vista Detalle .GridLines = True 'Muestre Lineas de separacion entre filas y columnas .Columns.Add("Codigo del Cliente", 120, HorizontalAlignment.Center) .Columns.Add("Nombre del Cliente", 250, HorizontalAlignment.Left) End With : End Sub Ahora programaremos en el Botn Ver Facturas
Finalmente presionamos F5 y vemos el resultado.
Private Sub btnbuscar_Click() Handles btnbuscar.Click
Dim cod, codigo As String Dim tamao As Integer cod = "" Try
For a As Integer = 0 To ListView1.Items.Count - 1 If (ListView1.CheckedItems(a).Checked = True) Then cod = cod & "'" & ListView1.CheckedItems(a).Text & "'," End If Next Catch ex As Exception End Try tamao = cod.Length 'Tamao de la cadena 'Le quitamos uno por la coma que sobra codigo = Mid(cod, 1, tamao - 1) Dim rpt As New Rpt_Facturas_Clientes rpt.SetParameterValue("@codigos", codigo) CrystalReportViewer1.ReportSource = rpt End Sub