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

Tayguara

[Resolvido] Inserir dados filtrados no subformulário a partir de uma escolha em uma caixa de combinação

Mensagens Recomendadas

Tayguara

Bom dia a todos!

Preciso de ajuda na seguinte situação:

Tenho um formulário que serve para marcar as presenças e ausências de alunos em um curso.

Os dados estão nas tabelas tbl_alunos (onde é feito o cadastro dos mesmos), tbl_matricula (onde estão os dados após a matrícula no curso), tbl_aulas (onde estão as aulas cadastradas) e tbl_detalhe_aula (onde estão os alunos e a indicação se estiveram presente e/ou ausentes).

No formulário cadastro a aula e no subformulário indico os alunos da turma e informo se os mesmos estavam presentes ou ausentes.

A intenção é ao escolher a turma na caixa de combinação, o sistema preencha o subformulário com o nome dos alunos daquela turma.

A marcação da informação presente e/ou ausente é feita através de campos Sim/Não.

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

acho que te faltam as tabelas :

tbl_turmas

tbl_detalhe_turmas

ou esses dados estao onde?

se faltarem, depois de as criares, no evento depois de atualizar, da caixa de combinaçao em que escolhes as turma ( no frm_aulas), colocas codigo que lê a tbl_detalhe_turmas, e passa cada uma das linhas para o subformulario frm_detalhe_aulas.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tayguara

Olá CarlosAl

Obrigado pelo auxilio

Na tabela matrícula, ao matricular o aluno indico a qual turma o mesmo está selecionando as turmas em uma caixa de combinacao.

Agora, qual código coloco para que ele filtre os dados que preciso de acordo com a turma selecionada?

Já tentei com recordsource + select porem as caixas de selecao Sim/Nao ficam inativas e me dá um aviso de erro.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

Se entendi bem o que queres é , quando no formulario das aulas, que tem um subformulario detalhe de aulas, queres actualizar os controles

alunoID (que penso que deve ser um campo numerico ligado á tbl_alunos)

esteve (campo sim/nao), para indicar se esteve presente

se for assim, poderias no control onde escolhes a turma que deve ser uma caixa de combinaçao no formulario das aulas, algo parecido com isto, mas terias de alterar os nomes que tens nos teus campos e controles

Dim t As Integer
Dim a As Integer
Dim db As Database
Set db = CurrentDb()


Dim rst1 As DAO.Recordset
Dim rst2 As DAO.Recordset

t = Me.t
a = Me.aulaid

Set rst2 = db.OpenRecordset("SELECT turmaID,alunoID FROM tbl_Matricula " & _
"WHERE turmaID=" & t)

Set rst1 = Me.tbl_detalhe_aula.Form.RecordsetClone
rst2.MoveFirst
Do While Not rst2.EOF

	   With rst1

		  .AddNew
			 !alunoID = rst2!alunoID
			 !aulaid = a
			 !Esteve = -1
		 .Update
	 End With
rst2.MoveNext
Loop
Me.tbl_detalhe_aula.Form.Requery

para funcionar tens de verificar se no editor VBA, em referencias se esta activa a seguinte library :

Microsoft DAO 3.6 Object Library

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FreiNando

Os sub-formulários em Access já tem propriedades para ligar ao formulário no qual estão inseridos:

- Separador Dados : Ligar campos principais e Ligar campos incorp.

Isto funciona para formulários ligados a uma origem de dados. E ao mudar o registo actual do formulário principal, no subformulario irá ser feita uma filtragem de acordo com o(s) campo ligado(s).


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

FreiNando,

pelo que percebi o que o colega quer nao é filtrar os registos por turma na aula em questao (form e subform já deveriam estar ligados por campo comun, ex: aulaid), mas sim ao adicionar NOVOS registos, preencher automaticamente no subformulario com os alunos da turma escolhida.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tayguara

O amigo CarlosAl está certo.

A intencão é no formulário Frm_aula, ao cadastrar uma nova aula, ao escolher a turma, o sistema já dê os nomes dos alunos em ordem da referida turma, sem precisar eu ter q escolher os alunos toda vez q cadastro uma aula.

CarlosAl, tentei implementar o código que enviaste, ainda me dá um erro (operador faltando)

https://www.dropbox.com/s/72r6du7m7agx3yh/Formulario.jpg?dl=0

Segue o arquivo:

https://www.dropbox.com/s/u49gl60cx3nqvti/Formulario%20com%20subformulario.rar?dl=0

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

nao vou conseguir ver o que mandaste, estou com uma versao anterior do Access. talvez algum colega por aqui consiga dar uma idea

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

tenta assim :

Me.Sub_Frm_Aula.SetFocus
Dim turma As String
Dim aula As Integer
Dim db As Database
Set db = CurrentDb()


Dim rst1 As DAO.Recordset
Dim rst2 As DAO.Recordset

turma = Me.Aula_Turma
aula = Me.Aula_Codigo

