none
Como evitar que se dupliquen los registros en la BD RRS feed

  • Pregunta

  • Hola a todos,

    Estoy trabajando en un proyecto en vb.net con mysql... ya tengo todas las tablas normalizadas pero mi duda es como hago para que no se me dupliquen los registros en las tablas al momento de hacer el insert...

    Por ejemplo

    Si el primer cliente que me compra es carlos y me compra pera al momento de registrarlo se me guarda que carlos compro una pera, pero si al dia siguiente viene pedro y me compra una pera tambien se me duplica la inf de nuevo ;S...

    El query lo tengo asi:
    mysql>Insert into clientes values 'nombre';
    mysql>Insert into productos values 'nombreproducto';

    Y esto es lo que no quiero que pase:

    ..............Cliente.............Producto
    id:1..... Nom:Carlos       id:1 Nom: Pera
    id:2.... Nom:Pedro         id:2 Nom: Pera

    Existe alguna forma de evitar a traves del query que se duplique el mismo producto...

    O en vb.net si existe algun codigo para hacerlo...

    Disculpen la molestia pero soy nuevo en la programacion
    • Editado Pedrez martes, 29 de enero de 2013 13:43
    martes, 29 de enero de 2013 13:41

Respuestas

  • Hola Pedrez;

    Hice un pequeño cambio, ya no utilizaremos la sentencia Distinct, solo usare Count para determinar  si ya existe el registro que se va a guardar en la tabla articulos...

    Finalmente validemos los datos y verifiquemos si ya están en la BD antes de que sean guardados...

    if RegistroRepetido = true then

    Public Function RegistroRepetido() As Boolean
            Dim Sql_String As String = "SELECT COUNT(descripcion) FROM articulos WHERE descripcion = '" & descripcion & "' "
            Dim MyCommand As New OleDb.OleDbCommand(Sql_String, obj_con)
            Try
                Dim Repetidos As Integer = CInt(MyCommand.ExecuteScalar)
                If Repetidos > 0 Then
                    Return True
                Else
                    Return False
                End If
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
            End Try
        End Function
    
    

    'luego preguntamos si la función Registro repetidos devuelve verdadero, si es así entonces el 'registro no procederá a guardarse porque ya existe en tu tabla.

    ' si la función devuelve true te dara el siguiente mensaje...

    Msgbox ("El Nombre del articulo esta repetido, Por favor cambie el nombre e inténtelo de nuevo", MsgBoxStyle.Information, "Informacion de sistema")

    Else

    'Si es false entonces solo nos queda guardar el registro en la función GuardarArticulo, ya que el registro no existe en la tabla.

    if GuardarArticulo = true then 

    Public Function GuardarArticulo() As Boolean
            Dim Sql_String As String
            Sql_String = "INSERT INTO articulos(descripcion,precio,unidad) VALUES ('" & descripcion & "', '" & precio & "','" & unidad & "' ) "
            Dim MyCommand As New OleDb.OleDbCommand(Sql_String, obj_con)
            Try
                MyCommand.ExecuteNonQuery()
                Return True
            Catch ex As Exception
                Return False
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
            End Try
        End Function

    Y ahí terminamos, no esta difícil, todo dependerá de el nivel que tengas en programación, espero que te sirva.

    si te fue de ayuda no olvides ponerla como respuesta. hasta pronto...


    Silvio Diaz

    • Marcado como respuesta Pedrez miércoles, 30 de enero de 2013 13:40
    miércoles, 30 de enero de 2013 3:12

