Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Busqueda en string sin SQL (https://www.clubdelphi.com/foros/showthread.php?t=60509)

klionsis 04-10-2008 01:41:28

Busqueda en string sin SQL
 
Hola gente, se puede buscar por el contenido de un String sin utilizar una consulta SQL... usando el Locate u otra función parecida.

Lo que busco es que el cursor se posicione en el registro que contiene la cadena que ingreso en una caja de texto por ejemplo, por esto no quiero una consulta sql.


Gracias.

maeyanes 04-10-2008 01:46:14

Hola...

Pues precisamente usando el método Locate. Puedes buscar en el foro o en la ayuda de Delphi como se usa...


Saludos...

klionsis 04-10-2008 02:15:00

Gracias por tu respuesta.. pero he buscado y no encuentro nada..
Puede ser que sea utilizando la opcion loCaseInsensitive de la función Locate?

Caro 04-10-2008 17:58:27

Hola Kilonis, la función Locate tiene las opciones loCaseInsensitive y loPartialKey dependiendo cual te sirva utilizas una u otra,

loCaseInsensitive -> te hace una busqueda exacta, sin tomar en cuenta mayusculas o minusculas.
loPartialKey -> te hace una busqueda aproximada.

Código Delphi [-]
 if Not (Query.Locate('campo',Edit1.Text,[locaseinsensitive])) then
   showmessage('No ha encontrado nada');

Saluditos

Fenareth 04-10-2008 18:10:44

Hola klionsis !

Este ejemplo es utilizando un TEdit y un TDBGrid....

probablemente te pueda ayudar de mucho...

Saludos, :)

klionsis 04-10-2008 20:24:37

Muchas gracias por sus respuestas, pero no es lo que busco.
Lo que quiero hacer es una consulta que me posicione el cursor en la grilla correspondiente al registro que "contiene" la cadena que ingreso en el textbox.

Seria el mismo comportamiento que tendria una consulta sql con el Like %campo%. He probado con el Locate como me indican pero el comportamiento no es el que busco.

Espero puedan ayudarme, gracias!

Fenareth 05-10-2008 05:48:19

Pues no entiendo realmente la diferencia entre lo que pides y los ejemplos que hemos colocado :confused:....

Podrías explicar un poco mejor y así nos aclaramos todos ??? :p :)

Lepe 05-10-2008 12:32:01

Mira bien la ayuda de locate, además de locaseInsensitive, tienes usar "loPartialkey"

Saludos

Caro 06-10-2008 04:24:50

Hola, lo que yo entiendo es que el amigo busca Like %campo% , pero con la opción IoPartialKey del Locate, hace la busqueda aproximada pero no de esa forma, sino algo asi Like campo%.

Saluditos

Lepe 06-10-2008 07:25:20

Cita:

Empezado por klionsis (Mensaje 318205)
Seria el mismo comportamiento que tendria una consulta sql con el Like %campo%. He probado con el Locate como me indican pero el comportamiento no es el que busco.

Yo al menos entiendo que quiere hacerlo con el locate, y así es si lee bien la ayuda ;). Porque vamos, no hay quien le saque una línea de código ni arrastrándolo :p y mi bola de cristal está fuera de cobertura :p.

Caro 06-10-2008 13:04:26

Hola de nuevo, no me he explicado bien, digamos que tenemos "Ana Maria Rojas" con el IoPartialKey si hacemos una búqueda por "Maria", no lo va ha encontrar ya que hace la búsqueda aproximada de lo que se pasa como parametro y cualquier cosa que venga despues, osea que encontraría todos los registros que en ese campo comiencen con "Maria". Y lo que creo que quiere es %Cadena%, osea cualquier cosa, el parametro y cualquier cosa.

Como mi bolita de cristal tampoco funciona, puede que no le haya entendido bien al amigo :p.

Saluditos

klionsis 06-10-2008 17:05:01

jeje, mis disculpas a todos por no ser claro. Caro, es exáctamente lo que busco... el Lopartialkey siempre me busca por el comienzo de la cadena, quiro poder buscar por lo que contiene la cadena..

Saludos..

klionsis 08-10-2008 18:55:44

Bueno, parece que mi falta de claridad los ha dejado sin habla ;). Todavía no encuentro una solución para mi problema.. si alguién tiene una idea podría ayudarme...

Gracias!!

