Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda busqueda de case usando radiogroup (https://www.clubdelphi.com/foros/showthread.php?t=90917)

cristian22 07-10-2016 23:45:00

Ayuda busqueda de case usando radiogroup
 
Hola buenas tardes. Realize una aplicacion con mysql -5 y delphi 2010, con componentes query de zeos". Tengo un formulario que utilizo un listado en el cual busco los productos utilizando un tedit llamado "eProductos" y estos datos van visualizando se en el dbgrid.
esta busqueda la realizo de la siguiente forma en un query tengo escrita la siguiente consulta

Código SQL [-]
 select * from productos where nombrepr LIKE :razon

luego en el boton buscar tengo escrito el siguiente codigo

Código Delphi [-]
 qProductos.ParamByName('razon').AsString := '%' +eProductos.text+ '%'

hasta aqui me funciona perfecto la busqueda ahora lo que necesito es filtrar esa busqueda dependiendo si el producto esta activo o no (para ello uso el campo estado de mi tabla producto)
creo un radiogroup con 3 opciones:

0:Activos
1:Bajas

para este punto hice lo siguiente borre la consulta del query e intente hacer lo siguiente en el evento onclick del boton buscar use el siguiente codigo
Código Delphi [-]
begin
qProductos.close;
qProductos.SQL.clear;
qProductos.SQL.Text:='Select * from producto';
qProductos.Open;
case radiog.ItemIndex of
0: qProductos.SQL.ADD('where estado=1')
1: qProductos.SQL.ADD('where estado=0')

al intentar esto me sale el siguiente error
project drugstore.exe raised exception class EDatabaseError with message 'qProductos:Cannot perform this operation on a closed dataset

tambien lo que habia intentado antes era escribir la siguiente consulta pero me daba error de escritura
Código Delphi [-]
0: begin
qProductos.SQL.ADD('where estado=1');
qProductos.SQL.ADD('where nombreproducto LIKE='+quotedstr(eProductos.text));

si podrian guiarme en este problema muchas gracias desde ya

Caminante 08-10-2016 00:28:32

Hola

Me parece que primero completas el SQL de tu consulta y luego le haces open.


Código Delphi [-]
begin qProductos.close; 
qProductos.SQL.clear; 
qProductos.SQL.Text:='Select * from producto'; 
case radiog.ItemIndex of 
0: qProductos.SQL.ADD(' where estado=1') ;
1: qProductos.SQL.ADD(' where estado=0');
end;
qProductos.Open;

Saludos

ecfisa 08-10-2016 00:31:04

Hola.

Otra opción:
Código Delphi [-]
...
begin
  if RadioGroup1.ItemIndex <> -1 then
  begin
    qProductos.Close;
    qProductos.SQL.Text := 'SELECT * FROM PRODUCTO WHERE ESTADO = :STATE';
    qProductos.ParamByName('STATE').Value := RadioGroup1.ItemIndex;
    qProductos.Open;
  end;
end;

Saludos :)

Caminante 08-10-2016 00:51:32

Si. Con parametros es mejor

Saludos

cristian22 08-10-2016 01:11:36

gracias
 
Cita:

Empezado por Caminante (Mensaje 509406)
Hola

Me parece que primero completas el SQL de tu consulta y luego le haces open.


Código Delphi [-]
begin qProductos.close; 
qProductos.SQL.clear; 
qProductos.SQL.Text:='Select * from producto'; 
case radiog.ItemIndex of 
0: qProductos.SQL.ADD(' where estado=1') ;
1: qProductos.SQL.ADD(' where estado=0');
end;
qProductos.Open;

Saludos

si era al final el open. Me funciona escribo algo y lo filtra el problema ahora es que si intento colocar de nuevo esta linea
Código Delphi [-]
case radiog.ItemIndex of 
0: begin
qProductos.SQL.ADD(' where estado=1') ;
qProductos.SQL.ADD('where nombreproducto LIKE='+'%'+quotedstr(eProductos.text)+'%'); // esta linea
end;
end;

cuando escribo un producto lo busco me lo muestra sin problema. El problema viene cuando si estoy escribiendo un producto y borro una letra me tira error de sintaxy haciendo referencia a que el error se encuentra en
Código SQL [-]
('where nombreproducto LIKE='+'%'+quotedstr(eProductos.text)+'%')

ecfisa 08-10-2016 01:40:07

Hola.

Estas mezclando peras con manzanas, lo último nada tiene que ver con el RadioGroup de la consulta inicial.

