bollywood actresses hair loss hair rehab london contact number cheap hair extensions brazilian curly hair with closure hair extension fails human hair wigs black ponytail hairstyles 2018 sunny hair extensions uk hair extensions remy hair extensions weft koko one piece hair extensions clip hair
Aprenda sobre filtragens

Trabalhando com Registros - DAO e ADO

Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 2x no Cartão de Crédito, através do Paypal. 

Veja como comprar e saiba mais sobre o material oferecido,  clicando aqui.

Open v3

 

Vamos examinar as técnicas de DAO e ADO para adicionar, modificar, copiar, excluir e classificar registros.

- Arquivo Exemplo

- Adicionando um novo registro com DAO

- Adicionando um novo registro com ADO

- Adicionando anexos com DAO

- Adicionando valores a um campo, do tipo Múltiplos Valores

- Modificando um registro com DAO

- Modificando um registro com ADO

- Editando vários registros com ADO

- Atualizando dados: diferenças entre ADO e DAO

- Excluindo um registro com DAO

- Excluindo um registro com ADO

- Excluindo Anexos com DAO

- Copiando registros para uma planilha Excel

- Copiando registros para um documento do Word

- Copiando registros para um arquivo de texto

- Filtrando registros, usando a cláusula WHERE da SQL

- Filtrando registros, usando a propriedade FILTER

- Classificando registros

Arquivo Exemplo

No final deste artigo está disponível um arquivo Zip, contendo dois Bancos de Dados Ms Access na extensão ACCDB e um arquivo de imagem na extensão GIF.  As tabelas utilizadas nos referidos Bancos de Dados foram extraídas do exemplo Northwing2007, da Microsoft. 

Todos os procedimentos aqui apresentados foram testados cuidadosamente e encontram-se disponíveis, separadamente, nos módulos globais do Banco de Dados Registros_ADO_DAO.accdbQuanto ao Banco de Dados Registros_ADO_DAO_2.accdb, é utilizado por alguns dos procedimentos abaixo, com a intenção de demonstrar a técnica de acesso às tabelas externas (sem vínculo).  Em relação ao arquivo GIF, o mesmo é utilizado pelo procedimento que demonstra como adicionar arquivos em campo do tipo Anexo.

Adicionando um novo registro com DAO

Na interface do usuário do Microsoft Access, antes de adicionar um novo registro a uma tabela, você deve primeiro abrir a tabela apropriada. No código, você simplesmente abre o objeto Recordset, chamando o método OpenRecordset.  No exemplo abaixo, as seguintes instruções declaram e abrem o objeto Recordset, com base na tabela Funcionários:

Dim rst As DAO.Recordset 
Set rst = CurrentDb.OpenRecordset("Funcionários")

Depois que o objeto Recordset estiver aberto, use o método AddNew para criar um registro em branco. Por exemplo:

rst.AddNew

Em seguida, você pode definir valores para todos ou alguns dos campos no novo registro.  É necessário que você determine o valor do campo, se a propriedade obrigatória de um campo for definida como True. Na interface de usuário do Microsoft Access, no modo de exibição Design de Tabela, há uma entrada Sim ao lado da propriedade Requerido,  caso a entrada no campo selecionado seja obrigatória.  Aqui estão alguns exemplos de configuração de valores de campo no código:

rst.Fields("Sobrenome").Value = "Sampaio" 
rst.Fields("Cargo").Value = "Programador VBA"

Observe que, como Value é a propriedade padrão de um objeto Field, o uso dessa palavra-chave é opcional.

Depois de preencher os valores dos campos, você precisa usar o método Update no objeto Recordset para garantir que o registro recém-adicionado seja salvo:

rst.Update

Analise o código completo.

Sub fncAddNovoReg_DAO()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Funcionários")
With rst
  .AddNew
    .Fields("Empresa") = "Pontocom Ltda"
    .Fields("Sobrenome") = "Sampaio"
    .Fields("Nome") = "Avelino"
    .Fields("Cargo") = "Programador VBA"
    .Fields("Endereço de Email") = "avelino@123.com"
  .Update
End With
rst.Close
Set rst = Nothing
End Sub

Em um conjunto de registros do tipo Tabela, o novo registro é colocado na ordem identificada pelo índice da tabela.  Em um conjunto de registros do tipo Dynaset, o novo registro é adicionado no final do conjunto de registros.  Porém, quando você adiciona um novo registro à uma tabela, ele não se torna o registro atual, ou seja: o registro anterior, considerado atual antes do novo registro ter sido adicionado, mantem-se como atual. Em outras palavras, enquanto um novo registro está sendo adicionado ao final da tabela, o cursor permanece no registro que foi selecionado antes de adicionar um novo registro.  No entanto, você pode tornar atual, o registro recém-adicionado, usando as propriedades Bookmark e LastModified.  Para isso, basta fazer desta forma:

rst.Bookmark = rst.LastModified

O exemplo do código acima demonstra como acessar uma tabela local/vinculada. No entanto,  se desejar acessar uma base de dados não vinculada, acrescente as linhas em vermelho que estão destacadas abaixo. O código também apresenta uma forma mais sucinta de informar o nome campo, sem o uso explícito da propriedade Fields.

Sub fncAddNovoReg_DAO() 
Dim bd As DAO.Database
Dim rst As DAO.Recordset 
Dim strBd As String 
strBd = "c:\SuaPasta\seuBd.accdb" 
Set bd = OpenDatabase(strBd) 
Set rst = bd.OpenRecordset("Funcionários") 
With rst 
  .AddNew 
    ![Empresa] = "Pontocom Ltda" 
    ![Sobrenome] = "Sampaio" 
    ![Nome] = "Avelino" 
    ![Cargo] = "Programador VBA" 
    ![Endereço de Email] = "avelino@123.com" 
  .Update 
End With 
rst.Close 
Set rst = Nothing 
bd.Close 
Set bd = Nothing 
End Sub

Adicionando um novo registro com ADO

Para adicionar um novo registro, use o método AddNew, do ADO Recordset.  Use o método Update, se não for adicionar mais nenhum registro.  No ADO, não é necessário chamar o método Update se você estiver indo para o próximo registro. Chamar o método Move, implicitamente, chama o método Update, antes de mover para o novo registro.  Dê uma olhada nas seguintes declarações:

rst![Sobrenome] = "Sampaio" 
rst.MoveNext

Neste fragmento de código, o método Update é chamado automaticamente quando você passa para o próximo registro (MoveNext).  O procedimento abaixo demonstra como adicionar um novo registro à tabela Funcionários.

