Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=11090)

Sudamericano 04-06-2004 23:58:58

Ayuda con Stored Procedure
 
Consulta:

Tengo la siguientes tablas

Tabla : producto

codigo_producto
nombre_producto
Stock_fisico

Tabla : Serie_productos ( )

Codigo_producto
codigo_serie

El stock_fisico(tabla producto) debe coincidir con el numero de series (tabla serie_productos)

ejemplo si tengo 5 monitores samgung debo tener 5 series

Tengo un procedimiento almacenado de esta manera


CREATE PROCEDURE STOCK_VS_SERIE
RETURNS (
CODiGO_ PRODUCTO VARCHAR(25) CHARACTER SET NONE,
NOMBRE_PRODUCTO VARCHAR(150) CHARACTER SET NONE,
STOCk_FISICO DOUBLE PRECISION,
NRO_SERIES INTEGER,
DIFERENCIA INTEGER)
AS
DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE CODPROD VARCHAR(50);
BEGIN
FOR SELECT
CODIGO_PRODUCTO,
NOMBRE_PRODUCTO,
STOCK_FISICO,
FROM PRODUCTO
INTO :CODIGO_PRODUCTO,
:NOMBRE_PRODUCTO,
:STOCK_FISICO,
DO
BEGIN
/* Por cada registro yo verifico cuantas series existen, deberian ser iguales */
SELECT COUNT (*) FROM SERIE_PRODUCTOS
WHERE CODIGO_PRODUCTO = :CODPROD
INTO :CNT;
NRO_SERIES = :CNT;
DIFERENCIA = STOCK_FISICO - :CNT;
CODIGO_PRODUCTO = :CODPROD;
SUSPEND;
END
END


// Este SP me devuelve todos los productos con la cantidad de Nro_series

lo que deseo es que me devuelva solo los que la variable diferencia sea distinta de cero

haber si alguien me da una mano con esto es la primera vez que escribo asi que disculpen si estoy cometiendo alguna falta grave, desde ya gracias por la ayuda

kinobi 05-06-2004 01:59:07

Hola,

Cita:

Empezado por Sudamericano
// Este SP me devuelve todos los productos con la cantidad de Nro_series

lo que deseo es que me devuelva solo los que la variable diferencia sea distinta de cero

Código SQL [-]
select * 
  from STOCK_VS_SERIE 
  where DIFERENCIA > 0

Como parece que eres nuevo por estos foros, te aconsejo la lectura de la Guía de estilo

