none
Insertar Registro Tabla Relacionada RRS feed

  • Pregunta

  • Hola gente,

    Tengo dos Tablas:

    Comunas
    IdComuna (PK)
    NombreComuna
    ---------------------
    Clientes
    IdCliente(PK)
    Nombre
    IdComuna(FK)
    ----------------------------->



    Tabla Comunas:
    IdComuna => 1
    NombreComuna => Santiago
    ----------------------------------
    IdComuna=>2
    NombreComuna=>Concepción
    ----------------------------------
    IdComuna=>3
    NombreComuna=>Arica
    --------------------------------------->

    Mi pregunta como inserto un registro en la tabla Clientes haciendo referencia a IdComuna, debe quedar así


    Tabla Clientes:
    IdCliente => 1
    Nombre   => Juanito Perez
    IdComuna => 1 
    -----------------------------
    IdCliente => 2
    Nombre   => chumingo ds
    IdComuna => 3
    • Cambiado Gustavo Larriera domingo, 4 de octubre de 2009 15:16 Foro más adecuado. (De:SQL Server)
    miércoles, 30 de septiembre de 2009 19:27

Respuestas

  • Veo que no estas llenando correctamente el ComboBox. Con esa forma, tendrías que obtener el valor del SelectedIndex, pero siempre tendrias que tener un orden fijo para los valores, ya que si cambian, el Index cambiará.

    Yo haría lo siguiente:
    (obviamente revisalo y rescata lo que te sirva)
    (este codigo se puede optimizar "partiendolo" en capas, para usar dll..)
     -------------------------------------------------------------------------------------

    Imports System.Data.SqlClient

    Public Class Form1

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pLlenaComboComuna()
      End Sub

      Private Sub pLlenaComboComuna()
        Using con As New SqlConnection("trusted_connection=yes;server=[SERVIDOR];database=[BD]")
          Try
            con.Open()
            Using cmd As New SqlCommand("SELECT IdComuna,Comuna FROM Comunas ORDER BY Comuna ASC", con)
              Dim drd As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult)
              Dim bs As New BindingSource
              bs.DataSource = drd
              With ComboBoxComuna
                .DataSource = bs
                .DisplayMember = "Comuna"
                .ValueMember = "IdComuna"
              End With
              drd.Close()
            End Using
          Catch ex As SqlException
            'Guardar el error de SQL
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
          Catch ex As Exception
            'Guardar cualquier otro error
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
          End Try
        End Using
      End Sub

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        pGrabaRegistro()
      End Sub

      Private Sub pGrabaRegistro()
        Dim con As New SqlConnection("trusted_connection=yes;server=[SERVIDOR];database=[BD]")
        Dim trx As SqlTransaction = Nothing
        Try
          con.Open()
          trx = con.BeginTransaction

          Using cmd As New SqlCommand("INSERT INTO Registros (Nombre,  IdComuna) VALUES('" & TextNombre.Text & "',  '" & ComboBoxComuna.SelectedValue & "')", con)
            Dim n As Integer
            Try
              cmd.Transaction = trx
              cmd.CommandType = CommandType.Text
              n = cmd.ExecuteNonQuery
              If n <= 0 Then
                trx.Rollback()
                MessageBox.Show("No se pudo realizar la operacion", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning)
              Else
                trx.Commit()
                MessageBox.Show("Operacion realizada satisfactoriamente", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
              End If
            Catch ex As Exception
              MessageBox.Show("No se pudo realizar la operación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
          End Using
        Catch ex As Exception
          trx.Rollback()
          MessageBox.Show("No se pudo realizar la operación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
          If con.State = ConnectionState.Open Then con.Close()
        End Try
      End Sub

    End Class

     -------------------------------------------------------------------------------------

    En resumen, esta pregunta debe pasar al foro de Programación.
    Espero haberte ayudado.

    • Marcado como respuesta Vito2009 domingo, 4 de octubre de 2009 0:08
    jueves, 1 de octubre de 2009 17:46

Todas las respuestas

  • Hola.

    No sé si lo he entendido, sería así:

    insert Clientes values (1, 'Juanito Perez', 1)
    insert Clientes values (2, 'chumingo ds', 3)

    Si no es eso, nos dices.



    Alberto López Grande.
    miércoles, 30 de septiembre de 2009 19:37
  • Hola eso es lo que busco insertar:


    EJ: En un ComboBox muestro todas las comunas en este caso mostraria Santiago, Concepcion, Arica.

    Pero cuando  Inserte los datos en la tabla Clientes no se debe guardar el nombre si no el Idcomuna .

    He leido que eso se hace con un Inner Join pero no se como es para Insertar, solo he visto ejemplos para SELECT .

    CMD.CommandText =

    "INSERT INTO Clientes (Nombre, Idcomuna) VALUES('" & TextBanco.Text & "' , '" & combobox.SelectedItem& "')"

    miércoles, 30 de septiembre de 2009 19:41
  • Hola
    En vez de "combobox.selectedItem", pon "combobox.selectedvalue"
    Eso te devuelve el campo codigo de la tabla.
    Si has definido el valor de ValueMember del combo con el dato del campo codigo de la tabla.
    Saludos,
    miércoles, 30 de septiembre de 2009 19:53
  • Hola,

    Con ComboxBox.SelectedValue me da el siguiente error


    Instrucción INSERT en conflicto con la restricción FOREIGN KEY "FK_comuna". El conflicto ha aparecido en la base de datos "Registros", tabla "dbo.Comunas", column 'IdComuna'. Se terminó la instrucción.

    CMD.CommandText =

    "INSERT INTO Registros (Nombre, IdComuna) VALUES('" & TextNombre.Text & "',  '" & ComboBoxComuna.SelectedValue & "')"  

    Con ComboxComuna.SelectedIndex funciona, pero guarda otro IdComuna que no corresponde.



    miércoles, 30 de septiembre de 2009 21:11
  • Como llenas el ComboBox...??
    No es un foro de Programacion, pero pasanos el codigo de como llenas el combo y el codigo de como intentas grabar.
    A todo esto ¿Cual es la estructura de la tabla Registros?... entiendo por el mensaje que tiene una restriccion.
    miércoles, 30 de septiembre de 2009 21:16
  •  

    Private Sub FrmCrearCliente_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ComboBoxComuna.Items.Clear()

    CN.Open()

    CMD.CommandType = CommandType.Text

    CMD.CommandText =

    "SELECT Comuna FROM Comunas ORDER BY Comuna ASC"

    CMD.ExecuteNonQuery()

    DR = CMD.ExecuteReader()

     

    While DR.Read

    ComboBoxComuna.Items.Add(DR(

    "Comuna"))

     

    End While

    CN.Close()

     

    End Sub

     

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    CN.Open()

    CMD.CommandType = CommandType.Text

    CMD.CommandText =

    "INSERT INTO Registros (Nombre,  IdComuna) VALUES('" & TextNombre.Text & "',  '" & ComboBoxComuna.SelectedValue & "')"

    CMD.ExecuteNonQuery()

    MessageBox.Show(

    "Registro", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)

    CN.Close()

     

    End Sub

    End

     

    Class

    ------------------------------------------------------------------>

    La tabla Comunas tiene la siguientes Estructura:

    IdComuna INT IDENTITY(1,1),
    Comuna VARCHAR(30),
    CONSTRAINT PK_comuna(IdComuna));


    La tabla Registros tiene la siguiente Estructura

    IdRegistro INT IDENTITY(1,1),
    Nombre VARCHAR(30),
    IdComuna INT,

    CONSTRAINT PK_registro(IdRegistro),
    CONSTRAINT FK_comuna FOREIGN KEY(IdComuna) REFERENCES Comunas(IdComuna));


    miércoles, 30 de septiembre de 2009 21:25
  • Veo que no estas llenando correctamente el ComboBox. Con esa forma, tendrías que obtener el valor del SelectedIndex, pero siempre tendrias que tener un orden fijo para los valores, ya que si cambian, el Index cambiará.

    Yo haría lo siguiente:
    (obviamente revisalo y rescata lo que te sirva)
    (este codigo se puede optimizar "partiendolo" en capas, para usar dll..)
     -------------------------------------------------------------------------------------

    Imports System.Data.SqlClient

    Public Class Form1

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pLlenaComboComuna()
      End Sub

      Private Sub pLlenaComboComuna()
        Using con As New SqlConnection("trusted_connection=yes;server=[SERVIDOR];database=[BD]")
          Try
            con.Open()
            Using cmd As New SqlCommand("SELECT IdComuna,Comuna FROM Comunas ORDER BY Comuna ASC", con)
              Dim drd As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult)
              Dim bs As New BindingSource
              bs.DataSource = drd
              With ComboBoxComuna
                .DataSource = bs
                .DisplayMember = "Comuna"
                .ValueMember = "IdComuna"
              End With
              drd.Close()
            End Using
          Catch ex As SqlException
            'Guardar el error de SQL
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
          Catch ex As Exception
            'Guardar cualquier otro error
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
          End Try
        End Using
      End Sub

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        pGrabaRegistro()
      End Sub

      Private Sub pGrabaRegistro()
        Dim con As New SqlConnection("trusted_connection=yes;server=[SERVIDOR];database=[BD]")
        Dim trx As SqlTransaction = Nothing
        Try
          con.Open()
          trx = con.BeginTransaction

          Using cmd As New SqlCommand("INSERT INTO Registros (Nombre,  IdComuna) VALUES('" & TextNombre.Text & "',  '" & ComboBoxComuna.SelectedValue & "')", con)
            Dim n As Integer
            Try
              cmd.Transaction = trx
              cmd.CommandType = CommandType.Text
              n = cmd.ExecuteNonQuery
              If n <= 0 Then
                trx.Rollback()
                MessageBox.Show("No se pudo realizar la operacion", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning)
              Else
                trx.Commit()
                MessageBox.Show("Operacion realizada satisfactoriamente", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
              End If
            Catch ex As Exception
              MessageBox.Show("No se pudo realizar la operación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
          End Using
        Catch ex As Exception
          trx.Rollback()
          MessageBox.Show("No se pudo realizar la operación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
          If con.State = ConnectionState.Open Then con.Close()
        End Try
      End Sub

    End Class

     -------------------------------------------------------------------------------------

    En resumen, esta pregunta debe pasar al foro de Programación.
    Espero haberte ayudado.

    • Marcado como respuesta Vito2009 domingo, 4 de octubre de 2009 0:08
    jueves, 1 de octubre de 2009 17:46
  • En resumen, esta pregunta debe pasar al foro de Programación.
    Espero haberte ayudado.


    Pasaremos este thread al foro de programación ADO.NET a la brevedad.
    --- Este mensaje se proporciona tal como es, sin garantías de ninguna clase. ---
    jueves, 1 de octubre de 2009 17:59
  • Gracias por la ayuda, adapte un poco el codigo y quedo funcionando perfecto.


    Saludos
    domingo, 4 de octubre de 2009 0:09