Você já deve estar cansado de saber que os controles de grade (MSFlexGrid ,MSHFlexGrid, DataGrid ,etc.) presentes no VB6 são ótimos para exibição de dados na forma de tabela com linhas e colunas. Mas quando a quantidade de registros é muito grande além de sobrecarregar o sistema , a navegação pelos registros pode se tornar um pesadelo.
Como resolver este problema ? Chamar o 'Chapolin Colorado' ? Não precisamos exagerar !!! A solução é mais simples do que pode parecer. Na verdade se você ler meu artigo : ADO - Paginando através de um Recordset já vai perceber uma luz no fim do túnel.
A idéia é até bem simples : basta exibir em uma página apenas uma quantidade pequena de registros e permitir ao usuário paginar o recordset carregando em cada página a mesma quantidade de registro. Com isto matamos dois coelhos com uma cajadada só : a carga do grid é rápida e a navegação do usuário pelos registros também.
Neste artigo vou mostrar como fazer isto usando um controle DataGrid (presente somente no VB6) exibindo os dados da tabela - Pedidos - do banco de dados Northwind.mdb presentes no diretório c:\teste (na minha máquina). Vou usar a técnica de carregar os recordsets desconectados definindo o tamanho de uma página de dados que será exibida a cada acesso aos dados.
Para atingir este objetivo vou usar algumas propriedades do objeto Recordset ADO :
Definindo Páginas
A técnica de paginar através de um recordset permite definir páginas do recordset com um certo número de registros; cada página possui então um número e uma certa quantidade de registros. Para mover-se para uma página e exibir seus registros basta especificar o número da página e ler todos os registros desta página no recordset. As etapas podem ser resumidas assim :
Usando um Recordset Desconectado
Eu já tratei deste assunto no artigo - ADO - Trabalhando com Recordsets sem uma base de dados - por isto não vou me aprofundar no tema.(Dê uma olhada no artigo...). Só quero fazer uma pequena ressalva ; para criar um recordset desconectado eu não preciso necessariamente usar um cursor do lado do cliente (client-side) e um bloqueio em lote do tipo otimista ( batch optimistic locking type).
Quer saber por que ? Bem se não houver uma conexão com o servidor o cursor será implicitamente do lado do cliente e neste caso o VB assume automaticamente o bloqueio em lote do tipo otimista ; portanto basta definirmos a variável objeto e instancia-la.
Eu não preciso fazer assim :
rst.LockType
= adLockBatchOptimistic
|
Posso fazer assim :
Dim rst As ADODB.Recordset
|
A próxima etapa será adicionar os campos ao construtor ; para isto usamos o método Append da coleção Fields :
rst.Fields.Append
"Código", adVarChar
|
Após ter criado o recordset podemos incluir os registros usando método AddNew após abrir o recordset:
rst.Open |
Criando o projeto
- Inicie um novo projeto no VB e no formulário padrão insira um componente DataGrid , quatro botões de comando e dois componentes Label , conforme figura abaixo :
- Na seção General Declarations do formulário vamos definir as variáveis :
Option
Explicit Private conn As ADODB.Connection Private rst As ADODB.Recordset Private subRst As ADODB.Recordset Const PAGE_SIZE = 12 Dim reg As Integer |
- conn
é a variável objeto para conexão - rst e subRst são as variáveis objeto do tipo Recordset - PAGE_SIZE define o tamanho da página - reg é a variável que armazena o número de registros atual |
- No evento Load do formulário insira o código abaixo:
Private Sub Form_Load() Dim sql As String Set conn = New ADODB.Connection With conn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=c:\teste\Northwind.mdb" .Open End With Set subRst = New ADODB.Recordset Set rst = New ADODB.Recordset Command1(2).Caption = "Próximos >" & PAGE_SIZE Command1(1).Caption = "Anteriores < " & PAGE_SIZE sql = "SELECT CódigoDoCliente, NomeDoDestinatário, DataDoPedido FROM Pedidos" With rst .CursorLocation = adUseClient .PageSize = PAGE_SIZE .Properties("Initial Fetch Size") = PAGE_SIZE .Open sql, conn, adOpenKeyset, , adAsyncFetchNonBlocking Set DataGrid1.DataSource = PaginarRecordset(rst) End With reg = PAGE_SIZE lblreg.Caption = reg End Sub |
- No código acima eu estou usando o Provedor ADO OLE DB para o Access versão 4.0 e exibindo os campos :CódigoDoCliente, NomeDoDestinatário, DataDoPedido da tabela Pedidos.
- O código associado aos botões de comando que fazem a paginação pelos registros é dado abaixo :
Private Sub Command1_Click(Index As Integer) Dim novaPagina As Long With rst Select Case Index Case 0 novaPagina = 1 reg = PAGE_SIZE lblreg.Caption = reg Case 1 novaPagina = .AbsolutePage - 1 reg = reg - PAGE_SIZE If reg < PAGE_SIZE Then reg = PAGE_SIZE End If lblreg.Caption = reg Case 2 novaPagina = .AbsolutePage + 1 reg = reg + PAGE_SIZE If reg > rst.RecordCount Then reg = rst.RecordCount End If lblreg.Caption = reg Case 3 novaPagina = .PageCount reg = rst.RecordCount lblreg.Caption = reg End Select If novaPagina < 1 Or novaPagina > .PageCount Then Exit Sub End If .AbsolutePage = novaPagina Set DataGrid1.DataSource = PaginarRecordset(rst) End With End Sub |
- O código da função que realiza efetivamente a página é dada a seguir :
Private Function PaginarRecordset(recset As ADODB.Recordset) As ADODB.Recordset Dim x As Long Dim fld As Field Dim origPage As Long origPage = IIf(recset.AbsolutePage > 0, recset.AbsolutePage, 1) With subRst If .State = adStateOpen Then .Close 'Cria campos For Each fld In recset.Fields .Fields.Append fld.Name, fld.Type, fld.DefinedSize, fld.Attributes Next fld 'Inclui registros .Open For x = 1 To PAGE_SIZE If recset.EOF Then Exit For .AddNew For Each fld In recset.Fields subRst(fld.Name) = fld.Value Next fld .Update recset.MoveNext Next x .MoveFirst recset.AbsolutePage = origPage End With Set PaginarRecordset = subRst End Function |
- Finalmente o código que encerra a aplicação , fecha os objetos e libera a memória.
Private Sub Form_Unload(Cancel As Integer) subRst.Close Set subRst = Nothing rst.Close Set rst = Nothing conn.Close Set conn = Nothing End Sub |
Ao excecutar o projeto teremos o formulário exibido como abaixo:
Até o próxima artigo ... Bye...
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB6 - DataGrid, MSFlexGrid e alguns conceitos básicos. - Macoratti.net
VB .NET - DataGridView - Selecionando e exibindo ... - Macoratti.net