Además, si introduces código en tus mensajes, también te aconsejo la lectura de este hilo (http://www.clubdelphi.com/foros/showthread.php?t=9991) que trata sobre el uso de las etiquetas vB para el formateo de mensajes.

Saludos y bienvenido.

Sudamericano 07-06-2004 18:03:50

Gracias kinobi por tu respuesta, pero la verdad es algo que yo ya habia intentado y obviamente funciona, pero muy lento por eso mi pregunta era como modificar el stored procedure original para obtener los diferentes de cero

guillotmarc 07-06-2004 18:16:54

Hola.

¿ Ya has creado un índice para el campo CODIGO_PRODUCTO en la tabla SERIE_PRODUCTOS ?

Saludos.

Sudamericano 07-06-2004 18:47:37

Gracias por tu respuesta tan rapida, pero si he creado el indice

creo que lo ideal es modificar ese sp, y en eso necesito la ayuda de ustedes

cahp 08-06-2004 20:39:45

para que te devuelva solo los que difieren las cantidades, pon el suspend dentro de un if:

Código SQL [-]
DIFERENCIA = STOCK_FISICO - :CNT;

IF (DIFERENCIA > 0) THEN
    SUSPEND;


Saludos.

cahp 08-06-2004 20:43:19

Otra cosa que puedes hacer es crearte una vista de la segunda tabla, y solo tienes que comparar el stock por codigo de producto en las dos tablas


Saludos de nuevo.

Sudamericano 08-06-2004 21:27:24

Gracias por la sugerencia, lo intente pero el ibexpert aparentemente se cuelga y luego despues de un largo tiempo aparecen los datos
cuando pongo el suspend despues del if DIFERENCIA <>0

Tu crees que se pueda mejorar ese SP,

guillotmarc 08-06-2004 21:38:07

¿ Cuantos registros tienen las tablas ?.

Estas consultas son muy sencillas, y solo con el índice para CODIGO_PRODUCTO en la tabla SERIES_PRODUCTOS deberias tener bastante para optimizar el procedimiento. ¿ Estás seguro que tienes este índice creado ?.

Respecto a la pregunta que has hecho antes, tener el suspend dentro de un IF no hará que el procedimiento se ejecute más rápido (un poco si, pero casi no lo notarás). La diferencia está en que solo te devolverá los registros con DIFERENCIA <> 0, que parece ser que són los únicos que te interesan.

Saludos.

Sudamericano 08-06-2004 22:18:51

Nuevamente gracias por su ayuda y tiempo, ejecutando el sp original (sin el if diferencia<>0) se demora 3 segundos aprox. cuando agrego el condicional se demora 3 minutos con 48 seg. aprox. como notaran es marcada la diferencia

por ahora la solucion fue, ejecutar el sp original y luego en mi aplicacion hacer el filtro respectivo, de esta manera es mas eficiente que usando el sp modificado

Si alguien puede dar sugerencias para hacerlo con un sp, sera bienvenida toda ayuda

mil gracias por su ayuda ,poro otro lado estoy para servirles en lo que necesiten, tanto en delphi, como en c .

guillotmarc 08-06-2004 22:52:56

¿ Estás seguro de eso ?

Una cosa es que cuando ejecutes el procedimiento almacenado, tarde 3 segundos en empezar a mostrarte registros, y otra cosa es que tarde 3 segundos en calcular toda la consulta.

Ejecuta el procedimiento original. Cuando en IB-Expert te empieze a mostrar registros, dale a Ctrl-Fin para indicarle que quieres ir al último. Cuenta el tiempo que tarda en saltar al último registro (es el tiempo que necesita para calcular todos los registros).

Seguro que te tiene que tardar aprox. 3 min. 50 seg., al igual que el procedimiento modificado.

Optimiza de verdad las consultas involucradas dentro del procedimiento almacenado. Para ello, consulta el plan de ejecución de esas consultas.

Saludos.

guillotmarc 08-06-2004 22:55:18

Por cierto, aún no has dicho cuantos registros tienen las tablas PRODUCTO y SERIE_PRODUCTOS.

Saludos.

Sudamericano 08-06-2004 23:07:50

Ups obvie ese pequeño detalle la de productos tiene aprox 8,000 registros y la de serieproductos aprox 300,000

cahp 09-06-2004 01:26:32

prueba asi, creo que aprovecharas mejor los indices

Código SQL [-]
CREATE PROCEDURE STOCK_VS_SERIE 
returns (PRODUCTO        VARCHAR(25),
     NOMBRE_PRODUCTO VARCHAR(150),
     STOCK_FISICO    DOUBLE PRECISION,
     NRO_SERIES      INTEGER,
     DIFERENCIA      INTEGER)
AS 

begin
FOR
  SELECT COUNT(CODIGO_SERIE), CODIGO_PRODUCTO
  FROM SERIE_PRODUCTO
  GROUP BY CODIGO_PRODUCTO
  INTO :NRO_SERIES, :PRODUCTO
DO
BEGIN
     SELECT NOMBRE_PRODUCTO, STOCK_FISICO
     FROM PRODUCTO
     WHERE CODIGO_PRODUCTO = :PRODUCTO
     INTO :NOMBRE_PRODUCTO, :STOCK_FISICO;
     
     DIFERENCIA = STOCK_FISICO - NRO_SERIES;

     if (DIFERENCIA > 0 ) THEN
     SUSPEND;
END
end

saludos


La franja horaria es GMT +2. Ahora son las 11:12:51.

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