Set rst2 = db.OpenRecordset("SELECT matricula_aluno_nome,matricula_aluno_codigo, matricula_turma FROM tbl_Matricula WHERE matricula_turma= """ & Aula_Turma & """")

tb acho q nao precisas para presente e outro para ausente, basta um de presente ( campo sim/nao)



Set rst1 = Me.Sub_Frm_Aula.Form.RecordsetClone
rst2.MoveFirst
Do While Not rst2.EOF
With rst1
.AddNew

!Detalhe_Aula_Aluno_Codigo = rst2!Matricula_Aluno_Codigo
!Detalhe_Aula_Aluno_Nome = rst2!Matricula_Aluno_Nome
!Detalhe_Aula_Numero = aula
!Detalhe_Aula_Presente = -1

.Update
End With
rst2.MoveNext
Loop
Me.Sub_Frm_Aula.Form.Requery

entre outras alterei na linha que abre o recordset para :

WHERE matricula_turma= """ & Aula_Turma & """"

porque em vez de procurares pelo ID da turma estas a procurar pelo nome da turma, que nao me parece muito correto,

Editado por carlosAl
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tayguara

Gostaria de agradecer ao amigo Carlos Al.

Funcionou perfeitamente.

Vou observar os comentários sobre a procura pelo nome da turma. Sobre os campos Presente e Ausente, coloquei os dois para contar as faltas do aluno.

Não achei como colocar o tópico como Resolvido.

Muitíssimo Obrigado!

Editado por Tayguara

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tayguara

Olá amigo Carlos Al,

Desculpe por incomodá-lo de novo com esse assunto mas estou enfrentando um problema.

Estou desenvolvendo outro formulário com aquela mesma metodologia e copiei o código e adaptei com a tabela e os campos utilizados.

É o preenchimento das aulas nos dias da semana.

O subformulário é preenchido mas não filtra os dias da semana, simplesmente ele joga tudo, todas as aulas da semana.

O que será que fiz errado?

Olha ai o código:

Me.Sub_Frm_Detalhes_da_Aula.SetFocus

Dim diadasemana As String

Dim aula As Integer

Dim db As Database

Set db = CurrentDb()

Dim rst1 As dao.Recordset

Dim rst2 As dao.Recordset

diadasemana = Me.DiaSemana

aula = Me.Aula_Codigo

Set rst2 = db.OpenRecordset("SELECT horario_detalhe_Prof_Cod, horario_detalhe_Prof, Horario_detalhe_Disc, Horario_detalhe_Disc_Cod, horario_turma, Horario_Sequencia, Horario_Detalhe_Dia_Semana FROM tbl_horario_detalhes WHERE Horario_Detalhe_Dia_Semana = """ & DiaSemana & """")

Set rst1 = Me.Sub_Frm_Detalhes_da_Aula.Form.RecordsetClone

rst2.MoveFirst

Do While Not rst2.EOF

With rst1

.AddNew

!Aula_Professor_Codigo = rst2!Horario_Detalhe_Prof_Cod

!Aula_Professor = rst2!Horario_Detalhe_Prof

!Aula_Disciplina = rst2!Horario_Detalhe_Disc

!Aula_Disciplina_Codigo = rst2!Horario_Detalhe_Disc_Cod

!Aula_Sequencia = rst2!Horario_sequencia

!Aula_Controle = aula

.Update

End With

rst2.MoveNext

Loop

Me.Sub_Frm_Detalhes_da_Aula.Form.Requery

End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carlosAl

nao consigo abrir o ficheiro que mandas, acho que vais ter de tentar resolver tu mesmo , no entanto reparei que a variavel

diadasemana = Me.DiaSemana

Set rst2 = db.OpenRecordset("SELECT horario_detalhe_Prof_Cod, horario_detalhe_Prof, Horario_detalhe_Disc, Horario_detalhe_Disc_Cod, horario_turma, Horario_Sequencia, Horario_Detalhe_Dia_Semana FROM tbl_horario_detalhes WHERE Horario_Detalhe_Dia_Semana = """ & DiaSemana & """")

estas a chamar no codigo acima "DiaSemana", por isso tenta

WHERE Horario_Detalhe_Dia_Semana = """ & diadasemana & """")

nao sei se vai resolver, boa sorte

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tayguara

Carlos AI

Enfim consegui resolver.

O problema era que só estava filtrando o dia da semana e não a turma e quando o comando era acionado ele preenchia com o dia da semana de todas as turmas e não de uma unica turma e ao alterar o código para WHERE Horario_Detalhe_Dia_Semana = """ & diadasemana & """ and Horario_turma = """ & turma & """") eis que veio a funcionar.

Obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Juniobsilva
Em 15/08/2015 às 15:22, Tayguara disse:

O amigo CarlosAl está certo.

A intencão é no formulário Frm_aula, ao cadastrar uma nova aula, ao escolher a turma, o sistema já dê os nomes dos alunos em ordem da referida turma, sem precisar eu ter q escolher os alunos toda vez q cadastro uma aula.

CarlosAl, tentei implementar o código que enviaste, ainda me dá um erro (operador faltando)

https://www.dropbox.com/s/72r6du7m7agx3yh/Formulario.jpg?dl=0

Segue o arquivo:

https://www.dropbox.com/s/u49gl60cx3nqvti/Formulario%20com%20subformulario.rar?dl=0

Esse link ainda esta ativo?

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.