Azelha Posted December 17, 2012 at 02:51 PM Report #487507 Posted December 17, 2012 at 02:51 PM (edited) 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 Edited December 17, 2012 at 06:20 PM by apocsantos
Azelha Posted December 17, 2012 at 05:34 PM Author Report #487524 Posted December 17, 2012 at 05:34 PM 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.http://img836.imageshack.us/img836/901/errojy.png
acao Posted December 17, 2012 at 06:42 PM Report #487535 Posted December 17, 2012 at 06:42 PM (edited) 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 Edited December 17, 2012 at 07:06 PM by acao
Azelha Posted December 17, 2012 at 07:30 PM Author Report #487544 Posted December 17, 2012 at 07:30 PM 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
acao Posted December 17, 2012 at 07:55 PM Report #487545 Posted December 17, 2012 at 07:55 PM 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
Azelha Posted December 17, 2012 at 08:10 PM Author Report #487546 Posted December 17, 2012 at 08:10 PM Não esse não é o problema. Ao alterar a propriedade para text nem abre a aplicação!
acao Posted December 17, 2012 at 08:17 PM Report #487549 Posted December 17, 2012 at 08:17 PM (edited) 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 Edited December 17, 2012 at 08:24 PM by acao
Azelha Posted December 17, 2012 at 08:50 PM Author Report #487562 Posted December 17, 2012 at 08:50 PM 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.
Azelha Posted December 17, 2012 at 09:32 PM Author Report #487571 Posted December 17, 2012 at 09:32 PM (edited) 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 Edited December 19, 2012 at 01:15 AM by apocsantos
acao Posted December 17, 2012 at 09:34 PM Report #487572 Posted December 17, 2012 at 09:34 PM (edited) 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 Edited December 17, 2012 at 09:35 PM by acao
Azelha Posted December 19, 2012 at 12:15 AM Author Report #487775 Posted December 19, 2012 at 12:15 AM 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now