PDA

Ver la Versión Completa : Ayuda consulta de busqueda en lista


inad20
18-05-2011, 21:06:38
que tal a todos espero y me puedan ayudar ya no encuentro la salida.
lo que quiero hacer es que de los datos de un ListBox enviarlos como parametro a un ibquery y que me muestro esos datos en un DBGrid les muestro como lo ago.


SELECT D.DOCTO_CC_ID,D.FOLIO,
D.NATURALEZA_CONCEPTO,
D.CONCEPTO_CC_ID,
D.FECHA, C.NOMBRE Cliente,
D.CLIENTE_ID,
R.CALLE,
R.TELEFONO1,
P.NOMBRE NOMBRE_Condiciones,
V.FECHA_VENCIMIENTO,
CIUDADES_1.NOMBRE NOMBRE_Ciudad,
T.NOMBRE_ABREV estado,
L.DIAS_PLAZO,
S.SALDO_CARGO
FROM DOCTOS_CC D
INNER JOIN CLIENTES C ON
(C.CLIENTE_ID = D.CLIENTE_ID)
INNER JOIN DIRS_CLIENTES R ON
(R.CLIENTE_ID = C.CLIENTE_ID)
INNER JOIN CONDICIONES_PAGO P ON
(P.COND_PAGO_ID = C.COND_PAGO_ID)
LEFT OUTER JOIN VENCIMIENTOS_CARGOS_CC V ON
(V.DOCTO_CC_ID = D.DOCTO_CC_ID)
INNER JOIN CIUDADES CIUDADES_1 ON
(CIUDADES_1.CIUDAD_ID = R.CIUDAD_ID)
INNER JOIN ESTADOS T ON
(T.ESTADO_ID = CIUDADES_1.ESTADO_ID)
INNER JOIN PLAZOS_COND_PAG L ON
(L.COND_PAGO_ID = P.COND_PAGO_ID)
left outer join SALDO_CARGO_CC_S ( D.DOCTO_CC_ID,D.FECHA,0,'N') s
on(D.docto_cc_id=cargo_id)
WHERE ( D.CONCEPTO_CC_ID = 4 )
and (s.saldo_cargo<>0) and
( D.clave_cliente in ((:cliente)))


y asi paso el parametro

procedure TForm1.Button1Click(Sender: TObject);
begin
ibquery1.Close;
IBQuery1.Prepare;
IBTransaction1.Active:=true;
IBQuery1.ParamByName('cliente').AsString:=listbox1.Items.DelimitedText;
IBQuery1.open;

end;


cuando solo pongo 1 dato me lo da sin ningun problema pero si pongo mas de 1 ya no me mesta nada agradesco de de ya cualquier ayuda que me puedan dar gracias.

Caro
18-05-2011, 21:34:13
Hola inad20, un paréntesis esta demas:

esto tienes


( D.clave_cliente in ((:cliente)))


debería ser así:


......................
( D.clave_cliente in (:cliente))
.........................


Saluditos

inad20
18-05-2011, 23:02:31
Hola inad20, un paréntesis esta demas:

esto tienes

