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 !.