Jump to content
Sign in to follow this  
joaogomes

Erro ao inserir dados em mais de uma tabela

Recommended Posts

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`)
)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • 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.