Lo que estas intentando ahora es una búsqueda incremental y normalmente se la realiza en el evento OnChange de un cuadro de edición, ejemplo:
Código Delphi [-]
procedure TForm1.eProductosChange(Sender: TObject);
begin
  qProducto.Close;
  qProducto.SQL.Text := 'SELECT * FROM PRODUCTO WHERE NOMBREPRODUCTO LIKE :NAME';
  qProducto.ParamByName('NAME').AsString := '%' + TEdit(Sender).Text + '%';
  qProducto.Open;
end;

Saludos :)

cristian22 08-10-2016 02:00:47

Cita:

Empezado por ecfisa (Mensaje 509411)
Hola.

Estas mezclando peras con manzanas, lo último nada tiene que ver con el RadioGroup de la consulta inicial.

Lo que estas intentando ahora es una búsqueda incremental y normalmente se la realiza en el evento OnChange de un cuadro de edición, ejemplo:
Código Delphi [-]
procedure TForm1.eProductosChange(Sender: TObject);
begin
  qProducto.Close;
  qProducto.SQL.Text := 'SELECT * FROM PRODUCTO WHERE NOMBREPRODUCTO LIKE :NAME';
  qProducto.ParamByName('NAME').AsString := '%' + TEdit(Sender).Text + '%';
  qProducto.Open;
end;

Saludos :)

yo este modelo de busqueda lo tenia antes y es la linea que puse cuando inicie el tema
Código Delphi [-]
qProductos.ParamByName('razon').AsString := '%' +eProductos.text+ '%'
pero esto solo me va trayendo las coincidencias lo que yo necesito es tambien que siga funcionando de la misma forma pero que tenga encuenta la opcion que esta marcada en el radiogroup y me valla filtrando dichos datos dependiendo de la opción que este marcada, es decir si yo tengo marcada la opcion "activado" y voy escribiendo ej:"fanta" me valla trayendo estos datos si esta con estado 1 osea activado y si marco "bajas" y al escribir lo mismo me muestre si existe dichos datos o no.No se si esto es posible o solo puede filtrarse la búsqueda al hacer clikear el boton
muchas gracias por tomarse el tiempo en ayudarme

ecfisa 08-10-2016 02:53:53

Hola.

Ahora si entiendo la relación...
Código Delphi [-]
...

procedure TForm1.eProductoChange(Sender: TObject);
begin
  if RadioGroup1.ItemIndex <> -1 then
  begin
    qProducto.Close;
    qProducto.SQL.Clear;
    qProducto.SQL.Add('SELECT * FROM PRODUCTO');
    qProducto.SQL.Add('WHERE ESTADO = :STATE');
    qProducto.SQL.Add('AND NOMBREPRODUCTO LIKE :NAME');
    qProducto.ParamByName('STATE').Value := 1 - RadioGroup1.ItemIndex; // (**)
    qProducto.ParamByName('NAME').AsString := '%' + TEdit(Sender).Text + '%';
    qProducto.Open;
  end;
end;
(**) linea que reemplaza a:
Cita:

Empezado por cristian22 (Mensaje 509404)
Código Delphi [-]
case radiog.ItemIndex of 
0: qProductos.SQL.ADD(' where estado=1') ;
1: qProductos.SQL.ADD(' where estado=0');
end;

Saludos :)

cristian22 08-10-2016 03:11:27

Muchas Gracias
 
Cita:

Empezado por ecfisa (Mensaje 509413)
Hola.

Ahora si entiendo la relación...
Código Delphi [-]
...

procedure TForm1.eProductoChange(Sender: TObject);
begin
  if RadioGroup1.ItemIndex <> -1 then
  begin
    qProducto.Close;
    qProducto.SQL.Clear;
    qProducto.SQL.Add('SELECT * FROM PRODUCTO');
    qProducto.SQL.Add('WHERE ESTADO = :STATE');
    qProducto.SQL.Add('AND NOMBREPRODUCTO LIKE :NAME');
    qProducto.ParamByName('STATE').Value := 1 - RadioGroup1.ItemIndex; // (**)
    qProducto.ParamByName('NAME').AsString := '%' + TEdit(Sender).Text + '%';
    qProducto.Open;
  end;
end;
(**) linea que reemplaza a:


Saludos :)

muchas gracias. funciona perfecto mil gracias de verdad :)

ecfisa 08-10-2016 03:40:30

Cita:

Empezado por cristian22 (Mensaje 509414)
muchas gracias. funciona perfecto mil gracias de verdad :)

Me alegra que te haya servido ^\||/

Saludos :)


La franja horaria es GMT +2. Ahora son las 13:16:04.

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