Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-08-2013
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Procedimiento con condiciones dinamicas

Estimados, utilizo Firebird 2.5, y tengo el siguiente procedimiento almacenado llamado inventario_resumen, con la variable de entrada bodegas de tipo varchar:

Código SQL [-]
begin

for select id_item, i_s.nombre, i_s.id_clasificacion from insumos_servicios I_S
INNER JOIN clasificaciones c on c.id_clasificacion = i_s.id_clasificacion
where que_es = 'T' AND estructura = 0 into :id_item, :nombre, :id_clasificacion do
begin
execute statement
'select coalesce(sum(cantidad * precio)/sum(iif(cantidad = 0,1,cantidad)),0),
coalesce(sum(cantidad),0) from inventario
where id_item ='||:id_item||' and id_bodega in '||(:bodegas)
into recio_medio, :cantidad_ingreso;


execute statement
'select coalesce(avg(precio),0), coalesce(sum(cantidad),0) from inventario_egreso
where id_item ='||:id_item||' and id_bodega in '||(:bodegas)
into recio_egreso, :cantidad_egreso;

suspend;
end
end

el cual lo llamo se la siguiente forma:

Código SQL [-]
select id_item, nombre, cantidad_ingreso - cantidad_egreso saldo, precio_medio,
(cantidad_ingreso - cantidad_egreso) * precio_medio subtotal from inventario_resumen (:bodegas)
where cantidad_ingreso > cantidad_egreso

donde bodegas tienes el formato por ejemplo: (1,2,5), que serian los id de las bodegas a consultar.
EL problema es que la condiciones de busqueda las hago al resultado de la consulta al agregarle por ejemplo estas lineas a la llamada del procedimiento.

Código SQL [-]
and id_clasificacion =:id_clasificacion
and nombre like :nombre

... pero de igual forma el procedimiento recorre cada uno de los registros de la tabla "insumos_servicios"

He pensado en agregar mas variables de entraqda al procedimiento, tal que las condiciones se realicen directamente a la consulta original y así evitar tener que procesar todos los registros de la tabla "insumos_servicios"
Hasta aquí todo va bien, pero surge un problema, que ocurre si el usuario desea listar todos los registros, las nuevas condiciones no podría sacarlas del query original, y estaría obligado siempre tener alguna condicioin, ya que no podria, por ejemplo, quitar la linea del procedimiento

Código SQL [-]
and nombre like :nombre

Espero se entienda y me puedan ayudar a resolver esto.
Gracias
Responder Con Cita
  #2  
Antiguo 13-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Por qué usas 'execute statement'?
Responder Con Cita
  #3  
Antiguo 13-08-2013
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
porque el usuario puede elegir revisar los items de mas de una bodega, de esta forma la condición es IN, y la forma de ingresar este parámetro al procedimiento es por una cadena, y si intento ejecutar el procedimiento con el parametro de entrada "bodega" directamente me arroja un error, por esto ejecuto cadena completa incluyendo la condicion IN como una gran cadena.

Pero finalmente esto no me arroja ningun problema.
He pensado en hacer dos procedimientos, uno con condiciones y otro sin... espero poder resolverlo de una mejor manera.
Otra idea es pasar el query completo como una variable de entrada, que incluya las condiciones que quiera y ejecutarlo todo como una gran cadena... sera la mejor ?

Gracias
Responder Con Cita
  #4  
Antiguo 13-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pienso que no es la forma de hacer eso. Es como si se pincha la rueda del coche y en lugar de arreglarla le haces un "invento"
Responder Con Cita
  #5  
Antiguo 13-08-2013
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
completamente de acuerdo, como lo harías??
Responder Con Cita
  #6  
Antiguo 13-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues como tú mismo has indicado, pasándole los parámetros necesarios.
Así, a simple vista, no creo que necesites el "execute statement".
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
Fecha con condiciones rufo Varios 17 07-04-2010 00:44:51
Paradox--->Condiciones lurad Tablas planas 2 19-09-2006 20:45:40
Condiciones Carlex SQL 7 09-08-2004 21:15:33
Condiciones en SQL agova SQL 5 20-07-2004 01:28:24
condiciones en interbase squenda Conexión con bases de datos 5 29-03-2004 02:54:49


La franja horaria es GMT +2. Ahora son las 12:09:20.


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