Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Select con funcion IN como parametro (https://www.clubdelphi.com/foros/showthread.php?t=94222)

IVAND 08-10-2019 01:43:53

Select con funcion IN como parametro
 
Hola a todos
Tengo una duda con la funcion In ,
Este es mi SP
Variable definica en el store procedure
Código:

    KEY_FLUJO integer,
    NOMBRE_CUENTA varchar(200),
    CUENTA varchar(50),
    MONTO numeric(15,2),
    LISTA varchar(100),

Código:

FOR select x.key_flujo,
x.nombre_cuenta,
X.cuenta,
x.cuentas_afectan

Esta es la cadena que contiene los valores (58,533,23,419,492,29,544,536,576,577,283,284)
Código:

from flujo_efectivo x  into :key_flujo,:nombre_cuenta,:cuenta,:lista Do
 Begin
  select sum(d.debe-d.haber)
    from cab_diario c ,det_diario d
    where c.key_cab_diario=d.key_cab_diario
    and c.estado='T'
    and extract(year from c.fecha_diario)=:anio
    and d.key_plan_ctas in into :monto ;

sale obvio error de convertir a string, por el parametro que se pasa al IN , alguien de ustedes ha tenido esta duda y como lo ha podido solucionar desde un store procedure

Probe tambien remplazado la variable :lista por este select y no arroja valor alguno
Código SQL [-]
select sum(debe-haber)
from cab_diario c,det_diario d
where c.key_cab_diario = d.key_cab_diario
and c.estado='T'
and extract(year from c.fecha_diario)=2018
and d.key_plan_ctas in (select list(tx.cuentas_afectan) from flujo_efectivo tx where tx.key_flujo=172)
si funciona logicamente si hago esto
Código SQL [-]
select sum(d.debe-d.haber)
 from cab_diario c , det_diario d where c.key_cab_diario=d.key_cab_diario
  and c.estado='T' and extract(year from c.fecha_diario)=:anio
  and d.key_plan_ctas in (58,533,23,419,492,29,544,536,576,577,283,284)

:(:(:(:(

Gracias por su tiempo

IVAND 08-10-2019 01:52:59

Este es el store procedure no se porque arriba sale tan mal
Código SQL [-]
create or alter procedure SP_FLUJO_EFECTIVO (
    ANIO integer)
returns (
    KEY_FLUJO integer,
    NOMBRE_CUENTA varchar(200),
    CUENTA varchar(50),
    MONTO numeric(15,2),
    LISTA varchar(100),
    LISTA2 varchar(10))
as
begin
 FOR select x.key_flujo, x.nombre_cuenta, X.cuenta,x.cuentas_afectan
 from flujo_efectivo x where x.key_flujo=172 into :key_flujo,:nombre_cuenta,:cuenta,:lista Do
 Begin
  select sum(d.debe-d.haber)
    from cab_diario c ,det_diario d
    where c.key_cab_diario=d.key_cab_diario
    and c.estado='T'
    and extract(year from c.fecha_diario)=:anio
    and d.key_plan_ctas in (:lista) into :monto ;
  /* Procedure Text */
  suspend;

 End
end

Casimiro Notevi 08-10-2019 13:03:34

Prueba a cambiar el 'in' por el 'exists'.

TOPX 08-10-2019 14:54:21

Hola

Por su sintaxis, parece que utilizara Firebird. Aunque no estoy seguro.

De todas maneras,
-

IVAND 09-10-2019 06:36:17

Si disculpa utilizo firebird 2.5

IVAND 09-10-2019 07:06:32

Gracias por su respuesta , pero exists no funciona ya que lo que estoy pasando es una cadena

formada de esta manera en la base de datos


select sum(d.debe-d.haber)
from cab_diario c , det_diario d where c.key_cab_diario=d.key_cab_diario
and c.estado='T' and extract(year from c.fecha_diario)=:anio
and d.key_plan_ctas in (58,533,23,419,492,29,544,536,576,577,283,284)

asi deberia armarse el query pero si paso la cadena desde la base da error de string

IVAND 09-10-2019 07:47:52

Agradecido

Código SQL [-]
create or alter procedure SP_FLUJO_EFECTIVO (
    ANIO integer)
returns (
    KEY_FLUJO integer,
    NOMBRE_CUENTA varchar(500),
    CUENTA varchar(500),
    MONTO numeric(15,2),
    LISTA varchar(500))
as
declare variable SMTP varchar(500);
begin
 FOR select x.key_flujo, x.nombre_cuenta, X.cuenta,x.cuentas_afectan
 from flujo_efectivo x into :key_flujo,:nombre_cuenta,:cuenta,:lista Do
 Begin
  monto=0;
  if (:lista is not null) then
  Begin
  smtp = 'select sum(d.debe-d.haber)
  from cab_diario c , det_diario d where c.key_cab_diario=d.key_cab_diario
  and c.estado=''T'' and extract(year from c.fecha_diario)=2018
  and d.key_plan_ctas in ('||:lista||')';

  EXECUTE STATEMENT :smtp into :monto;
  End
 /* Procedure Text */
  suspend;

 End
end

Ahi quedo el SP Gracias a los dos companeros por su tiempo y amabilidad

Casimiro Notevi 09-10-2019 11:28:43

Cita:

Empezado por IVAND (Mensaje 533888)
Gracias por su respuesta , pero exists no funciona ya que lo que estoy pasando es una cadena
formada de esta manera en la base de datos
select sum(d.debe-d.haber)
from cab_diario c , det_diario d where c.key_cab_diario=d.key_cab_diario
and c.estado='T' and extract(year from c.fecha_diario)=:anio
and d.key_plan_ctas in (58,533,23,419,492,29,544,536,576,577,283,284)
asi deberia armarse el query pero si paso la cadena desde la base da error de string

Suponía que esos datos estaban extraidos de un campo de una tabla, y no que era una cadena "fija".


La franja horaria es GMT +2. Ahora son las 02:42:17.

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