Ir para o conteúdo
MaxHelmer

INSERT INTO em tabelas relacionadas N:N

Mensagens Recomendadas

MaxHelmer

Olá pessoal! Venho pedir-lhes mais uma vez a vossa preciosa ajuda. Vi que no fórum existe algumas dúvidas relacionadas, mas criei um novo tópico por se tratar de relacionamentos (N:N).

Tenho 3 tabelas relacionadas no access (N:N):

tb_professor tb_juncao tb_disciplina

cod_professor cod_professor cod_disciplina

nome_professor cod_disciplina nome_disciplina

Criei o relacionamento desta forma de acordo com o que pesquisei pela internet. Observe que um professor pode lecionar várias diciplinas, assim como uma disciplina pode ser lecionada por vários professores ao mesmo tempo. (muitos para muitos). Acho que até aí estou entendendo perfeitamente.

Para gravar no banco de dados, atualmente tenho feito uma query assim:

"INSERT INTO tb_professor ( nome ) VALUES ( txtNome.Text.Trim )"

O meu problema atual é com a "query sql" que vou utilizar na hora de gravar no banco de dados.

Supondo por exemplo que eu um professor lecione (matemática e Química). Como seria essa query sql?

Forte abraço para os irmãos lusitanos.

Editado por MaxHelmer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Tens de ter o codigo do professor e disciplinas, depois fazes algo assim:

Imagina que o professor tem o codigo 1, a disciplina matematica tem o codigo 1 e a disciplina quimica tem o codigo 2

-- Inserir disciplina de matematica para o professor
INSERT INTO tb_juncao (cod_professor, cod_disciplina) VALUES (1, 1)
-- Inserir disciplina de quimica para o professor
INSERT INTO tb_juncao (cod_professor, cod_disciplina) VALUES (1, 2)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MaxHelmer

Tens de ter o codigo do professor e disciplinas, depois fazes algo assim:

Imagina que o professor tem o codigo 1, a disciplina matematica tem o codigo 1 e a disciplina quimica tem o codigo 2

-- Inserir disciplina de matematica para o professor
INSERT INTO tb_juncao (cod_professor, cod_disciplina) VALUES (1, 1)
-- Inserir disciplina de quimica para o professor
INSERT INTO tb_juncao (cod_professor, cod_disciplina) VALUES (1, 2)

Compreendi, mas nesse caso eu estou cadastrando um professor novo, onde eu vou precisar salvar no BD do Access na tb_professor uma string que está em uma Textbox e na tb_juncao o cod_professor e cod_disciplina. eu posso fazer isso na mesma query ou vou precisar acessar o banco separadamente?

Pelo que entendo, como o professor ainda não foi cadastrado e não foi gerado um código (autoincremental) no BD eu não posso gravar na tb_juncao o cod_professor e o cod_disciplina. Estou certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Inseres o professor na tabela de professores.

De seguida, tendo o codigo do professor inseres nessa tabela de juncao, para definir as disciplinas

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MaxHelmer

Inseres o professor na tabela de professores.

De seguida, tendo o codigo do professor inseres nessa tabela de juncao, para definir as disciplinas

nelsonr! Decidi fazer outro form onde vou tratar apenas o relacionamento entre professores e disciplina, assim não terei mais problemas relacionados ao código do professor.

No entanto, estou tendo outro problema. As disciplinas que o professor leciona estão em uma listbox (ex.: Matemática, História). o código do professor é selecionado do datagridview. Veja no código abaixo:

 If vmodo = "I" Then
           Dim cs As String = My.Settings.MBSoftGestaoEducacionalConnectionString
           Dim conect As New OleDb.OleDbConnection
           conect.ConnectionString = cs
           Try
               conect.Open()
               Dim selcom As New OleDb.OleDbCommand
               selcom.Connection = conect
               selcom.CommandText = "INSERT INTO tb_professor_disciplina ( cod_professor, cod_disciplina ) " & _
                                        "VALUES ( '" & acod_professor(dgvProfessor.CurrentRow.Index + 1) & "', '" & lsbB.SelectedValue & "' )"
               If selcom.ExecuteNonQuery() Then
                   MsgBox("Disciplinas/Professores incluidos com sucesso!")
               Else
                   MsgBox("Erro! Disciplinas/Professores não incluidos!")
               End If
               conect.Close()
           Catch ex As Exception
               MessageBox.Show("Erro de gravação de dados!" & vbCrLf & ex.Message, "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error)
           End Try
           desab_campos()
           carrega_professores()
       End If
   End Sub

Está a aparecer uma mensagem: "Tipos de dados incompatível na expressão de critério."

Acredito ser devido ao "lsbB.SelectedValue" onde "lsbB" é o nome da listbox.

Como posso fazer esse INSERT?

Editado por thoga31
GeSHi - alterado para a LP correcta

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Boas,

no listbox que propriedades preencheste ? DisplayMember e ValueMember?

Faz debug e vê o conteúdo do SelectedValue dessa listbox.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MaxHelmer

Boas,

no listbox que propriedades preencheste ? DisplayMember e ValueMember?

Faz debug e vê o conteúdo do SelectedValue dessa listbox.

Na listbox eu preenchi com o Displaymember (ex.: Matemática, História...)

Fiz o debug e observei duas coisas:

Primeira: se eu não selecionar alguma Disciplina no listbox no debug aparece ("nothing")

Segundo: se eu seleciono uma matéria no textbox no debug aparece o nome da disciplina e não o código dela.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
MaxHelmer

Amigos!

Tentei fazer da seguinte maneira:

For ind = 0 To lsbB.Items.Count - 1
                   selcom.CommandText = "INSERT INTO tb_professor_disciplina ( cod_professor, cod_disciplina ) " & _
                                        "VALUES ( '" & acod_professor(dgvProfessor.CurrentRow.Index + 1) & "', '" & lsbB.Items(ind).selectedvalue & "' )"
               Next ind

Mais um erro está aparecendo: "membro público 'selectedvalue' no tipo 'String' não encontrado"

Experimenta associar o ValueMember ao campo com o código da disciplina

Como seria essa associaçã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.