Ir para o conteúdo
joaogomes

Erro ao inserir dados em mais de uma tabela

Mensagens Recomendadas

joaogomes    0
joaogomes

Boa tarde. Tenho uma base de dados para guardar facturas e quando adiciono uma factura, por vezes dá-me o seguinte erro:

Mysql.Data.MysqlClient.MySqlException

Erro de base de dados #1452. Cannot add or update a child row; a foreign key constraint fails ('museu','itensfacturas', CONSTRAINT 'item_factura' FOREIGN KEY ('Factura') REFERENCES 'facturas' ('IDFactura'))

O meu código em vb. net é o seguinte:

Imports MySql.Data.MySqlClient
Public Class FrmAdicionarFactura
   Dim TotalFactura As Decimal
   Private Sub FrmAdicionarFactura_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    ' Obter o IDCliente, passado através da propriedade Tag
    Dim IDTrabalhador As Integer = CInt(Me.Tag)
    'Obter os dados do cliente IDCliente (i.e. preencher DataTable)
    Me.TrabalhadoresTableAdapter.FillByIDTrabalhador _
    (Me.MuseuDataSet.trabalhadores, IDTrabalhador)
    'Obter os dados de produtos (i.e. preencher DataTable)
    Me.ProdutosTableAdapter.Fill(MuseuDataSet.produtos)
   End Sub
   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'Se o valor de quantidade for válido:
    If ValidarEntradas.Preenchido(QuantidadeTextBox) AndAlso _
    ValidarEntradas.ÉInt32(QuantidadeTextBox) AndAlso _
    ValidarEntradas.EstáEntre(QuantidadeTextBox, 1, 10000) Then
	    ' - invocar sub para adicionar linha a ItensfacturasED
	    Me.AdicionarItem()
	    ' - invocar sub para determinar e mostrar os totais de
	    ' factura
	    Me.CalcularTotalFactura()
	    ' – seleccionar a comboBox Código, que mostra os produtos
	    CodigoComboBox.Select()
    End If
   End Sub
   Private Sub AdicionarItem()
    Try
	    'Obter os dados para a nova linha de ItensFacturaED, incluindo:
	    ' – o índice do produto seleccionado na combo
	    Dim ÍndiceProduto As Integer = CodigoComboBox.SelectedIndex
	    ' – a linha correspondente da tabela ProdutosED do dataset
	    ' (via declaração de variável e prop. por omissão Item)
	    Dim RegistoProduto As museuDataSet.produtosRow = _
	    Me.MuseuDataSet.produtos(ÍndiceProduto)
	    ' – os valores dos campos:
	    ' . código
	    Dim CodigoProduto As String = RegistoProduto("Codigo").ToString
	    ' . designação
	    Dim Designacao As String = RegistoProduto("Designacao").ToString
	    ' . preço unitário
	    Dim PrecoUnitario As Decimal = _
	    CDec(RegistoProduto("PrecoUnitario"))
	    ' – obter a quantidade e determinar o total do item
	    Dim Quantidade As Integer = CInt(QuantidadeTextBox.Text)
	    Dim TotalItem As Decimal = PrecoUnitario * Quantidade
	    'Criar um novo registo de ItensFacturasED, carregá-lo com dados
	    'e adicioná-lo ao DataSet
	    Dim RegistoItemFactura As museuDataSet.itensfacturasRow _
	    = Me.MuseuDataSet.itensfacturas.NewitensfacturasRow
	    RegistoItemFactura.Factura = 1 'Valor a actualizar depois
	    RegistoItemFactura.Produto = CodigoProduto
	    RegistoItemFactura.Designacao = Designacao
	    RegistoItemFactura.PrecoUnitario = PrecoUnitario
	    RegistoItemFactura.Quantidade = Quantidade
	    RegistoItemFactura.TotalItem = TotalItem
	    Me.MuseuDataSet.itensfacturas.AdditensfacturasRow _
	    (RegistoItemFactura)
    Catch ex As ConstraintException
	    MessageBox.Show("Já existe um item para este produto. " _
	    & "Por favor, seleccione outro produto.", "Erro")
    Catch ex As Exception
	    MessageBox.Show(ex.Message, ex.GetType.ToString)
    End Try
   End Sub
   Private Sub CalcularTotalFactura()
    'Limpar as caixas de texto de cálculo
    TotalFacturaTextBox.Text = ""
    ' Calcular o Total de Produto
    Dim TotalProduto As Decimal = 0
    'Se a DGV contém alguma linha
    If ItensfacturasDataGridView.Rows.Count > 0 Then
	    'Para cada linha da DGV
	    For Each r As DataGridViewRow In _
	    ItensfacturasDataGridView.Rows
		    'Obter o total do item e adicionar ao total
		    Dim TotalItem As Decimal = CDec(r.Cells(4).Value)
		    TotalProduto += TotalItem
	    Next
	    'Calcular o total da factura
	    TotalFactura = TotalProduto
	    'Mostrar os totais da factura
	    TotalFacturaTextBox.Text = FormatCurrency(TotalFactura)
    End If
   End Sub
   Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    'Se a DGV contém alguma linha
    If ItensfacturasDataGridView.Rows.Count > 0 Then
	    ' - invocar sub para adicionar factura
	    Me.AdicionarFactura()
	    ' - invocar sub para actualizar BD
	    Me.ActualizarBaseDeDados()
	    Me.Close()
    Else
	    MessageBox.Show("Tem que adicionar pelo menos um item " _
	    & "antes de guardar a factura.", "Factura não guardada")
    End If
   End Sub
   Private Sub AdicionarFactura()
    Try
	    'Criar um novo registo de FacturasED, carregá-lo com dados
	    'e adicioná-lo ao DataSet
	    Dim RegistoFactura As museuDataSet.facturasRow = Me.MuseuDataSet.facturas.NewfacturasRow
	    RegistoFactura.Trabalhador = CInt(IDTrabalhadorTextBox.Text)
	    RegistoFactura.DataFactura = DataFacturaDateTimePicker.Value
	    RegistoFactura.TotalFactura = TotalFactura
	    Me.MuseuDataSet.facturas.AddfacturasRow(RegistoFactura)
    Catch ex As Exception
	    MessageBox.Show(ex.Message, ex.GetType.ToString)
    End Try
   End Sub
   Private Sub ActualizarBaseDeDados()
    Try
	    'Actualizar a tabela FacturasED da base de dados
	    FacturasTableAdapter.Update(MuseuDataSet.facturas)
	    'Obter o último identificador de factura gerado pelo SGBD
	    Dim IDFactura As Integer = _
	    CInt(FacturasTableAdapter.ObterUltimoValorIDENTITY)
	    'Definir o identificador de factura para todos os itens
	    For Each registo As museuDataSet.itensfacturasRow In _
	    Me.MuseuDataSet.itensfacturas
		    registo.Factura = IDFactura
	    Next
	    'Actualizar a tabela ItensFActurasED da base de dados
	    ItensfacturasTableAdapter.Update(MuseuDataSet.itensfacturas)
    Catch ex As MySqlException
	    MessageBox.Show("Erro de base de dados # " & ex.Number _
	    & "; " & ex.Message, ex.GetType.ToString)
    End Try
   End Sub

   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    Me.Close()
   End Sub
   Private Sub ItensFacturasDataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ItensfacturasDataGridView.CellContentClick
    'Elimina o registo da grelha quando o utilizador pressionar o
    ' botão Eliminar presente na última (6.ª) coluna da grelha
    If e.ColumnIndex = 5 Then 'ColumnIndex começa em zero
	    ItensfacturasDataGridView.Rows.RemoveAt(e.RowIndex)
	    Me.CalcularTotalFactura()
	    CodigoComboBox.Select()
    End If
   End Sub