Lepe 08-10-2008 21:00:29

Caro ya te dió la solución en su primer mensaje. Otra forma no hay.

Podrías decir por qué no te sirve un query, quizás le encontremos solución.

Saludos

donki 08-10-2008 21:19:15

Hola chicos,

A ver que os parece mi aportación.

Si os fijais en la implementación del Locate lo que hace es un clon del RecordSet (en el caso de utilizar los componentes de ADO). Luego Filtra con la propiedad filter el Clon y con el bookmark que obtiene posiciona el TDataset principal. Creo que podria servirte un código similar a este:

Dataset1.DisableControls;
Dataset1.Filtered := True;
Dataset1.Filter := 'Campo_Por_El_que_buscas like '+QuotedStr('%'+Valor+'%');
bm := DataSet.GetBookMark;
Dataset1.Filtered := False;
Dataset1.EnableControls;
Dataset1.GotoBookMark(bm);

Espero que te ayude

Caro 09-10-2008 05:30:34

Hola de nuevo, con el Locate no vas a poder hacer la búsqueda que quieres. Y otra función que haga lo que quieres creo que no hay. Lo que se me ocurre es que te hagas tu la función y busques el registro, mas o menos así.

Código Delphi [-]
var
 Campo : String;
 Encontrado : Boolean;
 Marca : TBookMarkStr;
begin
  Encontrado := False;
  Try
   Marca := Query.Bookmark;
   Query.DisableControls;
   Query.First;
   //Recorremos hasta encontrar o hasta el final
   While Not Query.Eof do
    begin
     Campo := Query.FieldByName('nombrecampo').AsString;
     if AnsiPos(Edit1.Text, Campo)>0 then
      begin
       Encontrado := True;
       break;
      end;
     Query.Next;
    end;
  finally
   Query.EnableControls;
  end;
  //Si no ha encontrado, lo posicionamos donde estaba antes
  //y si ha encontrado se queda en en esa posición.
  if Not Encontrado then
   Query.Bookmark := Marca;

Saluditos

Delphius 09-10-2008 05:37:09

Perdonen que me entrometa en el hilo, pero la curiosidad me invade ¿klionsis, porqué ese "rechazo" a la consulta SQL?:confused:
¿En qué te puede afectar o perjudicar?

Saludos,

klionsis 10-10-2008 00:48:52

jeje, no es rechazo, es solo que la consulta sql me devuelve una coleccion de registros segun el filtro que le pase (me restringe el conjunto de registros a los que se se corresponden con el filtro) y yo no necesito esto, lo que necesito es posicionarme en un registro y que si quiero ver el registro que sigue me lo permita por mas que este no cumpla el criterio de busqueda que le dí... se entiende?

Gracias a todos por las alternativas que me dieron!! no he podido probarlas aún pero les aviso de los resultados...

Disculpen por la ignorancia, soy principiante..

Lepe 10-10-2008 10:46:41

El motor de bases de datos es más eficiente que tú, es decir, cerrar una consulta, cambiar el criterio de búsqueda y lanzarla, puede devolver los datos más rápidamente y eficientemente que moverte tú entre registros.

Por otra parte, y sin tener nada que ver.... ¿de qué le sirve un registro que no cumple el criterio de búsqueda al usuario final? :confused:.

Saludos

klionsis 10-10-2008 12:58:08

Lepe, tienes razón en lo que dices con lo cuál el motor de base de datos puede ser mas eficiente que cualquiera de nosotros si utilizamos lo que puede hacer con mucha eficiencia pero de nada me sirve lo potente que pueda ser la herramienta si no satisface la necesidad de las personas.

En realidad el concepto "consulta" en este hilo quizás este mal utilizado, lo que pretendo es que la persona con un par de datos que introduzca en una caja de texto, ordene la grilla por el criterio en que estaría filtrando el conjunto de datos y lo posicione en el primer registro que encuentre (en la grilla ordenada) el cual contiene esa cadena que ingresó, despúes si el quiere ir mas abajo de esa grilla o mas arriba, la aplicación se lo debe permitir y por esto no puedo reducir el conjunto de registros que tengo en una determinada tabla. ;)

Saludos!

klionsis 12-10-2008 15:40:46

Caro, tu ejemplo me anduvo a la perfección, muchas gracias!

Saludos.


La franja horaria es GMT +2. Ahora son las 21:26:08.

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