Dica de Access ====================== Combos com Dezenas de Milhares de Registros Combos ficam inúteis com alguns milhares de registros, até mesmo muitas centenas no Access 2. Carregando registros no combo depois que o usuário digitou os primeiros três ou quatro caracteres, você acaba otimizando-a. Esta é a idéia: Deixe a propriedade RowSource ( Origem da linha ) de uma Combo em branco. Crie uma função que refaz o RowSource depois que um número mínimo de caracteres é digitado. Só entradas que correspondem a estes caracteres iniciais serão carregadas, assim o RowSource da combo nunca conterá mais de alguns cem registros. Chame esta função no evento Change do combo, e no evento Current do formulário. Exemplo: Observe Códigos Postais de Bairros Para este exemplo você precisa de uma tabela nomeada PostCode (Códigos postais), com os campos Suburb (bairro), State (Estado) e PostCode (Código postal). Você pode criar esta tabela de dados importados, por exemplo Códigos postais de um Banco de dados da Austrália. Mas antes tenha certeza de que todos os três campos são indexados. Você também precisa de uma combo com estas propriedades: Name: Suburb RowSource: BoundColumn : 1 ColumnCount : 3 Passo 1: Cole isto na seção General Declarations do módulo de seu formulário: Dim SSuburbStub As String Const ConSuburbMin = 3 Function ReloadSuburb(sSuburb As String) Dim SNewStub As String sNewStub = Nz(Left(sSuburb, conSuburbMin),"") If sNewStub <> sSuburbStub Then If Len(sNewStub) < conSuburbMin Then Me.Suburb.RowSource = "SELECT Suburb, State, Postcode FROM Postcodes;" sSuburbStub ="" Else Me.Suburb.RowSource = "SELECT Suburb, State, Postcode FROM Postcodes WHERE (Suburb Like """ & sNewStub & "*"") ORDER BY Suburb, State, Postcode;" sSuburbStub = sNewStub End If End If End Function Passo 2: No procedimento de evento NoAtual do formulário, entre nesta linha: Call ReloadSuburb(Nz(Me.Suburb,"")) Passo 3: No procedimento de evento Change da combo, você poderia usar também uma única linha: Dim cbo As ComboBox Dim sText As String Set cbo = Me.Suburb sText = cbo.Text Select Case sText Case " " ' Remove initial space cbo = Null Case "MT " ' Change "Mt " to "Mount ". cbo = "MOUNT " cbo.SelStart = 6 Call ReloadSuburb(sText) Case Else ' Reload RowSource data. Call ReloadSuburb(sText) End Select Set cbo = Nothing Passo 4: Para acessar o Estado e o código postal, adicione este código no evento AfterUpdate da combo: Dim cbo As ComboBox Set cbo = Me.Suburb If Not IsNull(cbo.Value) Then If cbo.Value = cbo.Column(0) Then If Len(cbo.Column(1)) > 0 Then Me.State = cbo.Column(1) End If If Len(cbo.Column(2)) > 0 Then Me.Postcode = cbo.Column(2) End If Else Me.Postcode = Null End If End If Set cbo = Nothing A combo em uso Até que os usuários digitem os primeiros dois caracteres, a Combo estará vazia. Ao terceiro caráter, a lista enche com só as entradas que começam com esses três caracteres. Ao quarto caráter, o Acess completa o primeiro nome correspondente (assumindo o AutoExpand da combo setada para sim). Ao sair da combo, o Estado e o código são preechidos conforme sua correspondência. O tempo levado para carregar a combo entre digitações é mínimo. Isto acontece uma vez só para cada entrada, a menos que o usuário apage os caractéres até os três primeiros. Se sua lista ainda contiver muitos registros, você pode os reduzir por outro número mínimo de caractéres a serem digitados modificando o valor da constante conSuburbMin de 3 para outro valor ( 4 por exemplo), isto é: Const ConSuburbMin = 4 Esta mensagem é um oferecimento do Fórum Access. Visite nossa home page: www.forumaccess.com Para receber estas dicas acesse o site acima, cadastre-se (é grátis) e veja na seção Cadastrados o Forum News. ------------------------------ Colaboração do Oswaldo para o Cantinho dos Amantes do Access: cantinho.pagehere.com