Fórum Filtro com DateTimePicker não funciona! #197670

28/11/2003

0

Boa Tarde!

Estou com um problemão... estou tentando fazer uma filtragem com um DateTimePicker e o DBGrid fica vazio.
Gostaria de ao clicar na data do DTP fosse realizado o filtro por data na tabela e exibisse no dbGrid.
Já fiz N buscas no forum e não achei a solução, inclusive, estes códigos que usei foram coletados no forum.

Uso BD Access com ADOTable.

segue o código do procedimento OnClick do DateTimePicker:

procedure TfrmExpediente.dtpDataEntradaClick(Sender: TObject); begin (* este código abaixo não dá nenhum erro e tb não realiza nada *) dmExp.tblLancEntrada.Close; dmExp.tblLancEntrada.Filtered:=True; dmExp.tblLancEntrada.Filter:=´[DATA]=´+QuotedStr(DatetoStr(dtpDataEntrada.DateTime)); dmExp.tblLancEntrada.Open; (* já este ai em baixo NÃO aceita ´ParambyName´, diz que não reconhece *) { with datamodule.Query do begin Close; SQL.Clear; SQL.Add(´Select * from tblLancEntrada´); //tabela de Access SQL.Add(´Where DATA = :d´); SQL.ParambyName(´d´).Value := DateTimePicker1.DateTime; ExecSql; end; } end;


Onde estou errando já que a filtragem do evento OnShow deste form funciona perfeitamente?

Toda Ajuda será bem vinda!

Obrigado desde Já,

Douglas.


Douglas Bitencourt

Douglas Bitencourt

Responder

Posts

28/11/2003

Bampavao

with datamodule.Query do
begin
Close;
SQL.Clear;
SQL.Add(´Select * from tblLancEntrada´); //tabela de Access
SQL.Add(´Where DATA = :d´);
Parameters.ParambyName(´d´).Value := DateTimePicker1.DateTime;
Open;
end;


Responder

Gostei + 0

28/11/2003

Marcelo.c

Você deve utilizar ExecSQL apenas com comandos que não retornam dados (Insert, Delete, Update). Com Select, que retorna dados, você deve utilizar Open.


Responder

Gostei + 0

28/11/2003

Douglas Bitencourt

Caro BAMPavao, obrigado pela pronta resposta, aceitou legal o parâmetro, mas o dbgrig continua vazio!!!
E agora?
Que que eu faço!! Tô no laço!! Que embaraço!!

Se tiver alguma outra idéia...

Obrigado desde Já,

Douglas.


Responder

Gostei + 0

28/11/2003

Rafael Heise

Alguma vez já apareceu algum dado na sua DBGrid?
Verifique se o DataSource está setado Correto...
com que data você está testando?
verifique se não é porque deve ser usado o formato
mm/dd/yyyy ao invés de dd/mm/yyyy

para tal, use QuotedStr(FormatDateTime(´mm/dd/yyyy´,SuaData))


Responder

Gostei + 0

28/11/2003

Douglas Bitencourt

Zernero

tentei a sua dica, mas tb não funcionou.
o dbgrid já teve valores sim, mas quando não usei query.
eis o código que deu certo, mas somente no evento OnFilterRecord do AdoTable:

procedure TdmExp.tblLancSaidaFilterRecord(DataSet: TDataSet; var Accept: Boolean); var Dia, Mes, Ano: word; Hoje : TDateTime; begin Hoje := Date; Accept := false; DecodeDate(Date,Ano,Mes,Dia); if DMExp.tblLancSaida[´DATA´] = Hoje then Accept := True; end;


tentei também este código para o evento change e click do DateTimePicker:

procedure TfrmExpediente.dtpDataEntradaClick(Sender: TObject); begin dmExp.tblLancEntrada.Close; dmExp.tblLancEntrada.Filtered:=True; dmExp.tblLancEntrada.Filter:=´[DATA]=´+DatetoStr(dtpDataEntrada.Date); dmExp.tblLancEntrada.Open; end;


Quando uso AdoTable só funciona no evento OnFilterRecord do AdoTable.
E o OnClick do DTP não.

Agora o código que usei no evento OnFilterRecord do AdoQuery:

procedure TdmExp.QEntFilterRecord(DataSet: TDataSet; var Accept: Boolean); var Dia, Mes, Ano: word; Hoje : TDateTime; begin Hoje := Date; Accept := false; DecodeDate(Date,Ano,Mes,Dia); if DMExp.QEnt[´DATA´] = (FormatDateTime(´mm/dd/yyyy´,Hoje)) then Accept := True; end;


... e no evento OnChange do DTP...

procedure TfrmExpediente.dtpDataEntradaChange(Sender: TObject); begin with dmExp.QEnt do begin Close; SQL.Clear; SQL.Add(´Select * from LancEntrada´); SQL.Add(´Where DATA =:DATA´); Parameters.ParambyName(´DATA´).Value := dtpDataEntrada.Date; Open; end; dbDataEntrada.SetFocus; end;


Onde será que está o Wally??
Isso tá tirando meu sono mano...

Obrigado desde Já

Douglas


Responder

Gostei + 0

29/11/2003

Rafael Heise

Eu olhei e talvez possa ser isso...
verifique se na sua tabela, tem dados com a data passada pelo TDateTimePicker.
Talvez, ele não esteja retornando a data correta, e não está trazendo registro nenhum no TADOQuery.Verifique a data que o datetimepicker está trazendo. Vá debugando seu código. Veja se está entrando no OnClick ou no OnChange do DataTimePicker. Experimente abrir a query comente com SELECT * FROM TABELA e veja se os registros aparecem. Faça alguns testes desse tipo e tente ver o que realmente pode estar acontecendo. Veja se a query está conseguindo abrir, essas coisas.
blz?
mas assim pelo código que você passou, aparenta não ter erros. Mas posso estar enganado também
valeu!


Responder

Gostei + 0

29/11/2003

Douglas Bitencourt

Está funcionando agora! UFA!!!
como diz um companheiro aki do forum que não me lembro o nome:
´Parece dificil mas não é fácil não´

O problema era que ao clicar no DTP executava o código e também o que estava no evento OnFilterRecord da tabela.
Ou seja, executava 3 vs o filtro. A primeira ao abrir o form, a segunda no change do DTP e a terceira pelo fato de filtrar com o DTP ativar a tabela e o evento OnFilterRecord novamente, zerando o dbgrid.
A solução foi implementar no onShow do form o código e remover do OnFilterRecord. Desta forma roda belezinha.

Gostaria de agradecer a todos pelo apoio, pois, suas idéias me fizeram chegar a solução.

Segue o código que funcionou...

(* código que executa o FILTRO no evento OnShow do Form. Neste caso, filtra pela data atual. Para filtrar por outras datas implementar de acordo com a necessidade. *) procedure Formulario.FormShow(Sender: TObject); var ... begin DateTimePiker.Date := Date; //DTP recebe data do sistema(data atual) with TABELA do begin Filter:=´[CAMPODATA]=´ + DatetoStr(DateTimePicker.Date); Filtered := true; end;


(* Código associado ao evento OnChange do DateTimePicker. Quando selecionar a data o filtro é executado e o resultado aparece no dbgrid associado a tabela. Escolhi um dbgrid por atender as minhas necessidades, mas pode ser qualquer outro componente de saída. *) procedure Formulario.DateTimePickerChange(Sender: TObject); begin with TABELA do begin Filter:=´[CAMPODATA]=´ + DatetoStr(DateTimePicker.Date); Filtered := true; end;


[b:4c92b0a776]
Estes códigos não funcionam desta maneira com QUERY, e sim com TABLE.
[/b:4c92b0a776]

Mais uma vez obrigado,

Douglas.


Responder

Gostei + 0

24/02/2015

Carlos Filho

experimenta assim que da certo , sempre faço assiim , utilizo a classe Midas.

Dm.tbvenda.Filter:='Data_Venda >='+QuotedStr(datetostr(datainicial.date))+' and Data_Venda <='+QuotedStr(datetostr(datafinal.date));
dm.tbvenda.Filtered:=true;
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar