Fórum Erro No Filtro Dbgrid #420318

23/07/2012

0

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.



Watson Rocha

Watson Rocha

Responder

Posts

23/07/2012

Marco Salles

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
Responder

Gostei + 0

23/07/2012

Watson Rocha

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);
Responder

Gostei + 0

23/07/2012

William

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
Responder

Gostei + 0

23/07/2012

Marco Salles

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
Responder

Gostei + 0

23/07/2012

Watson Rocha

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
Responder

Gostei + 0

23/07/2012

William

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.
Responder

Gostei + 0

23/07/2012

Watson Rocha

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 .
Responder

Gostei + 0

23/07/2012

Marco Salles

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


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
Responder

Gostei + 0

23/07/2012

Watson Rocha

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.
Responder

Gostei + 0

23/07/2012

William

Colega analise a lógica dessa primeira linha:

[code]
if Data.IsEmpty Then //Se data estiver vazio então execute código
Responder

Gostei + 0

23/07/2012

William

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 ?
Responder

Gostei + 0

23/07/2012

Watson Rocha

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

Responder

Gostei + 0

23/07/2012

William

Colega vc tem Skype? ser tiver me add willfl2.
Responder

Gostei + 0

23/07/2012

William

Veja essa implementação:

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.
Responder

Gostei + 0

24/07/2012

Watson Rocha

Willian Boa tarde !

te adicionei no Shype ,caso aconteça alguma coisa segue o meu ID do skype rocha325
Responder

Gostei + 0

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

Aceitar