Código SQL [-] (http://www.clubdelphi.com/foros/#)( D.clave_cliente in ((:cliente)))


debería ser así:

Código SQL [-] (http://www.clubdelphi.com/foros/#)...................... ( D.clave_cliente in (:cliente)) .........................


Saluditos


Gracias por contestar Caro ya hice lo que me comentas en si lo tenia haci pero por lo que no me sale lo cambie y se me paso dejarlo como estaba pero ya hice el cambio de nuevo y sigue sin funcionar solo sirve cuando es un solo dato. gracias

saludos

Caro
19-05-2011, 04:10:02
Hola inad20, acabo de hacer la prueba y tampoco me funciona con parametros, has la prueba de pasar directamente los datos del in a tu consulta.


....................................
IBQuery1.SQL.Text := 'SELECT D.DOCTO_CC_ID,D.FOLIO,................ '+
'.....................................................................................'+
'left outer join SALDO_CARGO_CC_S ( D.DOCTO_CC_ID,D.FECHA,0,'N') s '+
'on(D.docto_cc_id=cargo_id) '+
'WHERE ( D.CONCEPTO_CC_ID = 4 ) and (s.saldo_cargo<>0) and '+
'(D.clave_cliente in ('+ListBox.Items.CommaText+'))';
....................................


Saluditos

guillotmarc
19-05-2011, 18:13:59
Hola.

Hola inad20, acabo de hacer la prueba y tampoco me funciona con parametros, haz la prueba de pasar directamente los datos del in a tu consulta.

Totalmente de acuerdo, va a tener que construir manualmente la sentencia SQL, puesto que en un solo parámetro no puedes pasar (hasta donde yo sé) directamente varios valores que la sentencia pueda utilizar con el operador IN (puesto que una vez pasado el parámetro, todos esos valores quedarán como una única cadena para la consulta SQL).

Saludos.

Lepe
19-05-2011, 18:22:42
hace años hice estas rutinas que aún tiro de ellas:

uses CheckLst, // marcarchklb
Classes // QuotedList
;
// y puede que haga falta alguno mas.


// devuelve los items de la siguiente forma : 'aaaa','bbbbb','ccc'
function QuotedList( Items: TStrings):string;
function QuotedListChklb( ctrl:TCheckListBox;const SoloChecked:Boolean = True):string;

....

function QuotedListchklb( ctrl:TCheckListBox;const SoloChecked:Boolean = True):string;
var i:integer;
begin
result := '';
with ctrl do

for i:= 0 to Items.Count-1 do
if SoloChecked then
begin
if Checked[i] then
Result := Result +QuotedStr(Items[i])+',';
end
else
Result := Result +QuotedStr(Items[i])+',';

if Length(Result)>0 then
Delete(Result,Length(Result),1); //quito la ultima coma

end;


function QuotedList( Items: TStrings):string;
var i:integer;
begin
result := '';
for i:= 0 to Items.Count-2 do
Result := Result +QuotedStr(Items[i])+',';
if Items.count > 0 then
Result := Result + quotedstr(Items[Items.count-1]);
end;


Yo quitaría el parámetro y concatenaría con la salida de quotedList, algo así:

IBQuery1.SQL.Text := 'SELECT D.DOCTO_CC_ID,D.FOLIO,................ '+
'.....................................................................................'+
'left outer join SALDO_CARGO_CC_S ( D.DOCTO_CC_ID,D.FECHA,0,'N') s '+
'on(D.docto_cc_id=cargo_id) '+
'WHERE ( D.CONCEPTO_CC_ID = 4 ) and (s.saldo_cargo<>0) and '+
'(D.clave_cliente in ('+QuotedList(ListBox.Items)+'))';


Saludos

inad20
19-05-2011, 21:02:37
muchas gracias a todos por responder enseguida reviso y les comento como me fue.

inad20
20-05-2011, 03:56:51
hace años hice estas rutinas que aún tiro de ellas:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)uses CheckLst, // marcarchklb Classes // QuotedList ; // y puede que haga falta alguno mas. // devuelve los items de la siguiente forma : 'aaaa','bbbbb','ccc' function QuotedList( Items: TStrings):string; function QuotedListChklb( ctrl:TCheckListBox;const SoloChecked:Boolean = True):string; .... function QuotedListchklb( ctrl:TCheckListBox;const SoloChecked:Boolean = True):string; var i:integer; begin result := ''; with ctrl do for i:= 0 to Items.Count-1 do if SoloChecked then begin if Checked[i] then Result := Result +QuotedStr(Items[i])+','; end else Result := Result +QuotedStr(Items[i])+','; if Length(Result)>0 then Delete(Result,Length(Result),1); //quito la ultima coma end; function QuotedList( Items: TStrings):string; var i:integer; begin result := ''; for i:= 0 to Items.Count-2 do Result := Result +QuotedStr(Items[i])+','; if Items.count > 0 then Result := Result + quotedstr(Items[Items.count-1]); end;


Yo quitaría el parámetro y concatenaría con la salida de quotedList, algo así:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)IBQuery1.SQL.Text := 'SELECT D.DOCTO_CC_ID,D.FOLIO,................ '+ '.....................................................................................'+ 'left outer join SALDO_CARGO_CC_S ( D.DOCTO_CC_ID,D.FECHA,0,'N') s '+ 'on(D.docto_cc_id=cargo_id) '+ 'WHERE ( D.CONCEPTO_CC_ID = 4 ) and (s.saldo_cargo<>0) and '+ '(D.clave_cliente in ('+QuotedList(ListBox.Items)+'))';


Saludos
que tal Lepe Gracias por tu respuesta pero no entiendo muy bien como implementar tu rutina no se si me puedes prestar tu ayuda desde ya muchas gracias.
saludos

Delfino
20-05-2011, 22:24:30
cuando solo pongo 1 dato me lo da sin ningun problema pero si pongo mas de 1 ya no me mesta nada agradesco de de ya cualquier ayuda que me puedan dar gracias.
Esto no se puede hacer y la explicacion esta aqui (http://edn.embarcadero.com/article/32076) ..

inad20
22-05-2011, 19:36:26
muchas gracias a todos por sus respuestas e interes ya quedo con la ayuda de Caro y Lepe muchas gracias y si se puede hacer. tema resuleto