Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2015
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Parametros en IN del Where

Hola amigos buenas noches.

Uso DELPHI6, FireBird 2.0

Estoy tratanto de pasar como parametro una cadena tipo VarChar de 300 en un store procedure. Este el SP estoy construyendo:
Código SQL [-]
CREATE PROCEDURE MOVTOS_MASIVOS_DOTACIONES(
  I_FECHA_INI DATE,
  I_FECHA_FIN DATE,
  I_PORCENTAJE SMALLINT,
  I_LECHERIAS VARCHAR(300))
AS
DECLARE VARIABLE V_NVA_DOT_LTS INTEGER;
DECLARE VARIABLE V_NVA_DOT_CANAST INTEGER;
DECLARE VARIABLE V_LECHERIA NUMERIC(10, 2);
DECLARE VARIABLE V_DOT_ACTUAL_LTS INTEGER;
DECLARE VARIABLE V_DOT_ACTUAL_CANAST INTEGER;
DECLARE VARIABLE V_FECHA_DISTR DATE;
DECLARE VARIABLE V_FECHA_VENTA DATE;
DECLARE VARIABLE V_CANAST_NUEVAS INTEGER;
DECLARE VARIABLE V_LTS_NUEVOS INTEGER;
DECLARE VARIABLE V_CANAST_AFECTADAS INTEGER;
DECLARE VARIABLE V_PIEZAS SMALLINT;
DECLARE VARIABLE V_EQ_LITROS SMALLINT;
BEGIN
     DELETE FROM MOVTOS_MASIVOS_DOTAC;
     FOR SELECT a.FECHA_DISTRIBUCION,
             a.FECHA_VENTA,
            a.lecher,
            a.dotacion_programada,
            ROUND(a.dotacion_programada/(c.piezas*c.equivalente_litros)),
                C.PIEZAS,
                C.EQUIVALENTE_LITROS
       from guia_venta_diaria a,
          lecheria b,
          producto c
         where a.lecher=b.lecher
        and a.fecha_venta between :I_FECHA_INI and :I_FECHA_FIN
        and a.cve_producto=c.cve_producto
        and a.cve_producto like 'AS%'
              and a.LECHER IN (:I_LECHERIAS)
       order by a.fecha_venta,a.lecher
           INTO :V_FECHA_DISTR,
                :V_FECHA_VENTA,
                :V_LECHERIA,
                :V_DOT_ACTUAL_LTS,
                :V_DOT_ACTUAL_CANAST,
                :V_PIEZAS,
                :V_EQ_LITROS DO
                BEGIN
                    V_CANAST_AFECTADAS=round(ROUND(:V_DOT_ACTUAL_LTS/(:V_PIEZAS*:V_EQ_LITROS))*(:I_PORCENTAJE/100.00) );
                    V_CANAST_NUEVAS=:V_DOT_ACTUAL_CANAST-:V_CANAST_AFECTADAS;
                    V_LTS_NUEVOS=:V_CANAST_NUEVAS*(:V_PIEZAS*:V_EQ_LITROS);
                    
                    INSERT INTO MOVTOS_MASIVOS_DOTAC(   FECHA_DISTRIBUCION,
                            FECHA_VENTA,
                            LECHERIA,
                            CVE_PRODUCTO,
                            DOTACION_LTS_ACTUAL,
                            DOTACION_CANASTILLAS_ACTUAL,
                            PORCENTAJE,
                            DOTACION_LTS_NUEVOS,
                            DOTACION_CANASTILLAS_NUEVAS,
                            CANASTILLAS_AFECTADAS)
                                    values(  :V_FECHA_DISTR,
                                             :V_FECHA_VENTA,
                                             :V_LECHERIA,
                                             'AS-606-1315',
                                             :V_DOT_ACTUAL_LTS,
                                             :V_DOT_ACTUAL_CANAST,
                                             :I_PORCENTAJE,
                                             :V_LTS_NUEVOS,
                                             :V_CANAST_NUEVAS,
                                             :V_CANAST_AFECTADAS);

                END
END

Lo marcado en ROJO, se puede usar en un procedimiento almacenado?...o como le hago para se ejecute sin que marque error??

Dentro de Delphi, acumulo ciertos datos del tipo string en una variable, les pongo codigo:
Código Delphi [-]
procedure TfrmMovtosMasivos.BitBtn1Click(Sender: TObject);
var
   i:integer;
begin
    cLecherias:='';
    With lvLecherias do
    begin
         for i:=0 to lvLecherias.Items.Count-1 do
         begin
             if Items[i].Checked then
             begin
                 cLecherias:=cLecherias+Items[i].SubItems[0]+',';
             end;
         end;
    end;
    cLecherias:=copy(cLecherias,1,Length(cLecherias)-1);
    spcDotMasivas.Close;
    spcDotMasivas.ParamByName('i_fecha_ini').AsDate:=FechaInicial.Date;
    spcDotMasivas.ParamByName('i_fecha_fin').AsDate:=FechaFinal.Date;
    spcDotMasivas.ParamByName('i_porcentaje').AsString:=mskPorcentaje.Text;
    spcDotMasivas.ParamByName('i_lecherias').AsString:=cLecherias;
    spcDotMasivas.ExecProc;
end;

