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:
|
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 :
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:
|
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:
Falar é fácil...
Chegou a hora de mostrar na prática como toda esta teoria funciona. Vamos lá...
- 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" rst.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