End Class

a minha base de dados está assim definida:

CREATE TABLE `produtos` (
 `Codigo` varchar(10) NOT NULL,
 `Designacao` varchar(100) NOT NULL,
 `PrecoUnitario` decimal(10,2) NOT NULL,
 `Quantidade` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`Codigo`)
)
CREATE TABLE `trabalhadores` (
 `IDTrabalhador` int(11) NOT NULL AUTO_INCREMENT,
 `Nome` varchar(100) NOT NULL,
 `Utilizador` varchar(100) NOT NULL,
 `Password` varchar(100) NOT NULL,
 PRIMARY KEY (`IDTrabalhador`)
)

CREATE TABLE `facturas` (
 `IDFactura` int(11) NOT NULL AUTO_INCREMENT,
 `Trabalhador` int(11) NOT NULL,
 `DataFactura` date NOT NULL,
 `TotalFactura` decimal(10,2) NOT NULL,
 PRIMARY KEY (`IDFactura`),
 KEY `factura_trabalhador` (`Trabalhador`),
 CONSTRAINT `factura_trabalhador` FOREIGN KEY (`Trabalhador`) REFERENCES `trabalhadores` (`IDTrabalhador`)
)
CREATE TABLE `itensfacturas` (
 `Factura` int(11) NOT NULL,
 `Produto` varchar(10) NOT NULL,
 `PrecoUnitario` decimal(10,2) NOT NULL,
 `Quantidade` int(11) NOT NULL,
 `TotalItem` decimal(10,2) NOT NULL,
 PRIMARY KEY (`Factura`,`Produto`),
 KEY `item_factura` (`Factura`),
 KEY `item_produto` (`Produto`),
 CONSTRAINT `item_factura` FOREIGN KEY (`Factura`) REFERENCES `facturas` (`IDFactura`),
 CONSTRAINT `item_produto` FOREIGN KEY (`Produto`) REFERENCES `produtos` (`Codigo`)
)

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


×

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.