Linha com cor dirente no DBGRID

Delphi

16/08/2005

Tenho um código que indentifica quantos dias de atraso uma determinada nota tem..


var
a:real;
begin
  a:= date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime;
  if a > 0 then
  BD_CONT_RECGS_COR_DATRASO.Value := date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime;
end;





sendo que o campo ´ BD_CONT_RECGS_COR_DATRASO ´ é um campo tempórário só exite quando o form é ativado somente para receber os valores referentes aos atrasos...

a pergunta... exite uma forma de colorir em amarelo os atrasados até 30 dias e os que tiverem um valor acima de 30 dias ficer em vermelho ?


Valew...t+


Gigatel

Gigatel

Curtidas 0

Respostas

Massuda

Massuda

16/08/2005

O código para isso é algo assim...
procedure TSeuForm.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState); 
var 
  Grid: TDBGrid;
  Atraso: Integer;
begin 
  Grid := Sender as TDBGrid;

  // ajusta as cores
  Atraso := ...calcule o total de dias em atraso...;
  if Atraso > 0 then begin
    if Atraso <= 30 then begin
      Grid.Canvas.Font.Color :=clBlack; 
      Grid.Canvas.Brush.Color :=clYellow; 
    end
    else begin
      Grid.Canvas.Font.Color :=clYellow; 
      Grid.Canvas.Brush.Color :=clRed; 
    end;    
  end; 

  // usa a rotina padrão de desenho
  Grid.DefaultDrawDataCell(rect,Column.Field,State); 
end;



GOSTEI 0
Gigatel

Gigatel

16/08/2005

O código para isso é algo assim...
procedure TSeuForm.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState); 
var 
  Grid: TDBGrid;
  Atraso: Integer;
begin 
  Grid := Sender as TDBGrid;

  // ajusta as cores
  Atraso := ...calcule o total de dias em atraso...;
  if Atraso > 0 then begin
    if Atraso <= 30 then begin
      Grid.Canvas.Font.Color :=clBlack; 
      Grid.Canvas.Brush.Color :=clYellow; 
    end
    else begin
      Grid.Canvas.Font.Color :=clYellow; 
      Grid.Canvas.Brush.Color :=clRed; 
    end;    
  end; 

  // usa a rotina padrão de desenho
  Grid.DefaultDrawDataCell(rect,Column.Field,State); 
end;




o que entraria aki ?


 // ajusta as cores 
  Atraso := ...calcule o total de dias em atraso...; 





GOSTEI 0
Massuda

Massuda

16/08/2005

o que entraria aki ?
Sua rotina que calcula o total de dias em atraso. Imagino que BD_CONT_RECGS_COR_DATA_VENC seja a data de vencimento no dataset (TTable, TQuery, etc) ligado ao DBGrid através do datasource.


GOSTEI 0
Gigatel

Gigatel

16/08/2005

[quote:ab32b45693=´Gigatel´]o que entraria aki ?
Sua rotina que calcula o total de dias em atraso. Imagino que BD_CONT_RECGS_COR_DATA_VENC seja a data de vencimento no dataset (TTable, TQuery, etc) ligado ao DBGrid através do datasource.[/quote:ab32b45693]


procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet);
var
a:real;
begin
  a:= date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime;
  if a > 0 then
  BD_CONT_RECGS_COR_DATRASO.Value := date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime;
end;




Tá dando erro...este campo

.....BD_CONT_RECGS_COR_DATA_VENC.... e do tipo Varchar e aí fiz o seguinte..


var
  Grid: TDBGrid;
  Atraso: Integer;
begin
  Grid := Sender as TDBGrid;

  // ajusta as cores
  Atraso := StrToInt(BD_CONT_RECGS_COR_DATA_VENC.value);
  if Atraso > 0 then begin
    if Atraso <= 30 then begin
      Grid.Canvas.Font.Color :=clBlack;
      Grid.Canvas.Brush.Color :=clYellow;
    end
    else begin
      Grid.Canvas.Font.Color :=clYellow;
      Grid.Canvas.Brush.Color :=clRed;
    end;
  end;



más dá o seguinte erro....

ECOVERTE ERROR ...21/08/2005 não é um valor inteiro válido...será que tem algo a ver com conversão......


GOSTEI 0
Massuda

Massuda

16/08/2005

Tá dando erro...
Bom... você não tinha avisado que tinha um campo calculado com o total de dias em atraso e eu não tinha reparado isso.

Como você tem esse campo com os dias em atraso, o código fica mais simples...
procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet); 
var 
  Atraso: Double; 
begin 
  Atraso:= Date - BD_CONT_RECGS_COR_DATA_VENC.AsDate; 
  if Atraso > 0 then 
    BD_CONT_RECGS_COR_DATRASO.AsDouble := Atraso; 
  else
    BD_CONT_RECGS_COR_DATRASO.AsDouble := 0; 
end; 

...
var
  Grid: TDBGrid;
  Atraso: Integer;
begin
  Grid := Sender as TDBGrid;

  // ajusta as cores
  Atraso := BD_CONT_RECGS_COR_DATA_VENC.AsInteger;
  if Atraso > 0 then begin
    if Atraso <= 30 then begin
      Grid.Canvas.Font.Color :=clBlack;
      Grid.Canvas.Brush.Color :=clYellow;
    end
    else begin
      Grid.Canvas.Font.Color :=clYellow;
      Grid.Canvas.Brush.Color :=clRed;
    end;
  end;
...



GOSTEI 0
Gigatel

Gigatel

16/08/2005

[quote:a991ef2e25=´Gigatel´]Tá dando erro...
Bom... você não tinha avisado que tinha um campo calculado com o total de dias em atraso e eu não tinha reparado isso.

Como você tem esse campo com os dias em atraso, o código fica mais simples...
procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet); 
var 
  Atraso: Double; 
begin 
  Atraso:= Date - BD_CONT_RECGS_COR_DATA_VENC.AsDate; 
  if Atraso > 0 then 
    BD_CONT_RECGS_COR_DATRASO.AsDouble := Atraso; 
  else
    BD_CONT_RECGS_COR_DATRASO.AsDouble := 0; 
end; 

...
var
  Grid: TDBGrid;
  Atraso: Integer;
begin
  Grid := Sender as TDBGrid;

  // ajusta as cores
  Atraso := BD_CONT_RECGS_COR_DATA_VENC.AsInteger;
  if Atraso > 0 then begin
    if Atraso <= 30 then begin
      Grid.Canvas.Font.Color :=clBlack;
      Grid.Canvas.Brush.Color :=clYellow;
    end
    else begin
      Grid.Canvas.Font.Color :=clYellow;
      Grid.Canvas.Brush.Color :=clRed;
    end;
  end;
...
[/quote:a991ef2e25]


quando copila..

[Error] Unit18.pas(868): Undeclared identifier: ´AsDate´

......

[Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´..

será que tenho que declarar alguma coisa ?


GOSTEI 0
Massuda

Massuda

16/08/2005

quando copila.. [Error] Unit18.pas(868): Undeclared identifier: ´AsDate´ [Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´
Desculpe... engano meu. Troque o AsDate por AsDateTime e o AsDouble por AsFloat.


GOSTEI 0
Gigatel

Gigatel

16/08/2005

[quote:774bc9c86d=´Gigatel´]quando copila.. [Error] Unit18.pas(868): Undeclared identifier: ´AsDate´ [Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´
Desculpe... engano meu. Troque o AsDate por AsDateTime e o AsDouble por AsFloat.[/quote:774bc9c86d]

Agora funcionol...

más Dá erro ... 28/08/2005 não é um valor inteiro....os campos que tenho..o calculado é INTEGER....O que recebe a data é VCHAR....

BD_CONT_RECGS_COR_DATA_VENC é um campo VChar
BD_CONT_RECGS_COR_DATRASO é um campo Integer..

Tá brabo,....


GOSTEI 0
Gigatel

Gigatel

16/08/2005

Deu certo só que tive que mudar o código..


procedure T_FormCRReceb.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if BD_CONT_REC.FieldByName (´GS_COR_DATRASO´).Value > 0 then
  begin
    if BD_CONT_REC.FieldByName (´GS_COR_DATRASO´).Value <= 30 then begin
      DbGrid1.Canvas.Font.Color :=clBlack;
      DbGrid1.Canvas.Brush.Color :=clYellow;
    end 
    else begin 
      DbGrid1.Canvas.Font.Color :=clYellow;
      DbGrid1.Canvas.Brush.Color :=clRed;
    end; 
//    DbGrid1.Canvas.Font.Color := clRed;
    //DbGrid1.Canvas.Font.Style := [fsBold];
  end;
  dbGrid1.DefaultDrawDataCell(rect,Column.Field,State);
end;
end.



Deu Certo é ficou muito bom o efeito...Vlw..Muito Obrigado..


GOSTEI 0
POSTAR