
Introdução
A propriedade RecordCount retorna o número de registros existentes em um RecordSet. No entanto, a implementação dessa propriedade foi otimizada para obter a melhor performance possível, e por isso o valor retornado por esta propriedade nem sempre está correto. Em realidade, o valor da propriedade RecordCount imediatamente após a abertura de um RecordSet, é sempre 0 (Zero) ou 1 (Um).
Conceito
Ao abrir um RecordSet, se não houverem registros, o valor de RecordCount é 0 (Zero), enquanto se houverem registros, não importando a quantidade, o valor de RecordCount é 1 (Um).
Conforme os registros do RecordSet são percorridos, a propriedade RecordCount vai sendo atualizada gradualmente, e somente quando atingimos o último registro do RecordSet teremos a quantidade real de registros na propriedade RecordCount.
Dessa forma, para obter a quantidade real de registros de um RecordSet após a abertura, deve-se chamar a função MoveLast desse RecordSet, que força o RecordSet a posicionar-se no último registro. Para posicionar-se no último registro, o RecordSet implicitamente percorrerá todos os registros e assim atualizará a propriedade RecordCount com a quantidade correta de registros.
Demonstração
Para mostrar em detalhe esta característica da propriedade RecordCount da classe RecordSet, criei um pequeno programa com uma tabela de Clientes, com os seguintes registros:

Primeiro Exemplo
No primeiro exemplo, a query utilizada para abrir o RecordSet procura todos os registros que contenham "Pedro" em qualquer parte do campo Nome. Como não existem registros que satisfaçam esses critérios, após a abertura do RecordSet a propriedade RecordCount tem o valor 0 (Zero) e permanecerá com esse valor já que não existem registros para serem percorridos.

Private Sub btnVerificar1_Click()
'Cria uma nova instância da classe tblClientes
Dim rstClientes As New tblClientes
'Abre um Recordset com todos os registros que possuirem "Pedro" no campo nome.
rstClientes.OpenRecordset "Nome Like '*Pedro*'", hbModeReadOnly + hbModeOpenExisting
'Mostra o RecordCount antes de percorrer os registros
MsgBox "RecordCount ao abrir RecordSet: " & rstClientes.RecordCount
'Percorre os registros do Recordset
While Not rstClientes.EOF
rstClientes.MoveNext
Wend
'Mostra o RecordCount depois de percorrer os registros
MsgBox "RecordCount depois de percorrer RecordSet: " & rstClientes.RecordCount
'Fecha o Recordset e libera a memória
rstClientes.Close
Set rstClientes = Nothing
End Sub
Segundo Exemplo
No segundo exemplo, a query utilizada para abrir o RecordSet procura todos os registros que contenham "Ana" em qualquer parte do campo Nome. Como pode ser visto na tabela de registros acima, existem 3 (três) registros que satisfazem esses critérios. Após a abertura do RecordSet a propriedade RecordCount tem o valor 1 (Um), o que significa que existem um ou mais registros. Conforme percorremos o RecordSet no loop a propriedade é atualizada gradualmente e ao final dos registros, a propriedade já possui o valor correto: 3 (três) registros.

Private Sub btnVerificar2_Click()
'Cria uma nova instância da classe tblClientes
Dim rstClientes As New tblClientes
'Abre um Recordset com todos os registros que possuirem "Ana" no campo nome.
rstClientes.OpenRecordset "Nome Like '*Ana*'", hbModeReadOnly + hbModeOpenExisting
'Mostra o RecordCount antes de percorrer os registros
MsgBox "RecordCount ao abrir RecordSet: " & rstClientes.RecordCount
'Percorre os registros do Recordset
While Not rstClientes.EOF
MsgBox "Cliente: " & rstClientes.Nome & " - RecordCount: " & rstClientes.RecordCount
rstClientes.MoveNext
Wend
'Mostra o RecordCount depois de percorrer os registros
MsgBox "RecordCount depois de percorrer RecordSet: " & rstClientes.RecordCount
'Fecha o Recordset e libera a memória
rstClientes.Close
Set rstClientes = Nothing
End Sub
Terceiro Exemplo
No terceiro e último exemplo, a query utilizada para abrir o RecordSet procura novamente todos os registros que contenham "Ana" em qualquer parte do campo Nome, e mais uma vez encontra três registros. Para atualizar a propriedade RecordCount e obter a quantidade correta de registros imediatamente após a abertura, a função MoveLast do RecordSet é executada, e o ponteiro do RecordSet é posicionado no último registro, forçando a atualização da propriedade RecordCount para o valor correto (três registros) imediatamente.

