ADO - Paginando através de um Recordset


Quando você tem que tratar um grande volume de dados , a movimentação através do recordset resultante e a exibição dos dados podem lhe causar problemas além de consumir um grande volume de recursos do seu sistema.

Com isto em mente vamos apresentar técnicas de como se movimentar e exibir os dados resultante de um recordset avantajado , ou seja , a paginação de dados usando a ADO. O objetivo principal será economizar recursos do banco de dados e do servidor.

Paginar através de um recordset é a técnica onde você apresenta somente um certo  número de registros ao usuário permitindo que ele navegue através do recordset página por página.

Navegar é preciso

O objeto recordset oferece as seguintes propriedades e métodos que permitem a movimentação através dos registros:

MoveNext  Permite navegar para o próximo registro no recordset a partir do registro atual. Se o registro atual for o último registro a ADO irá definir a nova posição depois do último registro como EOF. Se tentar ir além da posição definida como EOF isto gerará um erro.
MovePrevious Permite navegar par o registro anterior a partir do registro atual. (O objeto Recordset precisar suportar bookmarks ou o movimento do cursor para trás senão um erro ocorrerá). Se o registro atual for o primeiro registro a ADO irá definir a nova posição como BOF. Se tentar retroceder além desta posição um erro ocorrerá. 
MoveFirst Permite mover-se do registro atual para o primeiro registro no Recordset.
MoveLast Permite mover-se do registro atual para o último registro no Recordset.(O objeto Recordset precisa suportar bookmarks ou o movimento do cursor para trás, senão um erro ocorrerá)
Move  Permite mover o cursor do recordset para um registro relativo ao registro atual. A sintaxe é: Recordset.Move NumRegistros, Inicio   

Onde NumRegistros - é o numero de registros que o cursor irá se deslocar. Se for um número positivo o deslocamento será para frente se for um número negativo será para trás

Inicio - Um bookmark que pode assumir os valores:

Constante Descrição
adBookmarkCurrent Inicia na posição atual do registro>
adBookmarkFirst Inicia no primeiro registro.
adBookmarkLast Inicia no último registro.

 

Lembre-se que:

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 :

  1. Definimos um número de registros em uma página do recordset atribuindo um valor para a propriedade PageSize ( 10 é o valor padrão )
  2. Para ir para uma determinada página especificamos o número da página usando a propriedade AbsolutePage
  3. Para sabermos quantas páginas possui o recordset usamos a propriedade PageCount

Vejamos em detalhes estas propriedades:

PageSize Indica o número de registros que uma página possui no Recordset.( O valor padrão é 10 registros)
PageCount Indica quantas páginas de dados um objeto Recordset possui.
AbsolutePage Define em qual página o registro atual esta localizado. Pode retornar os seguintes valores:
Constante Descrição
adPosUnknown O recordset esta vazio ( empty) a posição do registro atual é desconhecida.
adPosBOF  O registro atual esta definido como BOF. (O valor numérico é -2)
adPosEOF  O registro atual esta definido como EOF. (O valor numérico é -3)

Assim , se um recordset possuir 46 registros e você definir uma página do recordset como possuindo 10 registros , teremos 5 páginas assim distribuídas:

  1. Página 1 - registros de 1 a 10
  2. Página 2 - registros de 11 a 20
  3. Página 3 - registros de 21 a 30
  4. Página 4 - registros de 31 a 40
  5. Página 5 - registros de 41 a 46

Falar é fácil...

Chegou a hora de mostrar na prática como toda esta teoria funciona.  Vamos lá...

  1. Inicie um novo projeto no VB e no formulário padrão insira os controles conforme o layout abaixo: (Não esqueça de fazer uma referência a bliblioteca ADO )
- 1 Controle ListBox - lstpagina

- 3 controles CommandButton - cmdcriapagina , cmdproximo , cmdanterior

- 4 Label rótulos e 4 labels para exibir os valores referentes á pagina criada. 

