jueves, febrero 24, 2011

Java - Aplicación Web, Carrito de Compras Parte I - Creación de la Base de Datos


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno


  • MySQL 5.1.
  • NetBeans IDE 6.9.1
  • Apache Tomcat
  • JDK 1.6.0 - 21

2. Introducción


En el siguiente tutorial vamos a desarrollar un carrito de compras o lo que seria un sistema de ventas usando el lenguaje de programación Java, como base de datos vamos a usar el MySQL 5.1. y tambien crearemos un reporte con JasperReports. La base de datos que vamos a crear es una base de datos con fines didácticos, dado que nos faltaría crear mas tablas, como la tabla cliente, categoría, unidad de medida, etc pero si nos explayamos mucho nos quedaría muy largo el tutorial. Ademas en el ejemplo no se explica como disminuir un stock, debido a que eso siempre se les pide a los alumnos universitario que investiguen como hacerlo, pero si quieren una ayudita lo pueden hacer creando Triggers en la base de datos. La aplicación se desarrollara en un formato web usando el patrón de Modelo, Vista y Controlador. Y para la parte de la vista usaremos lo que se conoce como Java Server Page (JSP). Espero que el ejemplo se de su utilidad.

3. Desarrollo


En esta primera parte del tutorial vamos a crear la base de datos en MySQL 5.1., la base de datos se llamara BDTutorial

3.1. Diseño de la base de datos

La base de datos tendría las siguientes tablas: Venta, Producto y DetalleVenta















A continuación les paso el script de creación de la base de datos

-- CREADO POR: HENRY JOE WONG URQUIZA
-- FECHA: 24FEB2011
-- ------------------------------------------------------
-- TUTORIAL DE COMO HACER UN CARRITO DE COMPRAS USANDO
-- EL MODELO VISTA CONTROLADOR
--
-- Creando la base de datos
--

CREATE DATABASE IF NOT EXISTS bdtutorial;
USE bdtutorial;

--
-- Creando la tabla `detalleventa`
--

