Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sp. con errores como solucionarlo y mejora los indices (https://www.clubdelphi.com/foros/showthread.php?t=39324)

IVAND 17-01-2007 00:29:18

Sp. con errores como solucionarlo y mejora los indices
 
Hola a todos

Utilizo firebird 1.5.3 , estoy tratando de crear un sp que le datos de una tabla y luego esos datos lo envio como parametros para sacar un informe que me estan pidiendo que es sacar las ventas por ano y mes por ciertos rangos los cuales pueden parametrizados (por eso lo puse en un a tabla y los envio para obtener el query)

Anexo el codigo del Sp.
Código SQL [-]
CREATE PROCEDURE FACTURA_CONTADOR (
    key_empresa integer,
    ano integer)
returns (
    dato char(10),
    mes integer,
    anos integer,
    no_vence numeric(15,2),
    monto_factura numeric(15,2))
as
declare variable valor1 integer;
declare variable valor2 integer;
Begin
FOR select descripcion,valor1,valor2 from tabla
 where key_padre =
    (select key_hijo from tabla where nomtabla ='REPOR'
                  and key_padre is null
                  and key_empresa=:key_empresa)   Into :dato,:valor1,:valor2 DO
Begin
 select count(c.key_cab_fac) Nveces,
 extract(month from c.fec_factura) mes,
 sum(f.total) total
 from cab_fac c , form_pago f
 where c.key_cab_fac=f.key_cab_fac
 and extract(year from c.fec_factura) = :ano
 and c.estado_fac='T'
 and f.cod_pago=533
 and f.total between :valor1 and :valor2
 group by  extract(month from c.fec_factura) into :no_vence,:mes,:monto_factura ;
 Suspend;

End
END

Me sale un error de single row en select y no me muestra nada , si quito el select despues del do me muestra los rangos de pedidos pero no los datos que deberia alguien me puede orientar o dar otra mejor idea de sacar este infiorme , crear algun indice para que valla mas rapido o algo ,
Nota : Si ejecuto el select solo si funciona pero con solo un rango
Código SQL [-]
 select count(c.key_cab_fac) Nveces,
 extract(month from c.fec_factura) mes,
 sum(f.total) total
 from cab_fac c , form_pago f
 where c.key_cab_fac=f.key_cab_fac
 and extract(year from c.fec_factura) = :ano
 and c.estado_fac='T'
 and f.cod_pago=533
 and f.total between :valor1 and :valor2
 group by  extract(month from c.fec_factura)

Lepe 17-01-2007 11:42:28

debes usar algo así:
Código SQL [-]
for select count(c.key_cab_fac) Nveces,
 extract(month from c.fec_factura) mes,
 sum(f.total) total
from tabla
where ....
group by .....
into  :dato, :mes, :anos  do
  suspend;

Con eso estas diciendo que para registro que exista, haga un suspend.

Ademas el "select ... into" dice que los valores que estas seleccionando en la tabla, los pase a los parámetros "dato, mes, ano"

El "count(c.key_cab_fac) " se guardaría en el parámetro "dato"
El "extract(month from c.fec_factura)" en el parámetro "mes"
etc.

Saludos

IVAND 17-01-2007 16:08:44

Gracias Lepe por tu respuesta , exactamente es lo que hago un suspend pero parace que el errro lo da al entrar al select , no entiendo he echo un monton de sp de esta manera pero aqui halgo esta mal .... Seguro alguna alma caritativa me ayudara


De antemano gracias


Seguire intentando

IVAND 17-01-2007 16:42:58

Hola a todos nuevamente

Estoy con mente mas fresca y tengo varias inquietudes.

1-) El primer select (for ) me saca los parametros que envio al segundo select
2-) el segundo select responde enviando varios registros (ahi es donde esta el problema deberia mandar uno a la vez entonces entra el Suspend lo retorna y continua el ciclo entonces deberia aumentar un for al segundo select y mandar otro select para que me retorne el valor unico y asi continuar hasta que termino el ciclo pero aqui me pierdo necesito de su ayuda con este problema


De antemano Gracias
:(

fdelamo 17-01-2007 17:45:42

¿El error que da es "multiple rows in singleton select"?

Si es así, el error se produce por que el siguiente select
Código SQL [-]
select key_hijo from tabla where nomtabla ='REPOR'
                  and key_padre is null
                  and key_empresa=:key_empresa
devuelve más de un registro para algún valor.

Prueba a poner un "in" en lugar de un "=":

Código SQL [-]
FOR select descripcion,valor1,valor2 from tabla
 where key_padre IN
    (select key_hijo from tabla where nomtabla ='REPOR'
                  and key_padre is null
                  and key_empresa=:key_empresa)   Into :dato,:valor1,:valor2 DO

IVAND 18-01-2007 21:02:42

Ya lo he probado el problema esta en el segundo query , lo que me envia es un conjunto de datos (20 Registros o Menos), aqui es donde esta el problema al parecer no puede enviar todos estos registros con un suspend si no que tiene que hacerlo uno a uno , entonces me parece que al segundo query agregarle un for y con estos datos enviar la consulta , pero ahi estaria matando al servidor


La franja horaria es GMT +2. Ahora son las 06:42:20.

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