LIGAR TABELAS, FORMS E SUBFORMS

ABACLAR 29/12/2012 14:37:54
#416543
O projecto passa por usar duas tabelas (tblTab1 e tblTab2) ligadas ao Form1 e subForm2 escrevi o seguinte código para o form1 ...


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

Sub liga()
txtCamp1 = rst.Fields([Ô]Campo1[Ô])
txtCamp2 = rst.Fields([Ô]Campo2[Ô])
End Sub

Private Sub Form_Load()
cnx.ConnectionString = [Ô]provider=Microsoft.jet.oledb.4.0; Data source = C:\Users\daddy\Desktop\vbtstConect    stConnVb.mdb[Ô]
cnx.Open
rst.Open [Ô]tblTab1[Ô], cnx, adOpenKeyset, adLockOptimistic
liga
End Sub


Para o subForm2, num 2º módulo fiz a mesma coisa! Fiz mais algumas coisas sem qualquer efeito.

No Form1 acrescentei os botões [Ô]move next[Ô] e [Ô]moveprevious[Ô], mas apesar de ter relacionado as tabelas pelo método Access [Ô]um-para-muitos[Ô], os botões não tem qualquer acção sobre o subForm2.

O meu pedido de ajuda, relaciona-se com isto como é que eu relaciono as duas tabelas por forma a que os botões tenham acção sob os registos do subForm2.

Obrigado

PROFESSOR 29/12/2012 19:38:15
#416565
Não ficou muito claro, mas ao que parece, em cada formulário você está carregando os dados de uma tabela distinta, por meio de dois recordsets igualmente distintos. Desta forma, os dois recordsets não estão relacionados no código VB, ok?
Para que ao mover-se de registro em um dos forms, o outro reflita isto, carregando apenas os registros [Ô]filhotes[Ô], será necessário: 1. - Coletar e enviar ao segundo formulário o código de registro do item selecionado no primeiro formulário;
2. - Filtrar o recordset do segundo formulário com base no código recebido desde o primeiro formulário.

De modo prático, alguém criaria uma variável pública ou global, do tipo inteiro longo, que receberia o ID do registro selecionado no primeiro formulário e seria utilizado então pelo segundo formulário.

Eu pessoalmente não faria isso, pois esse tipo de variável é visível ao aplicativo, e pode ser alterada em qualquer momento por outro trecho de código que inadvertidamente utilizasse uma variável homônima. Ao contrário, eu criaria uma propriedade pública no segundo formulário, do tipo inteiro longo, que ao ser alterada, carregaria o recordset já filtrado via instrução SQL e atualizaria os dados nos componentes. Seria algo parecido com:


[ô]...
[ô] No Formulário 2:
Private mCodigo As Long
[ô]...
Public Property Set Codigo(ByVal newValue As Long)
Me.mCodigo = newValue
Dim cs As String
Dim sq As String
cs = [Ô]provider=Microsoft.jet.oledb.4.0; Data source = C:\Users\daddy\Desktop\vbtstConect    stConnVb.mdb[Ô]
sq = [Ô]SELECT [campo1],[campo2],...[campoN] FROM tblTab1 WHERE ([campoCodigo]=[Ô] & Me.mCodigo & [Ô])[Ô]
rst.Open sq, cs, adOpenKeyset, adLockOptimistic
txtCamp1.Text = rst.Fields([Ô]Campo1[Ô]).Value
txtCamp2.Text = rst.Fields([Ô]Campo2[Ô]).Value
rst.Close
End Property
[ô]...


é claro, no formulário 1, assim que o Move do recordset completasse, seria preciso então atualizar essa propriedade do formulário 2, ago como:

[ô]...
Formulario2.Codigo = rst([Ô]campoCodigo[Ô])
[ô]...
ABACLAR 29/12/2012 21:35:20
#416566
Obrigado pela atenção dispensada,
Tentei, mas não me funcionou. Porém tenho que confessar que a minha ignorância, não me permite [Ô]divagar[Ô] á volta do código apresentado.
O projecto que estou a tentar elaborar é em Access (No código apresentado, eliminei o [Ô].Text[Ô] e o [Ô].Value[Ô] proprio do Vb) e está terminado [Ô]na forma básica[Ô], mas não é bem funcional.
é pena que não encontro nada na web (Ou talvez eu não saiba procurar) que explique para principiantes como ligar um formulário e um subFormulário e com eles preencher as respectivas tabelas.
Normalmente o subFormulário no access ou o DataGrid do no vb, são preenchidos com os dados da tabela a que estão ligados, nunca encontrei exemplo que fizesse o inverso.
Obrigado pela atenção.


ABACLAR 30/12/2012 17:41:40
#416577
Não sei como pedir melhor ajuda, junto um prototipo.
Apenas pretendo se possivel a explicação para principiantes de como ligar / relacionar duas tabelas e seus respectivos formulário e subformulário (grid). O subFormulário deve preencher a tabela a que está ligado


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

Sub carrega()
txtCamp1 = rst.Fields(1)
txtCamp2 = rst.Fields(2)
End Sub

Private Sub cmdAnterior_Click()
rst.MovePrevious
If Not (rst.BOF = True Or rst.EOF = True) Then
carrega
Else
MsgBox ([Ô]Chegou ao fim dos registos[Ô]), vbInformation, [Ô]Atenção[Ô]
End If
End Sub

Private Sub cmdFechar_Click()
DoCmd.Close
End Sub

Private Sub cmdRegistar_Click()
SQL = [Ô]insert into tblTab1 (Campo1, campo2) values ([ô][Ô] & txtCamp1 & [Ô][ô], [ô][Ô] & txtCamp2 & [Ô][ô])[Ô]
cnx.Execute (SQL)
limpa
End Sub

Private Sub cmdSeguinte_Click()
rst.MoveNext
If Not (rst.BOF = True Or rst.EOF = True) Then
carrega
Else
MsgBox ([Ô]Chegou ao fim dos registos[Ô]), vbInformation, [Ô]Atenção[Ô]
End If
End Sub

Private Sub Form_Load()
cnx.ConnectionString = [Ô]provider=Microsoft.jet.oledb.4.0; Data source = C:\Users\daddy\Desktop    stConnVb.mdb[Ô]
cnx.Open
rst.Open [Ô]tblTab1[Ô], cnx, adOpenKeyset, adLockOptimistic
rst.MoveLast
carrega
End Sub

Sub limpa()
txtCamp1 = Empty
txtCamp2 = Empty
End Sub



Um bom ano, obrigado.
Faça seu login para responder