• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

passado

Inserir dados em duas tabelas diferentes

12 mensagens neste tópico

Boas pessoal, eu estou a usar uma tabela para registar os alugueres(dados guardados na tabela "alugueres" e quando dou entrada de um novo aluguer queria que ao gravar modifica-se um campo na tabela "Maquinas", um campo do tipo bit que mais tarde me vai servir para listar as maquinas alugadas, a expressa SQL que tenho actualmente para inserir os dados apenas na tabela "alugueres" é o seguinte:

INSERT INTO Aluguer ([ncliente], [nmaquina], [dtasaida]) VALUES (@ncliente, @nmaquina, @dtasaida)

Sei que tenho de juntar um INNER JOIN senao estou em erro, eu so nao sei é onde....

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

JOINs em INSERTs não.

Tens que fazer é um UPDATE a seguir a esse INSERT para alterar o que queres na outra tabela. Ou criar um Trigger sobre a tabela Aluguer que faça um update à tabela Maquinas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

JOINs em INSERTs não.

Tens que fazer é um UPDATE a seguir a esse INSERT para alterar o que queres na outra tabela. Ou criar um Trigger sobre a tabela Aluguer que faça um update à tabela Maquinas.

Eu de modo menos correcto conseguiria fazer isso era um insert e depois outro de seguida, mas penso haver uma solução mais viavel...

Podes explicar-me melhor o trigger ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um INSERT? Mas não queres alterar um valor numa linha já existente?

E menos correcto porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um INSERT? Mas não queres alterar um valor numa linha já existente?

E menos correcto porquê?

Sim, uma tabela é insert outra update

Private Sub bt_saidasave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_saidasave.Click
        Dim strsql As String = "INSERT INTO Aluguer ([ncliente], [nmaquina], [dtasaida]) VALUES (@ncliente, @nmaquina, @dtasaida)"
        Dim strsql2 As String = "UPDATE Maquinas SET [alugada]=@alugada WHERE id='" & NmaquinaComboBox.SelectedValue & "'"

        Dim strcon As New SqlConnection(Gestão_de_Alugueres.My.Settings.aluguerConnectionString)

        Dim cmd As New SqlCommand(strsql, strcon)
        cmd.Parameters.Add("@ncliente", SqlDbType.Int).Value = NclienteComboBox.SelectedValue()
        cmd.Parameters.Add("@nmaquina", SqlDbType.Int).Value = NmaquinaComboBox.SelectedValue()
        cmd.Parameters.Add("@dtasaida", SqlDbType.DateTime).Value = DtasaidaDateTimePicker.Value()

        Dim cmd2 As New SqlCommand(strsql2, strcon)
        cmd2.Parameters.Add("@alugada", SqlDbType.Bit).Value = True

        strcon.Open()

        Dim x As Integer = cmd.ExecuteNonQuery()
        MsgBox("Registo inserido com sucesso.")
        If x <> 1 Then
            MsgBox("Erro ao tentar guardar registo", MsgBoxStyle.Critical)
        End If

        Dim x1 As Integer = cmd2.ExecuteNonQuery()
        If x1 <> 1 Then
            MsgBox("Erro ao tentar guardar registo", MsgBoxStyle.Critical)
        End If

        strcon.Close()
        strcon = Nothing
        cmd = Nothing
        cmd2 = Nothing
        carregacombos()
    End Sub

Eu tenho assim e esta a funcionar, sera a maneira correcta?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A parte do SQL parece-me bem, embora pudesses executar ambas as instruções no mesmo comando.

Só não me parece bem ali estares a mandar uma MsgBox de sucesso antes de testar o resultado das execuções.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como executo as duas ao mesmo tempo?

Onde sugeres a msgbox?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como executo as duas ao mesmo tempo?

Escreves ambas as instruções na mesma string:

        Dim strsql As String = "INSERT INTO Aluguer ([ncliente], [nmaquina], [dtasaida]) VALUES (@ncliente, @nmaquina, @dtasaida); " _
        "UPDATE Maquinas SET [alugada]=@alugada WHERE id='" & NmaquinaComboBox.SelectedValue & "'"

Já agora, não perdias nada em substituir o valor da combobox pelo parâmetro nmaquina.

Onde sugeres a msgbox?

O problema não é onde, o problema é que quer a coisa corra bem ou não, a msbox de sucesso é sempre mostrada, ou seja, quando corre mal aparece a msgbox de sucesso e de seguida aparece outra de erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Escreves ambas as instruções na mesma string:

        Dim strsql As String = "INSERT INTO Aluguer ([ncliente], [nmaquina], [dtasaida]) VALUES (@ncliente, @nmaquina, @dtasaida); " _
        "UPDATE Maquinas SET [alugada]=@alugada WHERE id='" & NmaquinaComboBox.SelectedValue & "'"

Já agora, não perdias nada em substituir o valor da combobox pelo parâmetro nmaquina.

O problema não é onde, o problema é que quer a coisa corra bem ou não, a msbox de sucesso é sempre mostrada, ou seja, quando corre mal aparece a msgbox de sucesso e de seguida aparece outra de erro.

O codigo assim dame erro :S

Mas que por vezes tenho erros e a msgbox naquele sitio nunca aparece

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Entretanto fiz umas pesquisas e criei este codigo

        Dim strsql As String = "INSERT INTO Aluguer ([ncliente], [nmaquina], [dtasaida]) VALUES (@ncliente, @nmaquina, @dtasaida);" + "UPDATE Maquinas SET [alugada]=@alugada WHERE id='" & NmaquinaComboBox.SelectedValue & "'"

        Dim strcon As New SqlConnection(Gestão_de_Alugueres.My.Settings.aluguerConnectionString)

        Dim cmd As New SqlCommand(strsql, strcon)
        cmd.Parameters.Add("@ncliente", SqlDbType.Int).Value = NclienteComboBox.SelectedValue()
        cmd.Parameters.Add("@nmaquina", SqlDbType.Int).Value = NmaquinaComboBox.SelectedValue()
        cmd.Parameters.Add("@dtasaida", SqlDbType.DateTime).Value = DtasaidaDateTimePicker.Value()
        cmd.Parameters.Add("@alugada", SqlDbType.Bit).Value = True

        strcon.Open()

        Dim x As Integer = cmd.ExecuteNonQuery()
        If x < 1 Then
            MsgBox("Erro ao tentar guardar registo", MsgBoxStyle.Critical)
        Else

            MsgBox("Registo inserido com sucesso.")
        End If

        strcon.Close()
        strcon = Nothing
        cmd = Nothing

Pareceme agora mais correcto, pelo menos funciona, ao inicio daveme sempre msg de erro mas depois alterei esta zona e ficou com as msgs no sitio correcto       

If x <> 1 Then 'ALTEREI AQUI PARA "< 1 then"
            MsgBox("Erro ao tentar guardar registo", MsgBoxStyle.Critical)
        Else

            MsgBox("Registo inserido com sucesso.")
        End If

Esta o codigo mais correcto assim?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os erros que te deram foram provavelmente derivados da minha inexperiência (orgulhosa) em VB :confused:

Quanto às msgboxes, já ma parece bem.

Volto só a chamar-te a atenção para reutilizares o parâmetro @nmaquina em vez de concatenação de strings na variável strsql.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os erros que te deram foram provavelmente derivados da minha inexperiência (orgulhosa) em VB :confused:

Quanto às msgboxes, já ma parece bem.

Volto só a chamar-te a atenção para reutilizares o parâmetro @nmaquina em vez de concatenação de strings na variável strsql.

Ok vou alterar isso tambem ;)

Obrigado pela ajuda

0

Partilhar esta mensagem


Link 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