Para que o ADO funcione no seu projeto é preciso ativar a biblioteca Microsoft ActiveX Data Object 6.1 Library.  Para ativar esta biblioteca, abra o VBA e no menu Ferramentas clique em Referências.  Procure na lista e marque a biblioteca.

Sub fncAddNovoReg_ADO()  
Dim rst As ADODB.Recordset 
Set rst = New ADODB.Recordset 
With rst 
.Open "SELECT * FROM Funcionários", CurrentProject.Connection, _
 adOpenKeyset, adLockOptimistic 
.AddNew 
  ![Empresa] = "Pontocom Ltda" 
  ![Sobrenome] = "Sampaio" 
  ![Nome] = "Avelino" 
  ![Cargo] = "Programador VBA" 
  ![Endereço de Email] = "avelino@123.com" 
  Debug.Print !Identificação.Value 
  .MoveFirst 
  Debug.Print !Identificação.Value
.Close 
End With 
Set rst = Nothing 
End Sub

Ao adicionar ou modificar registros, você pode definir os valores dos campos do registro de uma das seguintes maneiras:

rst.Fields("Sobrenome").value = "Sampaio" 
ou 
rst![Sobrenome] = "Sampaio"

Conforme mencionado, quando você usa o método AddNew para adicionar um novo registro e, em seguida, usa o método Move, o registro recém-adicionado é salvo automaticamente sem a necessidade de chamar, explicitamente, o método Update. No procedimento do exemplo anterior, usamos o método MoveFirst para mover para o primeiro registro; no entanto, você pode chamar qualquer um dos outros métodos de movimentação (Move, MoveNext, MovePrevious) para que o ADO chame, implicitamente, o método Update.  Depois de chamar o método AddNew, o novo registro passa a ser o registro atual.

Atenção:  Use o método Update, se não for adicionar mais nenhum registro.

O procedimento acima está realizando o acesso a uma tabela local/vinculada, através do comando CurrentProject.Connection.  Para se ter acesso à base de dados de um local diferente (não vinculada), observe bem, as partes em vermelho, que são acrescentadas ao código:

Sub fncAddNovoReg_ADO() 
Dim rst As ADODB.Recordset 
Dim strConn As String 
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source='c:\SuaPasta\seuBd.accdb'"
Set rst = New ADODB.Recordset 
With rst 
.Open "SELECT * FROM Funcionários", strConn, adOpenKeyset, adLockOptimistic 
.AddNew 
  ![Empresa] = "Pontocom Ltda" 
  ![Sobrenome] = "Sampaio" 
  ![Nome] = "Avelino" 
  ![Cargo] = "Programador VBA" 
  ![Endereço de Email] = "avelino@123.com"  
  Debug.Print !Identificação.Value 
  .MoveFirst 
  Debug.Print !Identificação.Value
.Close 
End With 
Set rst = Nothing 
End Sub

 Caso a base de dados esteja configurada com uma senha de acesso, acrescente a parte em vermelho, conforme indicado abaixo:

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source='c:\SuaPasta\seuBd.accdb';" & _ 
 "Jet OLEDB:Database Password='SuaSenha';"

Adicionando Anexos com DAO

O código exemplo abaixo demonstra como usar o DAO para adicionar arquivos externos a um campo do tipo Anexo.  Neste exemplo é adicionado apenas um arquivo de imagem (kofap1.gif).  Clique AQUI e saiba quais tipos de arquivos você pode armazenar nesta modalidade de campo. 

Sub fncAddAnexoParaReg()
Dim rst As DAO.Recordset2
Dim rstChild As DAO.Recordset2
Dim blnFlag As Boolean
Dim strPath$
strPath = CurrentProject.Path & "\"
Const strFile = "kofap1.gif"
Set rst = CurrentDb.OpenRecordset("Clientes")
' desloca o ponteiro para o quarto registro da tabela. Cliente Christina
rst.Move 3
' inicializa conjunto de registros filho
Set rstChild = rst.Fields("Anexos").Value

If rstChild.RecordCount > 0 Then
    ' verifica se o arquivo especificado já está anexado
    Do Until rstChild.EOF
        If rstChild.Fields("FileName").Value = strFile Then
            blnFlag = True
            Exit Do
        End If
        rstChild.MoveNext
    Loop
End If

If blnFlag Then MsgBox "O Arquivo " & strFile & _
 " já está anexado a este registro."
If Not blnFlag Then
    ' coloca o conjunto de registros pai no modo de edição
    rst.Edit
        ' adiciona um novo registro ao conjunto de registros filho
        rstChild.AddNew
            ' carrega o arquivo anexo
            rstChild.Fields("FileData").LoadFromFile strPath & strFile
        ' atualiza os conjuntos de registros filho e pai
        rstChild.Update
    rst.Update
    MsgBox "Anexado o arquivo " & strFile & " para o cliente " & _
    rst.Fields(3).Value
End If
' limpa a memória
Set rstChild = Nothing
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub

Este procedimento adiciona um anexo ao 4º registro na tabela Clientes. Este é um registro para a cliente Christina.  O conjunto de registros filho contém os registros do campo Anexo.  Antes de adicionar um registro a este conjunto de registros, o procedimento verifica a propriedade RecordCount do conjunto de registros filho para verificar se o arquivo especificado ainda não está anexado. Caso RecordCount seja maior que zero (0), a variável boleana blnFlag é definida como True e é exibida uma mensagem de que o arquivo já está anexado, assim, o procedimento é encerrado.  Caso a variável boleana blnFlag seja False,  não há problema em adicionar o arquivo.  Observe que, antes de adicionar um novo registro ao conjunto de registros filho, você deve colocar o conjunto de registros pai no modo Editar, usando o método Edit do objeto Conjunto de registros.  Em seguida, chame o método AddNew do conjunto de registros filho para adicionar um novo registro filho e use o método LoadFromFile para carregar o novo arquivo de anexo. Certifique-se de atualizar os conjuntos de registros filho e pai.

Adicionando valores ao campo do tipo Múltiplos Valores

Você pode adicionar um novo valor a um campo do tipo Múltiplos Valores, modificando sua propriedade RowSource quando a propriedade RowSourceType é definida como Lista de Valores.  A função abaixo adiciona novos valores ao campo de pesquisa de Múltiplos Valores de nome Carros, na tabela Clientes.

Function fncAddMultiplosValores_DAO(strTabela As String, _
 strCampo As String, strValor As String)
Dim tbl As DAO.TableDef
Dim fld As DAO.Field2
Dim prp As DAO.Property
On Error GoTo TrataErro

Set tbl = CurrentDb.TableDefs(strTabela)
Set fld = tbl.Fields(strCampo)

If fld.Properties("RowSourceType").Value = "Value List" Then
    Set prp = fld.Properties("RowSource")
    Debug.Print prp.Value
    If InStr(1, prp.Value, strValor) = 0 Then
        prp.Value = prp.Value & Chr(59) & Chr(34) & strValor & Chr(34)
        Debug.Print prp.Value
    End If
End If

Sair:
    Set prp = Nothing
    Set fld = Nothing
    Set tbl = Nothing
    Exit Function
TrataErro:
    MsgBox Err.Number & ":" & Err.Description
    Resume Sair
End Function

Este procedimento de função leva a três argumentos: o argumento strTabela que especifica o nome de uma tabela, onde um campo de pesquisa de vários valores está localizado; o argumento strCampo que especifica o nome de um campo de pesquisa de Múltiplos Valores e, o argumento strValor que especifica o valor que você deseja adicionar à lista.  Como exemplo, observe a função que está adicionando o nome Corolla ao campo Múltiplos Valores chamado Carros, na tabela Clientes.

fncAddMultiplosValores_DAO("clientes","Carros","Corolla")

Para trabalhar com a tabela especificada, começamos definindo a variável do objeto tbl para apontar para a nossa tabela:

Set tbl = currentDb.TableDefs(strTabela)

Lembre-se de que a coleção DAO TableDefs contém objetos TableDef, que são definições de tabela. Cada objeto TableDef contém uma coleção Fields. Configuramos a variável do objeto fld para obter acesso ao campo de pesquisa de vários valores especificados por meio da coleção Fields do objeto TableDef:

Set fld = tbl.Fields(strCampo)

O objeto Field possui uma coleção de propriedades. Antes de qualquer trabalho, verificamos se a propriedade RowSourceType está definida como Lista de Valores.  Caso este teste seja True, precisamos obter o valor atual da propriedade RowSource.  Configuramos a variável do objeto prp para apontar para esta propriedade e escrever o valor da propriedade na janela Imediata:

Set prp = fld.Properties("RowSource") 
Debug.Print prp.Value

Como queremos apenas valores únicos no campo de pesquisa de Múltiplos Valores, precisamos verificar se o valor passado no parâmetro strValor já está na lista de valores.  Para fazermos isso,   a função VBA InStr() pode ser usada.

If InStr(1, prp.Value, strValor) = 0 Then

Lembre-se de que a função InStr() retorna à posição da primeira ocorrência de uma string dentro de outra.  O primeiro parâmetro é opcional. Indica a posição do caractere onde a pesquisa deve começar. Obviamente, queremos começar na primeira posição para que possamos examinar toda a string da Lista de Valores. O segundo parâmetro é a string a ser pesquisada. O valor da variável prp contém a seguinte string quando a função é chamada:

"Gol";"Civic";"Jetta";"Uno"

O terceiro parâmetro da função InStr é a string que você deseja encontrar. Especificaremos essa string quando chamarmos o procedimento de função na próxima etapa.  A função InStr também tem um quarto argumento opcional que especifica o tipo de comparação de string.  Quando omitido, o Access executa uma comparação binária em que cada caractere corresponde apenas a si mesmo.  Este é o padrão.  A função InStr retornará zero (0) quando a string que você está procurando não for encontrada na string que você pesquisou. Em seguida, adicionaremos o novo item à Lista de Valores de RowSource atual:

prp.Value = prp.Value & Chr(59) & Chr(34) & strValor & Chr(34)

Para adicionar um novo valor à lista, usamos o caractere de concatenação (&). A função Chr (59) nos dá o ponto e vírgula necessário (;) e Chr (34) é para as aspas (“).  Observe que o procedimento usa o código TrataErro para interceptar erros que podem resultar da inserção de uma tabela ou nome de coluna inexistente.

Modificando um registro com DAO

Para editar um registro existente, use o método OpenRecordset para abrir o objeto Recordset.  Em seguida, localize o registro que deseja modificar. Em um conjunto de registros do tipo Tabela, você pode usar o método Seek e um índice de tabela para localizar um registro que atenda aos seus critérios. Nos conjuntos de registros do tipo Dynaset e Snapshot, você pode usar qualquer um dos métodos Find (FindFirst, FindNext, FindPrevious, FindLast) para localizar o registro apropriado. No entanto, lembre-se de que você pode editar dados apenas em conjuntos de registros do tipo Tabela ou do tipo Dynaset (instantâneos são usados apenas para recuperar dados). Depois de localizar o registro, use o método Edit do objeto Recordset e prossiga para alterar os valores dos campos.  Quando terminar a modificação do registro, invoque o método Update para o objeto Recordset. O procedimento abaixo demonstra como modificar um registro na tabela Funcionários.

Sub fncModificandoReg_DAO()
Dim rst As DAO.Recordset
Dim strFind As String
Dim intResult As Integer
Dim strDb As String
Set rst = CurrentDb.OpenRecordset("Funcionários", dbOpenTable)
rst.MoveFirst
' Altera o CEP de todos os funcionários
' De 99999-999 to 99999-998
Do While Not rst.EOF
    With rst
        .Edit
            .Fields("Cep") = "99999-998"
        .Update
        .MoveNext
    End With
Loop
' Encontrar o registro com sobrenome Sampaio
' e alterar o campo País para Brasil
strFind = "Sampaio"
rst.MoveFirst
rst.Index = "Sobrenome"
rst.Seek "=", strFind
MsgBox rst![Sobrenome]
Debug.Print rst.EditMode
rst.Edit
rst![País/Região] = "Brasil"
If rst.EditMode = dbEditInProgress Then
    intResult = MsgBox("Você quer salvar as alterações " & _
    "neste registro?", vbYesNo, "Confirmação")
End If
If intResult = 6 Then
    'Salvar alterações
    rst.Update
ElseIf intResult = 7 Then
    'Cancelar alterações
    rst.CancelUpdate
End If
rst.Close
Set rst = Nothing
End Sub

O procedimento abre um conjunto de registros do tipo Tabela com base na tabela Funcionários e altera o CEP de todos os funcionários.  Em seguida, o procedimento localiza o registro de um funcionário específico. Observe que a propriedade Index deve ser definida antes de usar o método Seek para pesquisar o conjunto de registros do tipo Tabela.  Se você definir a propriedade Index para um índice que não existe, ocorrerá um erro de tempo de execução. Uma vez localizado o registro desejado, o procedimento exibe o nome do funcionário em uma caixa de mensagem. O ponto de exclamação (!) é usado para separar o nome de um objeto, do nome da coleção da qual ele é membro. Como a coleção padrão do objeto Recordset é a coleção Fields, você pode omitir o nome da coleção padrão. Em seguida, o procedimento coloca o registro do funcionário encontrado no modo Editar e modifica o valor do campo País/Região.  A propriedade EditMode do objeto Recordset é usada para determinar se a operação Edit está em andamento.  As constantes EditModeEnum, que são mostradas na Tabela abaixo, indicam o estado de edição do registro atual. Antes de confirmar as alterações nos dados, o usuário é solicitado a verificar se as alterações devem ser salvas ou canceladas. Caso o botão Sim seja selecionado na caixa de mensagem, o método de atualização do Recordset é chamado; em situação contrária, o método CancelUpdate do objeto Recordset descartará as alterações no registro atual.

