Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   busqueda incremental (https://www.clubdelphi.com/foros/showthread.php?t=69488)

lucas05 21-08-2010 05:37:30

busqueda incremental
 
Hola, estoy realizando una búsqueda en forma incremental en Delphi 7 y MySQL.
Estoy usando 1Edit, 1DBGrid, 1DataSource, 1ADOQuery.
En el ADOQuery coloco la siquiente sentencia sql:
select * from empleados order by apellido asc
Para que en el DBGrid aparesca la información de la tabla de empleados ordenada por apellido en forma ascendente.

Para realizar la búsqueda en forma incremental pongo el siguiente código en el evento OnChange del Edit.

With ADOQuery 1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from empleados where apellido like'+Char(39)+Edit1.Text+'%'+Char(39));
Open;
end;

Cuando realizo la búsqueda la primera vez no hay problema, pero cuando quiero realizar una nueva busqueda y borro el apellido que habia puesto en el Edit, la información que estaba en el DBGrid ordenada en forma ascendente aparece desordenada (recuerden que en ADOQuery le habia puesto una sentecia sql para ordenarla en forma ascendete).
Como debo hacer para que la infomación que muestro en el DBGrid se mantenga siempre ordenada en forma ascendente por apellido, a un cuando realice una busqueda incremental?

Espero haber sido claro y muchas gracias por su atención.

ecfisa 21-08-2010 07:27:48

Hola Lucas.

Reemplazá la consulta por:
Código Delphi [-]
  with ADOQuery1 do
  begin
    Close;
    SQL.Text:='SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text + '%');
    Open;
  end;

Saludos.

luisdevis 21-08-2010 14:25:08

Has eliminado el order by...
 
Piensa que has modificado el query del objeto sin un order by.
Al modificar el edit tiene la sentencia sql :
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text + '%');
Que no tiene ningún "order by"

Cámbiala por esto :
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text + '% ORDER BY APELLIDO ASC');

ecfisa 22-08-2010 09:43:42

Cita:

Empezado por luisdevis (Mensaje 374121)
Piensa que has modificado el query del objeto sin un order by.
Al modificar el edit tiene la sentencia sql :
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text + '%');
Que no tiene ningún "order by"

Cámbiala por esto :
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text + '% ORDER BY APELLIDO ASC');

Amigo... tenés toda la razón.:)

lucas05 22-08-2010 20:03:12

Ok, gracias voy a intentarlo.

Saludos.

Caral 22-08-2010 20:08:57

Hola
mmmmmm

Código SQL [-]
SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+QuotedStr(Edit1.Text)+ '% ORDER BY APELLIDO ASC;

Saludos

lucas05 22-08-2010 21:00:57

Hola, intente poniendo el nuevo código, y al compilarlo noy problema.
Pero cuando escribo algún apellido en el Edit para realizar la búsqueda, se borra toda la información que habia en el DBGrid y no muestra nada.
Cual puede ser el problema?

Nuevamente gracias y saludos.

ecfisa 22-08-2010 21:26:49

Cita:

Empezado por lucas05 (Mensaje 374177)
Hola, intente poniendo el nuevo código, y al compilarlo noy problema.
Pero cuando escribo algún apellido en el Edit para realizar la búsqueda, se borra toda la información que habia en el DBGrid y no muestra nada.
Cual puede ser el problema?

Nuevamente gracias y saludos.

Hola Lucas.

¿ Podrías poner el código del evento OnChange tál como lo escribiste ?

Saludos.

lucas05 22-08-2010 22:35:05

Hola, este es el codigo que pongo en el evento OnChange:

With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Text:='select * from empleados where apellido like '+QuotedStr(Edit1.Text+'% order by apellido asc');
Open;
end;

Gracias y saludos.

Caral 23-08-2010 00:42:49

Hola
Sabes lo que es concatenar?.
Saludos

ecfisa 23-08-2010 01:25:20

Cita:

Empezado por lucas05 (Mensaje 374179)
Hola, este es el codigo que pongo en el evento OnChange:

