PDA

Ver la Versión Completa : Como pasar un parametro a una consulta que usa la clausula IN


coco0001
29-12-2007, 05:10:02
Tengo una consulta sql de la forma:

select ... from ... where campo in (:parametro)

cargada en un adoquery.

Quiero pasarle el parametro, que es una lista de enteros.

Como hago para asignarle al parametro una lista de enteros, que representarian por ejemplo, identificadores de algo. ??

El parametro podria recibir por ejemplo, 1, 2, 3, luego la consulta ejecutaria

select ... from ... where campo in (1,2,3)

Héctor Randolph
29-12-2007, 05:57:05
Hola coco0001

Una forma sencilla es construir una lista de números en un StringList y luego aprovechar la propiedad CommaText para obtener la serie de números separados por comas.


var
Lista: TStringList;
Numeros: String;
begin
Lista:=TStringList.Create;

Lista.Add(IntToStr(1));
Lista.Add(IntToStr(2));
Lista.Add(IntToStr(3));
Numeros:=Lista.CommaText;

AdoQuery1.SQL.Add('select * from tabla where campo in (:parametro)')

// Aquí envías el parámetro a tu consulta adoquery
AdoQuery1.Parameters.ParamByName('parametro').AsString:=Numeros;
.
.
.
Lista.Free;
end;



Saludos

coco0001
29-12-2007, 06:13:09
El hecho de armar la lista de numeros como string y pasarselo al parametro

AdoQuery1.Parameters.ParamByName('parametro').AsString:=Numeros;


de esta manera, lo que hace es que la clausula IN pregunte lo siguiente

campo in '1,2,3'

y esto no sirve ya que campo solo toma los valores individuales 1, 2 o 3, y nunca podria ser '1,2,3' como un solo valor. Se entiende ???

El parametro tendria que ser de algun tipo de arreglo o algo asi para que campo tome 1, 2 o 3.

Espero respuesta y gracias...

Héctor Randolph
29-12-2007, 07:01:52
Según lo que entiendo, lo que estamos tratando de hacer es formar esta consulta:


select ... from ... where campo in (1,2,3)


que es equivalente a esta otra:


select ... from ... where campo = 1 or campo = 2 or campo = 3


Si se complica el hecho de usar parámetros, construye directamente la sentencia en un string y ejecutala.


var
Lista: TStringList;
Numeros: String;
begin
Lista:=TStringList.Create;

Lista.Add(IntToStr(1));
Lista.Add(IntToStr(2));
Lista.Add(IntToStr(3));
Numeros:=Lista.CommaText;

AdoQuery1.SQL.Text:='select * from tabla where campo in ('+Numeros+')';
AdoQuery1.Open;
.
.
.
Lista.Free;
end;


Saludos

shoulder
26-04-2012, 17:45:02
Gracias no podia encontrar la forma, a mi me funciono, pase el parametro como un string aparte y todo bien.!!!!