Beruflich Dokumente
Kultur Dokumente
otras fragancias de
Programacin
La historia de la INFORMTICA est llena de progresos, en muchos de los casos sorprendentes, que han
influido enormemente en el desarrollo de la ciencia, de manera que estos han pasado por etapas en las
que los avances tecnolgicos se producan a una vertiginosa velocidad en un corto tiempo.
El software est presente hoy da en todos los aspectos de la sociedad: tanto los grandes sistemas
(telecomunicaciones, automatizacin industrial, investigacin, sector empresarial, bancario, econmico,
educativo, agrnomo, salud, etc) como los objetos de la vida cotidiana (telfonos celulares, tarjetas
bancarias, juegos, entretenimiento, etc) funcionan gracias a programas informticos.
La informtica realiza un trabajo consistente en ayudarnos a reducir las tareas rutinarias, acceder a
grandes volmenes de informacin y proveerla en forma oportuna y veraz, aumentar la precisin en
nuestros trabajos. Las computadoras han marcado un cambio en la forma de pensar, crear, saber,
trabajar, investigar, entretenernos, de manera que ha provocado nuestra dependencia de ellos. En
realidad es difcil imaginarse nuestra sociedad sin computadoras ya que estn presentes en todos los
campos del saber humano. De hecho, la informtica es actualmente la ciencia que ms ha predominado
en el progreso de las dems disciplinas cientficas, teconolgicas, artsticas y humansticas. La informtica
ha contribuido a generar ms informacin y la informacin es sinnimo de poder.
Cuando la nave Apolo 13 se perdi en el espacio, escasos 90 minutos fueron necesarios para que
los ordenadores de la NASA dieran con la forma de recuperarlos. Con papel y lpiz, a un cientfico
le hubiera tomado un milln de aos la misma hazaa.
En conclusin diramos que la Informtica es muy importante en nuestro mundo actual, debido a que
nos ayuda a mejorar nuestra calidad de vida, a hacer el trabajo ms rpido y buena calidad de
presentacin; nos permite obtener cualquier tipo de informacin deseada en la red (Internet),
comunicarnos con personas de cualquier parte del mundo, nos permite almacenar y procesar grandes
cantidades de informacin, esta presente tambin en los juegos y entretenimiento, control de
dispositivos electrnicos, control de diversas actividades a nivel empresarial e industrial. Tambin est
presente en actividades diarias como: medios de comunicacin (dispositivos mviles, celulares, chat,
videoconferencias), realizar compra y venta por internet (Comercio electrnico), Ver TV y escuchar
radio por Internet, etc. Tambien podramos mencionar reas de la informtica de actual investigacin y
auge en la actualidad como Visin Computacional, Inteligencia artificial, Sistemas Expertos, Lgica
difusa, Biometra, Redes neuronales, Computacin cuntica, etc.
PRESENTACION
La presente obra es un compendio que abarca la implementacin de bases de datos (SQL Server, Oracle,
MySQL, PostgreSQL), y sus diferentes conexiones desde distintos lenguajes de programacin (VB .NET,
C# .NET, Java, PHP).
En el captulo 4 se desarrollaron temas de Business Intelligence SQL Server 2008: Analysis Services, Data
Mining, Integration Services, Reporting Services.
El objetivo es presentar cdigo que ayuden a la enseanza y desarrollo de bases de datos con ejemplos
concretos desde distintos manejadores de base de datos, interactuando desde diferentes lenguajes (.NET,
Java, PHP).
Me gustara hacer hincapi en la importancia del desarrollo de base de datos ya que en la actualidad
facilitan el almacenamiento, procesamiento y recuperacin de la informacin, ayudan a la toma de
decisiones y estn presentes en cualquier tipo de industrias, empresas, organizaciones, bancos, etc.
Espero que la presente obra sirva de ayuda en los temas propuestos, y cualquier sugerencia o consulta no
duden en escribirme al correo electrnico: manhiuco@hotmail.com. Asimismo les invitamos a visitar
nuestra pgina web http://manhiuco.es.tl/
1. Base de Datos
1.1. SQL Server
1.2. Oracle
1.3. MySQL
1.4. PostgreSQL
2.2. JDBC
2.2.1. Conexin JDBC a MySQL
2.2.2. Conexin JDBC a Oracle
2.2.3. Conexin JDBC a SQL Server
2.2.4. Conexin JDBC a PostgreSQL
2.2.5. Ejemplos de uso de los Objetos Connection,Statement, PreparedStatement, ResultSet ,
CallableStatement
2.3. PHP
2.3.1. Conexin de PHP a MySQL
2.3.2. Conexin de PHP a SQLServer
2.3.3. Conexin de PHP a Oracle
2.3.4. Conexin de PHP a PostgreSQL
3. Proyecto CompuTienda
3.1. Script Base de Datos Computienda en SQL Server
3.2. Script Base de Datos Computienda en MySQL
3.3. Mantenimiento con Visual Basic .NET con SQL Server
3.4. Mantenimiento Java con MySQL
3.5. Mantenimiento PHP con MySQL
BASE DE DATOS
SQL (Lenguaje de consulta estructurado o Structured Query Language) es un lenguaje declarativo de
acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en stas.
Tipo Descripcin
DML (Data Manipulation Language - Conjunto de sentencias que trabaja con el contenido de la BD
Lenguaje de Manipulacin de datos) (Select , Insert, Update, Delete)
DCL (Data Control Language Lenguaje Conjunto de sentencias de asignacin de permisos (Grant,
de Control de datos) Deny, Revoke)
Usado para gestionar las distintas transacciones que ocurren
TCL (Transactional Control Language
dentro de una base de datos. (Commit, Rollback, Save
Lenguaje de Control de Transacciones)
transaction).
Microsoft SQL Server es un gestor de bases de datos producido por Microsoft basado en el
modelo relacional. Sus lenguajes para consultas son T-SQL y ANSI SQL.
Contenido:
Ejemplo 2:
Diagrama BD Northwind
Employees Orders
OrderID
Customers
EmployeeID
CustomerID
LastName CustomerID
CompanyName
FirstName EmployeeID
ContactName
Title OrderDate
ContactTitle
TitleOfCourtesy RequiredDate
Address
ShippedDate
BirthDate
City CustomerCustomerDemo
HireDate ShipVia CustomerID
Region
Address Freight CustomerTypeID
PostalCode
City ShipName
Country
Region ShipAddress
Phone
PostalCode ShipCity
Fax
Country ShipRegion
HomePhone ShipPostalCode
ShipCountry
CustomerDemographics
Extension
CustomerTypeID
Photo
CustomerDesc
Notes
ReportsTo
PhotoPath
Categories
CategoryID
Shippers
CategoryName
ShipperID
Description
CompanyName
Picture
Phone
EmployeeTerritories
EmployeeID
TerritoryID
Suppliers
Order Details Products SupplierID
OrderID ProductID CompanyName
ReorderLevel Phone
Ejemplo1
Descripcin Sentencia SQL
Mostrar el usuario logueo SELECT suser_sname()
Mostrar la fecha SELECT getdate()
Mostrar el nombre de la estacin de trabajo. SELECT host_name()
Mostrar el nombre de aplicacin de la sesin SELECT app_name()
actual.
SELECT * FROM master.dbo.sysdatabases
Mostrar las Bases de Datos
SELECT NAME FROM master.dbo.sysdatabases
Mostrar las Tablas de una BD SELECT * FROM INFORMATION_SCHEMA.TABLES
Ejemplo2
Descripcin Sentencia SQL
SELECT sin(pi()/2), 2+2*3-6/3,power(5,3),
Realizar clculos matemticos 5%3 as Residuo
Declare @n int
set @n = 290
if @n % 2 = 0
begin
Determinar si un nmero es par o
print El nmero es par'
impar end
else
begin
print 'El nmero es impar'
end
if (SELECT count(*) from products) >10
begin
Obtener los productos almacenados
SELECT productName from products
cuando estos superen las 10
end
unidades, y el numero de ellos
else
cuando no lo superen.
begin
SELECT count (*) from products
end
Ejemplo:
Ejemplos:
Sentencia COMPUTE BY
"Compute by" genera cortes de control y subtotales. Se generan filas de detalle y varios valores
de resumen cuando cambian los valores del campo.
Con "compute by" se DEBE usar tambin la clusula "order by" y los campos que se incluyan
luego de "by" deben estar en el "order by". Listando varios campos luego del "by" corta un grupo
en subgrupos y aplica la funcin de agregado en cada nivel de agrupamiento:
Ejemplo1:
Descripcin Sentencia SQL
Mostrar cada producto y su SELECT productName, quantity from products p
inner join [Order Details] o on
cantidad en los detalles de orden. p.productid=o.productid
Por cada producto generar el order by productName
total de cantidad compute sum (quantity) by productName
Los campos que aparecen luego de la clusula "compute by" DEBEN ser idnticos a un
subconjunto de los campos que aparecen despus de "order by" y estar en el mismo orden.
Ejemplos 2:
Descripcin Sentencia SQL
Mostrar cada producto y su SELECT productName, quantity from products p inner
cantidad en los detalles de join [Order Details] o on p.productid=o.productid
orden. Por cada producto order by productName
compute sum (quantity) by productName
generar el total de cantidad
Muestra cada cliente y su USE NORTHWIND
OrderId. Por cada Cliente SELECT Customers.CompanyName, Orders.OrderID
cuenta el nmero de FROM Customers, Orders
WHERE Customers.CustomerID=Orders.CustomerID
rdenes.
ORDER BY Customers.CustomerID
COMPUTE COUNT(Orders.OrderID) BY Customers.CustomerID
Resultado:
Sentencia ROLLUP-CUBE
CUBE: genera un conjunto de resultados que muestra agregados para todas las combinaciones de valores
de las columnas seleccionadas.
ROLLUP: genera un conjunto de resultados que muestra agregados para una jerarqua de valores de las
columnas seleccionadas.
Grouping es una funcin de agregado que genera una columna adicional en el resultado con el
valor de 1 si la fila se agrega mediante el operador CUBE o ROLLUP 0 cuando la fila no es el
resultado de CUBE o ROLLUP.
Ejemplo 1: Muestra el id del producto y sus cantidades vendidas. Muestra al inicio la suma de
todas las cantidades.
SELECT productid, cantidad=sum(quantity)
from [order details] od group by productid with rollup order by productid
Ejemplo 2: Muestra el id del producto, una columna que determina si es el resultado de una
funcin rollup o cube y sus cantidades vendidas. Muestra al inicio la suma de todas las
cantidades. Darse cuenta que en la suma de los totales tiene 1 en el resultado de la funcin
grouping y el resto su resultado es 0.
Ejemplo3: Muestra el id del producto, una columna que determina si es el resultado de una
funcin rollup o cube y sus cantidades vendidas. Muestra al inicio la suma de todas las
cantidades. Darse cuenta que en la suma de los totales mostramos la palabra Total caso
contrario mostramos su id del producto.
SELECT productid,
ver = case when grouping(od.productid)=1 then 'Total'
else str(productid,10) end,
cantidad=sum(quantity)
from [order details] od
group by productid with rollup
order by productid
SELECT
ver=case
when grouping(p.categoryid)=1 and grouping(od.productid)=1
then 'Total General'
else
case when grouping(p.categoryid)=0 and grouping(od.productid)=1
then space(4) + max(c.categoryname)
else space(7) + max(p.productname)
end
end,
p.categoryid,od.productid,
cate=grouping(p.categoryid),
prod=grouping(od.productid),
precio=sum(od.unitprice),cantidad=sum(od.quantity)
from [order details] od inner join products p
on od.productid=p.productid
inner join categories c on c.categoryid=p.categoryid
group by p.categoryid,od.productid with rollup
order by p.categoryid,od.productid
Ejercicio 5:
Columna Descripcion mostrar Total si es el nivel mximo de agrupamiento. En un Segundo
nivel, mostrar la fecha de la orden de venta. En un tercer nivel, mostrar el nombre del empleado
que atendio dicha ordeny por ultimo en un cuarto nivel, mostrar el nombre del producto.
Columna precio y cantidad, mostrar el precio y la cantidad de los productos en las ventas
realizadas (Tabla order details). Si la cantidad y el precio corresponden a una fila en la que se
muestre el empleado o fecha, deber mostrar la suma de los productos que le corresponden. Si la
fila corresponde al total, deber mostrar la suma de todos los productos.
Columna OrderDate muestra la fecha de la orden.
Columnas employeeid y productid mostrar los ids de empleado y producto respectivamente.
SELECT Descripcion =
case grouping(o.OrderDate) + grouping(e.EmployeeId) + grouping(p.ProductId)
when 3 then 'TOTAL'
when 2 then space(5) + 'Fecha: '+convert(char(12),o.OrderDate,103)
when 1 then space(10) + 'Empleado: '+MAX( e.LastName )
when 0 then space (15)+ MAX( p.ProductName)
end,
Precio = SUM ( d.UnitPrice ), cantidad = sum( d.Quantity ),
o.OrderDate, e.EmployeeId, p.ProductId
--,MAX( e.LastName ), MAX( p.ProductName)
FROM Orders o
INNER JOIN [ORDER DETAILS] d ON o.OrderId = d.OrderId
INNER JOIN Employees e ON e.EmployeeId = o.EmployeeId
INNER JOIN Products p ON p.ProductId = d.ProductId
group by o.OrderDate, e.EmployeeId, p.ProductId with rollup
order by o.OrderDate, e.EmployeeId, p.ProductId
SELECT Descripcion =
case when grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1
then 'TOTAL'
else
case when grouping(o.OrderDate) = 0 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1
then space(5) +'Fecha: '+convert(char(10),o.OrderDate,103)
else
case when grouping(o.OrderDate) = 0 and grouping(e.EmployeeId) = 0
and grouping(p.ProductId) = 1
then space(10) +'Empleado: '+MAX( e.LastName )
else
space(15) +MAX( p.ProductName)
end
end
end,
Precio = SUM ( d.UnitPrice ), cantidad = sum( d.Quantity ),
o.OrderDate, e.EmployeeId, p.ProductId,
MAX( e.LastName ), MAX( p.ProductName)
FROM Orders o
INNER JOIN [ORDER DETAILS] d
ON o.OrderId = d.OrderId
INNER JOIN Employees e
ON e.EmployeeId = o.EmployeeId
INNER JOIN Products p
ON p.ProductId = d.ProductId
group by o.OrderDate, e.EmployeeId, p.ProductId with rollup
order by o.OrderDate, e.EmployeeId, p.ProductId
Ejercicio 6:
Mostrar un reporte que se muetre el total de los totales, el total por cada Fecha, Producto y
Empleado. Los totales que debe de mostrar son totales de suma de precios, suma de cantidades
de unidades vendidas.
SELECT Descripcion =
case when grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1
then 'TOTAL'
else
case when (grouping(o.OrderDate) = 0 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1)
then ' Fecha: '+convert(char(10),o.OrderDate,103)
else
case when (grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 1
and grouping(p.ProductId) = 0)
then ' PRODUCTO: ' + MAX( p.ProductName)
else
-- Encontrar la venta de todos los productos
case when grouping(o.OrderDate) = 1 and grouping(e.EmployeeId)
= 0 and grouping(p.ProductId) = 1
then ' Empleados: ' +MAX( e.LastName)
end
end
end
end,
Precio = SUM ( d.UnitPrice ), cantidad = sum( d.Quantity ),
o.OrderDate, e.EmployeeId, p.ProductId, MAX( e.LastName ), MAX( p.ProductName)
FROM Orders o INNER JOIN [ORDER DETAILS] d ON o.OrderId = d.OrderId
INNER JOIN Employees e ON e.EmployeeId = o.EmployeeId
INNER JOIN Products p ON p.ProductId = d.ProductId
group by o.OrderDate, e.EmployeeId, p.ProductId with cube
HAVING (grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1) or
(grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 0 and
grouping(p.ProductId) = 1) or -- empleado
( grouping(o.OrderDate) = 1 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 0) or -- producto
( grouping(o.OrderDate) = 0 and grouping(e.EmployeeId) = 1 and
grouping(p.ProductId) = 1) -- fecha
order by o.OrderDate, e.EmployeeId, p.ProductId
Resultado:
--Obtener
Obtener una tabla de referencia cruzada cuyos aos sean las columnas con CUBE
select *,
AO_2005+AO_2006+AO_2007 as Total
from
(select
isnull(cast(EmpId as CHAR(5)),'Total')
CHAR EMP,
sum(case when Yr=2005 then Sales else 0 end) AO_2005,
sum(case when Yr=2006 then Sales else 0 end) AO_2006,
sum(case when Yr=2007 then Sales else 0 end) AO_2007
from
(SELECT EmpId, Yr, , SUM(Sales) AS Sales
FROM Sales
GROUP BY EmpId, Yr WITH CUBE) T1
group by T1.EmpId) T2
order by EMP
EJERCICIOS RESUELTOS
17. Obtener una tabla de referencia cruzada del total de ordenes por ao y por cada Trimestre
SELECT anio,
sum(case when trim=1 then 1 else 0 end) Trimestre1,
sum(case when trim=2 then 1 else 0 end) Trimestre2,
sum(case when trim=3 then 1 else 0 end) Trimestre3,
sum(case when trim=4 then 1 else 0 end) Trimestre4
from
( SELECT year(orderdate)as anio,datepart(quarter,orderdate) as trim, orderid
from orders) T
group by anio
18. Obtener una tabla de referencia cruzada del total del flete cobrado por ao y trimestre
SELECT *, Trimestre1+Trimestre2
Trimestre2+Trimestre3+Trimestre4 as Total
from(SELECT anio as Ao,
sum(case when trim=1 then monto else 0 end) Trimestre1,
sum(case when trim=2 then monto else 0 end) Trimestre2,
sum(case when trim=3 then monto else 0 end) Trimestre3,
sum(case when trim=4 then monto else 0 end) Trimestre4
from(
SELECT year(o.orderdate
orderdate)as anio,
datepart(quarter,o.
.orderdate)as trim,
sum(od.quantity*od.
.unitprice*(1-od.discount)) monto
from orders as o join [order details] as od
on o.orderid = od.orderid
orderid
group by o.orderdate
orderdate
)tempo
group by anio)as t;
20. Mostrar las unidades vendidas de cada producto por cada mes
select P.ProductName as Producto,
Producto
sum(CASE WHEN month(O.OrderDate
OrderDate) = 1 THEN D.Quantity ELSE 0 END) AS Enero,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 2 THEN D.Quantity ELSE 0 END) AS Febrero,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 3 THEN D.Quantity ELSE 0 END) AS Marzo,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 4 THEN D.Quantity ELSE 0 END) AS Abril,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 5 THEN D.Quantity ELSE 0 END) AS Mayo,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 6 THEN D.Quantity ELSE 0 END) AS Junio,
sum(CASE WHEN month(O.OrderDate
erDate) = 7 THEN D.Quantity ELSE 0 END) AS Julio,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 8 THEN D.Quantity ELSE 0 END) AS Agosto,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 9 THEN D.Quantity ELSE 0 END) AS Septiembre,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 10 THEN D.Quantity ELSE 0 END)
) AS Octubre,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 11 THEN D.Quantity ELSE 0 END)
) AS Noviembre,
sum(CASE WHEN month(O.OrderDate
OrderDate) = 12 THEN D.Quantity ELSE 0 END)
) AS Diciembre
from [Order Details] D inner join Orders O on D.OrderID = O.OrderID
rID
inner join Products P on D.ProductID = P.ProductID
ProductID
group by P.ProductName order by 1
Vistas (View)
Una vista es como una tabla virtual que almacena una consulta. Los datos accesibles a travs de la vista
no estn almacenados en la base de datos como un objeto.
Las vistas permiten:
- Ocultar informacin: permitiendo el acceso a algunos datos y manteniendo oculto el resto de la
informacin que no se incluye en la vista. El usuario opera con los datos de una vista como si se tratara de
una tabla, pudiendo modificar tales datos.
- Simplificar la administracin de los permisos de usuario: se pueden dar al usuario permisos para
que solamente pueda acceder a los datos a travs de vistas, en lugar de concederle permisos para
acceder a ciertos campos, as se protegen las tablas base de cambios en su estructura.
- Mejorar el rendimiento: se puede evitar tipear instrucciones repetidamente almacenando en una vista el
resultado de una consulta compleja que incluya informacin de varias tablas.
Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unin de varias tablas;
una combinacin de varias tablas; un resumen estadstico de una tabla; un subconjunto de otra vista,
combinacin de vistas y tablas.
Una vista se define usando un "SELECT".
Descripcin Vista
Create view Producto_Categoria_Proveedor
as
SELECT dbo.Suppliers.CompanyName as Proveedor,
dbo.Categories.CategoryName as Categoria,
Crear una Vista que dbo.Products.ProductName as Producto, dbo.Products.UnitPrice
as Precio, dbo.Products.UnitsInStock as Stock
muestre el proveedor
FROM dbo.Categories INNER JOIN
categora de los dbo.Products ON dbo.Categories.CategoryID =
productos, adems de dbo.Products.CategoryID INNER JOIN
su precio y stock dbo.Suppliers ON dbo.Products.SupplierID =
dbo.Suppliers.SupplierID
SP Insertar Personas
CREATE PROCEDURE insertarPersona
@nombres as varchar(50), @apellidos as varchar(50),
@direccion as varchar(150), @telefono as varchar(30),
@celular as varchar(20), @email as varchar(50), @fax as varchar(20),
@fechaNacimiento as datetime, @lugarNacimiento as varchar(50), @ocupacion as
varchar(20), @sueldo as decimal(10,2), @esJubilado as bit=0 , @nroHijos as tinyint,
@sexo as char(1),
@comentarios as varchar(50), @nombreCategoria as varchar(50)
AS
declare @idCategoria int
-- insertamos en la Tabla Categoria
exec insertarCategoria@nombreCategoria
-- Devolvemos en el idCategoria
SELECT @idCategoria=idCategoria from categoria where
nombreCategoria=@nombreCategoria
--Insertamos en la Tabla Persona
INSERT INTO persona(nombres, apellidos, direccion, telefono, celular, email, fax,
fechaNacimiento, lugarNacimiento, ocupacion, sueldo, esJubilado, nroHijos, sexo,
comentarios, idCategoria)
values(@nombres,@apellidos, @direccion, @telefono, @celular, @email, @fax,
@fechaNacimiento, @lugarNacimiento, @ocupacion, @sueldo, @esJubilado, @nroHijos, @sexo,
@comentarios, @idCategoria)
go
Ejecutar SP insertarPersona:
Exec insertarPersona'Pamela','Chu','Av. Incas
250','253299','995566778','pchu@gmail.com',
'','12/20/1990','Columbine','Carnicera','2500','1',3,'F','','B'
SP-Ejemplos
Descripcin Procedimiento Almacenado Ejecucin del SP
CREATE PROCEDURE OrdersByDate DECLARE @date1 datetime
SP que muestra @StartDate datetime, @EndDate DECLARE @date2 datetime
datetime SET @date1=1/1/1997
las ordenes entre AS SET @date2=3/31/1997
2 fechas SELECT * FROM Orders EXECUTE OrdersByDate @date1,
ingresadas. WHERE OrderDate BETWEEN @date2
@StartDate AND @EndDate
CREATE PROCEDURE DECLARE @date1 datetime
CountOrdersByDate DECLARE @date2 datetime
@StartDate datetime, @EndDate SET @date1='1/1/1997'
datetime, SET @date2='3/31/1997'
SP con @CountOrders intOUTPUT DECLARE @orderCount int
parmetros de AS EXECUTE
salida (output) SELECT @CountOrders CountOrdersByDate@date1,
=COUNT(OrderID)FROM Orders @date2, @orderCount OUTPUT
WHERE OrderDate BETWEEN PRINT'Existen
@StartDate AND @EndDate '+CONVERT(varchar(5),
@orderCount)+' ordenes.'
ALTER PROCEDURE raizN declare @a real, @b real, @c
SP que devuelve @base real, @indiceRadical real real
la raz ensima, as set @a=1000;set @b=3
ingresando una declare @resultado real exec @c= raizN@a,@b
base y el ndice set @resultado print @c
radical. =power(@base,(1/@indiceRadical))
return (@resultado)
EJERCICIOS
BEGIN TRAN
--Iniciamos la transaccin
UPDATE Products SET UnitPrice=@precio1 WHERE ProductName ='Chai'
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su cdigo en @Error
--y saltamos al trozo de cdigo que deshara la transaccin. Si, eso de ah es un
--GOTO, el demonio de los programadores, pero no pasa nada por usarlo
--cuando es necesario
IF (@Error<>0)GOTO TratarError
--Si llegamos hasta aqu es que los dos UPDATE se han completado con
--xito y podemos "guardar" la transaccin en la base de datos
COMMIT TRAN
TratarError:
--Si ha ocurrido algn error llegamos hasta aqu
If @@Error<>0
BEGIN
PRINT'Ha ecorrido un error. Abortamos la transaccin'
--Se lo comunicamos al usuario y deshacemos la transaccin
--todo volver a estar como si nada hubiera ocurrido
ROLLBACK TRAN
END
--Probar el procedimiento
--exec usp_ModificarPrecio2Productos19,20
--SELECT *from Products
3. Uso de Save Transaction (Save Tran crea un punto de almacenamiento dentro de una transaccin)
begin try
BEGIN TRAN saction
--Insertamos la categoria si no existe
If Not exists(SELECT CategoryName from Categories where
CategoryName=@CategoryName)
INSERT INTO Categories(CategoryName)
VALUES(@CategoryName);
-- 1.2 Devolvemos en el id
SELECT @idCategoria=categoryID from Categories where CategoryName=@CategoryName
begin catch
rollback transaction
SELECT @ErrMsg =ERROR_MESSAGE(), @ErrSeverity =ERROR_SEVERITY();
PRINT'Error:'+ERROR_MESSAGE()
raiserror(@ErrMsg,@ErrSeverity,1)
end catch
Probar SP:
exec ups_insertarProducto'P1', 1,'CAT1','1Litro x botella',50,100,60, 15, 0;
SELECT * from Products
Functions
I. Funciones Escalares: Devuelven un tipo de los datos (int, money, varchar, real, etc.) Pueden ser
utilizadas en cualquier lugar incluso incorporado dentro de sentencias SQL.
CREATE FUNCTION [owner_name.] function_name
( [{ @parameter_name scalar_parameter_type [ = default]} [,..n]])
RETURNS scalar_return_type
[WITH <function_option>>::={SCHEMABINDING | ENCRYPTION]
[AS]
BEGIN
function_body
RETURN scalar_expression
END
--Prueba
SELECT dbo.potencia(2,3), dbo.potencia(2.3,3.5), dbo.raiz(8,3)
CREATE FUNCTION dbo.factorial(@n int)
Returns int
as
begin
declare @res int
Crear una funcin if @n<=1
set @res=1
recursiva que else
devuelva el factorial set @res=dbo.factorial(@n-1)*@n
de un nmero.
return @res
end
--Prueba
SELECT dbo.factorial(5)
II. Funciones de tabla en lnea: Devuelven la salida de una simple declaracin SELECT. La salida se
puede utilizar adentro de joins o querys como si fuera un tabla de estndar.
Ejemplo1:
UPDATE @Result
SET on_probation ='N'
UPDATE @Result
SET on_probation ='Y'
WHERE hire_date <'01/01/1991'
RETURN
END
--Pruebas:
SELECT *FROM dbo.multi_test('A')
Ejemplo2:
CREATE FUNCTION dbo.customersbycountry( @Country varchar(15))
RETURNS
@CustomersbyCountryTab table (
[CustomerID] [nchar](5), [CompanyName] [nvarchar](40),
[ContactName] [nvarchar](30), [ContactTitle] [nvarchar](30),
[Address] [nvarchar](60), [City] [nvarchar](15),
[PostalCode] [nvarchar](10), [Country] [nvarchar](15),
[Phone] [nvarchar](24), [Fax] [nvarchar](24)
)
AS
BEGIN
INSERT INTO @CustomersByCountryTab
SELECT [CustomerID],
IF @cnt = 0
INSERT INTO @CustomersByCountryTab(
[CustomerID],
[CompanyName],
[ContactName],
[ContactTitle],
[Address],
[City],
[PostalCode],
[Country],
[Phone],
[Fax] )
VALUES ('','No Companies Found','','','','','','','','')
RETURN
END
GO
--Pruebas
SELECT *FROM dbo.customersbycountry('USA')
SELECT *FROM dbo.customersbycountry('CANADA')
SELECT *FROM dbo.customersbycountry('ADF')
Ejemplo3: Analizar una lista delimitada y convertirlo en un conjunto de filas. Delimitador por defecto es una coma
RETURN
END
--Prueba:
Ejemplo4: Muestra los clientes que hayan pasado un nmero determinado de ventas en un ao determinado
RETURNS
@temp TABLE(
ProductName VARCHAR(200),
CategoryName VARCHAR(200),
CustomerID CHAR(5),
CompanyName VARCHAR(200),
TotalSales INT,
EmployeeNames VARCHAR(2000))
AS
BEGIN
/*
Rellena la tabla temp con la tabla customer que han comprado algun producto
con ventas totales superiores a la cantidad especificada, en el ao dado
*/
INSERT @temp(
ProductName ,
CategoryName ,
CompanyName ,
CustomerID ,
TotalSales
)
SELECT
ProductName,
CategoryName,
CompanyName,
b.CustomerID,
SUM(a.UnitPrice * quantity)AS total_sales
FROM [order details] a
INNER JOIN orders b ON a.orderid = b.orderid
INNER JOIN products c ON c.productid = a.productid
INNER JOIN customers d ON d.customerid = b.customerid
INNER JOIN categories e ON e.CategoryID = c.CategoryID
WHERE DATEPART(YEAR, OrderDate)= @year
/*
Ahora obtenemos todos los empleados con sus clientes que han participado en un ao dado
y retorna una lista separada por comas.
*/
OPEN CustomerCursor
FETCH NEXT FROM CustomerCursor INTO @CustomerID
WHILE @@FETCH_STATUS= 0
BEGIN
INSERT @employees
SELECT DISTINCT FirstName +' '+ LastName
FROM Employees a INNER JOIN Orders b ON a.EmployeeID = b.EmployeeID
AND DATEPART(YEAR,OrderDate)= @year
WHERE b.CustomerID = @CustomerID
UPDATE @temp
SET EmployeeNames = @EmployeeName
WHERE CustomerID = @CustomerID
DELETE @Employees
FETCH NEXT FROM CustomerCursor INTO @CustomerID
END
CLOSE CustomerCursor
DEALLOCATE CustomerCursor
RETURN
END
--Prueba
SELECT *FROM dbo.udf_top_customers_and_reps(1997, 10000)
Columnas computadas: Las funciones escalares se pueden utilizar para crear columnas calculadas en una
definicion de tabla. Los argumentos de las funciones calculadas, columnas de tabla, constantes, o funciones
incorporadas. Este ejemplo muestra una tabla que utilice una funcin del volumen para calcular el volumen
de un envase.
Trigger DML.
No existe una tabla UPDATED? No, hacer una actualizacin es lo mismo que borrar (deleted) e insertar los nuevos
(inserted). La sentencia UPDATE es la nica en la que inserted y deleted tienen datos simultaneamente.
Ejemplo: Crear un Trigger en la Tabla Categories tal q al actualizar, actualizar o elimianr algn dato, se
muestre la tabla inserted y deleted
--Prueba:
update categories set categoryName='Nueva categoria'where categoryID=9
insert categories(categoryName)values('Categoria N')
delete categories where categoryID=9
SELECT *from categories
Descripcin Trigguer
Desactiva el trigger DISABLE TRIGGER TR_Categories
Activa el trigger ENABLE TRIGGER TR_Categories
Desactiva todos los trigger de la tabla Categories ALTER TABLE Categories DISABLE TRIGGER ALL
Activa todos los trigger de la tabla Categories ALTER TABLE Categories ENABLE TRIGGER ALL
Trigger DDL
CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety>
ON DATABASE
FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE>
AS
BEGIN
...
END
La siguiente instruccin impide que se ejecuten sentencias drop table y alter table en la base de datos.
Cursores
Un cursor es una variable que nos permite recorrer con un conjunto de resultados obtenido a travs de
una sentencia SELECT fila a fila.
@@FETCH_STATUS: Devuelve el estado de la ltima instruccin FETCH de cursor emitida para cualquier
cursor abierto en ese momento por la conexin.
Ejemplo:
-- Declaracion de variables para el cursor
DECLARE @Id int,
@Nombre varchar(80),
@Apellido varchar(80),
@FechaNacimiento datetime
-- Declaracin del cursor
DECLARE cClientes CURSORFOR
SELECT EmployeeID, FirstName, LastName, Birthdate
FROM employees
OPEN cClientes -- Apertura del cursor
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS= 0
BEGIN
SET @fileName = @path + @name +'_'+ @fileDate +'.BAK'
BACKUP DATABASE @name TODISK= @fileName
CLOSE db_cursor
DEALLOCATE db_cursor
DECLARE<nombre_cursor>CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR<sentencia_sql>
Ejemplo:
--Lectura de fila 5
FETCH ABSOLUTE 5 FROM cClientes INTO @id, @Nombre, @Apellido, @FechaNacimiento
PRINT'Fila 5: '+ @Nombre +' '+ @Apellido +space(5)+cast(@FechaNacimiento as char(12))
SQL Dinmico
La instruccin EXECUTE (EXEC):Permite ejecutar una cadena de caracteres que representa una sentencia SQL.
El principal incoveniente de trabajar con la instruccin EXEC es que no permite el uso de parametros abriendo la
puerta a potenciales ataques de Sql Injections
Ejemplo1:
DECLARE @sql nvarchar(1000)
SET @sql ='SELECT * from employees'
EXEC sp_executesql@sql
Sintaxis:
SELECT <columna no dinamizada>,
[primera columna dinamizada] AS <nombre de columna>, [segunda columna dinamizada] AS <nombre
de columna>
... [ltima columna dinamizada] AS <nombre de columna>
FROM
(<la consulta SELECT que genera los datos>) AS <alias de la consulta de origen>
PIVOT
(<funcin de agregacin>(<columna que se agrega>)
FOR [<columna que contiene los valores que se convertirn en encabezados de columna>]
IN ([primera columna dinamizada], [segunda columna dinamizada] ... [ltima columna dinamizada])
) AS <alias de la tabla dinamizada>
<clusula ORDER BY opcional>;
Pivot Esttico:
--Monto de las ventas por Ao y Trimestres. Agregar una columna al final que muestre
montos totales por cada ao
select Ao,isnull([1],0) as Trimestre1,isnull([2],0) as Trimestre2,isnull([3],0) as
Trimestre3,isnull([4],0) as Trimestre4,
isnull([1],0)+isnull([2],0)+isnull([3],0)+isnull([4],0) as Total from
(SELECT year(o.orderdate)as Ao,
datepart(quarter,o.orderdate)as Trimestre,
sum(od.quantity*od.unitprice*(1-od.discount)) monto
from orders as o join [order details] as od
on o.orderid = od.orderid
group by o.orderdate
) T
PIVOT (sum(monto) FOR Trimestre in ([1],[2],[3],[4])) as Pv
--Mostrar el valor total vendido por cada empleado para los siguientes productos:
--'Alice Mutton','Filo Mix','Flotemysost','Geitost',
'Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread'.
SELECT Empleado, [Alice Mutton],[Filo Mix],[Flotemysost],
[Geitost],[Konbu], [Maxilaku],[Pavlova],[Tofu],[Vegie-spread]
FROM (
select E.lastname+ ' ' + E.firstname as Empleado, P.Productname as Producto ,
sum (OD.Unitprice*OD.Quantity) as Total
FROM
Employees E INNER JOIN Orders O ON E.EmployeeID = O.EmployeeID
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID = P.ProductID
WHERE P.Productname IN('Alice Mutton','Filo Mix','Flotemysost','Geitost',
'Konbu','Maxilaku','Pavlova','Tofu','Vegie-spread')
group by E.lastname+ ' ' + E.firstname ,Productname
) as T
PIVOT(SUM(Total) FOR [Producto] IN ([Alice Mutton],[Filo Mix],[Flotemysost],
[Geitost],[Konbu],[Maxilaku],[Pavlova],[Tofu],[Vegie-spread])) AS PV
--luego ejecutar:
EXEC dynamic_pivot
'SELECT e.lastname as Empleado, o.OrderDate FROM northwind..Employees as e
INNER JOIN northwind..Orders as o ON (e.EmployeeID=o.EmployeeID) ',
'
'Year(OrderDate)',
'Count(OrderDate)'
--luego ejecutar:
EXEC dynamic_pivot
'SELECT s.companyname as Proveedor,coalesce(od.unitprice*od.quantity ,0) as total_cost
FROM northwind..products as p
inner join northwind..[order details] as od on p.productid=od.productid
inner join northwind..suppliers as s on p.supplierid=s.supplierid',
p.supplierid=s.supplierid'
'productname',
'sum(total_cost)'
Oracle es un sistema de gestin de base de datos objeto-relacional (o ORDBMS por el acrnimo en ingls
de Object-Relational Data Base Management System), desarrollado por Oracle Corporation. Se considera
a Oracle como uno de los sistemas de bases de datos ms completos, destacando: soporte de
transacciones, estabilidad, escalabilidad y Soporte multiplataforma.
Fuente: iSIL Tech - Curso de Oracle Database 11g SQL and PL/SQL Fundamentals
Desbloquear cuenta con system. ALTER USER MarketPERU identified by mercado ACCOUNT UNLOCK;
Ejecutar script de crear esquema y @D:\CreaEsquemaMarketPERU.sql
carga de datosde MarketPeru @D:\CargaDatosMarketPERU.sql
Conectarse a MarketPeru. Luego pide
CONNECT MarketPERU;
contrasea (mercado).
Mostra los objetos de un esquema select * from cat;
Diagrama de MarketPeru
Funciones de Cadena
SELECT ASCII('Marinovich') FROM dual; -- Retorna 77
SELECT chr(77) FROM dual; -- Retorna 'M'
SELECT concat('Hola ', 'Mundo') FROM dual; -- Retorna ''Hola Mundo'
SELECT initcap('Oracle es mI PASION') FROM dual; -- Retorna 'Oracle Es Mi Pasion'
--Instr(cadena1, cadena2 [ , n1 [ , n2 ] ] )
--Busca la ocurrencia n2 de cadena2 en cadena1. La bsqueda empieza a partir del caracter en la posicin n1 en
expresinCadena1.
SELECT instr('el murcielago del pielago', 'el', 3, 2) FROM dual; -- Retorna 16
Consultas tablas:
Consultas sencillas:
-- Generar la lista de precios. Mostrar: cdigo del producto, descripcin, presentacin, precio unitario, precio con IGV.
SELECT idProducto "Cdigo", nombre "Descripcin", unidadMedida "Presentacin", precioUnitario "Precio Unitario",
precioUnitario * 1.18 "Precio con IGV" FROM Producto;
-- Mostrar el nombre del proveedor y una columna que muestre la ciudad concatenada con el departamento
SELECT nombre, ciudad || ' - ' || departamento AS Ubicacin FROM Proveedor;
--Mostrar el codigo del producto y su nombre, pero cuyo nombre del producto debe tener la cadena 'BLANC' antes del
ltimo carcter. El ltimo caracter puede ser cualquiera.
SELECT idProducto, nombre FROM Producto WHERE UPPER(nombre) LIKE '%BLANC_';
-- Generar una lista de las guas emitidas desde el 20 Setiembre 2011 al 27 Febrero 2012
SELECT * FROM Guia WHERE fechaSalida BETWEEN '20/09/2011' AND '27/02/2012';
--Listar los empleados mostrando el monto total a abonarle a cada uno por su remuneracin del mes. COnsiderar:
monto =shaberBasico + 10000 * porcentajeComision / 100
SELECT idEmpleado, apellido, haberBasico, porcentajeComision,
haberBasico + 10000 * porcentajeComision / 100 AS monto FROM Empleado;--Incorrecto
--Creamos la secuencia
CREATE SEQUENCE sqCodigo MAXVALUE 99999 start with 7;
--CARACTERES DE ESCAPE:
----Realizar consultas con los caracteres especiales como: ',%,_
select * from categoria where categoria LIKE '%' || '''' || '%';--Muestre las categorias que tienen el caracter '
select * from categoria where descripcion LIKE '%\%%' ESCAPE '\';--Buscar descripcion que contenga el caracter: %
select * from categoria where descripcion LIKE '%\_%' ESCAPE '\';--Buscar descripcion que contenga el caracter: _
Agregacin y agrupamiento:
--Obtener el promedio de los precios unitarios de los productos:
SELECT AVG(precioUnitario) FROM Producto;
/* El operador GROUPING SETS permite que en una sola consulta GROUP BY se presenten grupos
grupo formados por
distintas combinaciones de atributos.
Este ejemplo muestra la suma acumulada del stockActual para tres combinaciones de atributos:
(idCategoria, idProveedor, precioUnitario)
(idCategoria, precioUnitario)
(idProveedor, precioUnitario)
*/
Inner join: es la consulta correlacionada que combina todas las filas que estn relacionadas de
las dos tablas conjuntos de filas.
--Obtener un listado de idCategoria, nombre de la categora, idProducto, nombre producto, unidad y precio
--Relacin entre Categoria y Producto:c (Categoria.idCategoria = Producto.idCategoria)
--Las siguientes consultas devuelven el mismo resultado:
SELECT Categoria.idCategoria, Categoria.categoria, Producto.idProducto, Producto.nombre, Producto.unidadMedida,
Producto.precioUnitario
FROM Categoria, Producto WHERE Categoria.idCategoria = Producto.idCategoria
ORDER BY 2,4;
Se considera como la tabla izquierda, a aquella que se menciona primero en la clusula FROM
-- Generar un listado que muestre el total de unidades entrantes, y el total de unidades salientes, para cada producto.
--La siguiente consulta es un ERROR, la data aparece "inflada"
SELECT Producto.idProducto, Producto.nombre, SUM(Orden_Detalle.cantidadRecibida) entradas,
SUM(Guia_Detalle.cantidad) salidas
FROM Producto INNER JOIN Orden_Detalle ON Producto.idProducto = Orden_Detalle.idProducto
INNER JOIN Guia_Detalle ON Producto.idProducto = Guia_Detalle.idProducto
GROUP BY Producto.idProducto, Producto.nombre
ORDER BY 1;
SOLUCIONES:
--Solucion 1: Usando Vistas
--Antes de crear las vistas se deber otorgar permisos para crear vistas desde system
grant create any view to MarketPeru;
-- Ejecucin de vistas
SELECT * FROM vEntradas;
SELECT * FROM vSalidas;
En cualquiera
lquiera de las 2 soluciones se mostrar
mostrar el resultado:
Cross join: Ess la consulta correlacionada que combina cada una de las filas de una de las tablas
con cada una de las filas de la otra tabla.
/* CROSS JOIN o Producto Cartesiano: Es un join ejecutado sin restricciones */
SELECT Producto.idProducto, Producto.nombre
nombre, Categoria.categoria
FROM Producto CROSS JOIN Categoria;
Natural join: See comparan todas las columnas que tengan el mismo nombre en ambas tablas. La
tabla resultante contiene slo una columna por cada par de columnas con el mismo nombre.
Auto join: Es una consulta correlacionada en la que una tabla se combina consigo misma para
generar un nuevo conjunto de resultados.
/* AUTOJOIN: Es un join ejecutado en un solo conjunto. El conjunto tiene una autorelacin */
-- Cambiar al esquema HR
SELECT employee_id, last_name, job_id, manager_id
FROM Employees
ORDER BY employee_id;
Ejemplo AutoJoin:
-- Consulta autojoin, creacin de la tabla con autorelacin
CREATE TABLE Trabajador(
idTrabajador int PRIMARY KEY,
Apellidos varchar(30) not null,
Jefe int null );
--Consulta que muestre una lista de trabajadores. La lista debe mostrar los apellidos del jefe de cada trabajador.
SELECT T1.idTrabajador, T1.apellidos, T2.apellidos AS Jefe
FROM Trabajador T1 LEFT OUTER JOIN Trabajador T2
ON T1.jefe = T2.idTrabajador;
Se requiere que las consultas a las tablas referenciadas tengan el mismo nmero de columnas, los mismos tipos de
datos, y que las columnas se encuentren en el mismo orden en la lista de cada uno de los SELECT.
Se elimina las filas duplicadas en el resultado. Sin embargo, si usa la opcin ALL, todas las filas (incluso las
duplicadas) son incluidas en el resultado.
Debe especificar los nombres de las columnas en la primera instruccin SELECT. Por consiguiente, si quiere definir
los nuevos ttulos de las columnas para el resultado, debe crear los seudnimos de las columnas en la primera
instruccin SELECT.
Si quiere que el resultado completo sea devuelto en un orden especfico, debe especificar el orden e incluir la
clusula ORDER BY dentro de la sentencia UNION.
INSERT INTO Operarios VALUES( '0967', 'Antonio' ); INSERT INTO Operarios VALUES( '0245', 'Nancy' );
INSERT INTO Operarios VALUES( '0376', 'Carlos' ); INSERT INTO Operarios VALUES( '0879', 'Rosa' );
INSERT INTO Operarios VALUES( '0147', 'Marcos' );
commit;
--INTERSECT entrega las filas que son comunes a las dos consultas.
SELECT idSupervisor AS Empleado, nombre FROM Supervisores
INTERSECT
SELECT idOperario, nombre FROM Operarios;
--MINUS muestra las filas que aparecen en el primer conjunto, pero que no aparecen en el segundo conjunto.
SELECT idOperario AS Empleado, nombre FROM Operarios
MINUS
SELECT idSupervisor, nombre FROM Supervisores;
--Lista de precios de todos los productos, y una columna adicional que muestra la diferencia entre el precio de cada --
producto y el precio promedio de todos los productos.
SELECT idProducto, nombre, precioUnitario,
precioUnitario - (SELECT AVG(precioUnitario) FROM Producto) AS Diferencia
FROM Producto;
-- Obtener una lista de los productos de la categora 1 cuyo precio unitario es mayor al precio promedio de los
-- productos de la categora 6
SELECT idProducto, nombre, precioUnitario
FROM Producto
WHERE idCategoria = 1
AND precioUnitario > (SELECT avg(precioUnitario)
FROM Producto
WHERE idCategoria = 6);
-- Obtener una lista de los productos que no registran salida del almacn
SELECT idProducto, nombre
FROM Producto
WHERE idProducto NOT IN (SELECT idProducto FROM Guia_Detalle);
--consulta que determine el porcentaje de unidades despachadas de cada producto de la categora 4 respecto al total
despachado de la categora.
SELECT Producto.idProducto, Producto.nombre, NVL(SUM(Guia_detalle.cantidad), 0)AS Despachado,
CAST(NVL(SUM(Guia_detalle.cantidad), 0) AS number) /
(SELECT SUM(cantidad)
FROM Guia_detalle INNER JOIN Producto
ON Guia_detalle.idProducto = Producto.idProducto
WHERE Producto.idCategoria = 4) * 100
AS Porcentaje
FROM Producto LEFT OUTER JOIN Guia_detalle ON Producto.idProducto = Guia_detalle.idProducto
WHERE Producto.idCategoria = 4
GROUP BY Producto.idProducto, Producto.nombre;
--Escriba una consulta que entregue una lista de los productos que se despacharon en la fecha que se despach la
ltima salida del almacn.
-- Tenga en cuenta que en dicha fecha se puede haber registrado ms de una salida.
SELECT DISTINCT Guia_detalle.idProducto, Producto.nombre
FROM Guia_detalle INNER JOIN Producto ON Guia_detalle.idProducto = Producto.idProducto
INNER JOIN Guia ON Guia_detalle.idGuia = Guia.idGuia
WHERE Guia.fechaSalida = (SELECT MAX(fechaSalida) FROM Guia);
--Mostrar una lista de los productos que no registran salida del almacn.
SELECT idProducto, nombre
FROM Producto
WHERE idProducto NOT IN (SELECT idProducto FROM Guia_detalle)
ORDER BY idProducto;
--Mostra el nombre y precio de los productos cuyo precio unitario sea menor QUE ALGUNOS de los precios de la
categoria 4
select nombre,precioUnitario from producto
where precioUnitario < ANY(select distinct precioUnitario from producto where idCategoria=4);
--Mostra el nombre y precio de los productos cuyo precio unitario sea menor QUE TODOS los precios de la categoria 4
select nombre,precioUnitario from producto
where precioUnitario < ALL(select distinct precioUnitario from producto where idCategoria=4);
Subconsulta correlacionada: Se presenta cuando la consulta externa debe entregar datos a la consulta
interna para que se pueda ejecutar. La consulta interna se evala repetidamente, una vez por cada fila de la
consulta externa. Se puede definir en la clusula WHERE de la consulta externa usando el operador EXISTS
(Test de existencia).
/* SUBCONSULTA CORRELACIONADA: se ejecuta cada vez que se compara los elementos con la consulta principal */
-- Productos que no registran salida del almacn
SELECT Producto.idProducto, Producto.nombre
FROM Producto
WHERE NOT EXISTS
(SELECT * FROM Guia_detalle
WHERE Producto.idProducto = Guia_detalle.idProducto)
ORDER BY Producto.idProducto;
--Insertamos en la tabal correo una consulta select de la tabla Proveedor, el cual va a insertar el nombre y el correo
que es una cadena que se construirade acuierdo a
-- la primera letra de su nombre concatenado con su apelido y concatenada con la cadena '@marketperu.com'
INSERT INTO Correo
SELECT representante,
LOWER( CONCAT( CONCAT( SUBSTR( representante, INSTR( representante, ',', 1, 1 )+2, 1 ),
SUBSTR( representante,1, INSTR( representante, ' ', 1, 1 )-1 ) ), '@marketperu.com' ) )
FROM Proveedor;
commit;
select * from correo;
Vistas: Es un objeto que almacena una consulta predefinida y que proporciona un modo alternativo de
visualizacin de datos sin tener que redefinir la consulta. Las vistas mejoran el rendimiento de las consultas
ya que la instruccin SELECT asociada se guarda compilada y con su plan de ejecucin ya definido.
--Crearemos otra versin de la vista, pero que no permita hacer mantenimiento de los productos que no
correspondan al filtro definido. Para ello, haremos uso de WITH CHECK OPTION.
-- Creando una vista con WITH CHECK OPTION
CREATE OR REPLACE VIEW v_MisProductos_CHECK
AS
SELECT idProducto, idCategoria, idProveedor,Nombre, Descontinuado
FROM Producto
WHERE idCategoria = 2
WITH CHECK OPTION;
-- Consultando la vista
SELECT * FROM v_MisProductos_CHECK;
Ejemplo:
DECLARE
vFecha VARCHAR2(40);
BEGIN
SELECT TO_CHAR(SYSDATE, 'Day, DD "de" Month "de" YYYY', 'NLS_DATE_LANGUAGE=Spanish') INTO vFecha FROM
DUAL;
dbms_output.put_line('Hoy es: ' || vFecha);
END;
Declaracion de variables.
%TYPE: Este operador permite declarar una variable del mismo tipo que otra variable, constante columna.
DECLARE
vNombre varchar2(20);
nEdad number := 18;
dFechaIngreso date := '15/11/2001';
dFechaContrato Empleado.fechaContrato%TYPE;
Condicional IF:
Sintaxis
IF (expresin_lgica) THEN IF (expresin_lgica) THEN IF (expresin_lgica1) THEN
... ... ...
ELSEIF (expresin_lgica2) THEN
END IF; ELSE ...
... ELSEIF (expresin_lgica3) THEN
END IF; ...
[ ELSE
... ]
END IF;
Ejemplo:
--Muestra el mensaje si hay suficiente stock, si hay que reponer mercaderia o si esta cercano al valor minimo del
stock del producto.
--Adicionalmente tambien valida si existe o no el producto
DECLARE
nActual Producto.stockActual%TYPE;
nMinimo Producto.stockMinimo%TYPE;
vMensaje VARCHAR2(50);
vMensaje2 VARCHAR2(50);
nProducto int:=27;
nAux int;
BEGIN
dbms_output.put_line(vMensaje||vMensaje2);
END;
Condicional CASE:
Sintaxis
CASE selector CASE
WHEN valor1 THEN WHEN expresin_lgica1 THEN
... ...
WHEN valor2 THEN WHEN expresin_lgica2 THEN
... ...
... ...
[ ELSE [ ELSE
... ] ... ]
END CASE; END CASE;
--La siguiente consulta califica el nivel de las unidades despachadas de los productos de la categora 2.
SELECT Producto.idProducto, Producto.nombre,
CASE
WHEN SUM(Guia_detalle.cantidad) < 200 THEN
'Nivel muy bajo, < 200 unidades'
WHEN SUM(Guia_detalle.cantidad) >= 200 AND SUM(Guia_detalle.cantidad) < 350 THEN
'Nivel bajo, 200 <= unidades < 350'
WHEN SUM(Guia_detalle.cantidad) >= 350 AND SUM(Guia_detalle.cantidad) < 500 THEN
'Nivel medio, 350 <= unidades < 500'
WHEN SUM(Guia_detalle.cantidad) >= 500 AND SUM(Guia_detalle.cantidad) < 750 THEN
'Nivel alto, 500 <= unidades < 750'
WHEN SUM(Guia_detalle.cantidad) >= 750 THEN
'Nivel muy alto, >= 750 unidades'
END CASE
FROM Producto INNER JOIN Guia_detalle ON Producto.idProducto = Guia_detalle.idProducto
WHERE Producto.idCategoria = 2
GROUP BY Producto.idProducto, Producto.nombre;
--La siguiente funcin establece si el precio del producto X est por encima por debajo del precio promedio de todos
los productos.
CREATE OR REPLACE FUNCTION fnPrecioAltoBajo(
nProducto Producto.idProducto%TYPE) RETURN VARCHAR2
IS
vMensaje VARCHAR2(50);
nPrecio Producto.precioUnitario%TYPE;
nPromedio Producto.precioUnitario%TYPE;
BEGIN
SELECT AVG(precioUnitario) INTO nPromedio FROM Producto;
SELECT precioUnitario INTO nPrecio FROM Producto WHERE idProducto = nProducto;
CASE
WHEN (nPrecio > nPromedio) THEN
vMensaje := 'Precio por encima del promedio';
WHEN (nPrecio = nPromedio) THEN
vMensaje := 'Precio promedio';
WHEN (nPrecio < nPromedio) THEN
vMensaje := 'Precio por debajo del promedio';
END CASE;
vMensaje := 'Producto ' || to_char(nProducto) || ' ' || to_char(nPrecio) || ' - ' || vMensaje;
RETURN vMensaje;
END;
/
Bucle WHILE: Permite ejecutar un conjunto de instrucciones en forma repetida. La ejecucin del bucle
se controla evaluando una expresin lgica antes del inicio de cada una de las repeticiones.
Sintxis
WHILE (expresin_lgica) LOOP
...
END LOOP;
Procedimientos
Registro (Record): El registro es una estructura de datos que puede almacenar datos de distinto tipo.
Sintxis
TYPE tipo_registro IS RECORD (
campo1 tipo1 [NOT NULL] [:= valor1],
campo2 tipo2 [NOT NULL] [:= valor2],
...
);
nombre_variable_registro tipo_registro
Ejemplo:
--Creacion del registro:
TYPE regProducto IS RECORD(
precio Producto.precioUnitario%type,
unidad Producto.unidadMedida%type,
stock Producto.stockActual%type);
--Declaracion de un registro:
miProducto regProducto;
Operador %ROWTYPE: Declara en forma implcita un registro que tiene la misma estructura que una
fila de una tabla. Los campos del registro tienen el mismo nombre que las columnas correspondientes en
la tabla.
Sintxis
nombre_variable_registro nombre_tabla%ROWTYPE
Ejemplo:
--Crear un procedimiento que permita obtener los datos de un proveedor ingresando su id
CREATE OR REPLACE PROCEDURE prDatosProveedor(nProveedor Proveedor.idProveedor%TYPE)
IS
regProveedor Proveedor%ROWTYPE;
BEGIN
SELECT * INTO regProveedor
FROM Proveedor WHERE idProveedor = nProveedor;
dbms_output.put_line('Nombre: '|| regProveedor.nombre);
dbms_output.put_line('Representante: '|| regProveedor.representante );
END;
/
--Ejecutamos el procedimiento.
EXECUTE prDatosProveedor(5);
Por Referencia: los valores de los parmetros pueden especificarse en cualquier orden, y puede omitir parmetros que
permiten valores nulos o que tienen un valor por defecto.
[ EXECUTE ] nombre_procedimiento
[ parmetro => valor ], [ parmetro => valor ], ...
Por Posicin: los valores de los parmetros se listan en el orden en que se definieron en la sentencia CREATE
PROCEDURE.
Sintxis
[ EXECUTE ] nombre_procedimiento [ valor1 [ , valor2 ] , ... ]
EXECUTE listaNumerosPrimos(20);
Excepciones predefinidas
Excepcin Descripcin
VALUE_ERROR Se presenta cuando existe conflicto de tipos de datos.
NO_DATA_FOUND Ocurre cuando una instruccin SELECT no retorna filas.
TOO_MANY_ROWS Ocurre cuando una instruccin SELECT retorna ms de una fila.
INVALID_CURSOR Se presenta cuando se hace referencia a un cursor que est cerrado.
CURSOR_ALREADY_OPEN Se presenta cuando se trata de abrir un cursor abierto.
Funciones: Son rutinas que aceptan parmetros, ejecutan un proceso, y retornan el resultado del
proceso como un valor.
Sintxis
CREATE [OR REPLACE] FUNCTION nombre_funcin(
parmetro1 [ modo_parmetro1 ] tipo_dato1,
parmetro2 [ modo_parmetro2 ] tipo_dato2,
...)
RETURN tipo_dato_valor_retorno
IS | AS
...
BEGIN
...
EXCEPTIONS
...
END;
Ejemplo.
--Funcion que retorna el monto ingresando idGuia
CREATE OR REPLACE FUNCTION fnMontoGuia(nGuia NUMBER) RETURN NUMBER
IS
nMonto NUMBER;
BEGIN
SELECT SUM(precioVenta * cantidad) INTO nMonto
FROM Guia_detalle
WHERE idGuia = nGuia;
RETURN nMonto;
END;
/
--Ejecutamos la funcion
SELECT fnMontoGuia(87) FROM DUAL;
Transacciones: Son un conjunto de modificaciones de datos (operaciones) que debe ser procesado
como una unidad. El motor de base de datos utiliza los bloqueos como un mecanismo para garantizar las
transacciones y mantener la consistencia de la base de datos cuando muchos usuarios acceden
simultneamente a ella.
Ejemplo:
CREATE TABLE PruebaBatch(ColA NUMBER PRIMARY KEY,ColB VARCHAR2(3) NOT NULL);
Desencadenantes a nivel de tabla (desencadenantes DML): se ejecutan cuando una declaracin DML (Data
Manipulation Language) como INSERT, UPDATE DELETE ocurre en la base de datos.
Desencadenantes DML: Un desencadenante es definido especficamente para una tabla vista, y para ser
ejecutado automticamente cuando se produce una insercin, actualizacin o eliminacin de filas.
A diferencia de los procedimientos, un desencadenante no puede ser llamado directamente, y no acepta o retorna
parmetros.
-- Registrando la factura 3
INSERT INTO Factura VALUES( 3, '02/11/2005', 'Rep. Asuncin', NULL );
-- Probando el desencadenante
INSERT INTO DetalleFactura VALUES( 3, 101, 12.5, 100 );
INSERT INTO DetalleFactura VALUES( 3, 127, 15, 100 );
INSERT INTO DetalleFactura VALUES( 3, 107, 10, 100 );
commit;
-- Verificando la data
SELECT * FROM DetalleFactura;
SELECT * FROM Factura;
Desencadenantes DCL: Se dispara en respuesta a la ejecucin de una sentencia DDL. Puede ser usado para
ejecutar tareas administrativas en la base de datos, tales como auditora y control de las operaciones de bases de datos.
Cursores: Un cursor es un elemento de SQL que permite recorrer un conjunto de filas, y procesarlas una por una.
Sintaxis:
Atributo Descripcin
%Found Retorna TRUE si la ltima instruccin FETCH se llev a cabo con xito; es decir, recuper
una fila.
%NotFound Retorna TRUE si la ltima instruccin FETCH no tuvo xito.
%RowCount Retorna la cantidad de filas extradas del cursor.
%IsOpen Retorna TRUE si el cursor est abierto. En caso contrario, retorna FALSE.
execute prTodasCategorias2;
Ejemplo:
CREATE OR REPLACE PROCEDURE prEjecutaSQLDinamico(vComando VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE vComando;
END;
/
EXECUTE prEjecutaSQLDinamico('CREATE TABLE PruebaSQLDinamico(codigo NUMBER, nombre VARCHAR2(15))');
EXECUTE prEjecutaSQLDinamico('INSERT INTO PruebaSQLDinamico VALUES(101, ''Rosa'')');
SELECT * FROM PruebaSQLDinamico;
Consta de 2 partes:
Especificacin del paquete: Es la interfaz del paquete y contiene las declaraciones de variables,
constantes, tipos, cursores, excepciones y subprogramas a las que se puede hacer referencia desde fuera
del paquete.
Sintxis
Sintxis
CREATE [ OR REPLACE ] PACKAGE BODY nombre_paquete
AS
implementacin
END;
Ejemplo:
--Procedimiento que ingresa el id del producto y devuelve el stock actual y stock minimo
PROCEDURE SP_StockProducto(pi_idProducto Producto.idProducto%TYPE,po_stockActual OUT
NUMBER,po_stockMinimo OUT NUMBER);
END;
/*
EXCEPTION
WHEN OTHERS THEN
po_intCodError := SQLCODE;
po_strDetError := SUBSTR(SQLERRM, 1, 100);
*/
END SP_ReporteSalidasxDia;
END;
Insertar datos
INSERT INTO Alumnos values (1010,'Abanto','Luis');
INSERT INTO NOTAS VALUES ('MYSQL', 1010, 15,18), ('PHP', 1010, 17,19), ('VB.NET', 1010, 16,17);
/* Ordenar registros */
SELECT distinct country from customers order by country;
/* mostrar el nombre, precio y las unidades de stock de los productos ordenados por el nombre del producto*/
SELECT productName, UnitPrice,UnitsInStock from Products order by productName;
/*Mostrar los productos y mostrar Si en caso estn descontinuados y NO en cualquier otro caso*/
SELECT productName,
case when discontinued =1 then 'Si'
else 'No' END as Suspendido
from products;
/* Obtener de todo*/
SELECT COUNT(*) as NroProductos,SUM(UnitPrice) as Stock, AVG(UnitPrice) as PrecioPromedio,
MAX(UnitPrice) as Alto,MIN(UnitPrice) as Bajo from Products;
/* Obtener el codigo del empleado que mas pedidos atendi Usar ORDERS*/
SELECT EmployeeId, count(*) as nro
from orders
group by EmployeeId order by nro desc limit 1;
/*SUBCONSULTAS*/
/*Obtener el nmero de clientes totales*/
SELECT count(*) from customers;
/*Obtener el nmero de clientes que han comprado por lo menos una vez*/
SELECT count(distinct customerId) from orders;
/*Obtener el nombre del producto, el precio Unitario y el precio Promedio del producto*/
SELECT productName, UnitPrice, (SELECT AVG(UnitPrice) as Promedio from Products) Promediofrom Products;
JUNTURAS
/*obtener los productos que se vendieron en el pedido 10248*/
SELECT * from orderdetails where orderid=10248;
/*obtener el nombre de los productos que se vendieron en el pedido 10248 usar: products y orderdetails */
SELECT p.productname, o.unitprice, o.quantity from products p join orderdetails ousing (productid)
where orderid=10248;
/*obtener el nombre del cliente del pedido 10248 usar: customers y orders*/
SELECT companyname, orderdate, ordered from customers join orders using(customerid)where orderid=10248;
/*mostrar el flete (freight) cobrado por cada compaia de envio. usar: orders(shipvia) y shippers(shipperid)*/
SELECT companyname, sum(freight) as flete from shippers s join orders o on (s.shipperid=o.shipvia)
group by companyname with rollup;
--si se utilize order by ya no se usa rollup
/*hacer una consulta de union para mostrar el nombre de la categoria, el nombre del producto, el precio del
productoy el nombre del proveedorusar:categories, products y suppliers */
SELECT categoryname, productname, unitprice, companyname from products join categories using (categoryid)
join suppliers using (supplierid);
/*hacer una consulta de union para mostrar el nombre del cliente, el nombre completo del empleado que lo atendi
y la fecha en que se vendio el pedido 10248 */
SELECT companyname, concat(lastname, ' ' ,firstname) as empleado, orderdate
from orders join customers using (customerid) join employees using (employeeid);
/*utilizando left join. mostrar los clientes que aun no han efectuado compra alguna */
SELECT c.customerid, c.companyname, o.customerid from customers c left join orders o using (customerid)
where o.customerid is null;
SELECT c.customerid, c.companyname, o.customerid from orders o right join customers c using (customerid)
where o.customerid is null;
/*obtener el nombre completo del empleadoque mas pedidos atendi. Usar:employees y orders*/
SELECT concat(lastname, ' ', firstname) emp,count(*) nro
from employees join orders using(employeeid)
group by lastname, firstname
order by nro desc
limit 1;
/*obtener el nombre de la empresa que tiene la mayorrecaudacin de flete (freight).usar shippers y orders*/
SELECT companyname, sum(freight) as flete from shippers s join orders o on (s.shipperid=o.shipvia) group by
companyname order by flete desc limit 1;
/*union de resultados*/
SELECT companyname from customers UNION SELECT companyname from suppliers UNION SELECT
companyname from shippers;
SELECT supplierid, companyname from suppliers UNION SELECT shipperid, companyname from shippers;
SELECT anio,
SUM(CASE WHEN TRIM=1 THEN 1 ELSE 0 END) t1,
SUM(CASE WHEN TRIM=2 THEN 1 ELSE 0 END) t2,
SUM(CASE WHEN TRIM=3 THEN 1 ELSE 0 END) t3,
SUM(CASE WHEN TRIM=4 THEN 1 ELSE 0 END) t4
FROM tempo
GROUP BY anio;
INSERT INTO tempo SELECT YEAR(orderdate) AS anio, QUARTER(orderdate) AS TRIM, freight FROM orders;
/*USAR JOIN PARA ACTUALIZAR DATOS - ACTUALIZAR EL PRECIO DE LOS PRODUCTOS EN 10%*/
UPDATE products SET unitprice = unitprice * 1.1;
/*ACTUALIZAR EL FLETE COBRADO CON EL 10% DEL VALOR DE LA VENTAS TOTALES DE CADA PEDIDO*/
/***************OJO : MYSQL NO SOPORTA ACTUALIZACION CON UNIONES**************/
/*CREAR UN FUNCION PARA OBTENER EL SUBTOTAL DE LAS VENTAS. USAR LA TABLA ORDERDETAILS
STOTAL=UNIPRICE*QUANTITY*(1-DISCOUNT)*/
create function stotal1(unitprice numeric(10,2), quantity int, discount numeric(5,2)) returns numeric(10,2)
return (unitprice*quantity*(1-discount));
/****PROBANDO *****/
SELECT orderid, productid, unitprice, quantity, discount, stotal1(unitprice,quantity,discount) st from orderdetails
where orderid=10248;
CALL NCOMPLETO_SP;
CALL FACTURA(10248);
/*CREAR UN PROCEDIMIENTO PARA MOSTRAR EL TOTAL DE LAS VENTAS, DISTRIBUIDOS POR AO (FILAS) Y
TRIMESTRE (COLUMNAS)*/
drop procedure if exists rcruzada;
delimiter //
create procedure rcruzada( )
begin
drop table if exists resumen;
create temporary table resumen (anio int, trim int, monto numeric(12,2));
insert into resumen SELECT year(orderdate), quarter(orderdate), unitprice*quantity*(1-discount)
from orders join orderdetails using(orderid);
/*USANDO LA TABLA EMPLOYEES. CREAR UN PROCEDIMIENTO PARA MOSTRAR LOS DATOS DE LOS EMPLEADOS
DE LA SIGUIENTE FORMA: CODIGO, NCOMPLETO DEL EMPLEADO, NCOMPLETO DEL JEFE*/
drop procedure if exists empleados_sp;
delimiter //
create procedure empleados_sp( )
begin
SELECT employeeid as codigo, ncompleto(employeeid) as empleado, ncompleto(reportsto) as jefe
from employees;
end //
delimiter ;
CALL EMPLEADOS_SP();
Usuarios y privilegios
Crear usuarios CREATE USER
Otorgar permisos GRANT
/*los privilegios que le puede conceder a un usuario son:SELECT , CREATE, INSERT, UPDATE, DELETE, DROP,
ALL. Para que JPEREZ pueda actualizar hay que concederle permisos de ACTUALIZACION*/
/*para hacer efectivos estos permisos, se tiene que desconectar y volver a ingresar al usuario*/
Los permisos son: SELECT , CREATE, INSERT, UPDATE, DELETE, DROP, ALL
Pgina 102 Autor: Ing. Nez Marinovich Nstor Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
PostgreSQL es un sistema de gestin de base de datos relacional orientada a objetos (ORDBMS) y libre
basado en el proyecto POSTGRES, de la universidad de Berkeley.
Web: http://www.postgresql.org.pe/
pgAdmin III : Es una aplicacin grfica para gestionar el gestor de bases de datos PostgreSQL.
Elimina caracteres del principio o o final de select trim(leading ' ' from ' Hola Mundo '); -- retorna: "Hola Mundo "
un string. Por defecto elimina los espacios debido a que indicamos que elimine los espacios en blanco de la cadena
en blanco si no indicamos el caracter o solo del comienzo (leading).
string.
select trim(trailing '-' from '--Hola Mundo----');-- retorna: "--Hola
Mundo", esto debido a indicamos que elimine los guiones del final del
string (trailing).
Elimina los caracteres de la izquierda segn select ltrim(' Hola ');--retorna "Hola "
el dato del segundo parmetro de la
funcin. select ltrim('****Hola*','*');--Retorna "Hola*"
Elimina los caracteres de la derecha segn select rtrim(' Hola ');--retorna " Hola"
el dato del segundo parmetro de la
funcin. select rtrim('**Hola*****','*');--Retorna "**Hola"
Rellena de caracteres por la izquierda. El
tamao total de campo es indicado por el
select lpad('Hola',10,'-'); -- retorna: "------Hola"
segundo parmetro y el texto a insertar se
indica en el tercero.
Rellena de caracteres por la derecha. El
tamao total de campo es indicado por el
select rpad('Hola',10,'-'); -- retorna: "Hola------"
segundo parmetro y el texto a insertar se
indica en el tercero.
--Para eliminarlas no se podra eliminar primero ciudad porque al otra tabal depende de esta.
--Lo correcto seria:
El ADO.NET es un conjunto de componentes del software que pueden ser usados por los programadores
para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que estn
incluidas en el Microsoft .NET Framework. Es comnmente usado por los programadores para acceder y
para modificar los datos almacenados en un Sistema Gestor de Bases de Datos Relacionales, aunque
tambin puede ser usado para acceder a datos en fuentes no relacionales.
Cadenas de conexin
Data Source = ServidorSQL; Initial Catalog = BaseDatos;
Autenticacin Windows
Integrated Security = True
Data source = ServidorSQL; initial catalog = BaseDatos; user id =
Autenticacin SQL Server
Usuario; password = Contrasea
End Function
DA.Fill(DS, "Tabla")
dataGrid.DataSource = DS 'HAcemos el enlace del DataSet al datagrid (Databind)
'dt.Rows.Count ' numero de filas del DataTable
dataGrid.DataMember = "Tabla"
End Sub
5. Ejecutar Command
Function ejecutarCommand(ByVal cadenaConexion As String, ByVal sentenciaSQL As String)
' Funcion que ejecuta una sentencia SQL (Insert , Delete, Update)
Dim CN As New SqlConnection(cadenaConexion)
Dim Cmd As New SqlCommand(sentenciaSQL, CN)
Try
CN.Open()
' ejecuta la consulta y devolvemos el numero de filas afectadas
Return Cmd.ExecuteNonQuery
CN.Close()
Catch ex As SqlException
MsgBox(ex.Message)
End Try
End Function
8. Stored Procedure
8.1. Procedimiento que ejecuta un Stored Procedure con parmetros de entrada y
de salida opcionales.
Sub SP_ejecutarStoreProcedure _
(ByVal cadenaConexion As String, _
ByVal nombreStoreProcedure As String, _
Optional ByVal nombreParametrosEntrada() As String = Nothing, _
Optional ByVal valorParametrosEntrada() As String = Nothing, _
Optional ByVal nombreParametrosSalida() As String = Nothing, _
Optional ByRef valorParametrosSalida() As String = Nothing)
' Procedimiento que ejecuta un Store Procedure
' usarlo para sentencias como: Update, Insert, Delete
CMD.Connection.Open()
CMD.ExecuteNonQuery()
If Not nombreParametrosSalida Is Nothing Then
Dim i As Integer
For i = 0 To nombreParametrosSalida.GetUpperBound(0)
valorParametrosSalida(i) = CMD.Parameters(nombreParametrosSalida(i)).SqlValue.ToString
8.3. Funcin que devuelve el resultado de una funcin de usuario en SQL Server.
Tambin podr ser usado en aquellos procedimientos almacenados que tienen
instruccin RETURN.
Function FN_devolverEscalar _
(ByVal cadenaConexion As String, _
ByVal nombreFuncion As String, _
Optional ByVal nombreParametros() As String = Nothing, _
Optional ByVal valorParametros() As String = Nothing)
' Procedimiento que devuelve el resultado de una funcion Escalar de la BD.
' Usarlo tambien para aquellos procedimientos almacenados con instruccion RETURN
Return CMD.Parameters("@resultado").SqlValue.ToString
End Function
8.4. Funcin que devuelve el resultado de una consulta de una Funcin de Tabla
en Linea o Funcin de Tabla Multilinea
Function FN_devolverDT_FuncionReturnTable _
(ByVal cadenaConexion As String, _
ByVal nombreFuncion As String, _
Optional ByVal nombreParametros() As String = Nothing, _
Optional ByVal valorParametros() As String = Nothing)
' Procedimiento que devuelve el resultado de una funcion Tabla en linea o Tabla Multisentencia de la
BD.
'----------------------------------------------------------
'Ejemplo de uso:
' Ejemplo1 - Funcion de Tabla En Linea:
'Dim np() As String = {"@idPedido"}
'Dim vp() As String = {"10"}
'Me.DataGridView1.DataSource = Base_Datos.SQLServer.FN_devolverDT_FuncionReturnTable(Str, "SELECT *
from dbo.DevolverDetallePedido(@idpedido)", np, vp)
End Function
Ejercicios Propuestos
1. Mostrar en un comboBox con los aos existentes en un campo de tipo fecha. El mtodo debe de tener
como parmetros:
Sub llenarComboBox_AosCampoFecha(ByVal cadenaConexion As String, ByVal CBO As ComboBox,
ByVal tabla As String, ByVal campo As String)
2. Llenar un ListView con una determinada sentencia SQL. Sub llenarListView(ByVal cadenaConexion As
String, ByVal sentenciaSQL As String, ByVal LV As ListView)
Pgina 111 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
3. Procedimiento en la que se ingresa una lista de campos y sus respectivas sentencias SQL en las q se
mostraran cada campo con sus respectivos datos en un Treeview. Como nodo padre estar el nombre del
campo, y sus hijos seran sus respectivos datos de acuerdo a la sentencia.
6. Funcin que ejecuta una sentencia y devuelve en una lista (array unidimensional) una determinada
columna (nroColumna) o campo de dicho resultado de la sentencia.
Function devolverColumna_ComoLista (ByVal cadenaConexion As String, ByVal sentenciaSQL As
String, Optional ByVal nroColumna As Integer = 0)
7. Funcin que ejecuta una sentencia y el resultado lo devuelve como un String, teniendo un string como
separadores de fila y otro string de separador de columna.
Function devolverConsulta_ComoString( ByVal cadenaConexion As String, ByVal sentenciaSQL As
String, Optional ByVal caracterSeparacionFilas As String = vbCrLf, Optional ByVal
caracterSeparacionColumnas As String = " ) As String
10. Funcion que devuelve Verdadero si la tabla es vacia, si la tabla tuviera datos devuelve false
Public Function esTablaVacia(ByVal cadenaConexion As String, ByVal nombreTabla As String) As
Boolean
11. Funcin que devuelve Verdadero si la tabla es vaca, si la tabla tuviera datos, devuelve false
Public Function esConsultaVacia(ByVal cadenaConexion As String, ByVal sentencia As String) As Boolean
12. Verifica si existe cierto dato en la BD, ingresando el nombre del campo y el dato a buscar
Public Function verificarExistenciaDato(ByVal cadenaConexion As String, ByVal nombreTabla As String,
ByVal nombreCampo As String, ByVal dato_a_buscar As String) As Boolean
namespace ADO_Oracle
{
class BD_Oracle
{
try
{
CMD.Connection.Open();//Abrimos la conexion
DR = CMD.ExecuteReader();
while (DR.Read()){
LB.Items.Add(DR[campo]);
}
CMD.Connection.Close();//cerramos la conexion
}
catch (Exception)
{
throw;
}
}
try{
}
}
if (nombreParametrosSalida !=null) {
OracleParameter PR;
for (int i = 0; i < nombreParametrosSalida.GetLength(0); i++)
{
PR = new OracleParameter(nombreParametrosSalida[i],
valorParametrosSalida[i]);
PR.Direction = ParameterDirection.Output;
PR.Size = 50;
CMD.Parameters.Add(PR);
}
}
CMD.Connection.Open();
CMD.ExecuteNonQuery();
CMD.Connection.Close();
}
catch (Exception)
{
throw;
}
finally
{
CMD.Connection.Close();
}
}
CMD.Connection.Open();
CMD.ExecuteNonQuery();
CMD.Connection.Close();
return CMD.Parameters["resultado"].Value;
}
}//fin de la clase
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ADO_Oracle
{
public partial class Form1 : Form
{
String strCn; // cadena de conexion
public Form1()
{
InitializeComponent();
}
BD_Oracle.ejecutarComando(strCn, consultaSQL);
MessageBox.Show("INSERT OK");
}
String resultado;
resultado = (String) BD_Oracle.FN_devolverEscalar(strCn, "PaqueteGuia.FN_MontoGuia",
NPE, VPE);
MessageBox.Show(resultado);
}
}
}
Codigo:
Imports MySQLDriverCS
cadenaConexion = _
"Provider=MySQLProv" & _
"; Location=" & Servidor & _
"; Data Source=" & BaseDatos & _
"; User Id=" & Usuario & _
"; Password=" & Contrasea & _
"; Port=" & nroPuerto & _
"; " & parametrosAdicionales
Return cadenaConexion
'"Data Source=BDMediciones_dbo;Password=321814;User
ID=root;Location=190.41.140.220;Port=3306;Extended Properties="""
'http://www.connectionstrings.com/mysql
'Server=serverAddress1 & serverAddress2 &
etc..;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
'Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Encryption=true;
'Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Encrypt=true;
'Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Connection
Timeout=5;
'User ID=root;Password=myPassword;Host=localhost;Port=3306;Database=myDataBase;
Direct=true;Protocol=TCP;Compress=false;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection
Lifetime=0;
End Function
#End Region
#End Region
Pgina 121 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
#End Region
Pgina 122 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
#End Region
#End Region
If incluirCabecerasColumna Then
ReDim matriz(nroFilas, nroColumnas - 1)
If CabecerasColumna Is Nothing Then
' ponemos las cabeceras propias del DataTable
For j = 0 To nroColumnas - 1
matriz(0, j) = DT.Columns(j).Caption
Next
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i + 1, j) = DT.Rows(i).Item(j).ToString()
Next
Next
Else
For j = 0 To nroColumnas - 1
Pgina 125 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
matriz(0, j) = CabecerasColumna(j)
Next
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i + 1, j) = DT.Rows(i).Item(j).ToString()
Next
Next
' ponemos las cabeceras de columna ingresadas en el argumento
End If
Else
' no incluimos cabeceras de columna
ReDim matriz(nroFilas - 1, nroColumnas - 1)
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i, j) = DT.Rows(i).Item(j).ToString()
Next
Next
End If
Return matriz
End Function
Function devolverColumna_ComoLista _
(ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal nroColumna As Integer = 0)
Dim DT As New DataTable
DT = devolverDataTable(cadenaConexion, sentenciaSQL)
Dim i, nroFilas As Integer
nroFilas = DT.Rows.Count
Dim listaResultado(nroFilas - 1) As String
For i = 0 To nroFilas - 1
listaResultado(i) = DT.Rows(i).Item(nroColumna).ToString
Next
Return listaResultado
End Function
Function devolverColumna_ComoString _
(ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal nroColumna As Integer = 0)
Dim DT As New DataTable
DT = devolverDataTable(cadenaConexion, sentenciaSQL)
Dim i, nroFilas As Integer
nroFilas = DT.Rows.Count
Dim cadenaResultado As String
For i = 0 To nroFilas - 1
If i = nroFilas - 1 Then
' si es el ultimo q ya no ponga vbcrlf
cadenaResultado &= DT.Rows(i).Item(nroColumna).ToString
Else
cadenaResultado &= DT.Rows(i).Item(nroColumna).ToString & vbCrLf
End If
Next
Return cadenaResultado
End Function
' devuelve una matriz resumen de lo que contiene una BD, indicando:
' Nombre de la BD - Nro Tablas - NroColumnas - NroFilas
Dim matrizResultado(3) As String
Dim i As Integer
If cadenaConexion = "" Then
Pgina 126 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
cadenaConexion = Me.generarCadenaConexionMySQL(nombreBaseDatos, , usuario, contrasea)
End If
matrizResultado(0) = nombreBaseDatos
matrizResultado(1) = Me.totalTablas(cadenaConexion, nombreBaseDatos)
matrizResultado(2) = Me.totalCamposBD(cadenaConexion, nombreBaseDatos)
matrizResultado(3) = Me.totalRegistrosBD(cadenaConexion, nombreBaseDatos)
Return matrizResultado
End Function
For i = 0 To listaBD.GetUpperBound(0)
nombreBaseDatos = listaBD(i)
cadenaConexion = Me.generarCadenaConexionMySQL(nombreBaseDatos, , usuario, contrasea)
If Not (nombreBaseDatos = "information_schema" Or nombreBaseDatos = "mysql" _
Or nombreBaseDatos = "phpmyadmin" Or nombreBaseDatos = "test") Then
matrizResultado(cont, 0) = nombreBaseDatos
matrizResultado(cont, 1) = Me.totalTablas(cadenaConexion, nombreBaseDatos)
matrizResultado(cont, 2) = Me.totalCamposBD(cadenaConexion, nombreBaseDatos)
matrizResultado(cont, 3) = Me.totalRegistrosBD(cadenaConexion, nombreBaseDatos)
cont += 1
End If
Next
Return matrizResultado
End Function
#End Region
End Function
Return resultado
End Function
Return resultado
End Function
#End Region
#End Region
#Region "DataGrid"
DA.Fill(DS, "Tabla")
dataGrid.DataSource = DS 'HAcemos el enlace del DataTable al datagrid (Databind)
'dt.Rows.Count ' numero de filas del DataTable
dataGrid.DataMember = "Tabla"
End Sub
DS = DG.DataSource
DG.TableStyles.Clear()
TableStyle1.MappingName = DS.Tables(0).TableName
TableStyle1.AlternatingBackColor = DG.AlternatingBackColor
TableStyle1.BackColor = DG.BackColor
TableStyle1.HeaderBackColor = DG.HeaderBackColor
TableStyle1.HeaderForeColor = DG.HeaderForeColor
TableStyle1.ForeColor = DG.ForeColor
TableStyle1.SelectionBackColor = DG.SelectionBackColor
TableStyle1.GridLineColor = DG.GridLineColor
COLUMNA.Width = arregloDimensiones(j)
TableStyle1.GridColumnStyles.Add(COLUMNA)
Next
Else
MsgBox("Ingrese dimensiones completas")
End If
DG.TableStyles.Add(TableStyle1)
End Sub
DT = DG.DataSource
Pgina 129 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
DG.TableStyles.Clear()
TableStyle1.MappingName = DT.TableName
TableStyle1.AlternatingBackColor = DG.AlternatingBackColor
TableStyle1.BackColor = DG.BackColor
TableStyle1.HeaderBackColor = DG.HeaderBackColor
TableStyle1.HeaderForeColor = DG.HeaderForeColor
TableStyle1.ForeColor = DG.ForeColor
TableStyle1.SelectionBackColor = DG.SelectionBackColor
TableStyle1.GridLineColor = DG.GridLineColor
COLUMNA.Width = arregloDimensiones(j)
TableStyle1.GridColumnStyles.Add(COLUMNA)
Next
Else
MsgBox("Ingrese dimensiones completas.")
End If
DG.TableStyles.Add(TableStyle1)
End Sub
#End Region
#Region "ListView"
Dim i, j As Integer
LV.Items.Clear()
LV.View = View.Details
LV.FullRowSelect = True ' permite la seleccion de toda una fila
'lv.GridLines = True ' muestra el listview una grilla
LV.AllowColumnReorder = True ' permite cambiarle el orden de aparicion de las columnas
If Not cabeceras Is Nothing Then
LV.Columns.Clear()
For i = 0 To cabeceras.GetUpperBound(0)
LV.Columns.Add(cabeceras(i), 100, HorizontalAlignment.Center)
Next
End If
Dim ls As ListViewItem
If enumerarFilas Then
' enumeramos las filas en la primera columna del listview
For i = 0 To DT.Rows.Count - 1
ls = LV.Items.Add(i + 1)
For j = 0 To DT.Columns.Count - 1
ls.SubItems.Add(DT.Rows(i).Item(j).ToString)
Next
Next
Else
' No enumeramos las filas
For i = 0 To DT.Rows.Count - 1
ls = LV.Items.Add(DT.Rows(i).Item(0).ToString)
For j = 1 To DT.Columns.Count - 1
ls.SubItems.Add(DT.Rows(i).Item(j).ToString)
Next
Pgina 131 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
Next
End If
End Sub
If enumerarFilas Then
' Enumeramos las filas
' llenamos las cabeceras de columna del ListView
ListView.Columns.Add("Nro", 40, HorizontalAlignment.Center)
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Add(listaCampos(i), 100, HorizontalAlignment.Left)
Next
CN.Open()
DR = CMD.ExecuteReader()
' llenamos el ListView con los datos del dataReader
Dim reg As Integer = 0
While DR.Read
'ls = ListView.Items.Add(Trim(DR.Item(listaCampos(0))))
reg += 1
ls = ListView.Items.Add(reg)
For i = 0 To listaCampos.GetUpperBound(0)
ls.SubItems.Add(DR.Item(listaCampos(i).ToString).ToString)
Next
End While
CN.Close()
Else ' No enumeramos las filas
' llenamos las cabeceras de columna del ListView
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Add(listaCampos(i), 100, HorizontalAlignment.Center)
Next
CN.Open()
DR = CMD.ExecuteReader()
' llenamos el ListView con los datos del dataReader
While DR.Read
ls = ListView.Items.Add(DR.Item(listaCampos(0)).ToString)
For i = 1 To listaCampos.GetUpperBound(0)
ls.SubItems.Add(DR.Item(listaCampos(i)).ToString)
Next
End While
CN.Close()
End If
If Not cabeceraColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
Pgina 132 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
ListView.Columns.Item(i).Text = cabeceraColumna(i).Trim
Next
End If
If Not anchoColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Item(i).Width = anchoColumna(i)
Next
End If
If Not alineamientoColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Item(i).TextAlign = alineamientoColumna(i)
Next
End If
Catch ex As MySQLException
MsgBox(ex.Message)
End Try
End Sub
#End Region
#Region "TreeView"
' devuelve una matriz resumen de lo que contiene una BD, indicando:
' Nombre de la BD - Nro Tablas - NroColumnas - NroFilas
TV.Nodes.Clear()
Dim i, j, k As Integer
For i = 0 To listaBD.GetUpperBound(0)
nombreBaseDatos = listaBD(i)
End Sub
' devuelve una matriz resumen de lo que contiene una BD, indicando:
' Nombre de la BD - Tablas - Columnas
TV.Nodes.Clear()
Dim i, j As Integer
For i = 0 To listaBD.GetUpperBound(0)
nombreBaseDatos = listaBD(i)
End Sub
#End Region
#End Region
End Sub
#End Region
#Region "Insertar"
End Using
''''''''''''''''''''''''''' Modo de uso:
'Dim strMySQL As String
'strMySQL = Mauco.Base_Datos.MySql.generarCadenaConexionMySQL("hotel", , , "pni")
'Dim vc() As Object = {"campoS", "CampoE", "CampoD", "CampoB"} '
'Dim vi() As Object = {Me.TextBox1.Text, val(me.textbox2.text), "3000-05-20", 0}
'Mauco.Base_Datos.MySql.insertarRegistro(strMySQL, "TablaT", vc, vi)
End Sub
End Using
''''''''''''''''''''''''''' Modo de uso:
'Dim strMySQL As String
'strMySQL = Mauco.Base_Datos.MySql.generarCadenaConexionMySQL("hotel", , , "pni")
'Dim valores(,) As Object = {{"campoS", Me.TextBox1.Text}, {"CampoE", 25}, {"CampoD", "3000-
05-20"}, {"CampoB", 0}}
'Mauco.Base_Datos.MySql.insertarRegistro(strMySQL, "TablaT", valores)
End Sub
#End Region
#Region "Modificar"
End Using
End Sub
#End Region
ListBox.Left = text.Left
ListBox.Visible = True
sentencia = _
"select distinct " & nombreCampo & " from " & nombreTabla & _
" where "
Select Case TipoBusqueda
Case TipoBusqueda.Comienze
sentencia &= _
nombreCampo & " like '" & TextoBuscar & "%' order by " & nombreCampo
Case TipoBusqueda.Contenga
sentencia &= _
nombreCampo & " like '%" & TextoBuscar & "%' order by " & nombreCampo
Case TipoBusqueda.Igual
sentencia &= _
nombreCampo & " = '" & TextoBuscar & "' order by " & nombreCampo
Case TipoBusqueda.Termine
sentencia &= _
nombreCampo & " like '%" & TextoBuscar & "' order by " & nombreCampo
End Select
Dim cn As New MySQLConnection(cadenaConexion)
Dim CMD As New MySQLCommand(sentencia, cn)
Dim DR As MySQLDataReader
With CMD
.Connection.Open()
DR = .ExecuteReader
While DR.Read
Pgina 139 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
ListBox.Items.Add(DR(nombreCampo))
End While
.Connection.Close()
End With
If ListBox.Items.Count = 0 Then ListBox.Visible = False
End Sub
ListBox.Top = topListBox
ListBox.Left = leftListBox
Pgina 140 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
ListBox.Visible = True
sentencia = _
"select distinct " & nombreCampo & " from " & nombreTabla & _
" where "
Select Case TipoBusqueda
Case TipoBusqueda.Comienze
sentencia &= _
nombreCampo & " like '" & TextoBuscar & "%' order by " & nombreCampo
Case TipoBusqueda.Contenga
sentencia &= _
nombreCampo & " like '%" & TextoBuscar & "%' order by " & nombreCampo
Case TipoBusqueda.Igual
sentencia &= _
nombreCampo & " = '" & TextoBuscar & "' order by " & nombreCampo
Case TipoBusqueda.Termine
sentencia &= _
nombreCampo & " like '%" & TextoBuscar & "' order by " & nombreCampo
End Select
Dim cn As New MySQLConnection(cadenaConexion)
Dim CMD As New MySQLCommand(sentencia, cn)
Dim DR As MySQLDataReader
With CMD
.Connection.Open()
DR = .ExecuteReader
While DR.Read
ListBox.Items.Add(DR(nombreCampo))
End While
.Connection.Close()
End With
If ListBox.Items.Count = 0 Then ListBox.Visible = False
End Sub
ListBox.Top = topListBox
ListBox.Left = leftListBox
ListBox.Visible = True
Dim cn As New MySQLConnection(cadenaConexion)
Dim CMD As New MySQLCommand(sentenciaSQL, cn)
Dim DR As MySQLDataReader
With CMD
.Connection.Open()
DR = .ExecuteReader
While DR.Read
ListBox.Items.Add(DR(nombreCampoLlenar))
End While
Pgina 141 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
.Connection.Close()
End With
If ListBox.Items.Count = 0 Then ListBox.Visible = False
End Sub
#End Region
For i = 0 To listaBD.GetUpperBound(0)
If nombreBaseDatos_a_Buscar.ToUpper = listaBD(i).ToUpper Then
resultado = True
Exit For
End If
Next
Return resultado
End Function
For i = 0 To listaTablas.GetUpperBound(0)
If nombreTabla_a_Buscar.ToUpper = listaTablas(i).ToUpper Then
resultado = True
Exit For
End If
Next
Return resultado
End Function
For i = 0 To listaCampos.GetUpperBound(0)
If nombreCampo_a_Buscar.ToUpper = listaCampos(i).ToUpper Then
resultado = True
Exit For
End If
Next
Return resultado
End Function
#End Region
End Function
End Function
#End Region
Function devolverConsulta_ComoString( _
ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal caracterSeparacionFilas As String = vbCrLf, _
Optional ByVal caracterSeparacionColumnas As String = " ", _
Optional ByVal incluirCabeceras As Boolean = False) As String
Dim i, j As Integer
Dim elemento, resultado As String
resultado = ""
Dim nroFilas, nroColumnas As Integer
Pgina 143 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
Dim DT As DataTable
' llenar el DataTable con la consulta
DT = devolverDataTable(cadenaConexion, sentenciaSQL)
nroFilas = DT.Rows.Count
nroColumnas = DT.Columns.Count
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
'DT.Rows(i).Item(nroColumna).ToString()
elemento = DT.Rows(i).Item(j).ToString 'DT.Item(j, i).Value.ToString
resultado &= elemento
'si es que no es el ultimo elemento de la columna
'ya no le ponemos caracter de separacion
If j <> nroColumnas - 1 Then resultado &= caracterSeparacionColumnas
Next
'si es que no es el ultimo elemento de la fila
'ya no le ponemos caracter de separacion
If i <> nroFilas - 1 Then resultado &= caracterSeparacionFilas
Next
Return resultado
End Function
Sub devolverConsulta_ComoArchivo( _
ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal caracterSeparacionFilas As String = vbCrLf, _
Optional ByVal caracterSeparacionColumnas As String = " ", _
Optional ByVal incluirCabeceras As Boolean = False, _
Optional ByVal rutaArchivoGrabar As String = "", Optional ByVal abrirArchivo As Boolean = False)
textoGrabar = devolverConsulta_ComoString( _
cadenaConexion, sentenciaSQL, _
caracterSeparacionFilas, caracterSeparacionColumnas, incluirCabeceras)
End Sub
#End Region
End Class
#End Region
'Agregar Referencia:
' Npgsql. dll
' Mono.Security.dll
cadenaConexion = _
"Server=" & Servidor & _
"; Database=" & BaseDatos & _
"; User Id=" & Usuario & _
"; Password=" & Contrasea & _
"; Port=" & nroPuerto & _
"; " & parametrosAdicionales
Return cadenaConexion
'http://www.connectionstrings.com/postgre-sql
'User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;
Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
'Server=127.0.0.1;Port=5432;Database=myDataBase;User Id=myUsername;Password=myPassword;
'Server=127.0.0.1;Port=5432;Database=myDataBase;Integrated Security=true;
'Server=127.0.0.1;Port=5432;Database=myDataBase;User
Id=myUsername;Password=myPassword;CommandTimeout=20;
'Server=127.0.0.1;Port=5432;Database=myDataBase;User
Id=myUsername;Password=myPassword;Timeout=15;
'Server=127.0.0.1;Port=5432;Database=myDataBase;User
Id=myUsername;Password=myPassword;Protocol=3;
End Function
#End Region
End Function
#End Region
#End Region
Pgina 147 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
#End Region
'Ejemplo:
'sentencia = "select * from ""Tabla2"" "
'Dim dt As New DataTable
'dt = Base_Datos.PostgreSQL.devolverDataTable(strcn, sentencia)
'Me.DataGridView1.DataSource = dt
End Function
End Function
#End Region
If incluirCabecerasColumna Then
ReDim matriz(nroFilas, nroColumnas - 1)
If CabecerasColumna Is Nothing Then
' ponemos las cabeceras propias del DataTable
For j = 0 To nroColumnas - 1
matriz(0, j) = DT.Columns(j).Caption
Next
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i + 1, j) = DT.Rows(i).Item(j).ToString()
Next
Next
Else
For j = 0 To nroColumnas - 1
matriz(0, j) = CabecerasColumna(j)
Next
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i + 1, j) = DT.Rows(i).Item(j).ToString()
Next
Next
' ponemos las cabeceras de columna ingresadas en el argumento
End If
Else
' no incluimos cabeceras de columna
ReDim matriz(nroFilas - 1, nroColumnas - 1)
For i = 0 To nroFilas - 1
For j = 0 To nroColumnas - 1
matriz(i, j) = DT.Rows(i).Item(j).ToString()
Next
Next
End If
Return matriz
'Ejemplo
'sentencia = "select * from ""Tabla2"" "
'Dim dt As DataTable
'Dim mm(,) As String
'dt = Base_Datos.PostgreSQL.devolverDataTable(strcn, sentencia)
'mm = Base_Datos.PostgreSQL.devolverMatrizBidimensional(dt, )
'mm = Base_Datos.PostgreSQL.devolverMatrizBidimensional(dt, True)
End Function
Function devolverColumna_ComoLista _
(ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal nroColumna As Integer = 0)
Dim DT As New DataTable
Pgina 151 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
DT = devolverDataTable(cadenaConexion, sentenciaSQL)
Dim i, nroFilas As Integer
nroFilas = DT.Rows.Count
Dim listaResultado(nroFilas - 1) As String
For i = 0 To nroFilas - 1
listaResultado(i) = DT.Rows(i).Item(nroColumna).ToString
Next
Return listaResultado
End Function
Function devolverColumna_ComoString _
(ByVal cadenaConexion As String, ByVal sentenciaSQL As String, _
Optional ByVal nroColumna As Integer = 0)
Dim DT As New DataTable
DT = devolverDataTable(cadenaConexion, sentenciaSQL)
Dim i, nroFilas As Integer
nroFilas = DT.Rows.Count
Dim cadenaResultado As String
For i = 0 To nroFilas - 1
If i = nroFilas - 1 Then
' si es el ultimo q ya no ponga vbcrlf
cadenaResultado &= DT.Rows(i).Item(nroColumna).ToString
Else
cadenaResultado &= DT.Rows(i).Item(nroColumna).ToString & vbCrLf
End If
Next
Return cadenaResultado
End Function
#End Region
#End Region
#Region "DataGrid"
DA.Fill(DS, """Tabla""")
dataGrid.DataSource = DS 'HAcemos el enlace del DataTable al datagrid (Databind)
'dt.Rows.Count ' numero de filas del DataTable
dataGrid.DataMember = """Tabla"""
End Sub
DS = DG.DataSource
DG.TableStyles.Clear()
TableStyle1.MappingName = DS.Tables(0).TableName
TableStyle1.AlternatingBackColor = DG.AlternatingBackColor
TableStyle1.BackColor = DG.BackColor
TableStyle1.HeaderBackColor = DG.HeaderBackColor
TableStyle1.HeaderForeColor = DG.HeaderForeColor
TableStyle1.ForeColor = DG.ForeColor
TableStyle1.SelectionBackColor = DG.SelectionBackColor
TableStyle1.GridLineColor = DG.GridLineColor
COLUMNA.Width = arregloDimensiones(j)
TableStyle1.GridColumnStyles.Add(COLUMNA)
Next
Else
MsgBox("Ingrese dimensiones completas")
End If
DG.TableStyles.Add(TableStyle1)
End Sub
DT = DG.DataSource
DG.TableStyles.Clear()
TableStyle1.MappingName = DT.TableName
TableStyle1.AlternatingBackColor = DG.AlternatingBackColor
TableStyle1.BackColor = DG.BackColor
TableStyle1.HeaderBackColor = DG.HeaderBackColor
TableStyle1.HeaderForeColor = DG.HeaderForeColor
TableStyle1.ForeColor = DG.ForeColor
TableStyle1.SelectionBackColor = DG.SelectionBackColor
TableStyle1.GridLineColor = DG.GridLineColor
COLUMNA.Width = arregloDimensiones(j)
TableStyle1.GridColumnStyles.Add(COLUMNA)
Next
Else
MsgBox("Ingrese dimensiones completas.")
End If
DG.TableStyles.Add(TableStyle1)
End Sub
#End Region
#Region "ListView"
Dim i, j As Integer
LV.Items.Clear()
LV.View = View.Details
LV.FullRowSelect = True ' permite la seleccion de toda una fila
'lv.GridLines = True ' muestra el listview una grilla
LV.AllowColumnReorder = True ' permite cambiarle el orden de aparicion de las columnas
If Not cabeceras Is Nothing Then
LV.Columns.Clear()
For i = 0 To cabeceras.GetUpperBound(0)
LV.Columns.Add(cabeceras(i), 100, HorizontalAlignment.Center)
Next
End If
Dim ls As ListViewItem
If enumerarFilas Then
' enumeramos las filas en la primera columna del listview
For i = 0 To DT.Rows.Count - 1
ls = LV.Items.Add(i + 1)
For j = 0 To DT.Columns.Count - 1
ls.SubItems.Add(DT.Rows(i).Item(j).ToString)
Next
Next
Else
' No enumeramos las filas
For i = 0 To DT.Rows.Count - 1
ls = LV.Items.Add(DT.Rows(i).Item(0).ToString)
For j = 1 To DT.Columns.Count - 1
ls.SubItems.Add(DT.Rows(i).Item(j).ToString)
Next
Next
End If
End Sub
If enumerarFilas Then
' Enumeramos las filas
' llenamos las cabeceras de columna del ListView
ListView.Columns.Add("Nro", 40, HorizontalAlignment.Center)
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Add(listaCampos(i), 100, HorizontalAlignment.Left)
Next
CN.Open()
Pgina 155 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
DR = CMD.ExecuteReader()
' llenamos el ListView con los datos del dataReader
Dim reg As Integer = 0
While DR.Read
'ls = ListView.Items.Add(Trim(DR.Item(listaCampos(0))))
reg += 1
ls = ListView.Items.Add(reg)
For i = 0 To listaCampos.GetUpperBound(0)
ls.SubItems.Add(DR.Item(listaCampos(i).ToString).ToString)
Next
End While
CN.Close()
Else ' No enumeramos las filas
' llenamos las cabeceras de columna del ListView
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Add(listaCampos(i), 100, HorizontalAlignment.Center)
Next
CN.Open()
DR = CMD.ExecuteReader()
' llenamos el ListView con los datos del dataReader
While DR.Read
ls = ListView.Items.Add(DR.Item(listaCampos(0)).ToString)
For i = 1 To listaCampos.GetUpperBound(0)
ls.SubItems.Add(DR.Item(listaCampos(i)).ToString)
Next
End While
CN.Close()
End If
If Not cabeceraColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Item(i).Text = cabeceraColumna(i).Trim
Next
End If
If Not anchoColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Item(i).Width = anchoColumna(i)
Next
End If
If Not alineamientoColumna Is Nothing Then
For i = 0 To listaCampos.GetUpperBound(0)
ListView.Columns.Item(i).TextAlign = alineamientoColumna(i)
Next
End If
Catch ex As NpgsqlException
MsgBox(ex.Message)
End Try
End Sub
#End Region
#Region "TreeView"
#End Region
#End Region
End Sub
#End Region
End Class
#End Region
package pruebas;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.util.logging.Level;
import java.util.logging.Logger;
package pruebas;
// Conexin Oracle
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.util.logging.Level;
import java.util.logging.Logger;
package pruebas;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
package pruebas;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
PHP (acrnimo recursivo que significa PHP Hypertext Pre-processor) es un lenguaje de programacin
interpretado, diseado originalmente para la creacin de pginas web dinmicas. Se usa principalmente
para la interpretacin del lado del servidor (server-side scripting).
Funcin Descripcin
mysql_affected_rows Devuelve el nmero de filas afectadas de la ltima operacin MySQL
mysql_change_user Cambia el usuario conectado en la conexin activa
mysql_client_encoding Devuelve el nombre del juego de caracteres
mysql_close cierra el enlace con MySQL
mysql_connect Abre una conexin a un servidor MySQL
mysql_create_db Crea una base MySQL
mysql_data_seek Mueve el puntero interno
mysql_db_name Obtener datos de resultado
mysql_db_query Envia una sentencia MySQL al servidor
mysql_drop_db Borra una base de datos MySQL
mysql_errno Deuelve el nmero del mensaje de error de la ltima operacin MySQL
mysql_error Devuelve el texto del mensaje de error de la ltima operacin MySQL
mysql_escape_string Escapa una cadena para su uso en mysql_query
Extrae la fila de resultado como una matriz asociativa, una matriz numrica o
mysql_fetch_array
ambas
mysql_fetch_assoc Recupera una fila de resultado como una matriz asociativa
mysql_fetch_field Extrae la informacin de una columna y la devuelve como un objeto.
mysql_fetch_lengths Devuelve la longitud de cada salida en un resultado
mysql_fetch_object Extrae una fila de resultado como un objeto
mysql_fetch_row Devuelve una fila de resultado como matriz
mysql_field_flags Devuelve las banderas asociados con el campo especficado en un resultado
mysql_field_len Devuelve la longitud del campo especficado
mysql_field_name Devuelve el nombre del campo especficado en un resultado
mysql_field_seek Asigna el puntero del resultado al offset del campo especficado
mysql_field_table Devuelve el nombre de la tabla donde est el campo especficado
mysql_field_type Devuelve el tipo del campo especficado en un resultado
mysql_free_result Libera la memoria del resultado
mysql_get_client_info Obtener informacin del cliente MySQL
mysql_get_host_info Obtener informacin de la mquina anfitriona MySQL
mysql_get_proto_info Obtener informacin del protocolo MySQL
mysql_get_server_info Obtener informacin del servidor MySQL
mysql_info Obtiene informacin sobre la consulta ms reciente
mysql_insert_id Devuelve el identificador generado en la ltima llamada a INSERT
mysql_list_dbs Lista las bases de datos disponibles en el servidor MySQL
mysql_list_fields Lista los campos del resultado de MySQL
mysql_list_processes Lista los procesos MySQL
mysql_list_tables Lista las tablas en una base de datos MySQL
mysql_num_fields Devuelve el nmero de campos de un resultado
mysql_num_rows Devuelve el nmero de filas de un resultado
mysql_pconnect Abre una conexin persistente al servidor MySQL
Estructura de archivos:
Script BD mysql
CREATE TABLE IF NOT EXISTS `cliente` (
`id` tinyint(7) NOT NULL auto_increment,
`nombres` varchar(50) NOT NULL,
`ciudad` varchar(50) NOT NULL,
`sexo` char(1) NOT NULL,
`telefono` varchar(10) NOT NULL,
`fecha_nacimiento` datetime NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
conexin.class.php
<?php
class BDMySQL{
var $conect;
var $BaseDatos;
var $Servidor;
var $Usuario;
var $Clave;
function BDMySQL(){
$this->BaseDatos = "bdpersonas";
$this->Servidor = "localhost";
$this->Usuario = "root";
$this->Clave = "mysql";
}
function conectar() {
if(!($con=@mysql_connect($this->Servidor,$this->Usuario,$this->Clave))){
echo"<h1> Error al conectar a la base de datos</h1>";
exit();
}
if (!@mysql_select_db($this->BaseDatos,$con)){
echo "<h1> Error al seleccionar la base de datos</h1>";
exit();
}
$this->conect=$con;
return true;
}
/******************************************************************************
--------------------------------------------------- Funciones de Base de Datos
******************************************************************************/
function devolverEscalar($sentencia)
{
$resultado=@mysql_query($sentencia, $this->conect)
or die("<h2>No se pudo ejecutar la consulta $sentencia.</h2>");
$fila=mysql_fetch_array($resultado);
return $fila[0];
}
function devolverNroRegistrosConsulta($sentencia)
{
$tabla=@mysql_query($sentencia, $this->conect)
or die ("<h2>Error en la consulta</h2>");
/***********Nro de registros ********/
$totalreg=mysql_num_rows($tabla);
return $totalreg;
}
function devolverNroRegistrosTabla($tabla)
{
$sentencia = "select count(*) from $tabla ";
return $this->devolverEscalar($sentencia);
}
function esConsultaVacia($sentencia)
{
$tabla=@mysql_query($sentencia, $this->conect)
or die ("<h2>Error en la consulta</h2>");
if ($totalreg>0)
// Si es mayor q cero entonces no esta vacia
// y asignamos a resultado el valor de 0
$resultado=0;
else
// Si NO es mayor q cero entonces esta vacia
// y asignamos a resultado el valor de 1, indicando q esta vacia
$resultado=1;
return $resultado;
}
function entraConsultaBD_saleColumna($sentencia,$nroColumna=0)
{
/*
Funcion que devuelve en un array los elementos de una determinada columna
de una consulta extraida de la BD.
*/
$tabla=@mysql_query($sentencia, $this->conect)
or die ("<h2>Error en la consulta</h2>");
$resultado=array();
while($fila=mysql_fetch_array($tabla))
{
//agregamos los elementos al array
array_push($resultado,$fila[$nroColumna]);
}
return $resultado;
}
}
?>
Cliente.class.php
<?php
include_once("conexion.class.php");
class Cliente{
//constructor
var $con;
function Cliente(){
$this->con=new BDMySQL;
}
function insertar($campos){
if($this->con->conectar()==true){
//print_r($campos);
//echo "INSERT INTO cliente (nombres, ciudad, sexo, telefono, fecha_nacimiento)
VALUES ('".$campos[0]."', '".$campos[1]."','".$campos[2]."','".$campos[3]."','".$campos[4]."')";
return mysql_query("INSERT INTO cliente (nombres, ciudad, sexo, telefono,
fecha_nacimiento) VALUES ('".$campos[0]."', '".$campos[1]. "','".$campos[2]. "','".$campos[3].
"','".$campos[4]."')");
}
}
function actualizar($campos,$id){
if($this->con->conectar()==true){
//print_r($campos);
return mysql_query("UPDATE cliente SET nombres = '".$campos[0]."', ciudad =
'".$campos[1]."', sexo = '".$campos[2]."', telefono = '".$campos[3]."', fecha_nacimiento =
'".$campos[4]."' WHERE id = ".$id);
}
}
function mostrar_cliente($id){
if($this->con->conectar()==true){
return mysql_query("SELECT * FROM cliente WHERE id=".$id);
}
}
function mostrar_clientes(){
if($this->con->conectar()==true){
return mysql_query("SELECT * FROM cliente ORDER BY id DESC");
}
}
function eliminar($id){
if($this->con->conectar()==true){
return mysql_query("DELETE FROM cliente WHERE id=".$id);
}
}
function totalClientes(){
if($this->con->conectar()==true){
//----Primera forma:
//$tabla=$this->mostrar_clientes();
//return mysql_num_rows($tabla);
//----Segunda forma:
//return $this->con->devolverEscalar("select count(*) from cliente");
//----Tercera forma:
//return $this->con->devolverNroRegistrosConsulta("select * from cliente");
//----Cuarta forma:
return $this->con->devolverNroRegistrosTabla("cliente");
}
}
}
?>
Pgina 170 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Mantenimiento de Clientes</title>
<script src="jquery/jquery-1.5.min.js" type="text/javascript"></script>
<script type="text/javascript" src="jquery/jquery-ui-1.8.9.custom.min.js"></script>
</head>
<body>
<div id="contenedor">
<div id="formulario" style="display:none;">
</div>
<div id="tabla">
<?php include('consulta.php') ?>
</div>
</div>
</body>
</html>
Consulta.php
<?php
require('clases/cliente.class.php');
$objCliente=new Cliente;
//Obtener nro
$nro = $_GET[nro];
if(!isset($nro)) $nro=0;
$regxpag= 10;
//$consulta=$objCliente->mostrar_clientes();
$consulta=$objCliente->mostrar_clientes2($nro,$regxpag,$palabraBusqueda);
?>
<script type="text/javascript">
$(document).ready(function () {
$("#formulario").dialog({
Pgina 171 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
autoOpen: false,
show: 'slide',
modal: true,
width: 580,
height: 300,
title: "Actualizar"
});
$("#formulario").dialog("open");
return false;
});
$("#formulario").dialog("open");
return false;
});
// numeros de la paginacion
$("#paginacion a").click(function () {
// $("#tabla").load(this.href);
//$("#formulario").show("slow");
$("#tabla").hide();
//$("#tabla").show("slow");
$("#tabla").fadeIn(1000);
$.ajax({
type: "GET",
url: this.href,
success: function (datos) {
$("#tabla").html(datos);
}
});
return false;
});
// busqueda
$("#buscar a").click(function () {
var valorBusqueda = $("#txtBusqueda").val();
$("#tabla").hide();
//$("#tabla").show("slow");
$("#tabla").fadeIn(1000);
$.ajax({
type: "GET",
url: "consulta.php?busqueda=" + valorBusqueda,
success: function (datos) {
$("#tabla").html(datos);
}
Pgina 172 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
});
return false;
});
});
</script>
<br/>
<table border="0">
<tr><td width="40">
<span id="nuevo"><a href="nuevo.php"><img src="img/add.png" alt="Agregar"
/></a></span>
</td>
<td width="70">Busqueda</td>
<td>
<span id="buscar">
<input type="text" size="20" maxlength="20" id="txtBusqueda"
name="txtBusqueda"/>
<a href="#">
<img src="img/buscar.gif" alt="Buscar" width="20" height="20" border="0"/></a></span>
</td></tr>
</table>
<table>
<tr>
<th>Nombres</th>
<th>Ciudad</th>
<th>Sexo</th>
<th>Telefono</th>
<th>Fecha Nacimiento</th>
<th></th>
<th></th>
</tr>
<?php
if($consulta) {
}
?>
</table>
<span id="paginacion" align="center">
<?php
$totalreg=$objCliente->totalClientes();
Nuevo.php
<?php
require('functions.php');
if(isset($_POST['submit'])){
require('clases/cliente.class.php');
$nombres = htmlspecialchars(trim($_POST['nombres']));
$ciudad = htmlspecialchars(trim($_POST['ciudad']));
$sexo = htmlspecialchars(trim($_POST['alternativas']));
$telefono = htmlspecialchars(trim($_POST['telefono']));
$fecha_nacimiento = htmlspecialchars(trim($_POST['fecha_nacimiento']));
$objCliente=new Cliente;
if ( $objCliente->insertar(array($nombres,$ciudad,$sexo,$telefono,$fecha_nacimiento)) ==
true){
echo 'Datos guardados';
}else{
echo 'Se produjo un error. Intente nuevamente';
}
}else{
?>
<form id="frmClienteNuevo" name="frmClienteNuevo" method="post" action="nuevo.php"
onsubmit="GrabarDatos(); return false">
<p><label>Nombres<br />
<input class="text" type="text" name="nombres" id="nombres" />
</label>
</p>
<p>
<label>Ciudad<br />
<input class="text" type="text" name="ciudad" id="ciudad" />
</label>
</p>
<p>
<label>
<input type="radio" name="alternativas" id="masculino" value="M" />
Masculino</label>
<label>
<input type="radio" name="alternativas" id="femenino" value="F" />
Femenino</label>
</p>
<p>
<label>Telefono<br />
<input class="text" type="text" name="telefono" id="telefono" />
</label>
</p>
<p>
<label>Fecha Nacimiento <a onclick="show_calendar()" style="cursor: pointer;">
<small>(calendario)</small>
Actualizar.php
<?php
require('functions.php');
if(isset($_POST['submit'])){
require('clases/cliente.class.php');
$objCliente=new Cliente;
$cliente_id = htmlspecialchars(trim($_POST['cliente_id']));
$nombres = htmlspecialchars(trim($_POST['nombres']));
$ciudad = htmlspecialchars(trim($_POST['ciudad']));
$sexo = htmlspecialchars(trim($_POST['alternativas']));
$telefono = htmlspecialchars(trim($_POST['telefono']));
$fecha_nacimiento = htmlspecialchars(trim($_POST['fecha_nacimiento']));
if ( $objCliente-
>actualizar(array($nombres,$ciudad,$sexo,$telefono,$fecha_nacimiento),$cliente_id) == true){
echo 'Datos guardados';
}else{
echo 'Se produjo un error. Intente nuevamente';
}
}else{
if(isset($_GET['id'])){
require('clases/cliente.class.php');
$objCliente=new Cliente;
$consulta = $objCliente->mostrar_cliente($_GET['id']);
$cliente = mysql_fetch_array($consulta);
?>
<form id="frmClienteActualizar" name="frmClienteActualizar" method="post"
action="actualizar.php" onsubmit="ActualizarDatos(); return false">
<input type="hidden" name="cliente_id" id="cliente_id" value="<?php echo $cliente['id']?>"
/>
<p>
<label>Nombres<br />
<input class="text" type="text" name="nombres" id="nombres" value="<?php echo
$cliente['nombres']?>" />
</label>
</p>
<p>
<label>Ciudad<br />
<input class="text" type="text" name="ciudad" id="ciudad" value="<?php echo
$cliente['ciudad']?>" />
</label>
</p>
<p>
<label>
<input type="radio" name="alternativas" id="masculino" value="M" <?php
Eliminar.php
<?php
require('clases/cliente.class.php');
$cliente_id=$_GET['id'];
$objCliente=new Cliente;
if( $objCliente->eliminar($cliente_id) == true){
echo "Registro eliminado correctamente";
}else{
echo "Ocurrio un error";
}
?>
Functions.php
<?php
function ultimoDia($mes,$ano){
$ultimo_dia=28;
while (checkdate($mes,$ultimo_dia + 1,$ano)){
$ultimo_dia++;
}
return $ultimo_dia;
}
function calendar_html(){
$meses=
array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Novi
embre','Diciembre');
//$fecha_fin=date('d-m-Y',time());
function calendar($mes,$anio){
$dia=1;
if(strlen($mes)==1) $mes='0'.$mes;
?>
<table style="width:200px;text-align:center;border:1px solid #808080;border-top:0px;"
cellpadding="0" cellspacing="0">
<tr style="background-color:#CCCCCC;">
<td>D</td>
<td>L</td>
<td>M</td>
<td>M</td>
<td>J</td>
<td>V</td>
<td>S</td>
</tr>
<?php
//echo $mes.$dia.$anio;
$numero_primer_dia = date('w', mktime(0,0,0,$mes,$dia,$anio));
$ultimo_dia=ultimoDia($mes,$anio);
$total_dias=$numero_primer_dia+$ultimo_dia;
$diames=1;
//$j dias totales (dias que empieza a contarse el 1 + los dias del mes)
Pgina 177 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
$j=1;
while($j<$total_dias){
echo "<tr> \n";
//$i contador dias por semana
$i=0;
while($i<7){
if($j<=$numero_primer_dia){
echo " <td></td> \n";
}elseif($diames>$ultimo_dia){
echo " <td></td> \n";
}else{
if($diames<10) $diames_con_cero='0'.$diames;
else $diames_con_cero=$diames;
Calendario.php
<?php
require('functions.php');
$mes=$_GET['month'];
$anio=$_GET['year'];
$dia=1; //primer dia del mes
calendar($mes,$anio);
?>
jquery.functions.js
function ActualizarDatos(){
var cliente_id = $('#cliente_id').attr('value');
var nombres = $('#nombres').attr('value');
var ciudad = $('#ciudad').attr('value');
var alternativas = $("input[@name='alternativas']:checked").attr("value");
var telefono = $("#telefono").attr("value");
var fecha_nacimiento = $("#fecha_nacimiento").attr("value");
$.ajax({
url: 'actualizar.php',
type: "POST",
data:
"submit=&nombres="+nombres+"&ciudad="+ciudad+"&alternativas="+alternativas+"&telefono="+telefono+"&f
echa_nacimiento="+fecha_nacimiento+"&cliente_id="+cliente_id,
success: function(datos){
alert(datos);
ConsultaDatos();
$("#formulario").hide();
$("#formulario").dialog("close");
$("#tabla").show();
}
});
return false;
}
function EliminarDato(cliente_id){
var msg = confirm("Desea eliminar este dato?")
if ( msg ) {
$.ajax({
url: 'eliminar.php',
type: "GET",
data: "id="+cliente_id,
success: function(datos){
alert(datos);
$("#fila-"+cliente_id).remove();
}
});
}
return false;
}
function GrabarDatos(){
var nombres = $('#nombres').attr('value');
var ciudad = $('#ciudad').attr('value');
var alternativas = $("input[@name='alternativas']:checked").attr("value");
var telefono = $("#telefono").attr("value");
var fecha_nacimiento = $("#fecha_nacimiento").attr("value");
$.ajax({
url: 'nuevo.php',
type: "POST",
data:
"submit=&nombres="+nombres+"&ciudad="+ciudad+"&alternativas="+alternativas+"&telefono="+telefono+"&f
echa_nacimiento="+fecha_nacimiento,
success: function(datos){
ConsultaDatos();
alert(datos);
$("#formulario").hide();
$("#formulario").dialog("close");
$("#tabla").show();
}
});
return false;
}
function Cancelar(){
$("#formulario").hide();
$("#tabla").show();
return false;
}
var valores='month='+month+'&year='+year;
$.ajax({
url: 'calendario.php',
type: "GET",
Pgina 179 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
data: valores,
success: function(datos){
$("#calendario_dias").html(datos);
}
});
}
function set_date(date){
$('#fecha_nacimiento').attr('value',date);
show_calendar();
}
function show_calendar(){
$('#calendario').toggle();
}
Estilos.css
@charset "utf-8"; form p{
*{ margin:auto;
font-family:Verdana, Arial, Helvetica, width:450px;
sans-serif; margin-top:5px;
font-size:11px; margin-bottom:3px;
padding:0; }
margin:0; form input{
text-transform:uppercase; border:1px solid #CCCCCC;
} padding:3px;
a{ }
text-decoration:none;
} form .text{
img{ width:400px;
border:none; }
}
#contenedor{
width:800px;
margin:auto;
margin-top:20px;
border:2px solid #C0C0C0;
background-color:#F2F2F2;
padding-bottom:20px;
}
small{
font-size:9px;
}
table{
width:700px;
margin:auto;
}
td{
border-bottom:1px solid #D3D3D3;
padding:5px 0px 5px;
}
th{
background-color:#CDCDCD;
padding:5px 0px 5px;
}
form{
border:2px solid #C0C0C0;
background-color:#F2F2F2;
width:500px;
margin:auto;
margin-bottom:20px;
}
<?php
$conectID = mssql_connect("192.168.40.2","sa","1");
mssql_select_db("Northwind");
$result=mssql_query("select * from products order by productName");
echo "<table border=1><tr bgcolor='#0099FF'><td>Nro</td><td>Producto</td><td>Precio</td></tr>";
while ($row=mssql_fetch_array($result)) {
$contador++;
$nombreProducto=$row["ProductName"];
$precio=$row["UnitPrice"];
echo ("<tr bgcolor='#CCFF99'><td>$ contador </td> <td>$nombreProducto</td> <td align='right'>
$precio</td></tr>");
}
echo "</table>";
mssql_close($conectID);
?>
Ejemplo 2: Realizar Insert en una tabla. Puede usarse tambin con las intrucciones Update, Delete
<?php
$conectID = mssql_connect("(local)","sa","1");
mssql_select_db("Northwind");
$sentencia="insert into Categories(CategoryName, Description) values ('Computo','Equipos
electronicos')";
//$sentencia="update Categories set Description='Equipos para PC' where CategoryID=@@identity";
//$sentencia="delete Categories where CategoryID=@@identity";
$result=mssql_query($sentencia);
echo "$result fila(s) afectada(s).";
mssql_close($conectID);
?>
Ejemplo 3: Devolver un escalar: Mostrar el total de ciudades e los empelados. Uso tabla employees
<?php
$conectID = mssql_connect("(local)","sa","1");
mssql_select_db("Northwind");
$sentencia="SELECT count(distinct city)from employees";
$result=mssql_query($sentencia);
$fila=mssql_fetch_array($result);
echo "Total de ciudades de los empleados: $fila[0]";
mssql_close($conectID);
?>
Los ejemplos se trabajarn con la base de datos usada en el capitulo que se desarrollo Oracle.
<?php
$user='MarketPERU';
$password='mercado';
//host puede ser este:
$host='(DESCRIPTION =(ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.205)(PORT =
1521)))(CONNECT_DATA =(SERVER = DEDICATED) (SERVICE_NAME = dbodpe)))';
//o tambien este de acuerdo al tnsnames
$host='DBODPEflor';
$conexion = ocilogon($user,$password,$host); // conexin a la base de datos
$query = 'select nombre, precioUnitario from producto';
$sentencia = ociparse($conexion, $query ); // se crea una sentencia
ociexecute($sentencia); // se ejecuta la sentencia
echo "<table border=1><tr bgcolor='#0099FF'><td>Nro</td><td>Producto</td><td>Precio</td></tr>";
while (ocifetchinto($sentencia,&$fila)) { // devuelve la siguiente tupla en el array fila
//print_r($fila);//despliega informacin sobre la variable
$counter++;
$nombreProducto=$fila[0];
$precio=$fila[1];
echo ("<tr bgcolor='#CCFF99'><td>$counter</td> <td>$nombreProducto</td> <td
align='right'>$precio</td></tr>");
}
echo "</table>";
ocifreestatement($sentencia); // se libera el resultado de la sentencia
ocilogoff($conexion); // desconexin de la base de datos
?>
Ejemplo 2: Realizar Insert en una tabla. Puede usarse tambin con las intrucciones Update, Delete
<?php
$user='MarketPERU';
$password='mercado';
//host puede ser este:
$host='(DESCRIPTION =(ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.205)(PORT =
1521)))(CONNECT_DATA =(SERVER = DEDICATED) (SERVICE_NAME = dbodpe)))';
//o tambien este de acuerdo al tnsnames
//$host='DBODPEflor';
$conexion = ocilogon($user,$password,$host); // conexin a la base de datos
$query = "insert into Categoria values (7,'Computo','Equipos electronicos')";
//$query = "update Categoria set categoria='Equipos para PC' where IDCATEGORIA=7";
//$query = "delete Categoria where IDCATEGORIA=7";
$sentencia = ociparse($conexion, $query ); // se crea una sentencia
ociexecute($sentencia); // se ejecuta la sentencia
ocicommit($conexion);
//ocirollback($conexion);
echo "Sentencia realizada con exito";
ocifreestatement($sentencia); // se libera el resultado de la sentencia
ocilogoff($conexion); // desconexin de la base de datos
?>
<?php
$user='MarketPERU';
$password='mercado';
//host puede ser este:
$host='(DESCRIPTION =(ADDRESS_LIST=(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.205)(PORT =
1521)))(CONNECT_DATA =(SERVER = DEDICATED) (SERVICE_NAME = dbodpe)))';
//o tambien este de acuerdo al tnsnames
//$host='DBODPEflor';
$conexion = ocilogon($user,$password,$host); // conexin a la base de datos
$query = 'select count(*) from producto';
$sentencia = ociparse($conexion, $query ); // se crea una sentencia
ociexecute($sentencia); // se ejecuta la sentencia
ocifetchinto($sentencia,&$fila); // devuelve la siguiente tupla en el array fila
echo ("Total de productos: $fila[0]");// mostramos el total de productos
ocifreestatement($sentencia); // se libera el resultado de lasentencia
ocilogoff($conexion); // desconexin de la base de datos
?>
Los ejemplos se trabajarn con la base de datos usada en el capitulo que se desarrollo PostgreSQL.
<?php
$conn = pg_connect("host=localhost port=5432 password=1 user=postgres dbname=bdlibros");
if (!$conn) {
echo "Error en la conexion.\n";
exit;
}
echo "Conexion OK";
$query="select titulo, autor from libro order by 1";
$result=pg_query($query);
Ejemplo 2: Realizar Insert en una tabla. Puede usarse tambin con las intrucciones Update, Delete
<?php
$conn = pg_connect("host=localhost port=5432 password=1 user=postgres dbname=bdlibros");
$sentencia="insert into Editorial(nombreEditorial) values('Coquito');";
//$sentencia="update Editorial set nombreEditorial='Juanito' where idEditorial=2";
//$sentencia="delete from Editorial where idEditorial=2";
$result=pg_query($sentencia);
echo "$result fila(s) afectada(s).";
pg_close($conn);
?>
Contenido:
Script Base de Datos Computienda en SQL Server
Script Base de Datos Computienda en MySQL
Mantenimiento con Visual Basic .NET con SQL Server
Funcin que devuelve la cadena de conexin
Procedimiento que muestra el resultado de una consulta de un Stored Procedure con
parmetro de entrada.
Procedimiento que ejecuta un Stored Procedure de Registrar un Pedido, el cual se realiza
con transacciones, parmetros de entrada y salida.
Procedimiento muestra el resultado de una funcin Escalar
Procedimiento muestra el resultado de una procedimiento almacenado con instruccin
RETURN
Procedimiento muestra el resultado de una Funcin en Linea
Procedimiento muestra el resultado de una Funcin Multisentencia
Mantenimiento con Java con MySQL
Mantenimiento con PHP con MySQL
Base de Datos
Tablas:
Cliente: idCliente, nombre, direccin, telfono, email.
Producto: idProducto, nombreProducto, stock, precioVenta, rutaImagen, descripcin.
Pedido: idPedido, idCliente, fecha, monto, despachado.
DetallePedido: idPedido, idProducto, cantidad, precio.
Usuario: idUsuario, nombreUsuario, password.
begintry
BEGIN TRAN saction--Iniciamos la Transaccion
WHILE (@indiceB!=0)
begin
print @indiceB;
Pgina 192 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
print'Producto:'+ @var_producto;
print'Lista: '+ @listaProducto;
--------------------------------------------------------------------------------------
print'Cantidad:'+ @var_Cantidad;
print'Lista: '+ @listaCantidad;
---------------------------------------------------------------------------------------
print'Precio:'+ @var_Precio;
print'Lista: '+ @listaPrecio;
begin catch
rollback transaction
SELECT @ErrMsg =ERROR_MESSAGE(), @ErrSeverity =ERROR_SEVERITY();
PRINT'Error: '+ERROR_MESSAGE()
raiserror(@ErrMsg,@ErrSeverity,1)
endcatch
--Ejemplo de uso:
declare @estado varchar(500)
exec ups_registrarPedido@estado output,'Pepito','Las Golondrinas
328','234433','pp@hotmail.com', 500.00,'1|2|3','Joystick|Impresora|Router','10|20|30'
print @estado
Procedimiento Almacenado 3. Devolver consulta: Devolver montos totales segn parametro por
ao, trimestre, meses, dias.
IF(@resumenTiempo='AO')
SELECT SUM(P.monto)AS Monto,YEAR(P.Fecha)AS Tiempo
FROM Pedido P
GROUP BY YEAR(P.Fecha)
ORDER BY Tiempo
ELSEIF(@resumenTiempo='MES')
SELECT SUM(P.monto)AS Monto,
cast(YEAR(P.Fecha)as char(4))+' - '+cast(MONTH(P.Fecha) as char(2))AS
Tiempo
FROM Pedido P
GROUP BY cast(YEAR(P.Fecha) as char(4))+' - '+cast(MONTH(P.Fecha)as
char(2))
ORDER BY Tiempo
ELSEIF(@resumenTiempo='TRIMESTRE')
SELECT SUM(P.monto)AS Monto,
cast(YEAR(P.Fecha) as char(4))+'-'+cast(datepart(QUARTER,P.Fecha)as
CHAR(1))AS Tiempo
FROM Pedido P
GROUP BY cast(YEAR(P.Fecha) as char(4))+'-'+cast(datepart(QUARTER,P.Fecha)
as char(1))
ORDER BY Tiempo
ELSEIF(@resumenTiempo='DIA')
SELECT SUM(P.monto)AS Monto, fecha AS Tiempo
FROM Pedido P
GROUP BY fecha
ORDER BY Tiempo
GO
--Prueba
declare @total float
exec @total =ups_devolverMonto'04/04/2011','16/04/2011'
print @total
Funcin 1. Funcin escalar: Devolver nombre del mes ingresando nmero del mes. Usado en
usp_reporteTotales
return @resultado
end
--Prueba
SELECT dbo.fn_devolverMes(4)
--Prueba
SELECT *from dbo.fn_DevolverDetallePedido(10)
RETURN
END
--Prueba
SELECT *from dbo.fn_CategoriaClientes()
/* Eliminar tablas (Opcional ya q recin hemos cerado las tablas por lo tanto estn vacias)*/
DELETE FROM detallepedido;
DELETE FROM pedido;
DELETE FROM cliente;
DELETE FROM producto;
DELETE FROM usuario;
INSERT INTO producto (idProducto, nombreProducto, stock, precioVenta, rutaImagen, descripcion) VALUES
(1, 'Memoria RAM DDR2 1 GB', 300, '150.00', 'Galeria Equipos/memoria_ram.jpg', 'Memoria DDR2.'),
(2, 'Disco Duro 160 GB', 90, '220.00', 'Galeria Equipos/disco duro.jpg', 'Hard Disk.'),
(3, 'Teclado Multimedia', 50, '30.00', 'Galeria Equipos/teclado.jpg', 'Teclado Universal.'),
(4, 'Mouse Optico', 100, '15.00', 'Galeria Equipos/mouse_cyberlink.jpg', 'Logitech.'),
(5, 'Grabadora CD/DVD', 50, '90.00', 'Galeria Equipos/grabadora.jpg', 'LG'),
(7, 'Fuentes ATX', 25, '50.00', 'Galeria Equipos/fuentes atx.bmp', ''),
(8, 'Estabilizador Hibrido', 35, '70.00', 'Galeria Equipos/estabilizador hibrido.bmp', ''),
(9, 'Case CPU Atlon', 80, '70.00', 'Galeria Equipos/CASE CPU ATLON.jpg', ''),
(10, 'Web CAM', 15, '50.00', 'Galeria Equipos/web cam.bmp', ''),
Pgina 197 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
(11, 'Monitor LCD', 35, '300.00', 'Galeria Equipos/monitor.jpg', ''),
(12, 'Router', 23, '120.00', 'Galeria Equipos/router.bmp', ''),
(13, 'Disqueteras', 2, '10.00', 'Galeria Equipos/disqueteras.bmp', ''),
(14, 'Laptop HP Pavilium 3770', 20, '3200.00', 'Galeria Equipos/laptop hp pavilium.bmp', ''),
(15, 'Memorias USB', 25, '80.00', 'Galeria Equipos/memoria usb.bmp', 'Memorias USB Kingston'),
(16, 'Impresora', 200, '100.00', 'Galeria Equipos/impresora.jpg', 'Impresora Laser'),
(17, 'Scanner', 600, '75.00', 'Galeria Equipos/scanner.bmp', ''),
(18, 'Joystick', 25, '35.00', 'Galeria Equipos/joystick.jpg', NULL),
(19, 'Plotter', 70, '1200.00', 'Galeria Equipos/plotter.jpg', NULL),
(20, 'Lectora de codigo de barras', 6, '80.00', 'Galeria Equipos/lectora de codigo de barras.jpg', 'Lectora de codigo de
barras');
INSERT INTO usuario (idUsuario, nombreUsuario, password) VALUES (1, 'Administrador', '1');
/*Funcion Nro1: Devolver el nombre del mes ingresando el nro del mes*/
DELIMITER //
DROP FUNCTION IF EXISTS fn_devolverMes//
CREATE FUNCTION fn_devolverMes (mes INT) RETURNS VARCHAR(20)
BEGIN
DECLARE resultado VARCHAR(20);
IF (mes=1) THEN SET resultado ='Enero';
ELSEIF (mes=2) THEN SET resultado ='Febrero';
ELSEIF (mes=3) THEN SET resultado ='Marzo';
ELSEIF (mes=4) THEN SET resultado ='Abril';
ELSEIF (mes=5) THEN SET resultado ='Mayo';
ELSEIF (mes=6) THEN SET resultado ='Junio';
ELSEIF (mes=7) THEN SET resultado ='Julio';
ELSEIF (mes=8) THEN SET resultado ='Agosto';
ELSEIF (mes=9) THEN SET resultado ='Setiembre';
ELSEIF (mes=10) THEN SET resultado ='Octubre';
Pgina 198 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
ELSEIF (mes=11) THEN SET resultado ='Noviembre';
ELSEIF (mes=12) THEN SET resultado ='Diciembre';
END IF;
RETURN resultado;
END//
DELIMITER ;
END WHILE;
-- Confirma Transaccion
COMMIT;
DELIMITER $$
DROP PROCEDURE IF EXISTS bdcomputienda.usp_reporteTotales$$
CREATE PROCEDURE usp_reporteTotales(IN resumenTiempo VARCHAR(20))
BEGIN
SET resumenTiempo=UPPER(resumenTiempo);
IF(resumenTiempo='AO') THEN
SELECT SUM(P.monto) AS Monto, YEAR(P.Fecha) AS Tiempo
FROM Pedido P
GROUP BY Tiempo
ORDER BY Tiempo;
ELSEIF(resumenTiempo='MES') THEN
SELECT SUM(P.monto) AS Monto, CONCAT(fn_devolverMes(MONTH(P.Fecha)),' ' , YEAR(P.Fecha)) AS Tiempo
FROM Pedido P
GROUP BY Tiempo
ORDER BY fecha;
ELSEIF(resumenTiempo='TRIMESTRE') THEN
SELECT SUM(P.monto) AS Monto, CONCAT(YEAR(P.Fecha),'-',QUARTER(P.Fecha)) AS Tiempo
FROM Pedido P
GROUP BY Tiempo
ORDER BY Tiempo;
ELSEIF(resumenTiempo='DIA') THEN
SELECT SUM(P.monto) AS Monto, fecha AS Tiempo
FROM Pedido P
GROUP BY Tiempo
ORDER BY Tiempo;
END IF;
END$$
DELIMITER ;
SubejecutarSP()
Dim str As String
str = devolverCadenaConexion()
Dim np() As String = {"@in_nombre", "@in_direccion", "@in_telefono", "@in_email", "@in_monto",
"@listaCantidad", "@listaProducto", "@listaPrecio"}
Dim vp() As String = {"Pepito2", "Las Golondrinas 328", "234433", "pp@hotmail.com", 1500.0,
"10|12|31", "Joystick|Impresora|Router", "10|20|30"}
Dimnps() As String = {"@p_estado"}
Dimvps() As String = {""}
Base_Datos.SQLServer.SP_ejecutarStoreProcedure(str, "ups_registrarPedido", np, vp, nps, vps)
Ifvps(0) = "OK"Then
MsgBox("Grabado OK")
Else
MsgBox("ABORT")
End If
End Sub
Sub devolverFuncionTablaEnLinea()
Dim str As String
str = devolverCadenaConexion()
Dim np() As String = {"@idPedido"}
Dim vp() As String = {"10"}
Me.DataGridView1.DataSource = Base_Datos.SQLServer. FN_devolverDT_FuncionReturnTable
(str, "SELECT * from dbo.DevolverDetallePedido(@idpedido)", np, vp)
End Sub
SubdevolverFuncionTablaMultiSentencia()
Dim str As String
str = devolverCadenaConexion()
Dim np() As String = {"@idPedido"}
Dim vp() As String = {"93"}
Me.DataGridView1.DataSource = Base_Datos.SQLServer. FN_devolverDT_FuncionReturnTable
(str, "SELECT * from dbo.fn_CategoriaClientes()")
End Sub
JDBC MYSQL
COMPUTIENDA - JDBC
1. Clase AccesoDB. Funcin que devuelve el objeto conexin
package database.acceso;
import java.sql.Connection;
import java.sql.DriverManager;
/*
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
*/
if (cn == null) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost:3306/bdcomputienda";
cn = DriverManager.getConnection(url, "root", "mysql");
} catch (Exception e) {
throw e;
}
}
return cn;
}
}
package model;
import database.acceso.AccesoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
while (rs.next()) {
Map rec = new HashMap();
rec.put("idProducto", rs.getInt("idProducto"));
rec.put("nombreProducto", nombreProducto);
rec.put("stock", rs.getInt("stock"));
rec.put("precioVenta", rs.getDouble("precioVenta"));
rec.put("rutaImagen", rs.getString("rutaImagen"));
rec.put("descripcion", rs.getString("descripcion"));
lista.add(rec);
}
rs.close();
} finally {
try {
//cn.close();
cn=null;
} catch (Exception e) {
}
}
return lista;
}
Connection cn = null;
try {
cn = AccesoDB.getConnection();
cn.setAutoCommit(false);
// Obtener el codigo de sucursal
String query =
"insert producto(nombreProducto,stock,precioVenta,rutaImagen,descripcion)"
+ "values(?,?,?,?,?)";
} catch (Exception e) {
Pgina 204 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
try {
cn.rollback();
} catch (Exception e1) {
}
throw e;
} finally {
try {
//cn.close(); // Devuelves la conxin al pool
cn=null;
} catch (Exception e) {
}
}
}
}
3. Clase Item y Canasta. Usada para mostrar los productos en el Carrito de Compras.
Clase Item
package model;
public Item() {
}
Clase Canasta
package model;
import database.acceso.AccesoDB;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public Canasta() {
lista = new ArrayList<Item>();
}
4. Clase Pedido
package model;
import database.acceso.AccesoDB;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public Pedido() {
}
Connection cn = AccesoDB.getConnection();
cn.setAutoCommit(true);
String query = "{call ups_registrarPedido(?,?,?,?,?,?,?,?,?)}";
CallableStatement cstm = cn.prepareCall(query);
cstm.registerOutParameter(1, Types.VARCHAR, 50);
cstm.setString(2, nombreCliente);
cstm.setString(3, direccion);
cstm.setString(4, telefono);
cstm.setString(5, email);
cstm.setDouble(6, monto);
cstm.setString(7, listaCantidad);
cstm.setString(8, listaProducto);
cstm.setString(9, listaPrecio);
cstm.executeUpdate();
String estado = cstm.getString(1);
if (!estado.equals("ok")) {
throw new Exception(estado);
Pgina 207 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
}
cn = null;
}
ResultSet rs = cstm.executeQuery();
while (rs.next()) {
Map rec = new HashMap();
rec.put("idPedido", rs.getString("idPedido"));
rec.put("cliente", rs.getString("cliente"));
rec.put("fecha", rs.getDate("fecha"));
rec.put("monto", rs.getDouble("monto"));
rec.put("despachado", rs.getString("despachado"));
lista.add(rec);
}
rs.close();
} finally {
try {
cn = null;
//cn.close();
} catch (Exception e) {
}
}
return lista;
}
String query =
"SELECT nombreProducto AS Producto, cantidad, precio, cantidad*precio AS subtotal"
+ " FROM detallePedido d INNER JOIN producto p "
+ " ON d.idProducto=p.idProducto"
+ " WHERE d.idPedido=?;";
while (rs.next()) {
Map rec = new HashMap();
Pgina 208 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
rec.put("producto", rs.getString("producto"));
rec.put("cantidad", rs.getDouble("cantidad"));
rec.put("precio", rs.getDouble("precio"));
rec.put("subtotal", rs.getDouble("subtotal"));
lista.add(rec);
}
rs.close();
} finally {
try {
cn = null;
//cn.close();
} catch (Exception e) {
}
}
return lista;
}
ResultSet rs = cstm.executeQuery();
while (rs.next()) {
Map rec = new HashMap();
rec.put("monto", rs.getDouble("monto"));
rec.put("tiempo", rs.getInt("tiempo"));
lista.add(rec);
}
rs.close();
} finally {
try {
cn = null;
//cn.close();
} catch (Exception e) {
}
}
return lista;
}
} catch (Exception e) {
try {
cn.rollback();
} catch (Exception e1) {
}
throw e;
} finally {
try {
//cn.close(); // Devuelves la conxin al pool
cn=null;
} catch (Exception e) {
}
}
}
}
5. Clase Cliente
package model;
import database.acceso.AccesoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
ResultSet rs = pstm.executeQuery();
/*
String query = "SELECT * FROM cliente order by nombre ";
Statement stm = cn.createStatement();
ResultSet rs = stm.executeQuery(query);
*/
Pgina 210 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
while (rs.next()) {
Map rec = new HashMap();
//rec.put("idProducto", rs.getInt("idProducto"));
rec.put("nombre", rs.getString("nombre"));
rec.put("direccion", rs.getString("direccion"));
rec.put("telefono", rs.getString("telefono"));
rec.put("email", rs.getString("email"));
lista.add(rec);
}
rs.close();
} finally {
try {
// cn.close();
} catch (Exception e) {
}
}
return lista;
}
while (rs.next()) {
Map rec = new HashMap();
rec.put("cliente", rs.getString("cliente"));
rec.put("recaudacion", rs.getString("recaudacion"));
lista.add(rec);
}
rs.close();
} finally {
try {
//cn.close();
cn=null;
} catch (Exception e) {
}
}
return lista;
}
}
head.php
<?php
echo "<html>
<head>
<link rel='stylesheet' type='text/css' href='estilo1.css'/>
</head>
<body>";
?>
conexion.php
<?php
/****************ARCHIVO DE CONEXION A NUESTRA BD************************/
$username="root";
$password="mysql";
$server="localhost";
$bdatos="BDCompuTienda";
//*/
$ocn=@mysql_connect($server,$username,$password) or
die("<h2>!!!Error de conexion al servidor!!!</h2>");
mysql_select_db($bdatos,$ocn);
?>
Catalogo.php
<?php
include("head.php");
include("conexion.php");
$SQL = "SELECT * FROM Producto" ;
$rs = @mysql_query($SQL,$ocn) or
die("<h2>!!!Error: no se puedo ejecutar la consulta!!!</h2>");
<tr>
<td align='center'>
Cant:<input type='text' name='txtCantidad' size='4'
maxlength='4'>
<input type='hidden' name='txtProducto' value='$reg[1]'>
<input type='hidden' name='txtPrecio' value='$reg[3]'>
<input type='hidden' name='pagina' value='Catalogo.php'>
</td>
<td>
<input type='image' name='$reg[0]'
src='Imagenes/carrito.gif'>
</td>
</tr>
</table>
</form>
</td>" ;
if ($cont==2) {
echo "</tr><tr>";
$cont=0;
}
}
echo "</table>";
mysql_free_result($rs);
mysql_close($ocn);
?>
llenarCarrito.php
<?
//grabarcompras.php
session_register("nrocompra");
include("conexion.php");
$SQL="INSERT INTO TempoPedido values('$nrocompra', '$txtProducto', $txtPrecio,
$txtCantidad)";
$rs = @mysql_query($SQL,$ocn) or
die("<h2>!!!Error: no se puedo ejecutar la consulta!!!</h2></br>".$SQL);
//sleep(2);
//header("Location: $pagina");
HEADER("Location: catalogo.php");
?>
echo "</table>";
/************fin de Consulta principal**********/
/***********consulta para la paginacion********/
$SQL="SELECT * FROM Producto";
$tabla=@mysql_query($SQL, $ocn) or die ("<h2>Error en la consulta</h2>");
/***********calculando el nro de paginas ********/
$totalreg=mysql_num_rows($tabla);
$nropags=$totalreg/$regxpag;
/*********** imprimiendo el nro de paginas ******/
echo "<center>";
for($j=0; $j<=$nropags; $j++)
{$inicio=$j*$regxpag;
if($nro==$inicio)
echo "<a href='productos.php?nro=$inicio'>
<font face='verdana' size='3' color='#3399FF'><b>[$j]</b></font></a>";
else
echo "<a href='productos.php?nro=$inicio'><font face='verdana'
size='2'>[$j]</font></a>";
}
echo "</center>";
/***********fin de la paginacion********/
Pgina 214 Docente: Ing. Nez Marinovich Manuel URL: http://manhiuco.es.tl
Ingeniero Informtico Email: manhiuco@hotmail.com
Aromas de Bases de Datos y otras fragancias de Programacin
mysql_close($ocn);
echo "
<table align=right bgcolor='#3399FF' > <tr> <td>
<a class='agregar' href='insertarProducto.php'>
Agregar Producto
</a>
<td><tr></table>";
?>
</body>
</html>