web 2.0


Curso Excel 2003 sobre ADO e ADOX (ActiveX Data Objects) - Parte 4

CURSO ADO e ADOX COMPLETO

 

Caso você ainda não tenha lido a terceira parte, voce pode acessá-la em ADO ADOX (ActiveX Data Objects).

2.5  Contando registros em um recordset

Uma propriedade importante de um recordset é a propriedade Recordcount. Diferentemente do DAO (onde precisamos mover dentro dos registros e retornar ao primeiro para não obtermos o famigerado -1), no ADO a contagem é feita diretamente, bastando apenas determinar a propriedade.

O código abaixo dará o número de registros contidos na tabela Categorias (pois selecionamos todos os registros ao utilizarmos o asterisco). Em termos gerais, a propriedade retorna o número de registro no recordset o qual pode ou não representar a tabela por completo:

Sub RecordsetRecCount()

    Dim cn      As New ADODB.Connection

    Dim rs      As New ADODB.Recordset

   

    cn.Open strCn

    rs.Open "SELECT * FROM Categorias", cn, adOpenKeyset, adLockPessimistic

   

    Debug.Print rs.RecordCount

   

    rs.Close

    cn.Close

    Set rs = Nothing

    Set cn = Nothing

 

End Sub

2.6.     Abrindo um recordset baseado em critériosAbrindo um recordset baseado em critérios

Abrir uma tabela por completo em um recordset nós somos, de certo modo, redundantes. Com isso quero dizer que normalmente nós desejamos apenas parte dos dados e não todos. Por exemplo, poderíamos querer todos os clientes iniciados pela letra “C”.

Neste caso, nós precisamos determinar na instrução SQL o que desejamos que seja retornado em nosso recordset. Para isso nós utilizamos a cláusula WHERE.

O ideal nestes casos é termos uma string declarada para escrevermos a instrução SQL. Com a string pronta nós a introduzimos no argumento do método Open e o comprimento da instrução é dastricamente reduzido.

Vejamos alguns exemplos de instruções SQL que fazem isso. Aqui vemos como passar um parâmetro, pois como queremos basear a consulta em uma condição não podemos amarrar a condição dentro da rotina.

Sub executarRs()

    Call RecordsetWhere(1)

End Sub

 

Sub RecordsetWhere(ByVal código As Long)

    Dim cn          As New ADODB.Connection

    Dim rs          As New ADODB.Recordset

    Dim strSQL      As String

   

    strSQL = "SELECT * FROM Produtos WHERE CódigoDaCategoria=" & código

    cn.Open strCn

   

    With rs

        .Open strSQL, cn, adOpenKeyset, adLockPessimistic

        .MoveFirst

        Debug.Print "Registros para o recordset da categoria " _

            & código & " --> " & .RecordCount

        Debug.Print vbCr & "NOMES DOS PRODUTOS"

        Do While Not .EOF

            Debug.Print !NomeDoProduto

            .MoveNext

        Loop

    End With

   

    rs.Close

    cn.Close

    Set rs = Nothing

    Set cn = Nothing

 

End Sub

Uma vez executado, teremos a seguinte impressão na janela imediata;

 

 

 

 

Figura 23 Resultado da impressão do recordset

O exemplo acima assume uma passagem de parâmetro numérica. Suponha um outro cenário onde o que queremos é retornar todos os produtos contendo uma string qualquer, como proceder?

O próximo exemplo será um pouco mais elaborado e utilizaremos o comparador LIKE. Precisaremos de um formulário como segue:

 

Figura 24 Formulário de seleção

No formulário digitaremos o que buscamos e escolheremos o tipo de busca. O botão Executar deve conter a seguinte instrução:

Private Sub cmdExecutar_Click()

    Call RecordsetLike(Me.txtBusca, Me.cboTipo.Value)

End Sub

A rotina RecordsetLike recebe dois argumento: 1) texto de busca e 2) o tipo de busca.

Sub RecordsetLike(ByVal strBusca As String, ByVal Tipo As String)

    Dim cn          As New ADODB.Connection

    Dim rs          As New ADODB.Recordset

    Dim strSQL      As String

    Dim lngLin      As Long

   

    On Error GoTo Err_Handler

   

'   Determina a opcao escolhida pelo usuário para remontar

'   a string de busca

    Select Case UCase(Tipo)

 

'       Se for registros que "terminam em" alguma coisa

'       adicionar o apóstrofo e sinal de percentual

'       para indicar que termina na string digitada pela usuário

        Case "TERMINA EM"

            strBusca = "'%" & strBusca & "'"

           

        Case "COMEÇA EM"

            strBusca = "'" & strBusca & "%'"

           

        Case "CONTÉM"

            strBusca = "'%" & strBusca & "%'"

           

        Case Else

            MsgBox "Opção de busca inválida. Cancelando a operação...", _

                vbExclamation

            Exit Sub

    End Select

   

           

   

    strSQL = "SELECT * FROM Produtos"

    strSQL = strSQL & " WHERE NomeDoProduto Like " & strBusca

    cn.Open strCn

   

    lngLin = 3

    With rs

        .Open strSQL, cn, adOpenKeyset, adLockPessimistic

        .MoveFirst

       ActiveSheet.Cells(1, 1) = "Registros para o recordset da categoria " _

            & strBusca & " --> " & .RecordCount

        ActiveSheet.Cells(2, 1) = "NOMES DOS PRODUTOS"

        Do While Not .EOF

             ActiveSheet.Cells(lngLin, 1) = !NomeDoProduto

             lngLin = lngLin + 1

            .MoveNext

        Loop

    End With

   

Limpar:

    On Error Resume Next

    rs.Close

    cn.Close

    Set rs = Nothing

    Set cn = Nothing

    Exit Sub

 

Err_Handler:

    MsgBox Err.Description, vbCritical, Err.Number

    Resume Limpar

End Sub

Diferentemente do caso numérico, aqui nós precisamos envelopar a string em apóstrofos. Também utilizamos o sinal de percentual para determinar o tipo de busca, isto é se o sinal aparece no início da string a busca é para produtos terminados com aquela string.

Por outro lado, se o sinal aparece no final da string a busca é para produtos iniciados por aquela string. E, finalmente, se a string contiver um sinal no início e fim, então a busca é por produtos que contenham a string.

CURSO ADO e ADOX COMPLETO

Tags: , , , , , ,

Microsoft Office | VBA

Os comentários estão fechados