Constantes EditModeEnum usadas na propriedade EditMode do objeto DAO Recordset.

Nome Constante Valor Descrição
 dbEditNone 0 Método de edição não invocado
 dbEditInProgress 1 Método de edição invocado
 dbEditAdd 2 AddNew método invocado

Nota 1: Às vezes, ao trabalhar com registros, você precisará deixar o registro e descartar as alterações. Para cancelar qualquer atualização pendente nos dados, chame o método CancelUpdate do objeto DAO Recordset. Este método aborta todas as alterações feitas na linha atual. Você pode usar o método CancelUpdate para cancelar quaisquer alterações feitas depois que o método Edit ou AddNew foi chamado. Você pode verificar se há uma operação pendente que pode ser cancelada usando a propriedade EditMode do objeto Recordset.

Nota 2: A propriedade NoMatch , que não foi utilizada no nosso exemplo , tem por objetivo identificar se o método Seek localizou o registro especificado.  Detalhes de sua utilização AQUI neste artigo da Microsoft.

Modificando Registros com ADO

Para modificar os dados em um campo específico, localize o registro e defina a propriedade Value, do campo obrigatório, com um novo valor. Sempre chame o método Update, se não estiver planejando editar mais nenhum registro. Se você modificar uma linha e, em seguida, tentar fechar o conjunto de registros sem chamar o método Update primeiro, o ADO disparará um erro de tempo de execução.

O procedimento abaixo modifica um registro de funcionário:

Sub fncModificandoReg_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
With rst
    .Open "SELECT * FROM Funcionários WHERE " _
    & "[sobrenome] = 'Sampaio'", _
    CurrentProject.Connection, adOpenKeyset, adLockOptimistic
 
    .Fields("Cidade").Value = "Rio de Janeiro"
    .Fields("Estado/Província").Value = "RJ"
    .Fields("País/Região").Value = "Brasil"
    .Update
    .Close
End With
Set rst = Nothing
Set conn = Nothing
End Sub

Este procedimento modifica o registro de uma tabela, acessando primeiro, os campos desejados. Você pode modificar vários campos em um registro específico chamando o método Update e transmitindo a ele duas matrizes. O primeiro Array deve especificar os nomes dos campos e o segundo deve listar os novos valores a serem inseridos.  Por exemplo, a instrução a seguir atualiza os dados nos campos Cidade, Estado/Província e País/ Região com os valores correspondentes:

rst.Update Array("Cidade", "Estado/Província", "País/Região"), _
 Array("Rio de Janeiro", "RJ", "Brasil")

Você pode usar a mesma técnica com o método AddNew.

Nota: Às vezes, ao trabalhar com registros, você precisará deixar o registro e descartar as alterações. Para evitar que o ADO confirme automaticamente essa linha de dados, chame o método CancelUpdate, do objeto ADO Recordset.  Este método aborta todas as alterações feitas na linha atual.

Editando vários registros com o ADO

ADO tem a capacidade de realizar atualizações em lote.  Isso significa que você pode editar vários registros e enviá-los ao provedor OLE DB, em uma única operação.  Para aproveitar as atualizações em lote, você deve usar o conjunto de chaves ou o cursor estático.  O procedimento abaixo encontra todos os registros na tabela Funcionários, onde o cargo é "Representante de vendas" e o altera para "Programador VBA".  As alterações são confirmadas no Banco de Dados em uma única operação de atualização.

Sub fncAtualizaçõesLoteReg_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strConn As String
Dim strFiltro As String

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & CurrentProject.Path & _
 "\Registros_ADO_DAO_2.accdb;" & _
 "Jet OLEDB:Database Password='a1234#';"

 
strFiltro = "[Cargo] = 'Representante de vendas'"
Set conn = New ADODB.Connection
conn.Open strConn
Set rst = New ADODB.Recordset
With rst
    Set .ActiveConnection = conn
    .Source = "Funcionários"
    .CursorLocation = adUseClient
    .LockType = adLockBatchOptimistic
    .CursorType = adOpenKeyset
    .Open
    .Find strFiltro
    Do While Not .EOF
        .Fields("Cargo") = "Programador VBA"
        .Find strFiltro, 1
    Loop
    .UpdateBatch
End With
rst.Close
Set rst = Nothing
conn.Close
Set conn = Nothing
End Sub

O procedimento usa o método ADO Find para localizar todos os registros que precisam ser modificados. Depois que o primeiro registro é localizado, ele é alterado na memória e a operação de localização prossegue para procurar o próximo registro e assim por diante, até que o final do conjunto de registros seja alcançado. Observe que a seguinte instrução é emitida para pesquisar além do registro atual:

.Find strFiltro, 1

Depois que todos os registros foram localizados e alterados, as alterações são todas confirmadas no Banco de Dados em uma única operação, emitindo a instrução UpdateBatch.

Atualizando dados: diferenças entre ADO e DAO

ADO difere do DAO na forma como as operações de atualização e exclusão são realizadas. No DAO, você deve usar o método Edit do objeto Recordset, antes de fazer qualquer alteração em seus dados. ADO não exige que você faça isso; conseqüentemente, não há método Edit no ADO.  Além disso, no ADO, as suas alterações são salvas automaticamente quando você modifica um registro.  No DAO, deixar uma linha, sem primeiro chamar o método Update do objeto Recordset, descartará automaticamente as alterações.

Excluindo um registro com DAO

Para excluir um registro existente, abra o objeto Recordset chamando o método OpenRecordset e localize o registro que deseja excluir.  Em um conjunto de registros do tipo Tabela, você pode usar o método Seek e um índice de tabela para localizar um registro que atenda aos seus critérios.  Em um conjunto de registros do tipo Dynaset, você pode usar qualquer um dos métodos Find (FindFirst, FindNext, FindPrevious, FindLast) para localizar o registro apropriado.  Em seguida, use o método Delete no objeto Recordset para executar a exclusão.  Antes de usar o método Delete, é uma boa idéia escrever um código para pedir ao usuário que confirme ou cancele a exclusão.  Imediatamente após a exclusão de um registro, não há registro atual. Use o método MoveNext para mover o ponteiro do registro para um registro existente.

