Cita:
Empezado por AgustinOrtu
Que yo sepa eso no se hace con parametros, en las versiones mas nuevas de de Delphi, con FireDAC incorporado creo que se puede hacer con algo que se llama "macro expand"
Pero en definitiva, lo que termina haciendo es sustituir el lugar indicado dentro del SQL por la secuencia de caracteres. No se como implementarlo dentro de un SP, pero si fuera que mandas un query desde delphi podes hacer algo asi:
Código Delphi [-]
procedure EjecutarSQL;
procedure BuildStr;
var
I: Integer;
begin
Result := '';
for I :=0 to lvLecherias.Items.Count - 1 do
...
end;
begin
SQL.Text := Format(' WHERE A.Lecher IN (%s) ', [BuildStr]);
SQL.Open;
...
end;
Yo creo que el secreto esta en implementar esa logica dentro del stored, es decir, acumular dentro de una variable local la cadena que se va a usar en el operador IN
|
Antes que nada muchas gracias por contestar y darte tiempo para decirme lo q escribiste.
Efectivamente aplicar una lógica como la q planteas, es lo q busco, y me parece que la solucion esta en esta instruccion:
EXECUTE STATEMENT
Aqui esta un ejemplo. No es otra cosa mas que construir la consulta dentro del SP y concatenar cadenas....y ahi es donde se pudiera hacer lo que busco.
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;
DECLARE VARIABLE V_SENTENCIA VARCHAR(1000);
BEGIN
DELETE FROM MOVTOS_MASIVOS_DOTAC;
V_SENTENCIA=' 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-606-1315''
and a.LECHER IN ('||I_LECHERIAS||')
order by a.fecha_venta,a.lecher';
FOR EXECUTE STATEMENT V_SENTENCIA
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^
Pero me marca error al momento de ejecutarlo:
Código:
Variable type (position 6) in EXECUTE STATEMENT 'SELECT a.FECHA_DISTRIBUCION,
' INTO does not match returned column type.
At procedure 'MOVTOS_MASIVOS_DOTACIONES'.