PDA

Ver la Versión Completa : Problemas con Locate


Acker
05-08-2005, 12:55:26
Buenas dias!!

Soy un principiante en esto de Delphi, y tengo una duda que espero que me puedan resolver.
Se trata de lo siguiente, al usar la funcion Locate me dice que no se puede usar teniendo la base de datos cerrada, asi que la abro (Open) pero sigue sin situarme el cursor en el registro que busco. Me pasa lo mismo en un proyecto que funciona perfectamente en otra maquina. A que se puede deber???
Espero vuestra ayuda!

P.D.- Si no esta suficientemente clara mi pregunta os ruego que me lo hagais saber para poder explicarla algo mejor.

Un saludo y Gracias

marcoszorrilla
05-08-2005, 12:57:36
Pues tienes que añadir el motor de base de datos que estas utilizando. Access, Paradox, Firebird......

Para utilizar Locate tienes que tener la tabla por la que vas a buscar abierta y además no es preciso que tengas indice declarado por el campo por el que haces la búsqueda aunque en aras a la rapidez es conveniente que el campo esté indexado.

Un Saludo.

Neftali [Germán.Estévez]
05-08-2005, 13:00:07
¿Puedes poner el código que utilizas?

Acker
05-08-2005, 13:04:33
A ver, contestando a vuestras dos respuestas.

El motor de Base de Datos es Paradox, y el codigo que uso es:

procedure TFIdentificacion.BAceptarClick(Sender: TObject);
begin
DMBaseDeDatos.TUsuarios.Locate('nombreUsuario',EUsuario.Text,[])
end;
end.
Mi objetivo con él es que me diga si un usuario introducido por teclado esta o no en la base de datos

Gracias

Neftali [Germán.Estévez]
05-08-2005, 13:28:16
Prueba con éste:


procedure TFIdentificacion.BAceptarClick(Sender: TObject);
var
b:Boolean;
begin
DMBaseDeDatos.TUsuarios.First;
b := DMBaseDeDatos.TUsuarios.Locate('nombreUsuario',
EUsuario.Text, [loCaseInsensitive])
if (b) then
MessageDlg('Encontrado', mtInformation, [mbOK], 0);
end
else begin
MessageDlg('No Encontrado', mtError, [mbOK], 0);
end;

end;

Acker
05-08-2005, 13:40:38
Neftali, siento decirte que tampoco me funciona.
Me tiene esto bastante cabreado.
No podra ser de algo de configuracion del entorno? o del sistema operativo?
Es que como comente al principio del hilo, un proyecto que funciona en otra maquina, me falla a mi tambien por lo mismo.

Madre mia, que desesperacion!!! algo tan absurdo y que me haga perder tanto tiempo!

Neftali [Germán.Estévez]
05-08-2005, 13:44:05
¿Seguro que tienes un campo en esa tablas con ese mismo valor?

Revisa que no tenga espacios, caracteres extraños, acentos,...
¿No te encuentra ningun valor en esa tabla (ningun nombre de usuario) o sólo es uno el que te falla? ¿El resto de valores sí los encuentra?

Acker
05-08-2005, 13:55:06
Que va tio, no encuentra nada, y no tiene ni acentos, espacios ni nada. lo mas gracioso es que si en lugar de poner para que busque DBEUsuario.text pongo una cadana de caracteres si que me la encuentra (si esta) y no si no esta.

Raro, no???

epuigdef
05-08-2005, 14:03:04
Buenas!

Parece una tontería pero prueba esto:

String temp;

temp = trim(EUsuario.Text);
b := DMBaseDeDatos.TUsuarios.Locate('nombreUsuario',
temp, [loCaseInsensitive])
if (b) then
MessageDlg('Encontrado', mtInformation, [mbOK], 0);
end
else begin
MessageDlg('No Encontrado', mtError, [mbOK], 0);
end;



Un saludo

Edu

Acker
05-08-2005, 14:13:12
Edu, parece que funciona, jejeje
Pero otra cosilla, este codigo es si tengo un Edit en lugar de un DBEdit. con los dbedit que estado tiene que tener la tabla antes de usar la tabla??
Open, edit,...., no se si me explico
Y sobre todo, cual es la funcion de trim??

epuigdef
05-08-2005, 14:19:37
Un DBEdit contiene un campo del registro activo en la tabla, por lo que no creo que debas utilizarlo en tu caso, si simplemente lo que quieres es buscar un valor.


La función trim simplemente elimina los espacios que pueda haber al principio y al final de la cadena, pero lo que realmente he pensado es más sutil: El campo dbedit.text lo que devuelve es un tipo de datos Variant (o sea, un comodín). La función trim interpreta el el variant es realmente una cadena, mientras que el locate no. Y el trim, aunque reciba un variant nos devuelve un String.

No sé si me he explicado muy bien, pero la idea es esta.

Un saludo

Edu

Acker
05-08-2005, 14:24:23
Te has explicado perfectamente. Seguiremos en contacto por que a medida que vaya avanzando en la practica me iran surgiendo dudas.

Muchas gracias chic@s por vuestra ayuda!

Un saludo

Neftali [Germán.Estévez]
05-08-2005, 15:47:46
temp = trim(EUsuario.Text);


A eso me refería... (a los espacios)