O procedimento abaixo exclui os funcionários que possuem o campo Identificação maior que 9.

Sub fncDeleteReg_DAO()
Dim bd As DAO.Database
Dim tblRst As DAO.Recordset
Dim n As Integer
Dim strBd As String
strBd = CurrentProject.Path & "\Registros_ADO_DAO_2.accdb"
Set bd = OpenDatabase(strBd, False, False, ";PWD=a1234#")
' exclui todos os funcionários com identificação maior que 9
Set tblRst = bd.OpenRecordset("Funcionários")
tblRst.MoveFirst
Do While Not tblRst.EOF
    Debug.Print tblRst!Identificação
    If tblRst![Identificação] > 9 Then
        tblRst.Delete
        n = n + 1
    End If
    tblRst.MoveNext
Loop
MsgBox "Número de registros excluídos: " & n
tblRst.Close
Set tblRst = Nothing
bd.Close
Set bd = Nothing
End Sub

A instrução Do While Not tblRst.EOF diz ao Visual Basic para executar as instruções dentro do loop, até que o fim do arquivo (EOF) seja alcançado.  A instrução condicional dentro do loop verifica o valor do campo Identificação e exclui o registro atual apenas se a condição especificada for True.  Cada vez que um registro é excluído, o valor da variável n é aumentado em 1.  Depois que o registro é excluído, o método MoveNext é chamado para mover o ponteiro do registro para o próximo registro existente, desde que o final do arquivo ainda não tenha sido alcançado. Embora você possa usar o método Delete e o loop While para remover os registros necessários, conforme mostrado no exemplo acima, é mais eficiente excluir registros com uma consulta Delete.

Excluindo um registro com ADO

Para excluir um registro, encontre o registro que deseja excluir e chame o método Delete.  Depois de excluir um registro, ele ainda é o registro atual. Você deve usar o método MoveNext para mover para a próxima linha se estiver planejando executar operações adicionais com os seus registros. Uma tentativa de fazer qualquer coisa com a linha que acabou de ser excluída gerará um erro de tempo de execução. O procedimento abaixo exclui um registro da tabela Funcionários.

Sub fncDeleteReg_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strConn As String

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & CurrentProject.Path & _
 "\Registros_ADO_DAO_2.accdb;" & _
 "Jet OLEDB:Database Password='a1234#';"
 
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset

With rst
    .Open "SELECT * FROM Funcionários WHERE " _
    & "[Empresa] ='EletronicaX'", _
    strConn, adOpenKeyset, adLockOptimistic
    .Delete
    .Close
End With

Set rst = Nothing
Set conn = Nothing
End Sub

Excluindo Anexos com DAO

O código abaixo usa o método Delete do objeto Recordset2 para excluir um anexo de um registro de tabela.

Sub fncExcluirAnexo_DAO()
Dim rst As DAO.Recordset2
Dim rstChild As DAO.Recordset2
Dim blnFlag As Boolean
Dim strPath$
strPath = CurrentProject.Path & "\"
Const strFile = "kofap1.gif"
Set rst = CurrentDb.OpenRecordset("Clientes")
' desloca o ponteiro para o quarto registro da tabela. Cliente Christina
rst.Move 3
' obtém o conjunto de registros filho para o campo Anexos
Set rstChild = rst.Fields("Anexos").Value

' busca o arquivo no campo Anexos e o remove se o encontrar
Do Until rstChild.EOF
    If rstChild.Fields("FileName").Value = strFile Then
        rstChild.Delete
        blnFlag = True
    End If
    rstChild.MoveNext
Loop

If Not blnFlag Then
    MsgBox "O arquivo " & strFile & " não existe...", _
    vbOKOnly + vbInformation, "Aviso"
Else
    MsgBox "O arquivo " & strFile & _
    " foi excluído do registro...", _
     vbOKOnly + vbInformation, "Aviso"
End If
' limpa a memória
rstChild.Close
Set rstChild = Nothing
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub

Copiando registros para uma planilha Excel

Você pode copiar o conteúdo de um objeto DAO ou ADO Recordset ,diretamente para uma planilha do Excel ou um intervalo de planilha, usando o método CopyFromRecordset do objeto Workbook Range.

Para copiar todos os registros no objeto Recordset para um intervalo de planilha, começando na célula A1, use a seguinte instrução:

Set rng = objSheet.Cells(2, 1) 
rng.CopyFromRecordset rst

O primeiro, após o nome do método é uma variável de objeto que representa um objeto Recordset.

Para copiar cinco registros para um intervalo de planilha, use a seguinte declaração:

Set rng = objSheet.Cells(2, 1) 
rng.CopyFromRecordset rst, 5

Para copiar cinco registros e quatro campos para um intervalo de planilha, use a seguinte instrução:

Set rng = objSheet.Cells(2, 1) 
rng.CopyFromRecordset rst, 5, 4;

Você também pode especificar o número de registros (linhas) e campos a serem copiados, usando variáveis:

Set rng = objSheet.Cells(2, 1) 
rng.CopyFromRecordset rst, Linhas, Colunas

O procedimento abaixo usa o método CopyFromRecordset para copiar dados da tabela Funcionários para uma planilha do Excel:

Sub fncExportarParaExcel_DAO()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim xlApp As Object
Dim wkb As Object
Dim objSheet As Object
Dim rng As Object
Dim strExcelFile As String
Dim strTable As String
Dim count As Integer
Dim iCol As Integer
Dim rowsToReturn As Integer
strTable = "Funcionários"
strExcelFile = CurrentProject.Path & "\Excel_Access.xls"

' Exclui o arquivo Excel se existir
If Dir(strExcelFile) <> "" Then Kill strExcelFile

Set rst = CurrentDb.OpenRecordset(strTable)
' armazena na variável a quantidade de registros
count = rst.RecordCount
rowsToReturn = CInt(InputBox("Quantos registros quer copiar?"))
If rowsToReturn <= count Then
    ' definir a referência para o Excel
    Set xlApp = CreateObject("Excel.Application")
    ' tornar o Excel visível
    xlApp.Application.Visible = True
    ' definir referências para a pasta de trabalho e planilha do Excel
    Set wkb = xlApp.Workbooks.Add
    Set objSheet = xlApp.ActiveWorkbook.sheets(1)
    objSheet.Activate
    ' escreva os nomes das colunas na primeira linha da planilha
    For iCol = 0 To rst.Fields.count - 1
        objSheet.Cells(1, iCol + 1).Value = rst.Fields(iCol).Name
    Next
    ' especifique o intervalo de células que receberá os dados
    Set rng = objSheet.Cells(2, 1)
    ' copie o número especificado de registros para a planilha
    rng.CopyFromRecordset rst, rowsToReturn
    ' ajuste automático das colunas para ajustar os dados
    objSheet.columns.AutoFit
    ' fecha a pasta de trabalho
    ' e salva no formato de arquivo Excel 97-2003
    wkb.SaveAs FileName:=strExcelFile, FileFormat:=56
    wkb.Close
    ' sair do Excel e liberar as variáveis de objeto
    Set objSheet = Nothing
    Set wkb = Nothing
    xlApp.Quit
    Set xlApp = Nothing
