JulioGO
01-08-2008, 19:14:21
Buenas tardes ante todo. El siguiente hilo lo aperturo para hallar alguna respuesta sobre la implementacion de procedimientos almacenados en MySQL. Antes de continuar, explico la situacion en la que trabajo: Tengo el servidor 5.0.51b-community-nt, en una PC de 80GB con 256MB. En ella creo una base de datos que me permitira controlar los ingresos y egresos de un almacen.
Estas son las tablas con las que dispongo: ct_articulo(informacion articulo), ct_venta y ct_dventa(cabecera y detalle de venta), ct_compra y ct_dcompra(cabecera y detalle de compra) y por ultimo kd_movim y kd_movim(cabecera y detalle de movimiento de almacen distintos a compras y ventas). Todas las tablas mencionadas las cree con el motor MyISAM.
No hay ningun problema con la consulta de las tablas. Hasta el momento tengo los modulos de ingresos y egresos. La cuestion viene cuando quiero implementar el procedimiento que realice el proceso de kardeo promedio.
Aqui detallo los pasos que realizo para ejecutar dicha tarea:
1. Creo una tabla temporal, denominada ct_movim_artic. En ella traslado las entradas, salidas y demas movimientos registrados en las tablas arriba mencionadas. Esto demora nada mas que 2 segundos. Hasta aqui no hay problemas
2. Al ejecutar el procedimiento de kardeo nombrado sp_kardex_prom, me demora, por un ejemplo 15 segundos solamente para leer 561 registros. Personalmente me parece que es demasiado para hacer un simple promedio.
A continuacion les pongo el procedimiento sp_kardex_prom:
DROP PROCEDURE `sp_kardex_prom`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_kardex_prom`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE ttipmov VARCHAR(1);
DECLARE tfecha DATE;
DECLARE truc VARCHAR(15);
DECLARE ttipdoc VARCHAR(2);
DECLARE tnrodoc VARCHAR(15);
DECLARE tcantid DECIMAL(12,4) DEFAULT 0;
DECLARE tpreuni DECIMAL(18,2) DEFAULT 0;
DECLARE in_qty DECIMAL(12,4) DEFAULT 0;
DECLARE in_price DECIMAL(18,2) DEFAULT 0;
DECLARE in_total DECIMAL(18,2) DEFAULT 0;
DECLARE out_qty DECIMAL(12,4) DEFAULT 0;
DECLARE out_price DECIMAL(18,2) DEFAULT 0;
DECLARE out_total DECIMAL(18,2) DEFAULT 0;
DECLARE stock_qty DECIMAL(12,4) DEFAULT 0;
DECLARE stock_price DECIMAL(18,2) DEFAULT 0;
DECLARE stock_total DECIMAL(18,2) DEFAULT 0;
DECLARE movim CURSOR FOR SELECT tipmov, fecha, ruc, tipdoc, nrodoc, cantid, preuni
FROM regist.ct_movim_artic
ORDER BY fecha, tipmov ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN movim;
REPEAT
SET in_qty = 0;
SET in_price = 0;
SET in_total = 0;
SET out_qty = 0;
SET out_price = 0;
SET out_total = 0;
FETCH movim INTO ttipmov, tfecha, truc, ttipdoc, tnrodoc, tcantid, tpreuni;
IF NOT done THEN
IF(ttipmov = 'E') THEN
SET in_qty = tcantid;
SET in_price = tpreuni;
SET in_total = in_qty * in_price;
SET stock_qty = stock_qty + in_qty;
SET stock_total = stock_total + in_total;
SET stock_price = stock_total/stock_qty;
ELSE
SET out_qty = tcantid;
SET out_price = stock_price;
SET out_total = out_qty * stock_price;
SET stock_qty = stock_qty - out_qty;
SET stock_total = stock_total - out_total;
END IF;
INSERT INTO ct_kardex_artic VALUES(tfecha, truc, ttipdoc, tnrodoc, in_qty, in_price, in_total, out_qty,
out_price, out_total, stock_qty, stock_price, stock_total);
END IF;
UNTIL done END REPEAT;
CLOSE movim;
END
Esperando alguna ayuda, agradezco con anticipacion
Julio Gonzales Ochoa.
Estas son las tablas con las que dispongo: ct_articulo(informacion articulo), ct_venta y ct_dventa(cabecera y detalle de venta), ct_compra y ct_dcompra(cabecera y detalle de compra) y por ultimo kd_movim y kd_movim(cabecera y detalle de movimiento de almacen distintos a compras y ventas). Todas las tablas mencionadas las cree con el motor MyISAM.
No hay ningun problema con la consulta de las tablas. Hasta el momento tengo los modulos de ingresos y egresos. La cuestion viene cuando quiero implementar el procedimiento que realice el proceso de kardeo promedio.
Aqui detallo los pasos que realizo para ejecutar dicha tarea:
1. Creo una tabla temporal, denominada ct_movim_artic. En ella traslado las entradas, salidas y demas movimientos registrados en las tablas arriba mencionadas. Esto demora nada mas que 2 segundos. Hasta aqui no hay problemas
2. Al ejecutar el procedimiento de kardeo nombrado sp_kardex_prom, me demora, por un ejemplo 15 segundos solamente para leer 561 registros. Personalmente me parece que es demasiado para hacer un simple promedio.
A continuacion les pongo el procedimiento sp_kardex_prom:
DROP PROCEDURE `sp_kardex_prom`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_kardex_prom`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE ttipmov VARCHAR(1);
DECLARE tfecha DATE;
DECLARE truc VARCHAR(15);
DECLARE ttipdoc VARCHAR(2);
DECLARE tnrodoc VARCHAR(15);
DECLARE tcantid DECIMAL(12,4) DEFAULT 0;
DECLARE tpreuni DECIMAL(18,2) DEFAULT 0;
DECLARE in_qty DECIMAL(12,4) DEFAULT 0;
DECLARE in_price DECIMAL(18,2) DEFAULT 0;
DECLARE in_total DECIMAL(18,2) DEFAULT 0;
DECLARE out_qty DECIMAL(12,4) DEFAULT 0;
DECLARE out_price DECIMAL(18,2) DEFAULT 0;
DECLARE out_total DECIMAL(18,2) DEFAULT 0;
DECLARE stock_qty DECIMAL(12,4) DEFAULT 0;
DECLARE stock_price DECIMAL(18,2) DEFAULT 0;
DECLARE stock_total DECIMAL(18,2) DEFAULT 0;
DECLARE movim CURSOR FOR SELECT tipmov, fecha, ruc, tipdoc, nrodoc, cantid, preuni
FROM regist.ct_movim_artic
ORDER BY fecha, tipmov ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN movim;
REPEAT
SET in_qty = 0;
SET in_price = 0;
SET in_total = 0;
SET out_qty = 0;
SET out_price = 0;
SET out_total = 0;
FETCH movim INTO ttipmov, tfecha, truc, ttipdoc, tnrodoc, tcantid, tpreuni;
IF NOT done THEN
IF(ttipmov = 'E') THEN
SET in_qty = tcantid;
SET in_price = tpreuni;
SET in_total = in_qty * in_price;
SET stock_qty = stock_qty + in_qty;
SET stock_total = stock_total + in_total;
SET stock_price = stock_total/stock_qty;
ELSE
SET out_qty = tcantid;
SET out_price = stock_price;
SET out_total = out_qty * stock_price;
SET stock_qty = stock_qty - out_qty;
SET stock_total = stock_total - out_total;
END IF;
INSERT INTO ct_kardex_artic VALUES(tfecha, truc, ttipdoc, tnrodoc, in_qty, in_price, in_total, out_qty,
out_price, out_total, stock_qty, stock_price, stock_total);
END IF;
UNTIL done END REPEAT;
CLOSE movim;
END
Esperando alguna ayuda, agradezco con anticipacion
Julio Gonzales Ochoa.