Todas las respuestas

  • Pedrez.

    tienes que validar si el registro que estas ingresando existe en la bd

    adjunto link por un tema muy parecido

    http://social.msdn.microsoft.com/forums/es-ES/netfxwebes/thread/9092cf55-d6b3-49cf-8fbe-dc066de93886


    ______________________________________ Mario Valderrama Ingeniero De Ejecucion En Informatica Santiago, Chile

    • Propuesto como respuesta MarioChep martes, 29 de enero de 2013 14:03
    martes, 29 de enero de 2013 14:03
  • Hola a todos,

    Estoy trabajando en un proyecto en vb.net con mysql... ya tengo todas las tablas normalizadas pero mi duda es como hago para que no se me dupliquen los registros en las tablas al momento de hacer el insert...

    Por ejemplo

    Si el primer cliente que me compra es carlos y me compra pera al momento de registrarlo se me guarda que carlos compro una pera, pero si al dia siguiente viene pedro y me compra una pera tambien se me duplica la inf de nuevo ;S...

    El query lo tengo asi:
    mysql>Insert into clientes values 'nombre';
    mysql>Insert into productos values 'nombreproducto';

    Y esto es lo que no quiero que pase:

    ..............Cliente.............Producto
    id:1..... Nom:Carlos       id:1 Nom: Pera
    id:2.... Nom:Pedro         id:2 Nom: Pera

    Existe alguna forma de evitar a traves del query que se duplique el mismo producto...

    O en vb.net si existe algun codigo para hacerlo...

    Disculpen la molestia pero soy nuevo en la programacion
    Para evitar que se dupliquen podrías hacer una verificación es decir mediante una consulta la cual reciba el id del cliente y el id del producto y lo almacenes un datatable. Si el datatable te trae registros es porque existe y controlas la excepcion con un alert. Suerte
    martes, 29 de enero de 2013 14:08
  • Hola mario gracias por tu respuesta,

    te explico ya he visto soluciones parecidas a esas, pero en este caso no me sirve ya que la inf del cliente y del producto la ingreso a traves de 1 solo formulario, es decir, que si lo coloco como aparece en esa solucion me dara error cada vez que alguien vuelva a comprar pera, no se si me explico bien...

    estuve leyendo que hay una instruccion llamada distinct pero no entiendo bien si la puedo usar en el insert para que no me duplique los registros...

    martes, 29 de enero de 2013 14:10
  • Pedrez.

    puedes colocar alguna imagen de lo que estas haciendo !?


    ______________________________________ Mario Valderrama Ingeniero De Ejecucion En Informatica Santiago, Chile

    martes, 29 de enero de 2013 15:56
  • Hola gracias por tu ayuda pero creo que no me explique bien....

    ..............Clientes............................ ..............Producto...............
    Id_C...............Nombre........Id_P............. .........Id_P.........Nombre
    1....................Carlos.............1......... ..................1............Pera
    2....................Pedro..............1......... ...................2..........Manzana
    3....................Juan................2
    4....................Ramon.............1
    5....................Luis..................2
    6....................Carlos..............2

    No se mucho sobre base de datos pero de lo que he entendido en la universidad tiene que funcionar algo asi mas o menos como lo tengo en la ilustracion de arriba....

    Es decir que se va a saber que producto compro el cliente por medio del id del producto.

    Espero y ahora si me entiendas ;D
    martes, 29 de enero de 2013 16:29
  • Pedrez yo te sugeriría que hicieras un Encabezado de una venta y un detalle de la venta, así podrías manejar de mejor forma los datos.
    Saludos.
    Emmanuel Rojas.
    martes, 29 de enero de 2013 16:40
  • Pedrez.

    creo que deberias de tener 3 tablas (Cliente, Producto y venta)

    la tabla ventas debe de contener las PK de Cliente y Procucto

    ..............Clientes............................                   
    Id_Cliente(PK)

    Nombre_Cliente

    etc...

    ..............Producto...............

    Id_Producto(PK)

    Nombre_Producto

    etc...

    ..............Ventas............

    Id_Cliente(FK)

    Id_Producto(FK)

    etc...


    ______________________________________ Mario Valderrama Ingeniero De Ejecucion En Informatica Santiago, Chile

    martes, 29 de enero de 2013 17:54
  • Hola; mi profesor de la universidad siempre me decía; Una de las cosas mas importantes para que  un software funcione de la manera ms optima es que tenga un buen diseño de base de datos esas palabras son muy ciertas, luego te darás cuenta según tomes experiencias.

    para la parte de la Base de Datos te recomiendo esto...

    1. Que crees una tabla clientes (id_clientes,Nombre,Direccion...)
    2. una tabla articulos(id_articulos, descripción, precio...)
    3. Una tabla facturas para registrar solo el encabezado de esta(id_factura,id_cliente fecha,condicion...)
    4. Una tabla detalle_factura para registrar solo el detalle de la factura antes creada.(id_factura,id_articulo,unidad,precio,total...).

    como ves en las tablas facturas y detalle_factura se repiten los campos que son id en otras tabas. estos campos son los que debes relacionar para que asi tengas una mejor integridad es tus datos y no hayan datos redundantes.

    El tipo de dato que usaras en el campo id de las tablas clientes, artículos y facturas(a excepción del campo id_cliente de la tabla factura que debe ser numérico) deben ser auto numéricos.

    El tipo de datos que usaras en los campos id de la tabla detalle_factura deben ser numéricos todos porque estos representan los id de otras tablas y se usaran para relacionar las tablas posteriormente. 

    si aplicas este diseño en tu BD, estarás muy cerca de ,lograr tu objetivo de no repetir celdas.

    La Query que debes usar para no insertar filas repetidas lleva el siguiente formato:

    1. INSERT INTO tableName(fieldName)
    2. SELECT DISTINCT fieldName
    3. FROM tableName
    4. WHERE Condition

    Ahora mismo no puedo terminarla porque estoy en mi oficina y me llego mucho trabajo pero en par de horas te construyo la sentencia sql para que la pruebes en tu proyecto.



    Silvio Diaz

    martes, 29 de enero de 2013 18:56
  • Ok muchas gracias espero por tu colaboracion
    martes, 29 de enero de 2013 19:59
  • Hola Pedrez;

    Hice un pequeño cambio, ya no utilizaremos la sentencia Distinct, solo usare Count para determinar  si ya existe el registro que se va a guardar en la tabla articulos...

    Finalmente validemos los datos y verifiquemos si ya están en la BD antes de que sean guardados...

    if RegistroRepetido = true then

    Public Function RegistroRepetido() As Boolean
            Dim Sql_String As String = "SELECT COUNT(descripcion) FROM articulos WHERE descripcion = '" & descripcion & "' "
            Dim MyCommand As New OleDb.OleDbCommand(Sql_String, obj_con)
            Try
                Dim Repetidos As Integer = CInt(MyCommand.ExecuteScalar)
                If Repetidos > 0 Then
                    Return True
                Else
                    Return False
                End If
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
            End Try
        End Function
    
    

    'luego preguntamos si la función Registro repetidos devuelve verdadero, si es así entonces el 'registro no procederá a guardarse porque ya existe en tu tabla.

    ' si la función devuelve true te dara el siguiente mensaje...

    Msgbox ("El Nombre del articulo esta repetido, Por favor cambie el nombre e inténtelo de nuevo", MsgBoxStyle.Information, "Informacion de sistema")

    Else

    'Si es false entonces solo nos queda guardar el registro en la función GuardarArticulo, ya que el registro no existe en la tabla.

    if GuardarArticulo = true then 

    Public Function GuardarArticulo() As Boolean
            Dim Sql_String As String
            Sql_String = "INSERT INTO articulos(descripcion,precio,unidad) VALUES ('" & descripcion & "', '" & precio & "','" & unidad & "' ) "
            Dim MyCommand As New OleDb.OleDbCommand(Sql_String, obj_con)
            Try
                MyCommand.ExecuteNonQuery()
                Return True
            Catch ex As Exception
                Return False
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
            End Try
        End Function

    Y ahí terminamos, no esta difícil, todo dependerá de el nivel que tengas en programación, espero que te sirva.

    si te fue de ayuda no olvides ponerla como respuesta. hasta pronto...


    Silvio Diaz

    • Marcado como respuesta Pedrez miércoles, 30 de enero de 2013 13:40
    miércoles, 30 de enero de 2013 3:12
  • Muchas gracias Silvio justo eso era lo que necesitaba ;D
    miércoles, 30 de enero de 2013 13:41