Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda consulta de busqueda en lista (https://www.clubdelphi.com/foros/showthread.php?t=73825)

inad20 18-05-2011 21:06:38

Ayuda consulta de busqueda en lista
 
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.

Código SQL [-]
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
Código Delphi [-]
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

Código SQL [-]
( D.clave_cliente in ((:cliente)))

debería ser así:

Código SQL [-]
......................
( D.clave_cliente in (:cliente))
.........................

Saluditos

inad20 18-05-2011 23:02:31

Cita:

Empezado por Caro (Mensaje 400541)
Hola inad20, un paréntesis esta demas:

esto tienes

Código SQL [-]( D.clave_cliente in ((:cliente)))


debería ser así:

Código SQL [-]...................... ( 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.

Código SQL [-]
....................................
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.

Cita:

Empezado por Caro (Mensaje 400577)
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:
Código Delphi [-]
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 [-]
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

Cita:

Empezado por Lepe (Mensaje 400667)
hace años hice estas rutinas que aún tiro de ellas:
Código Delphi [-]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 [-]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

Cita:

Empezado por inad20 (Mensaje 400538)
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 ..

inad20 22-05-2011 19:36:26

resuleto
 
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


La franja horaria es GMT +2. Ahora son las 23:05:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi