Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Búsquedas en tablas (https://www.clubdelphi.com/foros/showthread.php?t=12970)

arual 02-08-2004 17:22:16

Búsquedas en tablas
 
Buenas tardes!!!

Tengo una aplicación que rellena campos según un número de teléfono, es decir, lo típico, se pide un número de teléfono y a partir de éste se rellenan el resto de las edit.

Pero me encuentro con un problema, al no ser el número de teléfono la clave, puedo tener a varias personas con el mismo número de teléfono pero con distinto nombre.

Entonces, cuando rellenan el campo del teléfono hago:

procedure TPres1.PTlfExit(Sender: TObject);
begin
With Inicio.Personas do
begin
First;
if Locate('Tlf',PTlf.text,[]) then
begin
RELLENO LOS EDIT
AQUÍ TENDRÍA QUE COMPROBAR SI EXISTEN MÁS PERSONAS CON ESE NÚMERO DE TELÉFONO Y ACTIVAR UN BOTÓN QUE HE LLAMADO BSIGUIENTE.
BSiguiente.enabled:=True;
end;
end;
end;

No sé cómo comprobar si existen más personas con ese número de teléfono, es decir, tendría que buscar después de ese registro, pero no sé avanzar el puntero.

Admeás, me falta el procedimiento de cuando le de al botón de siguiente, pero cómo avanzo el puntero de la tabla para que me busque a aprtir del que ya ha encontrado?? (poniendo 'next' me sigue encontrando el mismo)

muchas gracias

P.D.: Perdón por las mayúsculas, pero las he utilizado por claridad. Gracias.

marto 02-08-2004 17:35:52

Wop!

¿Por qué no en lugar de hacer un locate no filtras la tabla? Así solamente tendrías los registros con el teléfono en cuestión, de manera que al hacer el Next conseguirías el efecto que propones.

Otra cosa, para mayor claridad, es mejor que pongas tu código entre tags [delphi], sino, da dolor de cabeza leerselo ;)

ruina 02-08-2004 17:41:27

no es dificil, simplemente debes poner una condición en el filter y llamar a FindFirst - FindNext.

No es necesario que la propiedad Filtered este a true (aunque con eso conseguirias ver en un grid solo aquellos telefonos que cumplen la condición)

seria algo asi:
Código Delphi [-]
Inicio.Personas.Filter:='Tlf = '+QuotedStr(PTlf.text);
Inicio.Personas.FindFirst;
 
...
...//boton siguiente 
Inicio.Personas.FindNext;

arual 02-08-2004 17:51:42

Muchas Gracias, con eso del findFirst me funciona, no lo conocía, muchas gracias otra vez. :)

marto 02-08-2004 17:56:12

Wop!

cuando uses los tags tienes que cerrarlos al estilo xml, en este caso, [/delphi], he editado tu mensaje, para que se vea correctamente ;)

ruina 02-08-2004 18:03:54

Cita:

Empezado por marto
Wop!

cuando uses los tags tienes que cerrarlos al estilo xml, en este caso, [/delphi], he editado tu mensaje, para que se vea correctamente ;)

¿no he puesto el de cierre?
valla, lo siento .. y gracias por la corrección marto ^_^

arual 02-08-2004 18:33:52

Y otra preguntilla mas...

Cómo se pueden hacer los filtros por más de un campo?

Gracias

marto 02-08-2004 18:41:34

Wop!

En la propiedad Filter puedes poner condiciones simples unidas por AND y OR.

Cita:

Empezado por Delphi's help
Specifies the text of the current filter for a dataset.

property Filter: string;

Description

Use Filter to specify a dataset filter. When filtering is applied to a dataset, only those records that meet a filter’s conditions are available. Filter describes the filter condition. For example, the following filter condition displays only those records where the State field is 'CA' or 'MA':

State = 'CA' or State = 'MA'

When a filter is set, Blank records do not appear unless explicitly included in the filter. For example:

State <> 'CA' or State = NULL

When a field name contains spaces, you must enclose the field name in brackets. For example:

[Home State] = 'CA' or [Home State] = 'MA'

Filter expressions on remote SQL tables and on client datasets support field comparisons. For example:

Field1 > Field2

Field comparisons are not supported against local tables (Paradox, dBASE, Access, FoxPro).

For a complete list of operators you can use in filter strings, see SettingTheFilterProperty.

Note: Filters are not supported on unidirectional datasets. If you set the Filter property of a unidirectional dataset, it raises an exception.

The FilterOptions property controls case sensitivity and filtering on partial comparisons.

Tip: Applications can set Filter at runtime to change the dataset’s filtering condition (for example, in response to user input).


arual 02-08-2004 18:48:20

Ya intenté lo que me dices, pero no compila, puse:
Código Delphi [-]
Filter:= ('Tlf='+QuotedStr(PTlf.text)) and ('Nombre='+QuotedStr(PNombre.text))and ('Ape1='+QuotedStr(PApe1.text));

Lo probé con paréntisis y sin ellos, y me dice: 'operator not applicable to this operand type' eso con los paréntisis, sin ellos me dice muchas más cosas.


gracias.

marto 02-08-2004 18:56:17

mmmmm ¿tú te has leído la ayuda? La propiedad Filter es de tipo String..... no le puedes hacer un and.... el "and" tiene que estar dentro de la cadena...

ruina 02-08-2004 18:59:56

en estos casos es muy util tirar de la función Format:
Código Delphi [-]
Filter:=
Format('(Tlf = %s) and (Nombre = %s) and (Ape1 = %s) ', 
 [QuotedStr(PTlf.text), QuotedStr(PNombre.text),QuotedStr(PApe1.text)])

arual 02-08-2004 19:02:18

mou?

Inglés, la verda q no entiendo mucho, la ayuda me la he leído, sí, lo q me has puesto antes ya lo había visto yo, pero la cosa es... y entonces??? cómo lo puedo hacer??? qe meta el and dónde??

ains...

muchas gracias

arual 02-08-2004 19:03:23

Muchas gracias Ruina, empiezas a ser mi Dios... muackas!!!

paren 04-08-2004 00:57:15

Otra preguntilla
 
Yo quiero hacer una busqueda, donde una palabra en un edit, se encuentre en cualquier parte del campo de un registro, lei en la ayuda que se puede hacer al go como esto

Cita:

De la ayuda de delphi
To filter strings bases on partial comparisons, use an asterisk as a wildcard. For example:

State = 'M*'
Solo que esta busqueda solo me trae los campos que empiezen con M y yo quiero que me traiga si encuentra la palabra en medio, al principio o al final

algo asi

select * from cliente
where empresa Like '%Tijuana%'
order by empresa

ya intente usar el like en el filter pero me marca el error:

raised exception class EDBEngineError with message 'Operation not aplicable.' ,
gracias por su ayuda

Uso delphi 5, win 98 se, e interbase 1.0.0.315

paren 04-08-2004 01:18:52

siempre no jeje
 
Bueno es ke me he leido este hilo
http://www.clubdelphi.com/foros/show...ghlight=Filter

y ya veo ke es imposible hacer lo ke kiero :(, entonces tendre ke usar una sentencia sql
en tiempo de ejecucion, gracias de antemano y hasta luego
:D


La franja horaria es GMT +2. Ahora son las 13:32:58.

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