Ver Mensaje Individual
  #3  
Antiguo 13-12-2015
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Reputación: 21
mRoman Va por buen camino
Execute Statement

Cita:
Empezado por AgustinOrtu Ver Mensaje
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'.
__________________
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 17:46:23.
Responder Con Cita