none
VBA para excell: Como utilizar o valor de uma variável em uma instrução SQL do tipo SELECT ... FROM ... WHERE (variável) RRS feed

  • Pergunta

  • Prezados Desenvolvedores e Desenvolvedoras:

    Em um "UserForm" tenho dois ComboBox (Estado - Município) que são "populados" com conteúdo de um banco de dados do Access.

    Pretendo que o usuário ao selecionar um Estado visualize todas as cidades correspondentes no combo Município.

    Estou com dificuldades na cláusula SQL.

    Escrevi o seguinte código:

    Private Sub PopulaMunicipio2()
    
        'Estabelece ligação com banco de dados "QD":
            Dim con As ADODB.Connection
            Set con = New ADODB.Connection
            con.Open "Data Source=QD" 'Abertura da ligação
        
        'Contagem dos registros:
            Dim varsql As String
            varsql = "SELECT Count(Municipio) FROM tblMunicipios WHERE ID_UF = 'SP'"
            Dim cmd As New ADODB.Command
            cmd.CommandText = varsql
            cmd.ActiveConnection = con
            Dim rst As ADODB.Recordset
            Set rst = cmd.Execute
            num_registros = rst.Fields(0)
            rst.Close
        
        'Obtenção dos valores:
            varsql = "SELECT * FROM tblMunicipios WHERE ID_UF = 'SP'"
            Dim cmd2 As New ADODB.Command
            cmd2.CommandText = varsql
            cmd2.ActiveConnection = con
            Set rst = cmd2.Execute
            num_campos = rst.Fields.Count
            cboAmbito.ColumnCount = num_campos
            
            Dim lista()
            ReDim lista(num_registros - 1, num_campos - 1)
            rst.MoveFirst
            registro = 0
            CAMPO = 0
            
            While Not rst.EOF
                For CAMPO = 0 To num_campos - 1
                    lista(registro, CAMPO) = rst.Fields(CAMPO)
                Next
                    registro = registro + 1
                    rst.MoveNext
                Wend
            
            'Transferência dos valores para a cboAmbito:
            cboMunicipio.List = lista()
            frmFeriados.cboMunicipio.ColumnCount = 2
            frmFeriados.cboMunicipio.ColumnWidths = 0
            
            con.Close 'Fecho da ligação
    
    End Sub
    

    Se fosse apenas um Estado como no exemplo acima estaria tudo certo. Ocorre que são 26 + o Distrito Federal.

    Poderia usar SELECT CASE. Mais ai o código não fica legal. Imagina quando tiver que usar um universo de dados maior. Todos os município, por exemplo.

    Assim estou tentando mudar a instrução SQL para, no lugar do "ID_UF = 'SP', por exemplo, fazer uso de uma variável.

    O valor da variável consigo obter sem problemas.

    O que eu não consigo é incluir o valor da variável na instrução SQL. Aliás, até já consegui, mas o retorno da linha  "num_campos = rst.Fieldos.Count" dá erro. Zero, nulo ...

    Agradeço a instrução e ajuda que me enviarem.

    Muito obrigado.

    sexta-feira, 18 de janeiro de 2013 01:32

Respostas

  • Prezados Desenvolvedores e Desenvolvedoras:

    CONSEGUI!!!

    A solução é tão simples e eu gastei muitas horas para descobrir.

    Para retribuir tudo o que VOCÊS já fizeram por mim, segue a solução que encontrei que talvez possa vir ajudar alguém:

    Private Sub PopulaMunicipio()
    
        Dim UF As String
        UF = "'" & cboEstado.Value & "'"
    
        'Estabelece ligação com banco de dados "QD":
            Dim con As ADODB.Connection
            Set con = New ADODB.Connection
            con.Open "Data Source=QD" 'Abertura da ligação
        
        'Contagem dos registros:
            Dim varsql As String
            varsql = "SELECT Count(Municipio) FROM tblMunicipios WHERE ID_UF=" & UF
            Dim cmd As New ADODB.Command
            cmd.CommandText = varsql
            cmd.ActiveConnection = con
            Dim rst As ADODB.Recordset
            Set rst = cmd.Execute
            num_registros = rst.Fields(0)
            rst.Close
        
        'Obtenção dos valores:
            varsql = "SELECT * FROM tblMunicipios WHERE ID_UF=" & UF
            Dim cmd2 As New ADODB.Command
            cmd2.CommandText = varsql
            cmd2.ActiveConnection = con
            Set rst = cmd2.Execute
            num_campos = rst.Fields.Count
            cboAmbito.ColumnCount = num_campos
            
            Dim lista()
            ReDim lista(num_registros - 1, num_campos - 1)
            rst.MoveFirst
            registro = 0
            CAMPO = 0
            
            While Not rst.EOF
                For CAMPO = 0 To num_campos - 1
                    lista(registro, CAMPO) = rst.Fields(CAMPO)
                Next
                    registro = registro + 1
                    rst.MoveNext
                Wend
            
            'Transferência dos valores para a cboAmbito:
            cboMunicipio.List = lista()
            frmFeriados.cboMunicipio.ColumnCount = 2
            frmFeriados.cboMunicipio.ColumnWidths = 0
            
            con.Close 'Fecho da ligação
    
    End Sub
    
    Muito obrigado.

    sábado, 19 de janeiro de 2013 00:02