- 1 item de Menu - Ir Para 

Vejamos agora o código relacionado a cada controle/evento do projeto:

Dim con As ADODB.Connection
Dim rst As ADODB.Recordset

Definimos as variáveis con como Connection e rst como Recordset visíveis em todo formulário.

Private Sub cmdcriapagina_Click()
Dim sql As String
Dim tamanhopagina As Long
Dim contador As Long

Set con = New ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\teste\BIBLIO.mdb;"

Set rst = New ADODB.Recordset
sql = "SELECT * FROM AUTHORS"

r
st.CursorLocation = adUseServer
rst.CursorType = adOpenStatic
rst.LockType = adLockReadOnly
rst.PageSize = 10


Set rst.ActiveConnection = con
rst.Open sql

Call exibe_pagina(1)
cmdproxima.Enabled = True
cmdcriapagina.Enabled = False
cmdanterior.Enabled = True

End Sub

- Criamos uma conexão e abrimos o banco de dados Biblio.mdb

- Definimos o recordset com uma instrução SQL para exibir todos os registros da tabela Authors -  sql = "SELECT * FROM AUTHORS"

- Definimos o a localizacao e o tipo do cursor , o bloqueio e o tamanho da página.

- Ativamos a conexão a abrirmos o recordset.

- A seguir exibimos a primeira página através da função - exibe_pagina(pagina)

Private Sub exibe_pagina(pagina)
rst.AbsolutePage = pagina
tamanhopagina = rst.PageSize
contador = 1
lblnpage.Caption = pagina

lstPagina.Clear
While (Not rst.EOF) And
(contador <= tamanhopagina)
   
lstPagina.AddItem rst(0) & vbTab & rst(1)
    rst.MoveNext
    contador = contador + 1
Wend

' exibe os valores
lblreg.Caption = rst.RecordCount
lblpage.Caption = rst.PageSize
lblregpage.Caption = rst.PageCount

End Sub

- A função recebe o número da página que deve ser aberta e preenche o controle listbox com os registros - rst(0) -código do autor e rst(1) o nome do autor.

- A seguir exibimos nas labels os valores referentes a página criada . Veja abaixo a primeira página sendo exibida:

Private Sub cmdproxima_Click()
If rst.AbsolutePage <> -3 Then
  Call exibe_pagina(rst.AbsolutePage)
  cmdanterior.Enabled = True
Else
  MsgBox " Chegamos a ultima pagina "
  Call exibe_pagina(rst.PageCount)
End If
End Sub

- enquanto não for final da arquivo ( EOF => absolutePage = -3 ) iremos fazer a chamada para a próxima página. Ao final temos uma mensagem alertando o usuário.

Private Sub Cmdanterior_Click()

If rst.AbsolutePage > 2 And rst.AbsolutePage <> -2 Then
  
Call exibe_pagina(rst.AbsolutePage - 2)
Else
    MsgBox " Chegamos a primeira pagina "
    Call exibe_pagina(1)
End If

End Sub

- Enquanto não for inicio de arquivo ( BOF => absolutePage = -2 ) iremos retroceder uma página . 

Private Sub mnuirpara_Click()
Dim resposta As String
resposta = InputBox("Informe o numero da Pagina : ", "Ir para a página : ", 625)
If resposta <> "" And IsNumeric(resposta) Then
     If CLng(resposta) <= rst.PageCount Then
        
  Call exibe_pagina(CLng(resposta))
     Else
           MsgBox "Só temos " & rst.PageCount & " paginas validas ", vbInformation,     "Paginando um Recordset "
     End If
Else
     MsgBox "Informe um valor valido para a página ", vbInformation, "Paginando um Recordset "
End If
End Sub

- O usuário pode informar o número da página que deseja exibir. Veja abaixo:

Por enquanto é só isto...  


Copyright (c) 2001 - José Carlos Macoratti