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:
Postar um comentário