domingo, 26 de fevereiro de 2012

Macetes com o ListBox no Access

Utilizando o ListBox num formulário Access, me deparei com alguns problemas e o primeiro deles, quase imperceptível: dependendo da quantidade de dados, o carregamento não é completo.
Por exemplo, carregar apenas uma coluna, o método "AddItem" do ListBox vai na boa, o detalhe é que se a quantidade de linhas é muito grande, as últimas não são carregadas!
Pior de tudo é que o Access nem dá mensagem de erro, simplesmente não carrega.
O número de linhas diminui a medida em que o número de colunas aumenta.

Em tempo, considerando uma quantidade muito grande de registros, talvez o ListBox não seja a melhor solução.
Tenho um aplicativo em que a quantidade de registros varia normalmene de 1 a 20, mas existem situações que podem ultrapassar a 3 mil. São exceções, mas podem ocorrer, por isso mantive a solução do ListBox.

Bem, continuando com a ajuda do amigo Gib@, mudei o carregamento do ListBox, apenas alterando a fonte de dados para uma tabela (sem carregamento por VBA).

Carregando uma grande quantidade de registros, o problema que surge é a navegação.
Pela barra de rolagem vertical, demora para se chegar até o último registro.
Um Requery aqui não funciona obviamente.

Após um tempinho tentando descobrir a causa dessa péssima navegabilidade, criei um "quebra-galho" mas que funciona: selecionar o último registro da lista e em seguida selecionar o primeiro.
Dessa forma, ao navegar pela barra de rolagem vertical todos os registros são exibidos mais rapidamente.

Essa questão na navegabilidade é mais facilmente verificada se montar ume exemplo, colocar aqui em palavras fica meio abstrato.

Uma outra forma de carregar o ListBox com uma quantiade grande de registros é clonar o RecordSet, veja exemplo mais abaixo.
Aí aparece outro problema: as colunas são colocadas em ordem alfabética.
Se o carregamento é por VBA, o ListBox.ColumnOrder não funciona,o que força a outro "quebra-galho": utilizar alias para as colunas no SQLÇ de forma que fiquem na ordem desejada e não colocar cabeçalhos de coluna no ListBox.
Para isso, basta utilizar Labels acima do ListBox, o resultado visual é bem melhor, visto que podemos trabalhar as propriedades de modo bem flexível.


Option Compare Database
Option Explicit

Private Sub carrega_lista()

Dim rst As New ADODB.Recordset
Dim ssql As String

Me.lst_teste.RowSource = ""

ssql = "SELECT cod as a_001, "
ssql = ssql & "Empresa as a_001,"
ssql = ssql & "Contato as a_002,"
ssql = ssql & "Cargo as a_003,"
ssql = ssql & "FROM fornecedores "

rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rst.MoveFirst

Set Me.lst_teste.Recordset = rst.Clone

Me.lst_teste.Selected(rst.RecordCount) = True
Me.lst_teste.Selected(1) = True

rst.Close
Set rst = Nothing

MsgBox "fim"

End Sub

;-)

Nenhum comentário:

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.