Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Buscando una cadena dentro de una tabla (https://www.clubdelphi.com/foros/showthread.php?t=68532)

carlos v.p.l. 18-06-2010 23:49:53

Buscando una cadena dentro de una tabla
 
saludos, espero me puedan ayudar, el problema que tengo es que necesito buscar una cadena en una tabla, estuve buscando como entonces llegue a este codigo:
[
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
     Unit2.DataModule2.cliente.Locate('nombre','carlos',[]);
end;
El problema que tengo es que funciona con enteros por ejemplo:
[
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
     Unit2.DataModule2.cliente.Locate('idnombre',5,[]);
end;
y si me ubica pero deplano con cadenas pues me marca un error que dice asi:
unsopported feature , espero que haya otra manera de hacer la busqueda y me puedan ayudar o ya si deplano es asunto de mi delphi o mmm alguna recomendación,gracias y saludos de nuevo

carlos v.p.l. 19-06-2010 01:27:09

Encontre por ahi que tengo que modificar el archivo IBSQL.pas , pero no lo encuentro por ningun lado, alguien lo ha utilizado ya? xD podria decirme donde encontrarlo por favir y grax

Casimiro Notevi 19-06-2010 01:47:31

Hola, carlos v.p.l., por favor, echa un vistazo a la guía de estilo de clubdelphi, así será más fácil ayudarte.

No has explicado nada de qué base de datos, componentes, etc. estás usando.

La pregunta, además, es algo confusa, supongo que quieres buscar un texto en un campo de una tabla.

Hay varias formas, pero sería conveniente que explicaras qué componentes usas y base de datos, eso como mínimo.


p.d.: No sé de dónde has sacado eso, pero ni si te ocurre modificar ibsql.pas :confused:

carlos v.p.l. 19-06-2010 01:55:13

1 Archivos Adjunto(s)
ok disculpa , lo que pasa es que encontre una respuesta a una pregunta con el mismo problema igual al mio , no kisiera confundir pero kisiera aprovechar esa respuesta por ke parece que si le funciono al otro amigo , pero por alguna razon no puedo pegar el link aqui en el mensaje , ahi viene la solucion a mi problema y pues ahi indica ke se debe modificar el archivo IBSQL.pas
Adjunto un txt con el link del tema del foro donde entre dicha respuesta por ke todavia no tengo permitido poner un link por aca segun esto, grax por adelantado

Casimiro Notevi 19-06-2010 02:08:16

El caso que indicas es un tema de caracteres unicode con los últimos delphi.

En tu caso, todavía no has dicho nada de qué usas y qué quieres hacer.

carlos v.p.l. 19-06-2010 02:13:17

hola , pues como tu lo indicas yo quiero buscar un texto en una tabla, y pues me aparece el mismo error que tiene el otro amigo en el link que adjunte, en el mismo caso que puso el que es cuando usa located para buscar un nombre por ejemplo, el error es el :
"unsupported feature", pero solo me pasa cuando busco cadenas , con enteros me funciona bien, que puedo hacer ??, yo queria probar con la respuesta que le dieron pero que me recomiendas? por favor y grax ,jeje se me estaba escapando de new : uso interbase y delphi 2009 grax

Casimiro Notevi 19-06-2010 02:25:31

Bueno, pues si quieres hacer lo mismo, ¿qué te lo impide?.
De todas formas no es muy recomendable modificar esos componentes.

carlos v.p.l. 19-06-2010 02:28:07

mmm je je je no kisiera regarla y no se donde esta el archivo no lo encuentro por ningun lado ,me puedes ayudar? por favor? o podrias recomendarme alguna otra manera de atacar mi problema por favor y grax

Casimiro Notevi 19-06-2010 02:39:12

Es algo complejo cuando no has explicado detalladamente qué quiéres hacer, pero si no voy muy mal equivocado, sólo pretendes buscar un texto y usas interbase con los componentes ibx?

Lo más lógico es usar sql, un componente IBDataSet y en su propiedad selectsql.text pones la sentencia de búsqueda, algo así:

Añade al form un tibdataset, un tedit y un botón
Código:

QR1: TIBDataSet;
bt1: TButton;
ed1: TEdit;

En el edit ponemos lo que queremos buscar y en el onclick del botón:

Código:

procedure TForm1.bt1Click(Sender: TObject);
begin
  qr1.Close;
  qr1.SelectSQL.Text := 'select campo from tutabla where campo containing '+quotedstr(ed1.text);
  qr1.Open;
  ShowMessage( QR1.fields[0].AsString );
end;

Es sólo un ejemplo para que te sirva de referencia.

Caral 19-06-2010 02:53:58

Hola
:confused::confused:
No entiendo nada.:D
Saludos

carlos v.p.l. 19-06-2010 03:02:43

ok, uso una unidad 2 como modulo de datos ahi tengo mi TIBDatabse mi TIBtransaction y por ejemplo
mi tabla TIBTable "clientes", en una unidad 5
tengo un TDatasource hacia clientes, en mi form de la unit 5 tengo un tDbgrid conectado al
datasourc , tons mi tabla clientes tiene un campo nombre y un campo idcliente por ejemplo,.

soy bastante novato en esto asi ke pues en donde esta el uses de mi form5 inclui mi unit2 entonces para acceder a mi tabla accedo de esta manera:
Unit2.DataModule2.cliente y ya por ejemplo para usar alguna propiedad pues:
Unit2.DataModule2.cliente.FieldbyName ,y funciona bien , si kisiera bsucar un 'carlos' por ejemplo en el campo 'nombre' siguiendo tu ejemplo esta bien esta sintaxis? o me ekivoke en algo por ke me marcar un error:
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    IBDataSet1.Close;
    IBDataSet1.SelectSQL.Text:='select nombre from Unit2.DataModule2.cliente where nombre containing'+quotedstr(Edit2.Text);
    IBDataSet1.Open;
    ShowMessage( IBDataSet1.fields[0].AsString );

end;
donde IBDataSet1 es mi dataset
espero me puedas seguir ayudando grax

Caral 19-06-2010 03:16:43

Hola
Vamos por partes:
1: datamodule = unit2
tienes: TIBDatabse1, TIBtransaction1 y TIBTable1
2: form5 = unit5
tienes: datasource1, dbgrid1, button1, Edit2.
Todo conectado correctamente.
3: Unit2 esta en el uses del unit5??. suponemos que si.
4: en el boton1:
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    DataModule2.TIBTable1.Close;
    DataModule2.TIBTable1.SQL.Text:='select * from tutabla where nombre like '+quotedstr(Edit2.Text);
    DataModule2.TIBTable1.Open;
  //  ShowMessage( IBDataSet1.fields[0].AsString ); // no entiendo para que?

end;
Voy bien?
Saludos

carlos v.p.l. 19-06-2010 03:21:29

Cita:

Empezado por Caral (Mensaje 367722)
Hola
Vamos por partes:
1: datamodule = unit2
tienes: TIBDatabse1, TIBtransaction1 y TIBTable1
2: form5 = unit5
tienes: datasource1, dbgrid1, button1, Edit2.
Todo conectado correctamente.
3: Unit2 esta en el uses del unit5??. suponemos que si.
4: en el boton1:
Código Delphi [-]procedure TForm5.Button1Click(Sender: TObject); begin DataModule2.TIBTable1.Close; DataModule2.TIBTable1.SQL.Text:='select * from tutabla where nombre like '+quotedstr(Edit2.Text); DataModule2.TIBTable1.Open; // ShowMessage( IBDataSet1.fields[0].AsString ); // no entiendo para que? end;

Voy bien?
Saludos

En lugar de * seria el campo nombre y no le habia puesto like le habia puesto containing ya probe pero = tiene error y vas bien grax

Caral 19-06-2010 03:23:37

Hola
Tiene error????.
Que error????, donde, cuando, como?.
Saludos

carlos v.p.l. 19-06-2010 03:28:56

al parecer tiene un problema con mi punto despues de Unit2 en la siguiente instruccion
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    IBDataSet1.Close;
    IBDataSet1.SelectSQL.Text:='select nombre from Unit2.DataModule2.cliente where nombre like'+quotedstr(Edit2.Text);
    IBDataSet1.Open;
end;

end.
Y es que por ejemplo en otros form cuando tengo que acceder a un campo de mi tabla por ejemplo para saber el valor accedo asi:
Código Delphi [-]
Unit2.DataModule2.nombredelatabla.FielByName('campo').value;
por ejemplo
de ke otra manera puedo acceder ami tabla y grax

Caral 19-06-2010 03:31:46

Hola
Cliente es el nombre del TIBTable1 o de la tabla???
Saludos

carlos v.p.l. 19-06-2010 03:34:04

De la TIBTABLE y de la tabla que hice en interbase , acostumbro ponerles el mismo nombre para no confundirme je

Caral 19-06-2010 03:38:24

Hola
1
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    DataModule2.cliente.Close;
    DataModule2.cliente.SQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
    DataModule2.cliente.Open;
end;
2
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    IBDataSet1.Close;
    IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
    IBDataSet1.Open;
end;
3
pasame el programa la bd y todo y lo veo.:)
Saludos

carlos v.p.l. 19-06-2010 03:46:26

orale con tu opcion uno ya no me marca error , como puedo ver el resultado es decir si kisiera ver en un Edit3 por ejemplo el nombre que encontro (xD que obviamente es el ke ingrese je je je), com puedo hacer eso y grax de new o por ejemplo en un tdbgrid que se encuentre = en mi form5 que se posicione en la fila del nombre encontrado(el dbgrid estaria conectado con un datasourc hacia la tabla cliente =)

Caral 19-06-2010 03:49:17

Hola
Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
    DataModule2.cliente.Close;
    DataModule2.cliente.SQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
    DataModule2.cliente.Open;
   Edit3.text:= DataModule2.cliente.fields[0].AsString;
end;
Saludos

carlos v.p.l. 19-06-2010 03:55:59

Disculpa ese resultado (que es 1) que me de vuelve el Edit3 que me indica ?
que lo ha encontrado y 0 que no?
o es el indice? y de nuevo grax es ke siempre me regresa 1 , cuando ingreso un nombre que si esta y 1 = si no esta

Caral 19-06-2010 04:01:41

Hola
Es una excelente pregunta: Que es el 1??.
En la tabla tienes algun numero 1 por ahi perdido?, por que le codigo tiene que regresar el nombre en el edit.
Saludos

carlos v.p.l. 19-06-2010 04:31:16

rTenia un error a la hroa de sustituir tu codigo solo cambie 2 lineas no las 3 perdon:
El siguiente codigo no me marca error pero siempre me regresa 1:
Código Delphi [-]
 procedure TForm5.Button1Click(Sender: TObject);
begin
   DataModule2.cliente.Close;
   IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
   DataModule2.cliente.Open;
   Edit3.text:= DataModule2.cliente.fields[0].AsString;
end;
supongo que 1 es mi primer indice
el siguiente codigo me no me marca error de compilacion pero me marcar un error a la hora de buscar que es este"ListIndex of bounds(0)":
Código Delphi [-]
 procedure TForm5.Button1Click(Sender: TObject);
begin
   DataModule2.cliente.Close;
   IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
   DataModule2.cliente.Open;
   Edit3.text:= IBDataSet1.fields[0].AsString;
end;

en tu caso 1 tienes la sguiente linea:
Código Delphi [-]
DataModule2.cliente.SQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
esa no me la acepta y ya pues el caso 2 que me pusiste pues ese si me marca el error:
SQL error code=-104
Token unknown -line 1,char 24 '. (la ' no es error de dedo xD)

ia no se ke hacer xD ,muchas grax por la ayuda,si no tas algun error te agradeceria que me siguieras ayudando(ya te hice trabajar mucho muchas grax)

Caral 19-06-2010 04:38:16

Hola
Intenta esto:
Código Delphi [-]
 procedure TForm5.Button1Click(Sender: TObject);
begin
   DataModule2.cliente.Close;
   IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+Edit2.Text;
   DataModule2.cliente.Open;
   Edit3.text:= DataModule2.cliente.fields[0].AsString;
end;
Revisa bien en la tabla, que el campo nombre contenga el dato.
Saludos

Caral 19-06-2010 04:50:23

Hola
Creo que he entendido mal desde el principio.
Lo que tienes es un IBTable, no un IBQuery.
El codigo es para un IBQuey.
Si quieres usar un table se hace un filtro:
Código Delphi [-]
 procedure TForm5.Button1Click(Sender: TObject);
var
   Filtro : String;
begin
   If (Edit2.Text <> '') then
   begin
      DataModule2.cliente.Filtered := False;
      Filtro := 'Nombre Like '''+ Edit2.Text + '*'''
      DataModule2.cliente.Filter := Filtro;
      DataModule2.cliente.Filtered := True
      Edit3.text:= DataModule2.cliente.fields[0].AsString;
end;
end;
Saludos

carlos v.p.l. 19-06-2010 04:52:44

MMM no pues no estoy seguro que debo tener otro error por ahi me dedicare a buscarlo , muchas grax por todo tu tiempo

carlos v.p.l. 19-06-2010 18:38:13

mm pues no encontre el error pero ya hoy con mas calma se me ocurrio hacerlo de otra forma y ya quedo muchas grax por su tiempo saludos.

AntonioTB 20-06-2010 10:28:12

Cita:

Empezado por carlos v.p.l. (Mensaje 367734)
rTenia un error a la hroa de sustituir tu codigo solo cambie 2 lineas no las 3 perdon:
El siguiente codigo no me marca error pero siempre me regresa 1:

Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
DataModule2.cliente.Close;
IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
DataModule2.cliente.Open;
Edit3.text:= DataModule2.cliente.fields[0].AsString;
end;





supongo que 1 es mi primer indice
el siguiente codigo me no me marca error de compilacion pero me marcar un error a la hora de buscar que es este"ListIndex of bounds(0)":

Código Delphi [-]
procedure TForm5.Button1Click(Sender: TObject);
begin
DataModule2.cliente.Close;
IBDataSet1.SelectSQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);
DataModule2.cliente.Open;
Edit3.text:= IBDataSet1.fields[0].AsString;
end;





