Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   campo filter firebird (https://www.clubdelphi.com/foros/showthread.php?t=53131)

anubis 11-02-2008 22:40:53

campo filter firebird
 
Buenas, ya he cambiado todas mis base de datos a firebird en la aplicacion que estaba realizando, y funciona!!!. De momento sigo usando del tipo:
table1.fielbyname('codigo').asinteger, todavia nose como se podria hacer en sql.

La pregunta viene con los campos filter, porque pongo por ejemplo:

table1.filter:='Tipo = '+'1 Cama KSize';
table1.filtered:=true;
pero me arroja un error, para campos que no llevan espacios funciona pero para estos no funciona da error.
Esto es asi? o que estoy haciendo mal.

gracias

jhonny 11-02-2008 22:51:13

Bueno, a pesar de que no nos dices cual es dicho error, yo creería que es porque faltan las comillas... osea debería ser asi:

Código Delphi [-]
table1.filtered := False;
table1.filter   := 'Tipo = '+'"1 Cama KSize"';
table1.filtered := True;

Por otro lado, dependiendo de lo que necesites, muchas veces deberias plantearte usar los filtros desde la consulta y no desde la propiedad Filter de los TQUery (Eso si, repito, dependiendo de lo que necesites).

Espero te sirva.

maeyanes 11-02-2008 22:54:59

Hola...

Para acceder a Firebird te recomiendo que uses componentes como los IBExpress (IBX) o algunos otros como MDO...

Esto por que usar componentes TTable para acceder a los datos de Firebird es muy costoso en cuanto al tráfico en la red...

Para tu problema con los filtros, trata así:

Código Delphi [-]
Table1.Filter := 'Tipo = ''1 Cama KSize''';
Table1.Filtered := True

Pero lo optimo sería algo así (usando un componente TIBQuery de los IBX:

Código Delphi [-]
TIBQuery1.SQL.Text := 'select * from Tabla where Tipo = ''1 Cama KSize''';
TIBQuery1.Open;


Saludos...

gendelphi 11-02-2008 23:29:31

También puedes hacerlo usando parámetros:
Código Delphi [-]
TIBQuery1.SQL.Text := 'select * from Tabla where Tipo = :Tipo';
TIBQuery1.ParamByName('Tipo').Value:= '1 Cama KSize ';
TIBQuery1.Open;

anubis 12-02-2008 03:04:00

Gracias por las respuestas, me que da mucho por aprender de estas cosas.
Código Delphi [-]
table1.filtered := False;
table1.filter   := 'Tipo = '+'"1 Cama KSize"';
table1.filtered := True;
si en vez de poner '"1 Cama KSize, pongo una variable no funciona
Código Delphi [-]
cv:='1 Cama KSize';
table1.filtered := False;
table1.filter   := 'Tipo = '+cv;
table1.filtered := True;
Esto asi no funciona.

gracias de nuevo

Delphius 12-02-2008 03:31:27

anubis,
Acostumbrate a usar QyotedSTr() y te olvidas del parto de controlar las comillas.

Código Delphi [-]
table1.Filter := 'Tipo = ' + QuotedStr(cv));

Y como consejo, en lo posible evitate empler filter. Es un proceso que en ocasiones suele ser lento. Se gana más perfomance empleando su variante: una consulta SQL. Y en este tema de las consultas SQL, lo mejor es emplear parámetros, tal como lo demuestra gendelphi.

Saludos,

RONPABLO 12-02-2008 16:57:44

Cita:

Empezado por ayuda Delphi sobre Filter en los IBX
Specifies rows in a dataset that meet the filter conditions.

property Filter: string;

Description

Use the Filter property to restrict the rows in the dataset to those that meet the filter conditions. The syntax for Filter is the same as the search condition that appears after a WHERE clause in a Select statement. For example, to view only those records where the value in the Country field contains 'France' or 'Fiji':

Country = 'France' or Country = 'Fiji'

You can use standard SQL wildcards such as percent (%) and underscore (_) in the condition when you use the LIKE operator. The following filter condition retrieves all Countries beginning with 'F':

Country LIKE 'F%'

To view rows that have a NULL value in the Country column and Contact_Name is not NULL, use the IS operator:

Country is NULL and Contact_Name is not NULL

You can also use complex expressions in filter clauses. The following example retrieves rows containing Country values that use Francs as currency.

Country IN (SELECT Country from Country where Currency = '_Franc')

No entiendo porque puede ser lento el trabajar con Filters?

maeyanes 12-02-2008 17:04:58

Hola...

Si estás en ambiente Cliente/Servidor y tienes tablas grandes y desde tu aplicación Delphi usas componentes TTable (o TIBTable), cada que abras un componente de estos, este se traerá todo el contenido de la tabla hasta la PC cliente, lo que conlleva a saturar la red y lentitud en la aplicación. Es por esta razón que trabajar con filtros es algo lento.

Ahora, usando IBX, es preferible hacer el filtro directamente desde la cláusula where ya que con esto solo se traen los datos necesarios.

Saludos...

RONPABLO 12-02-2008 18:06:27

bueno creo que están mezclando el caso de el Filter en un componente TTable y un componente IBTable, lo que yo tengo entendido es que el componente TTable trae toda la información e internamente este le hace los procesos de filtrado y demás, mientras que los componentes estilo IBX o MDO ponen en un IBTable después de un "select * from table" la clausula "where Filtro = ValorFiltro".... para probar esto los invito a hacer la siguiente pruba:

en Paradox creen una Tabla con 10 mil registros con dos campos uno llamado Id (entero auto incrementado de 1 a 10000) y otro nombre (texto de tamaño 150 y por defecto 'Usuario ' + id)... accedan a dicha tabla con un TTable con filtro (id < 200) y sin filtro, luego accedan con un componente TQuery (select * Tabla) con filtro (where id < 200) y sin filtro... veran que la velocidad siempre es similar tanto en el TQuery como en el TTable (con filtros o sin ellos)

Luego realizar el mismo proceso pero con un bd en FIrebird y componentes IBX o MDO, verá que la velocidad de un IBQuery con where id < 200 ó de una TTable con filtro id < 200 son similares y mucho mas rápidas que sin dichos filtros

rastafarey 22-02-2008 18:42:40

Resp
 
osea que te traes la data desde le servidor y luyego la filtar en el cliente.

Yo creo que deberias traerte la data ya filtrada. Bueno eso pienso yo.


La franja horaria es GMT +2. Ahora son las 13:08:54.

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