Curso de dbExpress e DataSnap

Parte XVII – Record Count e RecNo

Neste artigo veremos como usar as propriedades RecordCount e RecNo do ClienDataSet. Essas propriedades são exclusivas desse componente, sendo que possuíam capacidades limitadas quando se trabalhava com BDE. RecordCount, por exemplo, sempre retornava -1 em Queries de consultas a banco de dados quando se usa o BDE. Essa limitação não existe no ClientDataSet, pois o mesmo possui todas as informações em memória.

·         RecordCount – retorne o número atual de registros na memória do ClientDataSet, ou seja, o número de registros retornados pelo Select associado (a menos que se use Packet Records).

·         RecNo – a posição atual do cursor local de dados na memória do ClientDataSet. Por exemplo, se esse valor for “5”, estamos navegando no quinto registro do ClientDataSet.

Vejamos como isso funciona na prática. Coloque os componentes no formulário conforme mostrado na figura a seguir. Aqui colocamos um ClientDataSet, um DataSource, um DBGrid, um Button e um Label. Dê um clique de direita no ClientDataSet, escolha Load from MyBase Table e abra o arquivo Customer.XML, localizado nos demos do Delphi, por padrão no diretório C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data.


No botão simplesmente jogamos o valor de RecordCount no Caption do Label.

procedure TFrmMain.BitBtn1Click(Sender: TObject);

begin

 Label1.Caption := IntToStr(ClientDataSet1.RecordCount);

end;

Também criamos um campo calculado no ClientDataSet, como mostrado a seguir. Ele é do tipo Integer e vai indicar a posição atual do registro no resulset, se comportando como se fosse um campo normal do BD (como código, ID etc.)


No OnCalcFields atribuímos o valor do campo com base no valor do RecNo atual do ClientDataSet:

procedure TFrmMain.ClientDataSet1CalcFields(DataSet: TDataSet);

begin

 ClientDataSet1RECNO.AsInteger :=

   ClientDataSet1.RecNo;

end;


Você também pode fazer um DBGrid “zebrado” usado o RecNo, bastando verificar se o índice do registro é ímpar o par. Isso não é possível no BDE, pois sempre retorna -1. Isso pode ser feito com o seguinte código no evento OnDrawColumnCell do DBGrid:

procedure TFrmMain.DBGrid1DrawColumnCell(Sender: TObject;

 const Rect: TRect; DataCol: Integer; Column: TColumn;

 State: TGridDrawState);

begin

 (*DBGrid zebrado*)

 if not odd(ClientDataSet1.RecNo) then // se for ímpar

   if not (gdSelected in State) then // se a célula não está selecionada

   begin

     DBGrid1.Canvas.Brush.Color:= clYellow; // define uma cor de fundo

     DBGrid1.Canvas.FillRect(Rect); // pinta a célula

     DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

   end;

end;



dbExpress, DataSnap e ClientDataSet: Técnicas Avançadas

Para mais informações sobre acesso a dados no Delphi e técnicas avançadas, sugiro a leitura do meu livro, “Delphi: Programação para Banco de Dados e Web”, como apoio para o aprendizado das tecnologias. Na obra mostro várias técnicas introdutórios e avançadas de desenvolvimento com ClientDataSet, dbExpress e DataSnap (multicamadas, incluindo SOAP e COM+).

Leia todos artigos da série