Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   No puedo filtrar por dos campos (https://www.clubdelphi.com/foros/showthread.php?t=59847)

bLiNdEN 10-09-2008 20:51:47

No puedo filtrar por dos campos
 
Hola muy buenas tardes tengan ustedes...

Estoy haciendo una base de datos donde tengo que filtrar dos campos a la vez pero no puedo :( y quisisera saber como hacerles, miren, esto es lo que estoy haciendo:

procedure TForm1.Edit1Change(Sender: TObject);
begin

// filtrar o localizar
if (not cbFiltrar.Checked) then begin
// Busqueda incremental
ClientDataSet1.Locate('Campo4', Edit1.Text, [loCaseInsensitive, loPartialKey]);

Exit;
end
else begin

// esto sería para filtrar
if (Edit1.Text = '') then
begin
ClientDataSet1.Filtered := false;
ClientDataSet1.Filter := '';
end
else begin
ClientDataset1.Open;
ClientDataSet1.Filter := '(Campo4 =' +QuotedStr(Edit1.Text) +') and (Campo5 = '+QuotedStr(Edit2.Text)+ ')';

ClientDataSet1.Filtered := True;


end;
end;
end;

y pues nomas no lo filtra.... por favor quien me pueda ayudar se lo agradeceria bastante.

bLiNdEN 10-09-2008 20:54:12

jejeje otra preguntota despues de filtrar como le hago para eliminar los otros datos que no coinciden???

gracias

felipe88 10-09-2008 21:03:47

Hola,
Bienvenido al Club Delphi, primero que todo siempre aconsejamos a los nuevos usuarios a que revisen la Guia de estilo y que además usen la Búsqueda de los foros

felipe88 10-09-2008 21:07:22

Usar las etiquetas [ delphi ][ /delphi ] sin los espacios...
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
// filtrar o localizar
if (not cbFiltrar.Checked) then begin
// Busqueda incremental
  ClientDataSet1.Locate('Campo4', Edit1.Text, [loCaseInsensitive, loPartialKey]);
Exit;
end
else begin
// esto sería para filtrar
  if (Edit1.Text = '') then 
    begin
      ClientDataSet1.Filtered := false;
      ClientDataSet1.Filter := '';
   end
else 
  begin
    ClientDataset1.Open;
    ClientDataSet1.Filter := '(Campo4 =' +QuotedStr(Edit1.Text) +') and (Campo5 = '+QuotedStr(Edit2.Text)+ ')';
    ClientDataSet1.Filtered := True;
  end;
end;
end;
Ahora... ¿seguro que le estas pasando bien el filtro? :rolleyes:

bLiNdEN 10-09-2008 22:43:12

sip.... puedo filtrar solo lo de el edit1 pero lo del edit2 nomas no lo hace... y revise todos los posts que hay y ninguno me ha funcionado:(....como le puedo hacer...eske hagan de cuenta que filtra el primer edit pero el segundo no lo filtra de la misma tabla

egostar 10-09-2008 22:46:45

Cita:

Empezado por bLiNdEN (Mensaje 313290)
sip.... puedo filtrar solo lo de el edit1 pero lo del edit2 nomas no lo hace... y revise todos los posts que hay y ninguno me ha funcionado:(....como le puedo hacer...eske hagan de cuenta que filtra el primer edit pero el segundo no lo filtra de la misma tabla

Hola

A que te refieres con que filtra el primero edit y el segundo no, por lo que veo solo que un registro tenga los dos valores te lo va a mostrar, no uno u otro

Salud OS

bLiNdEN 10-09-2008 22:50:13

Hao!

mira eske por ejemplo si pongo solo:

ClientDataSet1.Filter := ('Campo4 =' + QuotedStr(Edit1.Text) );

me muestra lo que voy filtrando del edit pero no se como hacerle para que agarre el filtro del segundo edit ya le trate de mil maneras y naaaa pero aunque lo deje como está arriba hace lo mismo me filtra solo lo del primer edit

egostar 10-09-2008 22:57:57

Cita:

Empezado por bLiNdEN (Mensaje 313296)
Hao!

mira eske por ejemplo si pongo solo:

ClientDataSet1.Filter := ('Campo4 =' + QuotedStr(Edit1.Text) );

me muestra lo que voy filtrando del edit pero no se como hacerle para que agarre el filtro del segundo edit ya le trate de mil maneras y naaaa pero aunque lo deje como está arriba hace lo mismo me filtra solo lo del primer edit

Sabes que seria bueno, que nos mostraras los datos de varios registros y nos digas que valores quieres filtrar.

Salud OS

bLiNdEN 10-09-2008 23:02:00

ok mira:

tengo varios campos que se llaman: campo2,campo3,campo4,campo5 respectivamente y lo que quiero hacer es filtrar lo que viene en el campo4 para despues aplicar otro filtro para campo5 pero que sin se quite el filtro de campo4.....por ejemplo:

aplico filtro a campo4 (filtro Edit1 funciona correctamente)

selecciona: Ing. Industrial

aplico filtro a campo5 (filtro Edit2 ??)

seleccion: Quimica I

por lo que quedaria en la tabla Ing. Indutrial Quimica blabalbal


no se si me de a entender gracias

egostar 10-09-2008 23:09:10

Cita:

Empezado por bLiNdEN (Mensaje 313301)
ok mira:

tengo varios campos que se llaman: campo2,campo3,campo4,campo5 respectivamente y lo que quiero hacer es filtrar lo que viene en el campo4 para despues aplicar otro filtro para campo5 pero que sin se quite el filtro de campo4.....por ejemplo:

aplico filtro a campo4 (filtro Edit1 funciona correctamente)

selecciona: Ing. Industrial

aplico filtro a campo5 (filtro Edit2 ??)

seleccion: Quimica I

por lo que quedaria en la tabla Ing. Indutrial Quimica blabalbal


no se si me de a entender gracias

Ok, ya esta mejor. :)

Lo que tu necesitas es un ordenamiento por el campo4 y despues por el campo5, pero eso no lo vas a poder hacer con una Tabla, que me imagino estas usando, para esos menesteres necesitas una sentencia SQL mas o menos de esta forma

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text := 'select * from TABLA '+
                   ' where CAMPO4 = '+QuotedStr(Edit1.Text)+
                   ' order by CAMPO4,CAMPO5';
Query1.Open;

A ver si así obtienes lo que necesitas.

Salud OS

bLiNdEN 11-09-2008 02:19:10

Una molestia del tamaño del mundo no me podrias explicar paso por paso??

eske soy novato en bases de datos, mira:

estoy jalando el archivo a una DBgrid desde microsoft access y de ahi empieza el show asi es...eske la vvd no se a que te refieres con tabla


muchas gracias y perdon por la molestia

egostar 12-09-2008 17:01:32

Cita:

Empezado por bLiNdEN (Mensaje 313365)
Una molestia del tamaño del mundo no me podrias explicar paso por paso??

eske soy novato en bases de datos, mira:

estoy jalando el archivo a una DBgrid desde microsoft access y de ahi empieza el show asi es...eske la vvd no se a que te refieres con tabla


muchas gracias y perdon por la molestia

Puedes detellarnos que componentes estas usando para conectar a tu base access?

Salud OS

bLiNdEN 12-09-2008 22:08:12

TADOQuery=ADOQ(nombre)
TDataSetProvider=DSProvider(nombre)
TClientDataSet=ClientDataSet1(nombre)
TDataSource=DataSource1(nombre)

ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Edit1: TEdit;
Label2: TLabel;
StatusBar1: TStatusBar;
ADOQ: TADOQuery;
DSProvider: TDataSetProvider;
lblData: TLabel;
cbFiltrar: TCheckBox;


parte del codigo:

[/delphi]

procedure TForm1.Edit1Change(Sender: TObject);
begin

// filtrar o localizar
if (not cbFiltrar.Checked) then begin
// Busqueda incremental
ClientDataSet1.Locate('Campo4', Edit1.Text, [loCaseInsensitive, loPartialKey]);
Exit;
end
else begin

// esto sería para filtrar
if (Edit1.Text = '') then
begin
ClientDataSet1.Filtered := false;
ClientDataSet1.Filter := '';
end
else begin
ClientDataset1.Open;
ClientDataSet1.Filter := ('Campo4 =' + QuotedStr(Edit1.Text) );
ClientDataSet1.Filtered := True;


end;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var
path:string;
begin

Path := ExtractFilePath(Application.ExeName) + 'Data11.xml';

// Existe el XML?
if FileExists(path) then begin
ClientDataSet1.LoadFromFile(path);
lbldata.Caption := ExtractFileName(path);
Exit;
end;

// Probar con el MDB
Path := ExtractFilePath(Application.ExeName) + 'Data.MDB';
// Existe el MDB?
if FileExists(path) then begin
ClientDataSet1.ProviderName := 'DSProvider';
ADOQ.Open;
ClientDataSet1.Active := True;
ADOQ.Close;
ClientDataSet1.ProviderName := '';
lbldata.Caption := ExtractFileName(path);
Exit;
end;

// Si llega aqui es que no existe ninguno de los dos.
MessageDlg('No se ha encontrado ninguna fuente de datos; Data.XML o Data.MDB', mtWarning, [mbOK], 0);


end;


muchisimas gracias..:)

bLiNdEN 17-09-2008 20:26:27

alguien que me pueda ayudar????:( ya lo intente de muchisimas formas y nadae perdon por la molestia pero la verdad no se mucho de bases de datos es la primera vez que hago una

gracias

RebeccaGL 16-10-2008 16:19:03

La condición esta mal. Ponle >= y <=

Código Delphi [-]
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
// filtrar o localizar
if (not cbFiltrar.Checked) then begin
// Busqueda incremental
  ClientDataSet1.Locate('Campo4', Edit1.Text, [loCaseInsensitive, loPartialKey]);
Exit;
end
else begin
// esto sería para filtrar
  if (Edit1.Text = '') then 
    begin
      ClientDataSet1.Filtered := false;
      ClientDataSet1.Filter := '';
   end
else 
  begin
    try
      ClientDataset1.Open;
      ClientDataSet1.Filter := '(Campo4 >=' +QuotedStr(Edit1.Text) +') and (Campo5 <= '+QuotedStr(Edit2.Text)+ ')';
      ClientDataSet1.Filtered := True;
    except
      ClientDataSet1.Filtered := false;
      ClientDataSet1.Filter := '';
    end;
  end;
end;
end;

Te Explico si es (igual Edit1.text) no podra ser (igual a edit2.text)
Asi es que lo que tienes que hacer es, poner entre rangos osea:

de 1 a 100 solo quiero de 10 a 20 seria asi

if (>= 10) and (<= 20) then ...

Lo mismo con los flitros.

Saludos


La franja horaria es GMT +2. Ahora son las 20:09:48.

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