Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   algo parecido a findnearest (https://www.clubdelphi.com/foros/showthread.php?t=74466)

martita 21-06-2011 20:11:21

algo parecido a findnearest
 
hola foro, tengo la necesidad de aplicar algo parecido a un findnearest pero a un tquery, se que esa funcion solo aplica a ttable, hay alguna funcion o algo para hacere algo parecido a un tquery, en formas anteriores usaba el codigo siguiente: pero ahora ocupo hacerlo con un tquery , ir buscando el nombre mas proximo o parecido a lo que voy tecleado en un tedit.

procedure Tfbuscaope.Edit1Change(Sender: TObject);
begin
data.empleados.findnearest([edit1.text]);
end;
//saludos y gracias por la atencion.

Chris 21-06-2011 20:16:55

Locate y FindNearest son muy similares. Lo que ambos hacen es un bucle en dónde en cada interacción evalúan la similitud de los valores pasados en los parámetros. Por lo anterior, puedes revisar la implementación de FindNereast para TTable y hacer una copia del código pero que funcione con TQuery. No ha de hacer muy distinto. Incluso creo que el mismo código casi intacto puede funcionar ya que las propiedades necesarias son compartidas entre TTable y TQuery.

Saludos,
Chris.

martita 21-06-2011 22:13:53

marca error
 
marca errror el findnearest y el locate con los tquery, son exclusivos para ttable, se me ocurre hacerlo en mi select

si tengo un tedit1 y quiero buscar en un dbgrid asignado a un tquery el
valor del nombre de empleado mas aproximado como seria

en el evento onchange del tedit como seria la sentencia sql
select * from empleados.db where ????????????????????????
como hacer en el select que solo busque en el campo nombre
lo mas proximo a lo que puse en el edit ?
o que solucion mas podria aplicar ?

maeyanes 21-06-2011 22:20:49

Hola...

Puedes usar algo así:

Código SQL [-]
select * from empleados.db where campo like 'texto%'

De esta forma te busca todos los que el campo empiece con la cadena texto.

Ahora, también depende de que motor de base de datos estés usando, por que creo que con bases de datos Paradox esto no se puede.


Saludos...

ecfisa 21-06-2011 22:30:00

Hola martita.

Podés usar la condición LIKE y parametrizar la consulta:
Código Delphi [-]
function QueryNearest(AQuery: TIBQuery; Tabla, Campo: string; Dato: Variant): Boolean;
begin
  AQuery.Close;
  AQuery.SQL.Clear;
  AQuery.SQL.Add('SELECT * FROM '+Tabla);
  AQuery.SQL.Add('WHERE '+Campo+' LIKE :DATO || ''%''');
  AQuery.ParamByName('DATO').Value:= Dato;
  AQuery.Open;
  Result:= not AQuery.IsEmpty;
end;
Si usas BDE basta con cambiar el tipo TIBQuery del parámetro AQuery por el tipo TQuery.

Saludos.

martita 22-06-2011 22:39:42

ok pero
 
ok la ultima solucion me parece bien, pero el detalle es que trabajo con tablas paradox, con el bde, y un alias, el tibquery no me reconoce cuando quiero poner el nombre de la base de datos no aparece ninguna y tengo registradas como 5 en el bde se supone que deberia de mostrarme la lista de las bases de tados registradas en bde.

como puedo solucionar esto ?

ecfisa 22-06-2011 23:01:10

Hola martita.

No entiendo bién el problema que tenes ya que no conozco mucho a Paradox, pero como te dije arriba sólo tendrías que cambiar el tipo del argumento AQuery de TIBQuery por TQuery.

Te adjunto un ejemplo funcional que utiliza la BDE, así lo podes analizar con tranquilidad. Para probarlo sólo descomprimilo en una carpeta y compilalo, incluye la tabla sobre la que trabaja.

Saludos.

ecfisa 22-06-2011 23:22:52

Hola de nuevo.

Ahora entiendo lo que comentas del Alias...

En el evento OnShow del ejemplo que te adjunte, cambia:
Código Delphi [-]
Query1.DatabaseName:= ExtractFilePath(Application.ExeName);

Por:
Código Delphi [-]
Query1.DatabaseName:= 'NOMBRE_DE_TU_ALIAS';

O como una solución más completa, se puede agregar otro argumento a la función:
Código Delphi [-]
function QueryNearest(AQuery: TQuery; Alias, Tabla, Campo: string; Dato: Variant): Boolean;
begin
  AQuery.DatabaseName:= Alias;
  AQuery.Close;
  AQuery.SQL.Clear;
  AQuery.SQL.Add('SELECT * FROM ' + Tabla);
  AQuery.SQL.Add('WHERE '+Campo+' LIKE :DATO || ''%''');
  AQuery.ParamByName('DATO').Value:= Dato;
  AQuery.Open;
  Result:= not AQuery.IsEmpty;
end;

Ejemplo de llamada con la tabla Country que viene con Delphi:
Código Delphi [-]
  QueryNearest(Query1, 'DBDEMOS', 'COUNTRY', 'NAME', Edit1.Text);

Saludos.

martita 23-06-2011 18:47:37

gracias a ecfisa y a todos
 
gracias por el apoyo y colaboracion con el ejemplo que envio en zip
ecfisa pude comprender a fondo el funcionamiento de la busqueda de datos en una tabla, agradezco mucho por el tiempo y ayuda prestado.

saludos.

espero y sirva a otros compañeros del foro.


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

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