Donde en la sección q deje de rojo, intento pasarle una cadena como esta: 12309102,1029301902,109239013, pero marca un error a la hora de ejecutar el SP, el mensaje de error es el siguiente:

Código:
Arithmetic exception, numeric overflow, or string truncation.
At procedure 'MOVTOS_MASIVOS_DOTACIONES'.

Lo anterior es porque quiero pasarle todas las claves en una sola variable al SP, usando el COMANDO IN del WHERE, pero no he podido. Esto claro esta que se puede resolver si quito el FOR del SELECT....bueno quedaria asi:

Código SQL [-]
CREATE PROCEDURE MOVTOS_MASIVOS_DOTACIONES(
  I_FECHA_INI DATE,
  I_FECHA_FIN DATE,
  I_PORCENTAJE SMALLINT,
  I_LECHERIAS NUMERIC(10))
AS
DECLARE VARIABLE V_NVA_DOT_LTS INTEGER;
DECLARE VARIABLE V_NVA_DOT_CANAST INTEGER;
DECLARE VARIABLE V_LECHERIA NUMERIC(10, 2);
DECLARE VARIABLE V_DOT_ACTUAL_LTS INTEGER;
DECLARE VARIABLE V_DOT_ACTUAL_CANAST INTEGER;
DECLARE VARIABLE V_FECHA_DISTR DATE;
DECLARE VARIABLE V_FECHA_VENTA DATE;
DECLARE VARIABLE V_CANAST_NUEVAS INTEGER;
DECLARE VARIABLE V_LTS_NUEVOS INTEGER;
DECLARE VARIABLE V_CANAST_AFECTADAS INTEGER;
DECLARE VARIABLE V_PIEZAS SMALLINT;
DECLARE VARIABLE V_EQ_LITROS SMALLINT;
BEGIN
     DELETE FROM MOVTOS_MASIVOS_DOTAC;
     SELECT a.FECHA_DISTRIBUCION,
             a.FECHA_VENTA,
            a.lecher,
            a.dotacion_programada,
            ROUND(a.dotacion_programada/(c.piezas*c.equivalente_litros)),
                C.PIEZAS,
                C.EQUIVALENTE_LITROS
       from guia_venta_diaria a,
          lecheria b,
          producto c
         where a.lecher=b.lecher
        and a.fecha_venta between :I_FECHA_INI and :I_FECHA_FIN
        and a.cve_producto=c.cve_producto
        and a.cve_producto like 'AS%'
              and a.LECHER=:I_LECHERIAS
       order by a.fecha_venta,a.lecher
           INTO :V_FECHA_DISTR,
                :V_FECHA_VENTA,
                :V_LECHERIA,
                :V_DOT_ACTUAL_LTS,
                :V_DOT_ACTUAL_CANAST,
                :V_PIEZAS,
                :V_EQ_LITROS DO
                BEGIN
                    V_CANAST_AFECTADAS=round(ROUND(:V_DOT_ACTUAL_LTS/(:V_PIEZAS*:V_EQ_LITROS))*(:I_PORCENTAJE/100.00) );
                    V_CANAST_NUEVAS=:V_DOT_ACTUAL_CANAST-:V_CANAST_AFECTADAS;
                    V_LTS_NUEVOS=:V_CANAST_NUEVAS*(:V_PIEZAS*:V_EQ_LITROS);
                    
                    INSERT INTO MOVTOS_MASIVOS_DOTAC(   FECHA_DISTRIBUCION,
                            FECHA_VENTA,
                            LECHERIA,
                            CVE_PRODUCTO,
                            DOTACION_LTS_ACTUAL,
                            DOTACION_CANASTILLAS_ACTUAL,
                            PORCENTAJE,
                            DOTACION_LTS_NUEVOS,
                            DOTACION_CANASTILLAS_NUEVAS,
                            CANASTILLAS_AFECTADAS)
                                    values(  :V_FECHA_DISTR,
                                             :V_FECHA_VENTA,
                                             :V_LECHERIA,
                                             'AS-606-1315',
                                             :V_DOT_ACTUAL_LTS,
                                             :V_DOT_ACTUAL_CANAST,
                                             :I_PORCENTAJE,
                                             :V_LTS_NUEVOS,
                                             :V_CANAST_NUEVAS,
                                             :V_CANAST_AFECTADAS);

                END
END

La pregunta es la siguiente: Puedo hacer esto dentro del WHERE para usar IN, de esta forma:
ej.
where CODIGO IN (:CODIGOS)

Donde CODIGOS, puediera tener la siguientes cadena: 1234,5678,19281 ???

Espero haberme explicado, sino, comentenme para ser mas explicito. Saludos y gracias por su tiempo !.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 13-12-2015 a las 07:33:00.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
ADO con parámetros jonmendi Conexión con bases de datos 15 06-11-2011 17:18:26
UDF y parámetros ARPE Firebird e Interbase 1 07-10-2010 06:44:07
Parametros Opcionales no Parametros por defecto Velia Varios 7 19-08-2006 16:18:42
Parámetros en ADO Delfin Conexión con bases de datos 0 19-03-2005 01:02:36
Parametros BDE Red_Delphi Conexión con bases de datos 0 13-10-2003 11:18:05


La franja horaria es GMT +2. Ahora son las 07:16: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
Copyright 1996-2007 Club Delphi