en tu caso 1 tienes la sguiente linea:

Código Delphi [-]DataModule2.cliente.SQL.Text:='select nombre from cliente where nombre like'+quotedstr(Edit2.Text);


esa no me la acepta y ya pues el caso 2 que me pusiste pues ese si me marca el error:
SQL error code=-104
Token unknown -line 1,char 24 '. (la ' no es error de dedo xD)

ia no se ke hacer xD ,muchas grax por la ayuda,si no tas algun error te agradeceria que me siguieras ayudando(ya te hice trabajar mucho muchas grax)

Por el mensaje de rror que dices que tienes, prueba a escribir un espacio despues de 'like' en la sentencia sql, posiblemente ese sea el problema que te da el error.

mematanlimon 24-06-2010 16:07:51

buenas, les hago una consulta sobre los filtro, como se aplica un filtro con 2 condiciones, es decir....
una tabla donde haya por ejemplo

select VENTAS where CLIENTE like FILTRO1 like FILTRO2

este es un ejemplo porque en realidad no se como se hace para poder poner en un query esta doble condicion,

gracias

Casimiro Notevi 24-06-2010 16:24:55

Por favor, inicia siempre un tema nuevo cuando quieras hacer preguntas que no tengan que ver con el tema tratado en el hilo, gracias.


Código:

select campos
from tuTabla
where CLIENTE like FILTRO1
and    CIUDAD = FILTRO2
and    SUELDO > FILTRO3

etc...



La franja horaria es GMT +2. Ahora son las 16:58:39.

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