Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Optimizar el sgte codigo (https://www.clubdelphi.com/foros/showthread.php?t=46924)

BlueSteel 13-08-2007 23:48:31

Optimizar el sgte codigo
 
Hola amigos... quiero hacer una consulta de como podria optimar más este código...

Datos -> Formulario de tipo DataModule
AQ_Select -> ADOQuery
vBus -> TEdit
CB_Buscar -> ComboBox

Código Delphi [-]
     Datos.AQ_Select.Close;
     Datos.AQ_Select.SQL.Clear;
     Datos.AQ_Select.SQL.Add('Select * From Socio');
     If CB_Buscar.ItemIndex = 0 Then
        Begin
             Datos.AQ_Select.SQL.Add('Where Soc_Rut Like'+QuotedStr('%'+vBus.Text+'%'));
        End
     Else If CB_Buscar.ItemIndex = 1 Then
        Begin
             Datos.AQ_Select.SQL.Add('Where Soc_Nombre Like'+QuotedStr('%'+vBus.Text+'%'));
        End
     Else If CB_Buscar.ItemIndex = 2 Then
        Begin
             Datos.AQ_Select.SQL.Add('Where Soc_Apellido Like'+QuotedStr('%'+vBus.Text+'%'));
        End;
     Datos.AQ_Select.Open;

La idea es que tengo un ComboBox, en donde tengo 3 Campos... entonces yo puedo selecionar si quiero buscar a un Socio por Rut (DNI), Nombre o Apellido, entonces utilizo un TEdit y ejecuto la consulta a través de un ADOQuery

Si bien la consulta me funciona super, es para evitar tener que escribir preguntas del Tipo If,.... y si en caso me llegara a tocar una consulta parecidad pero con unos 20 campos..(exageracion)

eduarcol 13-08-2007 23:54:43

casualmente tengo un codigo como eso:

1.- Cargo los datos en un combo box
2.- Al ejecutar la busqueda leo el campo desde ese combo y lo concateno en la consulta

1.-


Código Delphi [-]
//Carga un combo box con los campos disponibles
procedure TBusquedas.CargarLista;
var
   nIdx: integer;
begin
   cbCampos.Items.Clear;
   for nIdx := 0 to sqBusqueda.FieldCount - 1 do
      cbCampos.Items.Add(sqBusqueda.Fields[nIdx].FieldName);
   cbCampos.Text := sqBusqueda.Fields[0].FieldName;
end;

2.-

Al hacer click en el boton Establece el filtro de la tabla
Código Delphi [-]
   if txValor.Text = '' then
   begin
      sqBusqueda.Active := False;
      sqBusqueda.SQL.Clear;
      sqBusqueda.SQL.Add(Original);
      sqBusqueda.Active := True;
   end
   else
   begin
      sqBusqueda.Active := False;
      sqBusqueda.SQL.Clear;
      sqBusqueda.SQL.Add(Original);
      sqBusqueda.SQL.Add(' where ' + cbCampos.Text + ' Like ''%' + txValor.Text + '%''');
      sqBusqueda.SQL.Add(' order by ' + cbCampos.Text);
      sqBusqueda.Active := True;
   end;

Si no entendi mal esto es lo que buscas

Caral 13-08-2007 23:57:44

Hola
Y no lo has pensado en hacer con filtros?.
Saludos

Caral 14-08-2007 00:10:22

Hola
Con esto se construye un procedimiento el cual lo puedo llamar en otras ocasione.
Código Delphi [-]
procedure TFOrdProd.ConstruyeFiltro;
begin
 if (CB_Buscar.Text <> 'Rut')  then
        begin
           QOrdProd.Filter := 'Soc_Rut = '+QuotedStr('%'+vBus.Text+'%');
           QOrdProd.Filtered := True;
        end
        else if (CBUsuarios.Text = 'Nombre')  then
             begin
          QOrdProd.Filter := 'Soc_Nombre = '+QuotedStr('%'+vBus.Text+'%');
          QOrdProd.Filtered := True;
             end
         else if (CBUsuarios.Text = 'Apellido')  then
             begin
         QOrdProd.Filter := 'Soc_Apellido = '+QuotedStr('%'+vBus.Text+'%');
          QOrdProd.Filtered := True;
           end;
end;
Ya sabes, solo una idea mas.
Saludos

cHackAll 14-08-2007 01:53:07

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const Values: array[0..2] of string = ('Soc_Rut', 'Soc_Nombre', 'Soc_Apellido');
begin
 Datos.AQ_Select.Close;
 Datos.AQ_Select.SQL.Clear;
 Datos.AQ_Select.SQL.Add('select * from Socio where ' + Values[CB_Buscar.ItemIndex] + ' like ''%' + vBus.Text + '%''');
 Datos.AQ_Select.Open;
end;

BlueSteel 14-08-2007 02:46:46

Gracias a todos

mañana cuando llegue a mi oficina.. probare lo que me entregarón.... :p

BlueSteel 14-08-2007 17:32:43

:pHola cHackAllJusto andaba buscando algo parecido.. me funciono perfecto...No he probado los otros códigos.. pero veo que estan weno... si tengo tiempo los probaré..

Enan0 14-08-2007 22:06:57

Código Delphi [-]
     Datos.AQ_Select.Close;
     Datos.AQ_Select.SQL.Clear;
     Datos.AQ_Select.SQL.Add('Select * From Socio');
     case CB_Buscar.ItemIndex of
          0: Datos.AQ_Select.SQL.Add('Where Soc_Rut Like'+QuotedStr('%'+vBus.Text+'%'));
          1:  Datos.AQ_Select.SQL.Add('Where Soc_Nombre Like'+QuotedStr('%'+vBus.Text+'%'));
          2:  Datos.AQ_Select.SQL.Add('Where Soc_Apellido Like'+QuotedStr('%'+vBus.Text+'%'));
          else begin showmessage('No se encuentra el tipo');
                        exit;
                end   ;
      End;
     Datos.AQ_Select.Open;

Bueno yo veo que ya lo tenes resuelto, pero otra forma para que sea un poco mejor puede ser esta,
ya que el valo que viene es un integer, podes utilizar un CASE, y de esta menera no se ejecuta todo el Siclo de comparaciones de los IF.
En caso de que el index no sea valido, muestra un mensaje y sale!

saludos y bueno solo es otra alternativa

Enan0 14-08-2007 22:09:25

Cita:

Empezado por Caral (Mensaje 222764)
Hola
Y no lo has pensado en hacer con filtros?.
Saludos

con los Filtros tenes que tener cuidado, ya que se ejecutan sobre la Tabla, es decir, Si lo haces sobre una tabla de access y tenes el filtro aplicado con la conexion abierta, y abris la tabla con el access vas a notar que los datos estan filtrados.

Saludos

Luis M. 14-08-2007 22:33:24

Cita:

Empezado por cHackAll (Mensaje 222782)
Código Delphi [-]Código Delphi [-]procedure TForm1.Button1Click(Sender: TObject);
const Values: array[0..2] of string = ('Soc_Rut', 'Soc_Nombre', 'Soc_Apellido');
begin Datos.AQ_Select.Close; Datos.AQ_Select.SQL.Clear; Datos.AQ_Select.SQL.Add('select * from Socio where ' + Values[CB_Buscar.ItemIndex] + ' like ''%' + vBus.Text + '%''');
Datos.AQ_Select.Open;
end;

Muy bueno...
Nunca se me había ocurrido (soy aprendiz de novato).:D
Este me lo guardo.
Un saludo.


La franja horaria es GMT +2. Ahora son las 12:49:44.

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