Erro No Filtro Dbgrid
Pessoal Bom dia !
Estou com problema ao filtrar dados em meu Dbgrid depois que coloquei esse comando abaixo em meu Dbgrid,todo filtro que faço que possue no dbgrid me retorna erro.
Ex : Quando Filtro todo nome que começa com JOSE ele me retorna dados e quandi for filtrar todo nome Marcos se ele não encontrar ele me da erro (is not as Valid date and Time)
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_ASO).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_INTEG).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if CLIENTDATASET1.FieldByName(STATUS).Value = BLOQUEADO then
DBGrid1.Canvas.Font.Color := clRed;
if CLIENTDATASET1.FieldByName(STATUS).Value = DESBLOQUEADO then
DBGrid1.Canvas.Font.Color := clblack;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
end;
end;
end;
end;
E para executar o filtro eu uso esse comando abaixo.
procedure TForm4.RzEdit1Change(Sender: TObject);
begin
clientdataset1.Filtered := False;
clientdataset1.filter := EMPRESA LIKE +
QuotedStr(RZEDIT1.Text+%);
clientdataset1.Filtered := true;
end;
procedure TForm4.RzEdit2Change(Sender: TObject);
begin
clientdataset1.Filtered := False;
clientdataset1.filter := NOME LIKE +
QuotedStr(RZEDIT2.Text+%);
clientdataset1.Filtered := true;
end;
end.
Estou com problema ao filtrar dados em meu Dbgrid depois que coloquei esse comando abaixo em meu Dbgrid,todo filtro que faço que possue no dbgrid me retorna erro.
Ex : Quando Filtro todo nome que começa com JOSE ele me retorna dados e quandi for filtrar todo nome Marcos se ele não encontrar ele me da erro (is not as Valid date and Time)
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_ASO).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_INTEG).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if CLIENTDATASET1.FieldByName(STATUS).Value = BLOQUEADO then
DBGrid1.Canvas.Font.Color := clRed;
if CLIENTDATASET1.FieldByName(STATUS).Value = DESBLOQUEADO then
DBGrid1.Canvas.Font.Color := clblack;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
end;
end;
end;
end;
E para executar o filtro eu uso esse comando abaixo.
procedure TForm4.RzEdit1Change(Sender: TObject);
begin
clientdataset1.Filtered := False;
clientdataset1.filter := EMPRESA LIKE +
QuotedStr(RZEDIT1.Text+%);
clientdataset1.Filtered := true;
end;
procedure TForm4.RzEdit2Change(Sender: TObject);
begin
clientdataset1.Filtered := False;
clientdataset1.filter := NOME LIKE +
QuotedStr(RZEDIT2.Text+%);
clientdataset1.Filtered := true;
end;
end.
Watson Rocha
Curtidas 0
Respostas
Marco Salles
23/07/2012
No evento , teste se o Cds Retornou algum dado , (Filtro <> vazio) , execute o método somente se tiver dados
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
if TDBGrid(sender).DataSource.DataSet.IsEmpty then
exit
seu codigo
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
if TDBGrid(sender).DataSource.DataSet.IsEmpty then
exit
seu codigo
GOSTEI 0
Watson Rocha
23/07/2012
Marcos Bom dia !
Sim , se na DBGRID ele tiver registro de nomes com a letra A por exemplo ele retorna dados legalzinho, agora se na DBGRID nao tiver nome que começa com a letra A por exemplo ela me retorna erro is not as Valid date and time )
Referente ao comando que você passou , me desculpe a ousadia é que não sei mesmo, mas seria mais ou menos como está abaixo.
begin
if Dbgrid1(sender).DataSource.DataSet.IsEmpty Then
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
Sim , se na DBGRID ele tiver registro de nomes com a letra A por exemplo ele retorna dados legalzinho, agora se na DBGRID nao tiver nome que começa com a letra A por exemplo ela me retorna erro is not as Valid date and time )
Referente ao comando que você passou , me desculpe a ousadia é que não sei mesmo, mas seria mais ou menos como está abaixo.
begin
if Dbgrid1(sender).DataSource.DataSet.IsEmpty Then
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
GOSTEI 0
William
23/07/2012
Caro colega, o Marcos passou um comando para verificar a quantidade de registros que foram retornados após o filtro:
Se CDS.Vazio entao
exit;
Senao
Executa seu código;
Fimse
Se CDS.Vazio entao
exit;
Senao
Executa seu código;
Fimse
GOSTEI 0
Marco Salles
23/07/2012
A idéia é como o amigo wllfl passou em seu ultim post
Porém acredito que a usa contestação é referengte a sintaxi do Delphi
Vc disse
if Dbgrid1(sender).DataSource.DataSet.IsEmpty Then
Olha so DbGrid1 Não uem classe e sim um Objeto
Vc deve aplicar o Typcast em um classe
TDbgrid(sender).DataSource.DataSet.IsEmpty
e por falar nisso vc pode utilizar todo o seu código utilizando esta conversão ao Invez dos nomes
DataSource1 , DBGrid1 etc...
claro que para não repetir esta código ao longo do método vc pode utilizar o Operador WITH
que para códigos longos e complicados deve ser evitado ou utilizar um ponteiro
var
Data:TDataSet;
begin
Data:=TDbgrid(sender).DataSource.DataSet;
if Data.IsEmpty then ... e por ai Vai
Leia com atenção o que o colega wllfl postou e também o que comentei anteriormente . Duvidas questione
[]sds
Porém acredito que a usa contestação é referengte a sintaxi do Delphi
Vc disse
if Dbgrid1(sender).DataSource.DataSet.IsEmpty Then
Olha so DbGrid1 Não uem classe e sim um Objeto
Vc deve aplicar o Typcast em um classe
TDbgrid(sender).DataSource.DataSet.IsEmpty
e por falar nisso vc pode utilizar todo o seu código utilizando esta conversão ao Invez dos nomes
DataSource1 , DBGrid1 etc...
claro que para não repetir esta código ao longo do método vc pode utilizar o Operador WITH
que para códigos longos e complicados deve ser evitado ou utilizar um ponteiro
var
Data:TDataSet;
begin
Data:=TDbgrid(sender).DataSource.DataSet;
if Data.IsEmpty then ... e por ai Vai
Leia com atenção o que o colega wllfl postou e também o que comentei anteriormente . Duvidas questione
[]sds
GOSTEI 0
Watson Rocha
23/07/2012
Marcos acabei de fazer esse esquema , que você me passou ainda continua dando erro is not Valid as date and time na consulta do filtro do edit
Abraço
Abraço
GOSTEI 0
William
23/07/2012
Colega debuga a aplicação e acompanhe os valores quando entrar nesse evento do DBGrid, caso entre na condição então verifique se está retornando os valores corretos, o formato da data que está no banco etc.
GOSTEI 0
Watson Rocha
23/07/2012
Tem alguma outra forma de fazer pesquisa no dbgrid, que não gere esse erro ,sem ser essa que eu uso ?
Pois fiz o formato do banco é a mesma do edit .
Pois fiz o formato do banco é a mesma do edit .
GOSTEI 0
Marco Salles
23/07/2012
Caro colega, o Marcos passou um comando para verificar a quantidade de registros que foram retornados após o filtro:
Se CDS.Vazio entao
exit;
Senao
Executa seu código;
Fimse
Se CDS.Vazio entao
exit;
Senao
Executa seu código;
Fimse
Vc disse :
Marcos acabei de fazer esse esquema , que você me passou ainda continua dando erro is not Valid as date and time na consulta do filtro do edit
Abraço
Acho que vc não fez .. Pois caso tenha feito ele ira sair pelo exit
GOSTEI 0
Watson Rocha
23/07/2012
veja o erro !
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Data: TDataset;
begin
Data:=Dbgrid1.DataSource.DataSet;
if Data.IsEmpty Then
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then <<---nessa parte ela da erro!
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_ASO).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_INTEG).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if CLIENTDATASET1.FieldByName(STATUS).Value = BLOQUEADO then
DBGrid1.Canvas.Font.Color := clRed;
if CLIENTDATASET1.FieldByName(STATUS).Value = DESBLOQUEADO then
DBGrid1.Canvas.Font.Color := clblack;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
end;
end;
end;
end;
end.
procedure TForm4.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Data: TDataset;
begin
Data:=Dbgrid1.DataSource.DataSet;
if Data.IsEmpty Then
if DataSource1.DataSet.FieldByName(VAL_CNH).AsDateTime < date Then <<---nessa parte ela da erro!
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_ASO).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if DataSource1.DataSet.FieldByName(VAL_INTEG).AsDateTime < date Then
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
begin
if CLIENTDATASET1.FieldByName(STATUS).Value = BLOQUEADO then
DBGrid1.Canvas.Font.Color := clRed;
if CLIENTDATASET1.FieldByName(STATUS).Value = DESBLOQUEADO then
DBGrid1.Canvas.Font.Color := clblack;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, DBGrid1.columns[datacol].field, State);
end;
end;
end;
end;
end.
GOSTEI 0
William
23/07/2012
Colega analise a lógica dessa primeira linha:
[code]
if Data.IsEmpty Then //Se data estiver vazio então execute código
[code]
if Data.IsEmpty Then //Se data estiver vazio então execute código
GOSTEI 0
William
23/07/2012
Desculpe faltava terminar, nessa condição vc manda executar seu código se o DataSet estiver vazio, acho que é ao contrário só executa o código se retornar dados, certo ?
GOSTEI 0
Watson Rocha
23/07/2012
Cara infelizmente nada mesmo ,quando eu executo ele funciona no edit digito a primeira letra ex C no dbgrid ele me retorna todas as pessoas que possuem que começam com C mas se eu colocar em seguida uma outra letra ex CR se não tiver na DBGRID ela me dá erro is not as Valid date and time
GOSTEI 0
William
23/07/2012
Colega vc tem Skype? ser tiver me add willfl2.
GOSTEI 0
William
23/07/2012
Veja essa implementação:
O código só será executado se o ClientDataSet NÃO estiver vázio, caso contrário ele não entra na instrução então não tem erro.
procedure TForm1.grd1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if not ClientDataSet.IsEmpty Then
begin
if dts1.DataSet.FieldByName(DATA_CADASTRO).AsDateTime < date Then
begin
grd1.Canvas.Font.Color := clRed;
grd1.DefaultDrawDataCell(Rect, grd1.columns[datacol].field, State);
end;
end;
end;
O código só será executado se o ClientDataSet NÃO estiver vázio, caso contrário ele não entra na instrução então não tem erro.
GOSTEI 0
Watson Rocha
23/07/2012
Willian Boa tarde !
te adicionei no Shype ,caso aconteça alguma coisa segue o meu ID do skype rocha325
te adicionei no Shype ,caso aconteça alguma coisa segue o meu ID do skype rocha325
GOSTEI 0
Watson Rocha
23/07/2012
William Bom dia !
Fiz a alteração no dbgrid como vc me explicou !
RESOLVIDO
Fiz a alteração no dbgrid como vc me explicou !
RESOLVIDO
GOSTEI 0
Watson Rocha
23/07/2012
RESOLVIDO
GOSTEI 0