Else
    MsgBox "Especifique um número menor que " & count + 1 & "."
End If
End Sub

Este procedimento cria um conjunto de registros com base na tabela Funcionários e armazena o número total de registros na variável de contagem.  O usuário é solicitado a especificar o número de registros a serem copiados para o Excel.  Se o número especificado for menor ou igual ao número total de registros no conjunto de registros, o código continuará a copiar os registros para o Excel, usando o método CopyFromRecordset. Observe que o procedimento usa a cláusula As Object para declarar variáveis ​​de objeto que passarão a conter referências a objetos do Excel quando o procedimento for executado. Quando você define uma variável de objeto como Object, a variável é atrasada. Isso significa que o VBA não sabe a que tipo de objeto a variável faz referência até que o programa seja executado. Para definir uma referência ao Microsoft Excel, é necessário usar a função CreateObject.  Depois que o objeto é criado (Excel.Application), ele é referenciado com a variável do objeto (xlApp).  A função CreateObject cria uma nova instância do aplicativo Excel.  Para usar a instância atual ou iniciar o Excel e carregar um arquivo específico enquanto o Excel já está em execução, use a função GetObject. Para visualizar o que está acontecendo enquanto o procedimento está em execução, defina a propriedade Visible do aplicativo Microsoft Excel como True. Então, se você executar o procedimento no modo de etapas (pontos de interrupção), poderá verificar o conteúdo da janela do Excel à medida que executa cada instrução.

Antes de copiar os dados do Access para a planilha do Excel, você precisa definir referências aos objetos Pasta de trabalho, Planilha e Intervalo. Depois que essas referências são definidas, o procedimento usa o método Add para adicionar uma nova pasta de trabalho do Excel e, em seguida, ativa a primeira planilha. Os nomes dos campos do conjunto de registros são escritos como nomes de coluna na primeira linha da planilha.  Em seguida, a referência é definida para o objeto Range que receberá os dados do conjunto de registros. O método CopyFromRecordset é usado para copiar o número especificado de registros para a planilha.  Depois que os dados são colocados na planilha, eles são ajustados às colunas com a propriedade AutoFit.  A planilha do Excel é salva no formato de arquivo compatível com o Excel 97-2003.  O método SaveAs da pasta de trabalho requer o parâmetro FileFormat que especifica o formato do arquivo para a pasta de trabalho.  Os seguintes formatos de arquivo são usados no Excel:

