controlar que no haya registros duplicados
hola, trabajo con visual basic 6.0 y access 2000. Para acceder a la base de datos utilizo el control ADO. Mi problema es que cuando doy de alta a un registro con un identificativo nº1, si vuelvo a dar de alta al mismo registro me aparece un mensaje de error (por el tema de los registros duplicados). ¿CÓMO CONTROLO ESE ERROR? GRACIAS
Hola Paky este es el codigo que necesitas.
Do While Not Rs.EOF 'Rs es tu Recordset
If Textbox.Text = Rs!identificador Then
MsgBox "No se puede el mismo" _ & "identificador ", vbCritical, "Error"
Textbox.Text = ""
Textbox.SetFocus
Exit Sub
End If
Rs.MoveNext
Loop
Este codigo iria en el click del boton que usas
para guardar el registro, antes de dar el alta.
Espero que te sirva!!!
Do While Not Rs.EOF 'Rs es tu Recordset
If Textbox.Text = Rs!identificador Then
MsgBox "No se puede el mismo" _ & "identificador ", vbCritical, "Error"
Textbox.Text = ""
Textbox.SetFocus
Exit Sub
End If
Rs.MoveNext
Loop
Este codigo iria en el click del boton que usas
para guardar el registro, antes de dar el alta.
Espero que te sirva!!!
Paki:
Puedes usar también una consulta para saber si existe ya un registro con el mismo Id, si necesitas que lo indique el usuario (aunque recomiendo que evites eso en la medida de lo posible, mejor un autonumérico). Un ejemplo seria el siguiente:
' Asumimos que tienes un datagrid asociado a un ADO data control abierto y con registros:
Private Function HayRegistroDuplicado(ByVal NombreTabla as String, ByVal Valor as Long) as Boolean
Dim Rs as Recordset
Set Rs = New Recordset
Rs.ActiveConnection = <adoDC>.Recordset.ActiveConnection
' Asumimos que el CampoId es numérico, por tanto no va entrecomillado en la comparación "Where"
Rs.Source = "Select Count (*) from " & NombreTabla & " Where CampoID = " & valor
Rs.Open
' En el Select Count sólo hay un campo, cuyo ordinal es cero. Devolverá True si existen registros con el Id.
HayRegistroDuplicado = (Rs.Fields(0).Value > 0)
Rs.Close
End Function
Puedes invocar una función de este tipo antes de guardar el registro, por ejemplo:
If HayRegistroDuplicado("MiTabla", 1234) Then
MsgBox "ID duplicado", vbOkOnly
Else
' ... guardar ...
End If
Salud.
Puedes usar también una consulta para saber si existe ya un registro con el mismo Id, si necesitas que lo indique el usuario (aunque recomiendo que evites eso en la medida de lo posible, mejor un autonumérico). Un ejemplo seria el siguiente:
' Asumimos que tienes un datagrid asociado a un ADO data control abierto y con registros:
Private Function HayRegistroDuplicado(ByVal NombreTabla as String, ByVal Valor as Long) as Boolean
Dim Rs as Recordset
Set Rs = New Recordset
Rs.ActiveConnection = <adoDC>.Recordset.ActiveConnection
' Asumimos que el CampoId es numérico, por tanto no va entrecomillado en la comparación "Where"
Rs.Source = "Select Count (*) from " & NombreTabla & " Where CampoID = " & valor
Rs.Open
' En el Select Count sólo hay un campo, cuyo ordinal es cero. Devolverá True si existen registros con el Id.
HayRegistroDuplicado = (Rs.Fields(0).Value > 0)
Rs.Close
End Function
Puedes invocar una función de este tipo antes de guardar el registro, por ejemplo:
If HayRegistroDuplicado("MiTabla", 1234) Then
MsgBox "ID duplicado", vbOkOnly
Else
' ... guardar ...
End If
Salud.
Antes de escribir la base de datos yo realizo una busqueda con una sentencia sql buscando si ya existe la clave principal en la base de datos. en caso de que asi sea mando el mensaje de error. Si no existe entonces se puede grabar sin problemas
Saludos
Saludos
No puedes dar de alta al mismo registro 2 veces;
explica para que quieres dar de alta dos veces el mismo registro... acuerdate que el campo identificativo debe ser unico y no permitir vacios
explica para que quieres dar de alta dos veces el mismo registro... acuerdate que el campo identificativo debe ser unico y no permitir vacios
No he usado mucho ADO, pero si lo que aparece es un mensaje de error, entonces lo que debe hacer es algo como esto:
on error resume next
rs.update
if (err.number=<# de error esperado>) Then
msgbox "El mensaje deseado debe aparecer aquí"
elseif (err.number<>0)then
msgbox "Ocurrio un error inesperado." & vbcrlf & vbcrlf & err.description
endif
on error goto 0 'o a una etiqueta de manejo de errores global al procedimiento.
on error resume next
rs.update
if (err.number=<# de error esperado>) Then
msgbox "El mensaje deseado debe aparecer aquí"
elseif (err.number<>0)then
msgbox "Ocurrio un error inesperado." & vbcrlf & vbcrlf & err.description
endif
on error goto 0 'o a una etiqueta de manejo de errores global al procedimiento.