Está en la página 1de 160

ndice General

Semana 1 Manipulacin de datos en SQL 2008



Semana 2... Procedimientos Almacenados I

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:

exec pa_libros_autor_editorial2 @editorial='Nuevo siglo',@autor='Paenza';

--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:

exec pa_libros_autor_editorial 'Richard Bach','Planeta';

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:

exec pa_libros_autor_editorial @editorial='Planeta', @autor='Richard Bach';

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:

Create procedure pa_promedio
@n1 decimal(4,2), @n2 decimal(4,2), @resultado decimal(4,2) output
as
select @resultado=(@n1+@n2)/2;

Al ejecutarlo tambin debe emplearse "output":

declare @variable decimal(4,2)
execute pa_promedio 5,6, @variable output select @variable;

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:

declare @s decimal(6,2), @p decimal(6,2)

execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output

select @s as total, @p as promedio;

Ejecucin de procedimientos almacenados

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:

System.Data.Odbc
System.Data.OleDb
System.Data.OracleClient
System.Data.SqlClient

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.

----------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

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.

Create table EmpleadosImagen(
Emp_cod char(5) Primary key,
Emp_nom varchar(100),
)

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

Declare @codigo char(5)
exec usp_generacodigoEmpleado @codigo output
print @codigo

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

También podría gustarte