MySQL - ayuda procedimiento almacenado

   
Vista:

ayuda procedimiento almacenado

Publicado por undertaker (21 intervenciones) el 04/08/2013 01:05:40
Buenas...
La verdad nunca he realizado un procedimiento almacenado en Mysql
y pues necesito realizar uno para quitarme de algunas dudas

Lo que quiero es registrar las ventas de un producto determinado

Lo que no se hacer es recorrer los productos ya que al realizar la venta puede uno optar por mas de un producto, ademas de las validaciones correspondientes tales como la cantidad no puede superar el stock y advertir al pasar el stock minimo

Aca dejo las tablas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CREATE TABLE IF NOT EXISTS `detalle` (
  `VENTA_FOLIO` int(11) NOT NULL,
  `PRODUCTO_ID_PROD` int(11) NOT NULL,
  `CANTIDAD` int(11) NOT NULL,
  `PRECIO` int(11) NOT NULL,
  PRIMARY KEY (`VENTA_FOLIO`,`PRODUCTO_ID_PROD`),
  KEY `fk_VENTA_has_PRODUCTO_PRODUCTO1` (`PRODUCTO_ID_PROD`),
  KEY `fk_VENTA_has_PRODUCTO_VENTA` (`VENTA_FOLIO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `producto`
--
 
CREATE TABLE IF NOT EXISTS `producto` (
  `ID_PROD` int(11) NOT NULL,
  `NOMBRE` varchar(50) NOT NULL,
  `PRECIO_PROD` int(11) NOT NULL,
  `STOCK` int(11) NOT NULL,
  `STOCK_MINIMO` int(11) NOT NULL,
  PRIMARY KEY (`ID_PROD`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `venta`
--
 
CREATE TABLE IF NOT EXISTS `venta` (
  `FOLIO` int(11) NOT NULL,
  `TOTAL` int(11) NOT NULL,
  `DESCUENTO` int(11) NOT NULL,
  PRIMARY KEY (`FOLIO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


y lo que llevo del procedimiento..si me ayudan a terminarlo para continuar aprendiendo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE PROCEDURE REGISTROVENTAS(
IN V_FOLIO INT,
IN V_CANTIDAD INT,
IN V_DESCUENT INT)
 
DECLARE
 
	MENSAJE VARCHAR(50);
	SUBTOTAL INT;
	RESULTADO INT;
 
BEGIN
	SELECT ID_PROD,NOMBRE,PRECIO_PROD,STOCK,STOCK_MINIMO FROM PRODUCTO;
 
	RESULTADO = (V_CANTIDAD * PRECIO_PROD);
 
	IF(STOCK <= 0)
		MENSAJE = 'NO HAY STOCK DISPONIBLE PARA EL PRODUCTO';
	ELSE IF(STOCK < V_CANTIDAD)
		MENSAJE = 'LA CANTIDAD ES MAYOR AL STOCK';
	ELSE IF(STOCK_MINIMO < V_CANTIDAD)
		MENSAJE = 'LA CANTIDAD ES MAYOR AL STOCK MINIMO';
	ELSE IF(DESCUENTO < TOTAL)
		MENSAJE = 'EL DESCUENTO ES MAYOR AL PRECIO TOTAL DEL PRODUCTO..NO SE PUEDE DESCONTAR';
	ELSE
		INSERT INTO VENTA VALUES(V_FOLIO,TOTAL,V_DESCUENTO);
		INSERT INTO DETALLE VALUES(V_FOLIO,PRODUCTO_ID_PRODUCTO,V_CANTIDAD,PRECIO)
	END IF;
END;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ayuda procedimiento almacenado

Publicado por Pedro (54 intervenciones) el 04/08/2013 16:41:45
Por lo que veo necesitas un poco de estudio en el armado de procedimientos,
Empeza por revisar esta pagina

http://taller-bases-datos-itcj.blogspot.com.ar/2012/11/ejemplo-cursores.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda procedimiento almacenado

Publicado por undertaker (21 intervenciones) el 04/08/2013 20:33:41
gracias por responder
una pregunta como logro obtener los datos de los productos para ingresar 1 o mas productos
la verdad estoy muy confundido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda procedimiento almacenado

Publicado por Pedro (54 intervenciones) el 04/08/2013 20:38:10
Segun entiendo por lo que escribiste, los datos de los productos van a salir del cursor
El recorrer el cursor por cada producto te va a dar los valores para analizar el mensaje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda procedimiento almacenado

Publicado por undertaker (21 intervenciones) el 04/08/2013 22:57:32
Espero ir progresando XD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
DROP PROCEDURE IF EXISTS REGISTROVENTAS;
DELIMITER //
CREATE PROCEDURE REGISTROVENTAS(
IN V_FOLIO INT,
IN V_CANTIDAD INT,
IN V_DESCUENTO INT,
IN V_ID_PROD INT,
IN V_PRECIO INT,
IN V_STOCK INT,
IN V_STOCK_MINIMO INT)
 
BEGIN
	DECLARE MENSAJE VARCHAR(50);
	DECLARE SUBTOTAL INT;
	DECLARE RESULTADO INT;
	DECLARE NUEVO_STOCK INT;
	DECLARE NUEVO_STOCK_MINIMO INT;
	DECLARE X INT;
	DECLARE V_MENSAJE VARCHAR(50);
	DECLARE cursorproducto
		CURSOR FOR SELECT  p.id_prod,p.nombre,p.precio,p.stock,p.stock_minimo
		FROM producto p, detalle d
		WHERE p.id_prod = d.producto_id_prod;
	DECLARE CONTINUE HANDLER salida FOR SQLSTATE '20000' SET accion = 1;
	DECLARE accion INT DEFAULT 0;
 
	SET SUBTOTAL =0;
	SET RESULTADO =0;
	SET NUEVO_STOCK =0;
	SET NUEVO_STOCK_MINIMO =0;
	SET X = 0;
	SET RESULTADO = SUM(V_CANTIDAD * PRECIO);
	SET NUEVO_STOCK = SUM(V_STOCK - V_CANTIDAD);
	SET NUEVO_STOCK_MINIMO = SUM(V_STOCK - V_CANTIDAD);
 
	IF V_STOCK <= 0 THEN
		MENSAJE = SELECT 'NO HAY STOCK DISPONIBLE PARA EL PRODUCTO';
	IF V_STOCK < V_CANTIDAD THEN
		MENSAJE = SELECT 'LA CANTIDAD ES MAYOR AL STOCK';
	IF V_STOCK_MINIMO > V_STOCK THEN
		MENSAJE = SELECT 'ERROR STOCK MINIMO MAYOR A STOCK';
	IF V_DESCUENTO > TOTAL THEN
		MENSAJE = SELECT 'EL DESCUENTO ES MAYOR AL PRECIO TOTAL DEL PRODUCTO..NO SE PUEDE DESCONTAR';
	ELSE
 
	OPEN cursorproducto;
	REPEAT
		FETCH cursorproducto INTO id_prod,nombre,precio,stock,stock_minimo;
			X = SUM(RESULTADO)
			INSERT INTO DETALLE VALUES(V_FOLIO,PRODUCTO_ID_PRODUCTO,V_CANTIDAD,RESULTADO);
		UNTIL salida END REPEAT;
	CLOSE cursorproducto;
 
		INSERT INTO VENTA VALUES(V_FOLIO,TOTAL,V_DESCUENTO);
		UPDATE PRODUCTO SET V_STOCK = NUEVO_STOCK,V_STOCK_MINIMO =NUEVO_STOCK_MINIMO WHERE V_ID_PROD = PRODUCTO_ID_PRODUCTO;
	END IF;
END;
//


no se si voy bien enfocado a lo que quiero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willian

ayuda procedimiento almacenado

Publicado por Willian (51 intervenciones) el 05/08/2013 17:56:25
para aclarar algunas cosas
-la funcion "MENSAJE" no existe, si estas queriendo que MYSQL te devuelva un mensaje de error o aviso, tenes que usar "raiserror" pero ojo, si usas la version de MYSQL menor a 5.5 o sea la 5.1 esa funcion aun no existe la debes hacer de forma manual o sea vos la creas para que puedas usar.
-en vez de hacer un procedimiento podes usar un TRIGGER que te sera mucho mejor el mantenimiento, por que en tu caso no veo la necesidad de usar un SP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda procedimiento almacenado

Publicado por undertaker (21 intervenciones) el 06/08/2013 08:02:13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DELIMITER $
CREATE TRIGGER actualizar_stock
AFTER INSERT ON detalle
FOR EACH ROW
BEGIN
	IF(stock <=0) THEN
		SET @mensaje = 'No hay stock disponible';
	ELSEIF(cantidad > stock) THEN
		SET @mensaje = 'La cantidad es superior al stock';
	ELSEIF(stock_minimo >= stock) THEN
		SET @mensaje = 'Advertencia...La cantidad ha superado el stock';
		UPDATE producto
		SET stock=(stock-new.cantidad)
		WHERE id_prod=new.producto_id_prod;
	END IF;
END;
$
DELIMITER $
CREATE PROCEDURE lanzar_trigger()
BEGIN
	CALL actualizar_stock();
END;
$



Hice esto al final...solo logre actualizar stock
una pregunta...Lo que quiero ahora llamar el procedimiento a java
el valor @mensaje es global...es posible que en la aplicacion java salga el mensaje de advertencia o error de acuerdo a las condiciones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willian

ayuda procedimiento almacenado

Publicado por Willian (51 intervenciones) el 06/08/2013 23:11:48
si usas @nombre_variable no es global si no que es un tipo de dato tipo SESSION podes saber mas de esas variables en este link
http://www.java2s.com/Tutorial/MySQL/0201__Procedure-Function/LOCALSESSIONANDGLOBALVARIABLESINMYSQL.htm

para que tengas una idea, supongamos que me conecte con el Usuario "JUAN" con el id de conexión 225, al cargar @nombre_variable voy a poder ver el valor de @nombre_variable haciendo un SELECT de la misma ejemplo : SELECT @nombre_variable;
si por A o B motivo la conexión cae y me re-conecto mi id de conexión ya no sera el 225, si no que otro id y las variables @nombre_varible ya no tendrán valores estarán todas nulas.
En resumen solo esta cargada mientras la conexión este activa.

Bueno ahora entramos al tema de TRIGGERS.
tenes que leer un poco mas sobre trigger podes ver aquí
http://dev.mysql.com/doc/refman/5.0/es/triggers.html

cualquier cosa escribenos..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar