PDA

Ver la Versión Completa : filtrar registros en delphi


the walrus
23-08-2018, 16:26:01
estoy trabajando en un proyecto en delphi xe6 y componentes ADO y un libro excel como base de datos. como filtrar registros desde un edit y que el resultado lo muestre en un dbgrid

Casimiro Notevi
23-08-2018, 19:12:43
¿Y cuál es el problema y la pregunta?

the walrus
23-08-2018, 22:56:16
¿Y cuál es el problema y la pregunta?

mi pregunta es esta
¿como filtrar registros desde un edit y que el resultado lo muestre en un dbgrid?

y mi problema es este cuando compilo el codigo
"argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros "

mi codigo
DataSource1.DataSet.Close;
DataSource1.DataSet.Filter:= 'nombre like' + quotedstr(Edit1.Text + '%');
DataSource1.DataSet.Open;
DataSource1.DataSet.Filtered := true;

Caminante
23-08-2018, 23:51:07
Código Delphi [-] (http://www.clubdelphi.com/foros/#)DataSource1.DataSet.Close; DataSource1.DataSet.Filter:= 'nombre like' + quotedstr(Edit1.Text + '%'); DataSource1.DataSet.Open; DataSource1.DataSet.Filtered := true;




Hola


Si va a usar la propiedad filter no es necesario cerrar el dataset (DataSet.Close) solamente asigna false a filtered antes de asignar el filtro (DataSet.Filtered := false).


Saludos

Casimiro Notevi
24-08-2018, 00:56:56
¿Faltará un espacio tras el like?
like '

the walrus
24-08-2018, 23:18:04
no funciona, utilice los dos metos

Casimiro Notevi
24-08-2018, 23:23:59
y mi problema es este cuando compilo el codigo¿Cuándo compilas?

the walrus
24-08-2018, 23:44:38
si, cuando compilo no hace la busqueda

Casimiro Notevi
24-08-2018, 23:51:30
si, cuando compilo no hace la busquedaEs que cuando compila, no ejecuta. No busca cuando compila.
Creo que estás confundido con los conceptos. Tendrás que explicarnos más claramente las cosas.

the walrus
24-08-2018, 23:59:52
Es que cuando compila, no ejecuta. No busca cuando compila.
Creo que estás confundido con los conceptos. Tendrás que explicarnos más claramente las cosas.

jajja bueno, el programa compila , cuando quiero hacer una busqueda no la realiza

ecfisa
25-08-2018, 03:39:20
Hola.
mi pregunta es esta
¿como filtrar registros desde un edit y que el resultado lo muestre en un dbgrid?

y mi problema es este cuando compilo el codigo
"argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros "

mi codigo
DataSource1.DataSet.Close;
DataSource1.DataSet.Filter:= 'nombre like' + quotedstr(Edit1.Text + '%');
DataSource1.DataSet.Open;
DataSource1.DataSet.Filtered := true;
Como te indicó Caminante, ese código no es correcto.

Del siguiente modo tendría que filtrar sin problemas:

...
var
DS: TDataSet;
begin
DS := DataSource1.DataSet;

if not DS.Active then DS.Open; (* Esta línea es innecesaria si el DataSet está activo *)

DS.Filtered := False;
DS.Filter := 'NOMBRE LIKE ' + QuotedStr(Edit1.Text + '%');
DS.Filtered := True;
end;


Saludos :)

the walrus
17-09-2018, 21:19:59
Hola.

Como te indicó Caminante, ese código no es correcto.

Del siguiente modo tendría que filtrar sin problemas:

...
var
DS: TDataSet;
begin
DS := DataSource1.DataSet;

if not DS.Active then DS.Open; (* Esta línea es innecesaria si el DataSet está activo *)

DS.Filtered := False;
DS.Filter := 'NOMBRE LIKE ' + QuotedStr(Edit1.Text + '%');
DS.Filtered := True;
end;


Saludos :)

cuando realizo una búsqueda filtra pero cuando borro el filtro me aparce este error argumento incorrecto fuera de intervalos permitido o en conflictos con otros

ecfisa
17-09-2018, 21:49:44
Hola.

Para orientarnos mejor sobre el problema, ¿ podrías poner la parte del código donde aplicas el filtro y la parte donde lo borras ?

Saludos :)

the walrus
17-09-2018, 23:02:03
Hola.

Para orientarnos mejor sobre el problema, ¿ podrías poner la parte del código donde aplicas el filtro y la parte donde lo borras ?

Saludos :)

el codigo que utilizo es el mismo publicaste y con respecto de borrar el filtro me refiero cuando realizo una busqueda en el edit1 por ejemplo busco el registro con nombre 'pepe' realiza la búsqueda pero cuando borro por completo del edit1 me aparece el error que te comente antes.

ecfisa
18-09-2018, 04:49:54
Hola.

Ahora entiendo..., podrías hacer:

...
var
DS: TDataSet;
begin
if Edit1.Text > '' then
begin
DS := DataSource1.DataSet;
DS.Filtered := False;
DS.Filter := 'NOMBRE LIKE ' + QuotedStr(Edit1.Text + '%');
DS.Filtered := True;
end; { ( opcional )
else
MessageBeep(MB_ICONERROR); }
end;


Saludos :)

the walrus
18-09-2018, 15:09:11
lo pude solucionar de esta forma

ADOQuery1.Close;
ADOQuery1.SQL.Text :='Select * FROM mitabla WHERE nombre like '+ QuotedStr(edit1.text+'%');
ADOQuery1.Open;
ADOQuery1.Filtered := true;

gracias por sus respuestas

Caminante
18-09-2018, 16:03:30
Hola


Si vas a filtrar usando SQL ya no es necesario usar la propiedad filter.


Saludos

movorack
18-09-2018, 18:04:58
Entonces validas si el edit tiene valor.


if Length(Trim(Edit.text)) > 0 then
begin
//Acá aplicas el filtro como ya te explicaron
end
else
Dataset.Filtered := False;

ecfisa
18-09-2018, 18:24:02
Hola.
lo pude solucionar de esta forma

ADOQuery1.Close;
ADOQuery1.SQL.Text :='Select * FROM mitabla WHERE nombre like '+ QuotedStr(edit1.text+'%');
ADOQuery1.Open;
ADOQuery1.Filtered := true;

gracias por sus respuestas

En ese caso sería mejor que parametrices la consulta,

ADOQuery1.Close;
ADOQuery1.SQL.Text := 'SELECT * FROM MITABLA WHERE NOMBRE LIKE :PARAM';
ADOQuery1.Parameters.ParamByName('PARAM').Value := Edit1.Text + '%';
ADOQuery1.Open;

para evitar la inyección SQL (https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL).

Saludos :)

the walrus
27-09-2018, 01:37:30
Hola.

Ahora entiendo..., podrías hacer:

...
var
DS: TDataSet;
begin
if Edit1.Text > '' then
begin
DS := DataSource1.DataSet;
DS.Filtered := False;
DS.Filter := 'NOMBRE LIKE ' + QuotedStr(Edit1.Text + '%');
DS.Filtered := True;
end; { ( opcional )
else
MessageBeep(MB_ICONERROR); }
end;


Saludos :)

tengo una duda tdataset es un adodataset

ecfisa
27-09-2018, 03:30:16
Hola.
tengo una duda tdataset es un adodataset

TDataSet es la clase base para todos los componentes de acceso a datos: TDataSet (https://www.freepascal.org/docs-html/fcl/db/tdataset.html).

Es decir que cualquiera (o todas) de las siguientes asignaciones son válidas:

...
var
DS : TDataSet;
begin
// BDE
DS := Query1;
DS := Table1;
// ADO
DS := ADOQuery1;
DS := ADOTable1;
// IBX
DS := IBQuery1;
DS := IBDataSet1;
// dbExpress
DS := SQLQuery1;
DS := SQLTable1;
...



Saludos :)

Casimiro Notevi
27-09-2018, 10:04:22
Más claro, imposible ^\||/

ElDioni
27-09-2018, 15:57:57
Hola,


en otro hilo ya se estuvo comentando como hacer consultas a los datos de una hoja excel. Puede que el filter te funcione si lo cambias y lo pones de la siguiente manera.



Adoquery1.Filtered:=false;
Adoquery1.Filter:='[Hoja1$].[Nombre] LIKE '+quotedstr(Edit1.Text+'%');
Adoquery1.Filtered:=true;




Saludos.

the walrus
28-09-2018, 01:43:31
Hola.


TDataSet es la clase base para todos los componentes de acceso a datos: TDataSet (https://www.freepascal.org/docs-html/fcl/db/tdataset.html).

Es decir que cualquiera (o todas) de las siguientes asignaciones son válidas:

...
var
DS : TDataSet;
begin
// BDE
DS := Query1;
DS := Table1;
// ADO
DS := ADOQuery1;
DS := ADOTable1;
// IBX
DS := IBQuery1;
DS := IBDataSet1;
// dbExpress
DS := SQLQuery1;
DS := SQLTable1;
...



Saludos :)
si, gracias por el concepto y el material
tengo un pequeño problema se trata de filtrar registros mi problema es el siguiente cuando escribo una letra en el edit1 por ejemplo la letra 'c' me muestra los registros con la letra c pero cuando borro la letra del edit1 la grilla no me muestra todos los registros el código que uso es este
begin
if Edit1.Text > '' then
begin
datasource.DataSet.Filtered := false;
datasource.DataSet.Filter := 'nombre like '+ QuotedStr(edit1.text+'%');
datasource.DataSet.Filtered := true;
end;


end;
en este caso estoy intentando filtrar registros de tres tablas
Más claro, imposible ^\||/
(y)
Hola,


en otro hilo ya se estuvo comentando como hacer consultas a los datos de una hoja excel. Puede que el filter te funcione si lo cambias y lo pones de la siguiente manera.



Adoquery1.Filtered:=false;
Adoquery1.Filter:='[Hoja1$].[Nombre] LIKE '+quotedstr(Edit1.Text+'%');
Adoquery1.Filtered:=true;




Saludos.
cambie de gestor de base de datos ahora uso MS ACCESS

Casimiro Notevi
28-09-2018, 09:35:31
A ver si te aclaras.

ElDioni
28-09-2018, 15:00:47
si, gracias por el concepto y el material
tengo un pequeño problema se trata de filtrar registros mi problema es el siguiente cuando escribo una letra en el edit1 por ejemplo la letra 'c' me muestra los registros con la letra c pero cuando borro la letra del edit1 la grilla no me muestra todos los registros el código que uso es este

begin
if Edit1.Text <> '' then
begin
datasource.DataSet.Filtered := false;
datasource.DataSet.Filter := 'nombre like '+ QuotedStr(edit1.text+'%');
datasource.DataSet.Filtered := true;
end;
end;

en este caso estoy intentando filtrar registros de tres tablas

(y)

cambie de gestor de base de datos ahora uso MS ACCESS


Para que te vuelva a mostrar todos los registros:





datasource.DataSet.Filtered := false;
if Edit1.Text <> '' then
begin
datasource.DataSet.Filter := 'nombre like '+ QuotedStr(edit1.text+'%');
datasource.DataSet.Filtered := true;
end;

Casimiro Notevi
28-09-2018, 17:29:48
Buena aclaración :)

the walrus
01-10-2018, 23:00:12
funciono gracias por su ayuda