Private Sub btnVerificar3_Click()
'Cria uma nova instância da classe tblClientes
Dim rstClientes As New tblClientes
'Abre um Recordset com todos os registros que possuirem "Ana" no campo nome.
rstClientes.OpenRecordset "Nome Like '*Ana*'", hbModeReadOnly + hbModeOpenExisting
'Existe algum registro no Recordset?
If Not rstClientes.BOF And Not rstClientes.EOF Then
'Sim, então vai para o último registro
'e atualiza a propriedade RecordCount
rstClientes.MoveLast
'Mostra o RecordCount antes de percorrer os registros
MsgBox "RecordCount ao abrir RecordSet: " & rstClientes.RecordCount
'Agora volta para o início do RecordSet
'Antes de percorrermos todos os registros
rstClientes.MoveFirst
'Percorre os registros do Recordset
While Not rstClientes.EOF
MsgBox "Cliente: " & rstClientes.Nome & " - RecordCount: " & rstClientes.RecordCount
rstClientes.MoveNext
Wend
'Mostra o RecordCount depois de percorrer os registros
MsgBox "RecordCount depois de percorrer RecordSet: " & rstClientes.RecordCount
End If
'Fecha o Recordset e libera a memória
rstClientes.Close
Set rstClientes = Nothing
End Sub
Histórico
- 02/05/2007 - Primeira versão deste artigo.
Sobre o Autor
Caio Proiete é Arquiteto de Soluções, especialista em desenvolvimento de softwares para PDAs e telefones celulares, principalmente nas plataformas Palm OS, Windows Mobile e Symbian OS.
Atualmente suas principais ferramentas/tecnologias de trabalho incluem CodeWarrior C++, Handheld Basic, eMbedded Visual C++, .NET Compact Framework, C# .NET, e Carbide.c++.
Possui extensa experiência em arquitetura e desenvolvimento de sistemas baseados em web e smart-clients, gerenciamento de projetos e treinamento, e atua também como instrutor oficial Microsoft em centros de treinamentos (CLPS), e é detentor das seguintes certificações:
- MCT - Microsoft Certified Trainer;
- MCSD - Microsoft Certified Solution Developer;
- MCDBA - Microsoft Certified Database Administrator;
- MCAD .NET - Microsoft Certified Application Developer;
- MCSD .NET - Microsoft Certified Solution Developer for .NET;
- MCTS - Microsoft Certified Technology Specialist for Windows Mobile.
Veja o todos os artigos publicados por Caio Proiete no PDAExpert.
Artigos Relacionados
- Não existem artigos relacionados
4 Comentários »
Comentários via RSS TrackBack URI
-
Marcelo em 15/05/2007 18:09
Caio, fiquei muito interessado no desenvolvimento de aplicações com o HB++ devido a simplicidade da ferramenta.
Mas, também fiquei muito intrigado com uma situação (não sei se é desconhecimento meu da ferramenta):
* No HB++ não existe a possibilidade de se colocar uma Grid (ou GridEx) com bordas e divisórias (como uma Table em HTML).
* Não haver a possibilidade de se colocar um “Label” fixo que mesmo que tenha rolagem horizontal, fique fixo no topo do Grid indicando o conteúdo do campo.
* Não haver a possibilidade de definir uma cor de fundo ou do texto de algumas linhas dentro de uma Grid.Ouvi falar de que era possível realizar esse tipo de modificação criando uma UC, porém, pesquisando na web não encontrei nada que explique como faze-la.
Gostaria de uma ajuda sua, se possível.
Muito obrigado!
-
Caio Proiete em 15/05/2007 19:17
Marcelo,
Todos estes ítens que você mencionou são perfeitamente possíveis com HB++, e a melhor maneira é criar User Controls para que seja possível reutilizar os recursos em diferentes formulários e projetos.
Creio que essa não seja uma deficiência apenas do HB++, mas de todas as linguagens para Palm OS. Em realidade, não conheço qualquer ferramenta de desenvolvimento para Palm OS que possua esses recursos de forma nativa, sem precisar de implementação ou criação de controles. Você conhece alguma?
Abraços,
Caio Proiete
-
Marcelo em 15/05/2007 23:40
Caio,
Realmente andei estudando diversas ferramentas, e muitas delas com várias deficiências em comparação com o HB++.
Como você mesmo mencionou, não encontrei de forma tão explícita em outras ferramentas de desenvolvimento algo similar, mas visto que você como um bom conhecedor do HB++ tão logo iria confirmar minhas suspeitas.
Bom, seria uma boa oportunidade mostrar pra a comunidade (inclusive eu que vou ficar esperando de carteirinha) um bom artigo/how to de como aprender a fazer um Grid com todas as funcionalidades tal como (ou próximo a) um DataGrid do ASP.net.
Muito obrigado pela resposta.
Abraços,
Marcelo Burégio
-
Caio Proiete em 16/05/2007 05:09
Já está na lista dos pendentes, Marcelo. Será publicado em breve.
Abraços,
Caio Proiete


Envie seu comentário
ATENÇÃO: A área de comentários deve ser utilizada apenas para dúvidas sobre este artigo. Para dúvidas não relacionadas a este artigo, utilize o Fórum PDAExpert.net.