Jump to content
Tayguara

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

Recommended Posts

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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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,

Edited by carlosAl
  • Vote 1

Share this post


Link to post
Share on other 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!

Edited by Tayguara

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

  • Vote 1

Share this post


Link to post
Share on other sites
Tayguara

Ola Carlos AI

Fiz a alteração conforme sugeriste porém continua infelizmente com o defeito.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites
Juniobsilva

Tayguara vc ainda tem um exemplo da planilha pra eu tentar elaborar a minha. Obrigado 

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.