Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-08-2008
JulioGO JulioGO is offline
Miembro
 
Registrado: ago 2004
Posts: 94
Poder: 20
JulioGO Va por buen camino
Consulta sobre procedimiento almacenado

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:

Código SQL [-]
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.

Última edición por JulioGO fecha: 01-08-2008 a las 19:27:37.
Responder Con Cita
  #2  
Antiguo 01-08-2008
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
Hola, no he analizado el código a profundida, pero creo que el problema está en los cursores, lo digo por experiencia, en un trabajo anterior un outsourcing hizo una serie de store procedures, con cursores, y era lentísimo, así que a simple vista te recomiendo que evites el uso de cursores a menos que sea sumamente necesario, ahora estoy en mi trabajo pero más tarde vuelvo a entrar a ver si puedo analizar más detenidamente.

Saludos cordiales.
__________________
"La información tiene más valor cuando se comparte"
Responder Con Cita
  #3  
Antiguo 01-08-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por fer21unmsm Ver Mensaje
Hola, no he analizado el código a profundida, pero creo que el problema está en los cursores, lo digo por experiencia, en un trabajo anterior un outsourcing hizo una serie de store procedures, con cursores, y era lentísimo, así que a simple vista te recomiendo que evites el uso de cursores a menos que sea sumamente necesario, ahora estoy en mi trabajo pero más tarde vuelvo a entrar a ver si puedo analizar más detenidamente.

Saludos cordiales.

coincido con el compañero fer, el uso de cursores en cualquier motor debe ser utilizado cuandos sea estrictamente necesario.

En tu caso, el cursor puede ser convertido facilmente a una consulta de actualización que será por mucho más eficiente
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #4  
Antiguo 01-08-2008
JulioGO JulioGO is offline
Miembro
 
Registrado: ago 2004
Posts: 94
Poder: 20
JulioGO Va por buen camino
Cita:
Empezado por poliburro Ver Mensaje
coincido con el compañero fer, el uso de cursores en cualquier motor debe ser utilizado cuandos sea estrictamente necesario.

En tu caso, el cursor puede ser convertido facilmente a una consulta de actualización que será por mucho más eficiente

Una vez mas gracias por las respuestas. Como dice poliburro, debo convertir el cursor en una consulta de actualizacion. Pero que es eso de consulta de actualizacion. Si pudieras poner un ejemplo seria mejor para entender.

Una vez mas gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consejo para principiante sobre Disparador y Procedimiento almacenado NPIdea Firebird e Interbase 5 18-06-2008 08:13:00
llamar Procedimiento almacenado en una consulta tcp_ip_es MySQL 3 17-06-2008 12:47:38
Consulta dinámica en procedimiento almacenado Ivanzinho Firebird e Interbase 2 24-10-2005 15:26:27
Duda sobre procedimiento almacenado Nuria Firebird e Interbase 33 01-10-2004 21:09:11
Ayuda sobre un Procedimiento Almacenado Nuria Firebird e Interbase 6 21-01-2004 13:18:15


La franja horaria es GMT +2. Ahora son las 10:00:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi