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
- Curso de dbExpress e DataSnap
- Curso de dbExpress e DataSnap - Parte II
- Curso de dbExpress e DataSnap - Parte III
- Curso de dbExpress e DataSnap - Parte IV
- Curso de dbExpress e DataSnap - Parte V
- Curso de dbExpress e DataSnap - Parte VI
- Curso de dbExpress e DataSnap - Parte VII
- Curso de dbExpress e DataSnap - Parte VIII
- Curso de dbExpress e DataSnap - Parte IX
- Curso de dbExpress e DataSnap - Parte X
- Curso de dbExpress e DataSnap - Parte XI
- Curso de dbExpress e DataSnap - Parte XII
- Curso de dbExpress e DataSnap - Parte XIII
- Curso de dbExpress e DataSnap - Parte XIV
- Curso de dbExpress e DataSnap - Parte XV
- Curso de dbExpress e DataSnap - Parte XVI
- Curso de dbExpress e DataSnap - Parte XVII
- Curso de dbExpress e DataSnap - Parte XVIII
- Curso de dbExpress e DataSnap - Parte XIX
- Curso de dbExpress e DataSnap - Parte XX
- Curso de dbExpress e DataSnap - Parte XXI
- Curso de dbExpress e DataSnap - Parte XXII
- Curso de dbExpress e DataSnap - Parte XXIII
- Curso de dbExpress e DataSnap - Parte XXIV
- Curso de dbExpress e DataSnap - Parte XXV
- Curso de dbExpress e DataSnap - Parte XXVI
- Curso de dbExpress e DataSnap - Parte XXVII
- Curso de dbExpress e DataSnap - Parte XXVIII
- Curso de dbExpress e DataSnap - Parte XXIX
- Curso de dbExpress e DataSnap - Parte XXX