51 = xlOpenXMLWorkbook (without macro's in 2007-2019, xlsx)
52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2019, xlsm)
50 = xlExcel12 (Excel Binary Workbook in 2007-2019 with or without macro's, xlsb)
56 = xlExcel8 (97-2003 format in Excel 2007-2019, xls)

Depois de salvar a pasta de trabalho, o procedimento usa o método Workbook Close para fechar o arquivo do Excel. O método Quit do objeto Aplicativo Excel é usado para fechar o aplicativo Excel.

Copiando registros para um documento do Word

Existem várias técnicas para colocar dados do Microsoft Access em um documento do Microsoft Word.  O procedimento abaixo demonstra como usar o método GetString do Recordset para inserir dados da tabela de dados de fornecedores em um documento do Word recém-criado.  O exemplo abaixo mostra como inserir dados da tabela Fornecedores e formatar a saída usando o objeto Tabela do Word.

Escolha Ferramentas | Referências na janela Editor do Visual Basic. Role para baixo para localizar Microsoft Word xx.x Object Library, clique na caixa de seleção ao lado dela e, em seguida, clique em OK para sair.

Option Compare Database

Public myWord As Word.Application

Sub fncExportarParaWord_ADO()
Dim rst As ADODB.Recordset
Dim doc As Word.Document
Dim strSQL As String
Dim varRst As Variant
Dim f As Variant
Dim strHead As String
Set rst = New ADODB.Recordset

strSQL = "SELECT Empresa,Nome,Cargo "
strSQL = strSQL & "FROM Fornecedores;"

rst.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, _
 adLockReadOnly, adCmdText
 
' recuperar dados e cabeçalhos de tabela em variáveis
If Not rst.EOF Then
    varRst = rst.GetString(adClipString, , vbTab, vbCrLf)
    For Each f In rst.Fields
        strHead = strHead & f.Name & vbTab
    Next
End If
' observe que o aplicativo do Word está declarado
' no topo do módulo
Set myWord = New Word.Application
' cria um novo documento do Word
Set doc = myWord.Documents.Add
myWord.Visible = True
' colar o conteúdo das variáveis no documento do Word
doc.Paragraphs(1).Range.Text = strHead & vbCrLf
doc.Paragraphs(2).Range.Text = varRst
On Error GoTo TrataErro
doc.Close SaveChanges:=wdPromptToSaveChanges
Sair:
    myWord.Quit
    Set myWord = Nothing
    Exit Sub
TrataErro:
    If Err = 4198 Then
        MsgBox "Você se recusou a salvar este documento..."
    End If
    Resume Sair
End Sub

Este procedimento usa o método GetString do objeto Recordset para retornar os dados do conjunto de registros como uma variante com valor de string.  Antes de executar este procedimento, você deve definir uma referência para a Biblioteca de objetos do Microsoft Word Versão xx.x. Essa referência permite que o procedimento acesse objetos, propriedades e métodos do aplicativo Word por meio de sua própria biblioteca.  A parte superior do módulo contém a declaração da variável de objeto myWord que apontará para o aplicativo Word.  Observe que essa variável é declarada com o Escopo Público; portanto, ele pode ser acessado por outros procedimentos no projeto VBA atual. (O próximo exemplo prático também usa essa variável.)

Para iniciar o Word e criar um novo documento, definimos o objeto Aplicativo como uma nova instância do Word.Application, usando a palavra-chave New:

Set myWord = New Word.Application

Para trabalhar com um documento do Word, o método Add da coleção de documentos do Word é usado para criar um documento em branco.  Armazenamos a referência a este documento na variável do objeto doc.  Para permitir que o usuário veja o que está acontecendo enquanto o procedimento está em execução, a propriedade Visible do aplicativo Word é definida como True.  Em seguida, o conteúdo do Recordset e os nomes dos campos que salvamos anteriormente nas variáveis de string são gravados no documento do Word usando a propriedade Paragraphs do objeto Document. O procedimento termina solicitando ao usuário que salve as alterações no documento do Word.  Se o usuário não optar por salvar o documento, o erro 4198 será acionado.

Vamos a outro exemplo, usando o DAO.  Este procedimento usa a variável de objeto myWord que foi declarada no exemplo anterior.

Sub fncExportarParaWord_DAO()
Dim doc As Word.Document
Dim wrdTbl As Word.Table
Dim rst As DAO.Recordset
Dim f As Variant
Dim numRows As Integer
Dim numCols As Integer
Dim r As Integer
Dim c As Integer
Set rst = CurrentDb.OpenRecordset("Notas Fiscais")
' contador de linha
numRows = rst.RecordCount
' contador de coluna
numCols = rst.Fields.count
Set myWord = New Word.Application
' cria um novo documento do Word
Set doc = myWord.Documents.Add
' inserir a tabela
Set wrdTbl = doc.Tables.Add _
 (doc.Range, numRows + 1, numCols)
c = 1
If numRows > 0 Then
    ' Cria os títulos das colunas nas células da tabela
    For Each f In rst.Fields
        wrdTbl.Cell(1, c).Range.Text = f.Name
        c = c + 1
    Next f
End If
r = 2
Do While Not rst.EOF
    For c = 1 To numCols
        wrdTbl.Cell(r, c).Range.Text = Nz(rst.Fields(c - 1).Value)
    Next c
    r = r + 1
    rst.MoveNext
Loop
myWord.Visible = True
rst.Close
Set rst = Nothing
Set myWord = Nothing
End Sub

Copiando registros para um arquivo de Texto

Para gravar registros em um arquivo de texto, salve-os como uma string usando o método GetString do objeto Recordset. Em seguida, crie um arquivo de texto com o método CreateTextFile do FileSystemObject da Microsoft Scripting Runtime Library.

O procedimento abaixo demonstra como gravar os registros da tabela Detalhes do Pedido em um arquivo de texto denominado TesteArq.txt

Sub fncExportarTxt_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim f As ADODB.Field
Dim fso As Object
Dim txtfile As Object
Dim strFileName As String
Set conn = New ADODB.Connection

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & CurrentProject.Path & _
 "\Registros_ADO_DAO_2.accdb;" & _
 "Jet OLEDB:Database Password='a1234#';"
 
strFileName = CurrentProject.Path & "\TesteArq.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set txtfile = fso.CreateTextFile(strFileName, True)
Set rst = New ADODB.Recordset
rst.Open "[Detalhes do pedido]", conn
For Each f In rst.Fields
    ' Escreva o nome do campo no arquivo de texto
    txtfile.Write (Nz(f.Name))
    txtfile.Write Chr(9) 'ou vbTab
Next
' move para uma nova linha txtfile.WriteLine
' escreva todos os registros no arquivo de texto
txtfile.WriteLine
txtfile.Write rst.GetString(adClipString, , vbTab, vbCrLf)
rst.Close
txtfile.Close
Set rst = Nothing
conn.Close
Set conn = Nothing
End Sub

Este procedimento usa a função CreateObject para acessar o FileSystemObject. O objeto File é criado usando o método CreateTextFile de FileSystemObject.  O primeiro argumento deste método especifica o nome do arquivo a ser criado e o segundo argumento (True) indica que o arquivo deve ser sobrescrito, se ele já existir.  Em seguida, o procedimento itera por meio do conjunto de registros com base na tabela Detalhes do Pedido e grava os nomes dos campos no arquivo de texto, usando o método Write do objeto File.  Os dados do conjunto de registros são convertidos em uma string usando o método GetString do objeto Recordset e então, gravados no arquivo de texto usando o método Write do objeto File.

O arquivo de texto é fechado com o método Close.

Filtrando registros usando a cláusula WHERE da SQL

Quando você deseja trabalhar apenas com um determinado subconjunto de registros, pode filtrar os registros que não deseja ver, usando a cláusula SQL WHERE ou a propriedade Filter.  Você pode aplicar um filtro a um objeto Recordset do tipo Dynaset ou Snapshot.  A maneira mais rápida de filtrar registros é abrir um novo objeto Recordset usando uma instrução SQL que inclui uma cláusula WHERE. O exemplo abaixo demonstra o uso da cláusula SQL WHERE para recuperar pedidos de produtos com uma quantidade de pedidos superior a 100.  Exemplo de código, usando o DAO:

Sub fncFiltro_SQL_WHERE_DAO()
Dim rst As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim qryNome As String
Dim strSQL As String

On Error Resume Next
qryNome = "qryPedidosMaiorQue100"

DoCmd.DeleteObject acQuery, qryNome

strSQL = "SELECT * FROM " _
 & "[Detalhes do pedido] WHERE Quantidade > 100;"
 
Set qdf = CurrentDb.CreateQueryDef(qryNome)
qdf.SQL = strSQL
Set rst = CurrentDb.OpenRecordset(qryNome)
' move ponteiro até final e retorna ao início,
' necessário para realizar a contagem
rst.MoveLast: rst.MoveFirst

Debug.Print "Existem " & rst.RecordCount & _
 " pedidos com quantidade maior que 100."
 
rst.Close
Set rst = Nothing
Set qdf = Nothing
End Sub

Este procedimento cria uma consulta Selecionar simples, com base na tabela Detalhes do Pedido. A cláusula SQL WHERE na instrução SQL especifica que apenas os pedidos com uma quantidade maior que 100 devem ser retornados.  Se a expressão contida na cláusula WHERE for True, o registro será selecionado; caso contrário, o registro é excluído do conjunto de registros aberto.

O procedimento abaixo abre um conjunto de registros da tabela Clientes, listando apenas os Gerentes de Compras da cidade de New York .

Código exemplo usando o ADO:

Sub fncFiltro_SQL_WHWRE_ADO()
Dim rst As ADODB.Recordset
Dim strSQL As String

strSQL = "SELECT * FROM Clientes WHERE Cidade ='New York'" & _
 " AND cargo = 'Gerente de Compras' "
 
Set rst = New ADODB.Recordset
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

MsgBox "Existem " & rst.RecordCount & " registros..."

rst.Close
Set rst = Nothing
End Sub

Filtragem de registros, usando a propriedade FILTER

Você pode usar a propriedade DAO ou ADO Filter para obter um conjunto de registros que atendam a critérios específicos.

O exemplo abaixo usa a propriedade Filter com o DAO Recordset para restringir o subconjunto de registros àqueles em que a cidade do funcionário começa com a letra "R."

Sub fncFilterReg_DAO()
Dim rst As DAO.Recordset
Dim FiltroRst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Funcionários", dbOpenDynaset)
rst.Filter = "Cidade like 'R*'"
Set FiltroRst = rst.OpenRecordset()
Do Until FiltroRst.EOF
    Debug.Print FiltroRst.Fields("Sobrenome").Value
    FiltroRst.MoveNext
Loop
FiltroRst.Close
Set FiltroRst = Nothing
rst.Close
Set rst = Nothing
End Sub

Este procedimento começa abrindo um objeto Recordset do tipo Dynaset com base na tabela Funcionários e definindo a propriedade Filter neste conjunto de registros:

rst.Filter = "Cidade like 'R*'"

Para que o filtro tenha efeito depois de defini-lo, você deve abrir um novo conjunto de registros com base no objeto Conjunto de registros ao qual o filtro foi aplicado:

Set FiltroRst = rst.OpenRecordset()

Em seguida, o procedimento grava na janela Verificação Imediata o valor do campo Sobrenome para todos os registros no conjunto de registros filtrado.

O procedimento abaixo cria uma exibição filtrada de clientes listados que estão localizados em Boston, EUA.

Código exemplo usando o ADO:

Sub fncFilterReg_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Set conn = New ADODB.Connection

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & CurrentProject.Path & _
 "\Registros_ADO_DAO_2.accdb;" & _
 "Jet OLEDB:Database Password='a1234#';"
 
Set rst = New ADODB.Recordset
rst.Open "Clientes", conn, adOpenKeyset, adLockOptimistic
rst.Filter = "Cidade='Boston' And [País/Região]='EUA'"

MsgBox rst.RecordCount & " registros atendem aos critérios...", _
vbInformation, "Clientes de Boston"
    
Do Until rst.EOF
    Debug.Print rst.Fields(1).Value
    rst.MoveNext
Loop
rst.Filter = adFilterNone
MsgBox "Filtro removido... " & vbCr & vbCr _
 & "A tabela Clientes contém " & rst.RecordCount & " registros..."
rst.Close
Set rst = Nothing
conn.Close
Set conn = Nothing
End Sub

Este procedimento define o filtro na tabela Clientes e exibe os registros filtrados.  Em seguida, o filtro é removido definindo a propriedade Filter como adFilterNone.

Use a propriedade Filter como uma solução alternativa para o método ADO Find sempre que precisar localizar registros que atendam a mais de uma condição. Se o conjunto específico de registros que você deseja obter estiver localizado no SQL Server, você deve usar procedimentos armazenados em vez da propriedade Filter.

Classificando Registros

Você pode usar a propriedade Sort do objeto Recordset para alterar a ordem em que os registros são exibidos. A propriedade Sort não reorganiza fisicamente os registros; ele simplesmente exibe os registros na ordem especificada pelo índice.  Se você estiver classificando em campos não indexados, um índice temporário será criado para cada campo especificado no índice. Este índice é removido automaticamente quando você define a propriedade Sort como uma string vazia.  No ADO, você só pode usar Classificar em cursores do lado do cliente. Se você usar o cursor do lado do servidor, receberá este erro: “A operação solicitada pelo aplicativo não é compatível com o provedor.”

A ordem de classificação padrão é crescente. Para ordenar um conjunto de registros por país em ordem crescente e, a seguir, por cidade em ordem decrescente, você usaria a seguinte instrução:

rst.Sort = "País ASC, Cidade DESC" 

Embora você possa usar a propriedade Sort para classificar seus dados, provavelmente obterá melhor desempenho especificando uma cláusula SQL ORDER BY na instrução ou consulta SQL usada para abrir o conjunto de registros.  O procedimento abaixo exibe os registros dos clientes em ordem decrescente por cidade.

Sub fncSortReg_ADO()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Set conn = New ADODB.Connection

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
 "Data Source=" & CurrentProject.Path & _
 "\Registros_ADO_DAO_2.accdb;" & _
 "Jet OLEDB:Database Password='a1234#';"
 
Set rst = New ADODB.Recordset
With rst
    .CursorLocation = adUseClient 'lado do cliente
    .Open "Clientes", conn, adOpenKeyset, adLockOptimistic
    .Sort = "[cidade] DESC"
    Do Until .EOF
        Debug.Print .Fields("cidade").Value & ": " & _
        .Fields("sobrenome").Value
        .MoveNext
    Loop
    .MoveFirst
    Debug.Print "Ordem de classificação original...";
    .Sort = Empty
    Do Until .EOF
        Debug.Print rst.Fields("cidade").Value & ": " & _
        .Fields("sobrenome").Value
        .MoveNext
    Loop
    .Close
End With
Set rst = Nothing
conn.Close
Set conn = Nothing
End Sub

Neste procedimento, após classificar os registros na ordem especificada, a propriedade Sort é definida como uma string vazia (Empty) e os registros são exibidos na ordem em que aparecem fisicamente na tabela.

Baixar Arquivo Zip

Para você que é meu assinante, baixe o arquivo Zip.  Ao descompactar, os seguintes arquivos estarão disponíveis:

- Registros_ADO_DAO.accdb (este é o arquivo que contém os procedimentos)
- Registros_ADO_DAO_2.accdb (senha: a1234#)
- Kofap1.gif

Sucesso!


 

 


 

Envie seu comentário:



4 comentários

Jeser Borges Cotrim   02/07/2023 11:54:10

Olá AVelino! Feliz Ano Novo!
Faz muito tempo que não faço contato contigo. Achei até que não estava mais na ativa.
Por favor, me dê um "help". Como faço para preencher uma "combobox" de um formulário no EXCEL usando um banco de ados do ACCESS?
Desde já, agradeço pela sua atenção, lhe desejando uma Feliz Ano Novo! Que seja realmente com saúde e de grandes realizações! Forte abraço!

Cleber   10/09/2022 18:49:14

Tenho um Servidor de Dados uma maquina na rede com SQL Server 2017.
no dominio tenho minha maquinas acessando o sistema. hj uso a vinculo das tabelas porem se a maquina nao esta no dominio fica pedindo a senha do DSN criado para vincular as tabelas.

Gostaria de um exemplo simples de conexão a esse banco de dados. Tipo ter um modulo com a conexão onde insiro os dados da conexao, endereço do Servidor, senha so msm.

E uma função tipo ao carregar o formulario que chama a funçao conexao e executa a query para aquele formulario.

Rogério   03/11/2020 04:17:54

Sempre uma boa surpresa em cada artigo.
Muito obrigado!

Washington   01/11/2020 16:06:58

Que conteúdo! Obrigado mais uma vezes por uma grande aula. Aprendendo cada dia mais.