Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Azelha

Navegação entre registos.

Mensagens Recomendadas

Azelha

Já tive algumas "brincadeiras" com access mas nunca me aventurei com a conexão via VBA, hoje experimentei! Uma tabela e formulário fiz umas buscas, (Que grande confusão) mas consegui ligar-me à base de dados e à tabela, onde inseri 3 registos, para os visualizar no formulários, mas não consegui navegar entre os registos, tenho este código.


Option Compare Database
Option Explicit

Dim cnx As ADODB.Connection
Dim rst As ADODB.Recordset

Private Sub cmdPrevious_Click()
If rst.BOF And rst.EOF Then
rst.MovePrevious
End If
End Sub

Private Sub cmdSeguinte_Click()
If rst.BOF And rst.EOF Then
rst.MoveNext
End If
End Sub

Private Sub Form_Load()
Set cnx = New ADODB.Connection
cnx.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0; Data Source = C:\Users\daddy\Desktop\tstConectaAdo\dbConnecta.mdb"
cnx.Open

Set rst = New ADODB.Recordset
rst.Open "tblTeste", cnx, adOpenKeyset, adLockOptimistic
rst.MoveLast

txtCamp1 = rst.Fields("Campo1")
txtCamp2 = rst.Fields("Campo2")

End Sub

Será que me podem ajudar?

Obrigado

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Azelha

Resolvido em parte, agora movimento-me pelo registos mas ao chegar ao fim dos registos (Primeiro ou ultimo) tenho uma mensagem de erro e o código pára.errojy.png

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

verifica se não estás fora da tabela (talvez o bof ou eof sejam true)

coloca breakspoints e verifica aonde dá o erro.

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Azelha

Por desconhecimento não posso especificar erro, mas dito dessa forma o erro ocorre quando sai da tabela. o Debug aponta para

txtCamp1 = rst.Fields("Campo1")

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

Por desconhecimento não posso especificar erro, mas dito dessa forma o erro ocorre quando sai da tabela. o Debug aponta para

txtCamp1 = rst.Fields("Campo1")

Obrigado

boas só agora reparei no campop falta .text

assim : txtCamp1.text

cumps

acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

Não esse não é o problema. Ao alterar a propriedade para text nem abre a aplicação!

não é uma caixa de texto?

para receber o valor é na propriedade text.

edit:

tenta assim:

txtCamp1.text = rst.Fields("Campo1")

'ou
txtCamp1.text = rst.Fields(0) ' o zero significa o numero da coluna

' ou assim
txtCamp1.text = rst!Campo1

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Azelha

Fiz alteração proposta e a aplicação deu erro ao abrir, (Qualquer coisa sobre foco no objecto) mas não posso de forma alguma contrapor o que me diz, mas parto dum principio lógico, se as caixas de texto do formulário (Access) navegam pelos 3 registos preenchidos na tabela e o erro apenas ocorre quando eu "por engano forço o acesso ao ID 0 ou ID 4", registos estes que não existem, parece-me que não é uma questão de receber o valor, o problema é não ter valor na tabela para mostrar. Portanto é necessário impedir "a coisa" de tentar aceder a registos que não existem.

Não sei se é possível mas tenho aqui o "projecto" h**p://maximoaccess.maisforum.com/download.forum?id=3412

Obrigado pela atenção dispensada.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Azelha

Peço desculpa, eu tinha a solução, só que me esqueci, Resolvido

Dim cnx As ADODB.Connection
Dim rst As ADODB.Recordset
Dim numreg As Integer
Sub carrega()
If Not (rst.BOF = True Or rst.EOF = True) Then
txtCamp1 = rst.Fields(1)
txtCamp2 = rst.Fields(2)
Else
MsgBox ("Chegou ao fim dos registos"), vbCritical
End If
End Sub
Private Sub cmdCount_Click()
numreg = rst.RecordCount
MsgBox "Existem " & numreg
End Sub
Private Sub cmdPrevious_Click()
If Not (rst.BOF = True) Then
rst.MovePrevious
carrega
End If
End Sub

Private Sub cmdSeguinte_Click()
If Not (rst.EOF = True) Then
rst.MoveNext
carrega
End If
End Sub

Private Sub Form_Load()
Set cnx = New ADODB.Connection
cnx.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0; Data Source = C:\Users\daddy\Desktop\tstConectaAdo\dbConnecta.mdb"
cnx.Open
Set rst = New ADODB.Recordset
rst.Open "select * from tblTeste", cnx, adOpenKeyset, adLockOptimistic
rst.MoveLast
carrega
End Sub

Editado por apocsantos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao

boas

Private Sub cmdPrevious_Click()
If rst.BOF And rst.EOF Then
msgbox("não existem registos")
else
rst.MovePrevious
'se der erro aqui colocas «txtCamp1.setfocus»
txtCamp1.text = rst!Campo1
'e aqui «txtCampo2.setfocus
txtCamp1.text = rst!Campo2

End If
End Sub

Private Sub cmdSeguinte_Click()
If rst.BOF And rst.EOF  Then
msgbox("não existem registos")
else
rst.MoveNext
if rst.EOF Then  'se estiver fora dos registos ou seja no fim da tabela
MsgBox("não tem mais registos")
else
'se der erro aqui colocas «txtCamp1.setfocus»
txtCamp1.text = rst!Campo1
'e aqui «txtCampo2.setfocus
txtCamp1.text = rst!Campo2
End if
End If
End Sub

cumps

acao

Editado por acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Azelha

Esta parte foi resolvida, passei à fase seguinte e apesar de muito googlar não encontrei nada suficiente simples ou esclarecedor para me ajudar no proximo passo.

Acima tenho a parte do código referente ao formulário frmTeste, o codigo abaixo refere-se ao subform de CONTÍNUNO ligado à respectiva tabela

Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Private Sub Form_Load()
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0; Data Source = C:\Users\daddy\Desktop\tstConectaAdo\dbConnecta.mdb"
cnn.Open
Set rs = New ADODB.Recordset
rs.Open "select * from tblProduto", cnn, adOpenDynamic, adLockReadOnly

txtMarca = rs.Fields(2)
txtModelo = rs.Fields(3)
End Sub

O que eu pretendo é relacionar / sincronizar o subform com o formulário, para preencher as tabelas.

Um problema que já notei, para testar o subformulário, preenchi alguns registos da tabela correspondente, (ID duplicação autorizada) creio que, como normalmente sucede o subformulário CONTÍNUO deveria abrir tantas linhas quantas o ID correspondente, no entanto só abre uma linha.

Obrigado pela atenção.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.