DROP TABLE IF EXISTS `detalleventa`;
CREATE TABLE `detalleventa` (
  `codigoVenta` int(11) NOT NULL,
  `codigoProducto` int(11) NOT NULL,
  `cantidad` decimal(18,2) NOT NULL,
  `descuento` decimal(18,2) NOT NULL,
  PRIMARY KEY  (`codigoVenta`,`codigoProducto`),
  KEY `FK_DetalleVenta_Producto` (`codigoProducto`),
  CONSTRAINT `FK_DetalleVenta_Producto` FOREIGN KEY (`codigoProducto`) REFERENCES `producto` (`codigoProducto`),
  CONSTRAINT `FK_DetalleVenta_Venta` FOREIGN KEY (`codigoVenta`) REFERENCES `venta` (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Creando la tabla `producto`
--

DROP TABLE IF EXISTS `producto`;
CREATE TABLE `producto` (
  `codigoProducto` int(11) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `precio` decimal(18,2) NOT NULL,
  PRIMARY KEY  (`codigoProducto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Creando la tabla venta
--

DROP TABLE IF EXISTS `venta`;
CREATE TABLE `venta` (
  `codigoVenta` int(11) NOT NULL,
  `cliente` varchar(100) NOT NULL,
  `fecha` datetime NOT NULL,
  PRIMARY KEY  (`codigoVenta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3.2. Creando los procedimientos almacenados

Según Wikipedia un procedimiento almacenado (stored procedure en inglés) es un programa (o procedimiento) el cual es almacenado físicamente en una base de datos. Su implementación varía de un manejador de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y sólo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.

3.2.1. Procedimientos almacenados para la tabla Producto

-- CREADO POR: HENRY JOE WONG URQUIZA
-- FECHA: 24FEBRERO2011
-- ------------------------------------------------------
-- TUTORIAL DE COMO REALIZAR UN CARRITO DE COMPRAS CON JAVA Y JSP
-- APLICANDO MODELO, VISTA Y CONTROLADOR

-- Procedimiento almacenado para insertar un producto
DROP PROCEDURE IF EXISTS `spI_producto`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_producto`(
   INOUT _codigoProducto  int ,
   _nombre  varchar(100) ,
   _precio  decimal(18, 2)
)
BEGIN
-- Genera una especie de autoincremental pero yo controlo los codigos
-- que genero
SELECT IFNULL(MAX(codigoProducto),0)+1 into _codigoProducto FROM `producto`;
INSERT INTO `producto`(
   `codigoProducto`,
   `nombre`,
   `precio`
)
VALUES (
   _codigoProducto,
   _nombre,
   _precio
);
END $$
DELIMITER ;

-- Procedimiento almacenado para actualizar un producto
DROP PROCEDURE IF EXISTS `spU_producto`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spU_producto`(
   _codigoProducto  int ,
   _nombre  varchar(100) ,
   _precio  decimal(18, 2)
)
BEGIN

UPDATE producto
SET 
   `nombre` = _nombre,
   `precio` = _precio
WHERE
    `codigoProducto` = _codigoProducto
;
END $$
DELIMITER ;

-- Procedimiento almacenado para obtener todos los productos
DROP PROCEDURE IF EXISTS `spF_producto_all`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_all`(
)
BEGIN

SELECT
    p.codigoProducto,
    p.nombre,
    p.precio
FROM
    producto p
ORDER BY
    P.nombre

;
END $$
DELIMITER ;


-- Procedimiento almacenado para obtener todos los productos
DROP PROCEDURE IF EXISTS `spF_producto_one`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_one`(
_codigoProducto  int 
) BEGIN SELECT p.codigoProducto, p.nombre, p.precio FROM producto p
WHERE
    p.codigoProducto = _codigoProducto
ORDER BY P.nombre ; END $$ DELIMITER ;


3.2.2. Procedimientos almacenados para la tabla venta

-- CREADO POR: HENRY JOE WONG URQUIZA
-- FECHA: 24FEBRERO2011
-- ------------------------------------------------------
-- TUTORIAL DE COMO REALIZAR UN CARRITO DE COMPRAS CON JAVA Y JSP
-- APLICANDO MODELO, VISTA Y CONTROLADOR

-- Procedimiento almacenado para insertar una venta
DROP PROCEDURE IF EXISTS `spI_venta`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_venta`(
   INOUT _codigoVenta  int ,
   _cliente  varchar(100) 
)
BEGIN
-- Codigo autogenerado
SELECT IFNULL(MAX(codigoVenta),0)+1 into _codigoVenta FROM `venta`;
INSERT INTO `venta`(
   `codigoVenta`,
   `cliente`,
   `fecha`
)
VALUES (
   _codigoVenta,
   _cliente,
   CURDATE()
);
END $$
DELIMITER ;

-- Procedimiento almacenado para obtener todas las ventas
DROP PROCEDURE IF EXISTS `spF_venta_All`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_All`(
)
BEGIN
SELECT
    v.codigoVenta AS CodigoVenta,
    v.cliente AS Cliente, 
    v.fecha AS Fecha,
    d.codigoProducto AS CodigoProducto, 
    p.nombre AS Nombre,
    p.precio AS Precio, 
    d.cantidad AS Cantidad,
    d.descuento AS Descuento,
    p.precio*d.cantidad AS Parcial,
    ((p.precio*d.cantidad)-d.descuento) AS SubTotal,
    (
    SELECT     
        SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
    FROM         
        DetalleVenta AS dT INNER JOIN
        Producto AS pT ON dT.codigoProducto = pT.codigoProducto
    WHERE
        dT.codigoVenta=v.codigoVenta
    ) AS TotalPagar
FROM 
    Venta AS v INNER JOIN
    DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
    Producto AS p ON d.codigoProducto = p.codigoProducto
ORDER BY
    CodigoVenta, Nombre
 ;
END $$
DELIMITER ;

-- Procedimiento almacenado para obtener una venta
DROP PROCEDURE IF EXISTS `spF_venta_one`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_venta_one`(
  _codigoVenta  int
)
BEGIN
SELECT
    v.codigoVenta AS CodigoVenta,
    v.cliente AS Cliente, 
    v.fecha AS Fecha, 
    d.codigoProducto AS CodigoProducto, 
    p.nombre AS Nombre,
    p.precio AS Precio, 
    d.cantidad AS Cantidad, 
    d.descuento AS Descuento,
    p.precio*d.cantidad AS Parcial,
    ((p.precio*d.cantidad)-d.descuento) AS SubTotal,
    (
    SELECT     
        SUM((dT.cantidad * pT.precio)-dT.descuento) AS TotalPagar
    FROM         
        DetalleVenta AS dT INNER JOIN
        Producto AS pT ON dT.codigoProducto = pT.codigoProducto
    WHERE
        dT.codigoVenta=v.codigoVenta
    ) AS TotalPagar
FROM 
    Venta AS v INNER JOIN
    DetalleVenta AS d ON v.codigoVenta = d.codigoVenta INNER JOIN
    Producto AS p ON d.codigoProducto = p.codigoProducto
WHERE
    v.codigoVenta=_codigoVenta
ORDER BY
    Nombre
;
END $$
DELIMITER ;

3.2.3. Procedimientos almacenados para la tabla DetalleVenta

-- CREADO POR: HENRY JOE WONG URQUIZA
-- FECHA: 24FEB2011
-- ------------------------------------------------------
-- TUTORIAL DE COMO HACER UN CARRITO DE COMPRAS USANDO
-- EL MODELO VISTA CONTROLADOR

-- Procedimiento almacenado para insertar un detalle de venta
DROP PROCEDURE IF EXISTS `spI_detalleventa`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_detalleventa`(
   _codigoVenta  int ,
   _codigoProducto  int ,
   _cantidad  decimal(18, 2) ,
   _descuento  decimal(18, 2)
)
BEGIN

INSERT INTO `detalleventa`(
   `codigoVenta`,
   `codigoProducto`,
   `cantidad`,
   `descuento`
)
VALUES (
   _codigoVenta,
   _codigoProducto,
   _cantidad,
   _descuento
);
END $$
DELIMITER ;

9 comentarios:

CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_one`(
_codigoProducto int ,
)

spF_producto_one: .... Encontre un error al ejecutar el script creo que debe revivir solo un parámetro ingeniero corrigame si me equivoco.

CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_producto_one`(
_codigoProducto int )

Si exacto ... se me fue la coma ahí al momento de copiarlo. Gracias por la corrección

Saludos

oye una preguntota en donde puedo encontrar la segunada parte, donde se esta programando como tal el carrito de compras ??

Sigue el ejemplo todos los capitulos estan completos :D

Chevere Chico el ejemplo esta muy completo porfa continua

Espero no sea molestia al creador de este sitio y a su vez agradecerle por este excelente tutorial les dejo el link de la base de datos solo para ser importada si es de molestia porfa comuniquenme y lo elimino a la brevedad

http://www.megaupload.com/?d=QKZK91Q0

MUY BUENO EL TUTORIAL INGENIERO SIGA ASI.

joder tuve problemas para levantar el backup pero finalmente lo hice con el workbench....solucionado

Exelente blog!!! saludos

Gracias Ing!! Bien explicado!