With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Text:='select * from empleados where apellido like '+QuotedStr(Edit1.Text+'% order by apellido asc');
Open;
end;

Gracias y saludos.

Hola lucas.

Copia y pegá esta línea tal cuál está.

Código Delphi [-]
  SQL.Text:= 'SELECT * FROM EMPLEADOS WHERE APELLIDO LIKE '+
             QuotedStr( Edit1.Text + '%' ) + ' ORDER BY APELLIDO';

A mí me funciona perfectamente.


Saludos.

lucas05 23-08-2010 04:09:22

Hola ecfisa, muchas gracias, volví a escribir el código tal cual me dijiste y ahora funciona muy bien.

Nuevamente gracias y saludos.

ecfisa 23-08-2010 05:01:55

De nada lucas. :)

Aprovecho para aclararte que cometí una omisión intencional:
No especifiqué el sentido del orden ASC por que lo asume por defecto, aunque el acentuarlo, hace más legible el sentido
del ordenamiento al leer el código.

Si lo querés en sentido descendente tenés que utilizar indefectiblemente: DESC

Saludos.

AzidRain 23-08-2010 18:52:38

iba a comentar algo sobre este tipo de búsquedas y el costo en velocidad y tráfico hacía el servidor que tiene, pero me encontré que los chicos de google parece que ya lo resolvieron:
aquí

ecfisa 23-08-2010 19:17:00

Cita:

Empezado por AzidRain (Mensaje 374220)
iba a comentar algo sobre este tipo de búsquedas y el costo en velocidad y tráfico hacía el servidor que tiene, pero me encontré que los chicos de google parece que ya lo resolvieron:
aquí

Hola AzidRain.

¿ Se te ocurre alguna idea de como lo han implementado ? Por que hasta donde he probado las busquedas incrementales son bastante ineficientes...


Saludos.

AzidRain 23-08-2010 20:21:04

ASi es eficsa...solo son útiles con unos cuantos cientos de registros pero conforme la cosa crece se va poniendo muy canija. Es por eso muy "novedoso" como lo habrán implementado los de Google, aunque claro con la potencia de cómputo que tienen ayuda bastante.

Antes eran famosas estas búsquedas, cuando solo incluía tablas locales de unos cuantos cientos de registros (en Clipper llegué a hacer algo igual, hace mil años, claro) pero cuando ya hablamos de miles y hasta millones de registros resulta ocioso esto. Prefiero más el enfoque de escribir una frase y hasta tenerla lista aplicar un "like % %" para obtener todos los que contengan lo buscado. En aplicaciones administrativas (facturación, clientes, etc.) es mucho más común que el usuario solo recuerde alguna parte de todo el nombre que como empieza..."Me acuerdo que era un tal 'Fernandez'", "creo que era algo de 'aceros'" y así...Al final el usuario se siente más como si usara un buscador de internet, además de que a lo largo del uso se irán dando de alta nombres muy similares por lo que por ejemplo:

Sean los nombres:

Código:

COMERCIOS ORGANIZADOS
COMERCIALIZADORA DE GANADO
COMERCIAL DE SEGUROS
COMERCIANTES UNIDOS
COMERCIALES S.A.
COMERCIALIZADORA LA BOMBITA
COMERCIAL DE NEUMATICOS
COMERCIANTES S.A.

si quieres encontrar por ejemplo el registro de "la bombita" que es lo que se queda más grabado, tienes que escribir "COMERCIALIZADORA L" para que llegues al resultado. En cambio con el otro esquema basta que pongas "bombi", "bom" o similar y te llevará mucho más rápido. Además de evitamos los "typos" dijeran los gringos como:

Código:

"COMERSIALISADORA LA BOMBITA"
Suponiendo que algun operador iletrado lo haya dado de alta asi...con la búsqueda incremantal, ¿Sabes cuando lo encontrarías?...claro, a menos que lo escribas con las mismas faltas.

Solo un apunte.


La franja horaria es GMT +2. Ahora son las 21:11:20.

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