Ver Mensaje Individual
  #1  
Antiguo 13-12-2015
Avatar de mRoman
mRoman mRoman is online now
Miembro
 
Registrado: nov 2003
Posts: 599
Reputación: 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 06:33:00.
Responder Con Cita