Access inicio | | | | | |
Olá,
Seja Bem Vindo ao Blog.

Conecte-se ou registre-se e utilize gratuitamente este equipamento, temos exemplos referente a criação de banco de dados e desenvolvimento de softwares e programas utilizando o Microsoft Access.


Administração do Blog AccessDoProgramador.

Access e VBA, usando os itens do recordset nas ações de loop

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

06092012

Mensagem 

Access e VBA, usando os itens do recordset nas ações de loop






No artigo passado eu abordei um loop que transportava somente a primeira letra da string de uma coluna para outra usando a estrutura For Next: ( Veja aqui se desejar ). Hoje irei falar sobre algo parecido porém darei ênfase ao uso de itens do recordset na manipulação de registros. Ainda que também demonstrarei o transporte e concatenação de dados de duas colunas em uma terceira coluna utilizando a estrutura Do While Loop.

Então.. Os recordset’s numeram suas colunas que iniciam a partir do zero. Essa numeração é nomeada como Item.
A sintaxe é:
Variável Recordset(item)

Vamos supor que a variável chamada Rs signifique o nosso recordset, então considere o seguinte trecho de código:

Rs.Edit
Rs(3) = Rs(1) & “ e “ & Rs(2)
Rs.Update

Claramente detectamos que aí foi usado os itens para manipular o conjunto de registros, ou seja, manipular os registros contidos no recordset.

Para você entender irei formular o seguinte exemplo:
Criarei uma tabela que chamarei tabIndex contendo os campos:
Id, CampoA, CampoB e CampoC

Agora quero percorrer registro a registro e quero com isso armazenar os registros do CampoA e CampoB no CampoC.

O código ficaria assim:

'Inicio o tratamento de erros
On Error GoTo TratareiErro
'Declaro a variável Rs que referenciará o objeto Recordset
Dim Rs As DAO.Recordset
'Instancio o Recordset, ou seja, o conjunto de registros
Set Rs = CurrentDb.OpenRecordset("tabIndex")

'Aqui inicio o loop
'Enquanto não chegar no ultimo registro estarei percorrendo a tabela

Do While Not Rs.EOF

  'Passando pelo registro e abrindo edição
  Rs.Edit
 
  'Realizando edição preenchendo o CampoC com
  'os valores dos Campos A e B

  Rs(3) = Rs(1) & " e " & Rs(2)
 
  'Atualizando o registro
  Rs.Update

  'Indo ao próximo registro
  Rs.MoveNext


'Para copreender o loop, perceba que ao passar pelo método MoveNext
'voltamos novamente lá pra cima apartir de Do While ...
'Só executaremos Rs.Close quando passar por todos os registros,
'quando passar pelo ultimo.

Loop

'Fecho o recordset, uma vez que não o percorrerei mais.
Rs.Close

'Envio a mensagem ao usuário, informando a conclusão
MsgBox "Loop completado com sucesso." _
      & vbCrLf & "Abra a tabela tabIndex e veja o resultado.", vbInformation, "Concluído"


'Se o algoritmo funcionou, então encerro o tratamento de erro
Exit_TratareiErro:
Exit Sub

'Se algo inesperado acontecer e impedir o correto funcionamento do algoritmo
'Então disparo o tratamento de erro

TratareiErro:
MsgBox "Aconteceu falha neste processamento." _
      & vbCrLf & "Trata-se do erro n°: " & Err.Number _
      & vbCrLf & "Descrição: " & Err.Number, vbInformation, "Erro inesperado"

     
Exit Sub


Link para download do exemplo:
Download

Diante deste simples e funcional exemplo, para melhor interpretação analisaremos graficamente os itens Rs(0), Rs(1), Rs(2) e Rs(3):

Vejamos que a partir da hora que no código escrevi:
Set Rs = CurrentDb.OpenRecordset(“tabIndex”)
Os itens foram memorizados na forma original da tabela, veja:

Modo estrutura:


Modo visualização:



Abaixo veja novamente o trecho de código e compare com a representação gráfica acima. Ficou claríssimo a manipulação dos itens no loop não acha ?
Rs.Edit
Rs(3) = Rs(1) & “ e “ & Rs(2)
Rs.Update


Atenção que se for montar o recordset usando SQL a posição dos itens podem se alterar. Se ao invés de (“tabIndex”) eu optasse por montar o recordset assim:

("SELECT Id, CampoB, CampoA, CampoC FROM tabIndex")

O item do campo Id seria = Rs(0)
O item do campoA seria = Rs(2)
O item do campoB seria = Rs(1)
O item do campoC seria = Rs(3)

Repare que os itens seriam memorizados de acordo com a sequência assumida na instrução e com isso o resultado da manipulação dos registros seria outro.

Pratique.

Até a próxima! study


Última edição por Dilson em Ter 4 Abr 2017 - 22:31, editado 2 vez(es)


avatar
Dilson
Facilitador
Facilitador

Brasil


http://www.dadosweb.com

Voltar ao Topo Ir em baixo

- Tópicos similares
Compartilhar este artigo em: BookmarksDiggRedditDel.icio.usGoogleLiveSlashdotNetscapeTechnoratiStumbleUponNewsvineFurlYahoo!Smarking

Access e VBA, usando os itens do recordset nas ações de loop :: Comentários

Mensagem em Ter 31 Dez 2013 - 17:10 por sf9912

Achei muito boa a explicação. Poderia ter sido melhorada se tratasse também de CurrentDb(), Database, OpenRecordset, RS.close, RS.MoveNext, RS.EOF, MoveFirst e MovePrevious. De qq forma está de parabéns pela simplicidade e iniciativa.
 Wink

Voltar ao Topo Ir em baixo

avatar

Mensagem em Sab 4 Jan 2014 - 11:33 por Dilson

Olá obrigado. A idéia desse espaço é exatamente tratar aos poucos essas questões, pois o processo de aprendizagem da linguagem para a maioria é lento e necessita dessa fragmentação. Vou tomar como nova idéia para começar falar dos outros objetos que citou. Obrigado por sua participação.
 Very Happy 

Voltar ao Topo Ir em baixo

Mensagem em Sab 12 Abr 2014 - 8:09 por agomar.martins

Olá Dilson,

Primeiramente quero dizer que gostei muito do post e também do blog, a forma como é explicado cada passo é de fácil entendimento. Parabéns.
Segundo: estou com uma problema que está me dando dor de cabeça.

tenho o seguinte código:

Código:
Sub pesquisa_dado()

    Dim i As Long
    Dim idMenu As Long

    conecta
    
    Sheets("Descrição Macro-Flex").Select

    idMenu = Range("B70").Value
    
    Sheets("Campos-DTS").Select

    i = 2

    gSQL = " USE TRAINING_COREDB " & vbNewLine & vbNewLine & _
           " SET NOCOUNT ON " & vbNewLine & vbNewLine & _
           " SELECT " & _
           "    LI.NM_PARAMETER , " & _
           "    LI.DE_PARAMETER, " & _
           "    LI.NU_START_POSITION, " & _
           "    LI.NU_LENGTH, " & _
           "    LI.NU_ORDER " & _
           " FROM LAYOUT_ITEM LI " & _
           " JOIN LAYOUT L ON LI.ID_LAYOUT = L.ID_LAYOUT " & _
           " JOIN LAYOUT_GROUP LG ON L.ID_LAYOUT_GROUP = LG.ID_LAYOUT_GROUP " & _
           " WHERE LG.ID_MENU = " & idMenu & vbNewLine & vbNewLine & _
           " SET NOCOUNT OFF "
          
    MsgBox gSQL
    
   Set gRs = gCon.Execute(gSQL)

    If Not (gRs.EOF) Then
        
        Do While Not gRs.EOF
            Range("A" & i) = gRs!NM_PARAMETER
            i = i + 1
            gRs.MoveNext
        Loop
    
    End If
    
    Set gRs = Nothing

gCon.Close
End Sub

e quando a execução chega na linha: If Not (gRs.EOF) Then ocorre o seguinte erro:

 Erro em tempo de execução '3704:'
Operação não permitida quando o objeto está fechado.

Pode me ajudar?

Voltar ao Topo Ir em baixo

avatar

Mensagem em Sab 12 Abr 2014 - 10:58 por Dilson

Olá amigo, que bom que gostou, seja bem vindo a essa sala de discussão.

Vejo que o código é para planilha do excel e não tenho domínio algum quando o ambiente é esse. No entanto, posso ajudar na lógica na medida do possível:

Diga o que pretende que o código faça ?

Voltar ao Topo Ir em baixo

Mensagem  por Conteúdo patrocinado

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum