No insertar registros duplicados insert into

Necesito controlar que la información digitada en un formulario no pueda ser duplicada. ¿Tienen idea de como puedo crear este control?

2 Respuestas

Respuesta
1

Yo atajaría el problema de raíz y en lugar de crear un control, modificaría las propiedades del campo en el que no quieres valores dulicados.

Lo haría desde la tabla donde tengas este campo.

La abres en modo diseño, clicas sobre el campo en cuestión y en la lista de propiedades "General", cambia el valor de la propiedad "Indexado" y pon la opción "Si (sin duplicados)".

De esta manera, cuando en el formulario entres un valor que ya existe, access te lanzara una ventana que te indicara que crearías valores duplicados y simplemente no te dejara continuar si no cambias ese valor.

Eso si, antes de modificar esta propiedad asegurate que no tengas valores duplicados porque te dará algún "problema"

Gracias por la respuesta, sin embargo creo que es un poco más complejo, perdón por no formular la pregunta correctamente.

Tengo un campo que se llama materia que en teoría no debe tener dos evaluaciones para un mismo estudiante en el mismo periodo.como lees el control debe verificar que no exista evaluación para un mismo periodo para un mismo estudiante para una misma materia.

Espero haber sido más explícito

Pues si, es más complejo y me temo que no se tanto como para solucionarlo de una manera sencilla.

Lo lamento pero no se me ocurre una solución... tal como entendí la pregunta lo vi realmente sencillo, pero ahora, explicado de esta manera, veo que hasta ahi no llego

Un consejo. Cuando he planteado preguntas, a mi me ha respondido un experto que se llama Sveinbjorn El Rojo

Estoy totalmente seguro que él te lo solucionará a la primera, lo que no se es como formularle la pregunta directamente

Respuesta
2

Por alusiones, te indico una forma de hacer ese control: utiliza las funciones DCount() para ver si hay registros que cumplan esos criterios o DLookup().

DCount devolverá 0 si no hay coincidencias, o el número de registros que haya con esos criterios (en tu caso no debería haber más de 1)

DLookup devolverá un Nulo si no hay coincidencias, o el primer valor que coincida.

Por ejemplo podrías hacerlo así:

If DCount("*","NombreTabla","Materia='" & Me.Materia & "' AND Alumno='" & Me.Alumno & "' AND Periodo='" & Me.Periodo & "'")>0 Then
Msgbox "Ya hay una evaluación para el alumno y materia en ese periodo"
... ' aquí lo que quieras hacer si ya está registrada
Else
...'Aqui lo que quieras hacer si no hay duplicado
End If

Saludos.


¡Gracias! Hermano.

la pruebo y te dejo saber que tal

DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
Dim i As Integer
For i = 1 To Form.Recordset.RecordCount
If Nz(Me.Calificacion, "") <> "" Then
DCount("*", "Aux", "Materia='" & Me.Parent!cbo_materia & "' AND Alumno='" & Me.Alumno & "' AND Periodo='" & Me.Parent!cbo_periodo & "')) > 0
MsgBox "Ya hay una evaluación para el alumno y materia en ese periodo", vbInformation, "AVISO"
Me.Parent.cboteval.SetFocus
Else
DoCmd.RunSQL "insert into aux(curso,alumno,no,calificacion,conducta,periodo,materia,profesor,evaluacion,tipo,fecham)values " _
& "('" & Me.Parent.cbo_curso & "','" & Me.Alumno & "'," & Me.No & ",'" & Me.Calificacion & "', '" & Me.Conducta & "','" & Me.Parent!cbo_periodo & "','" & Me.Parent!cbo_materia & "','" & Me.Parent!cboprofesor & "','" & Me.Parent!cbo_evaluacion & "','" & Me.Parent!cboteval & "','" & Date & "')"
End If
End If

Me esta dando un error. me puedes ayudar a corregir la sintaxis?

Favor obviar la pregunta anterior ya lo pude solucionar. Sin embargo me gustaría que el código le indique al usuario que registro es el que esta tratando de duplicar y le de la opción de cancelar y continuar:

DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
Dim i As Integer
For i = 1 To Form.Recordset.RecordCount
If Nz(Me.Calificacion, "") <> "" Then
ElseIf DCount("*", "Aux", "Materia='" & Me.Parent!cbo_materia & "' AND Alumno='" & Me.Alumno & "' AND Periodo='" & Me.Parent!cbo_periodo & "'") > 0 Then
MsgBox "Ya hay una evaluación para el alumno y materia en ese periodo", vbCritical, "AVISO"
Me.Parent.cboteval.SetFocus
Else
DoCmd.RunSQL "insert into aux(curso,alumno,no,calificacion,conducta,periodo,materia,profesor,evaluacion,tipo,fecham)values " _
& "('" & Me.Parent.cbo_curso & "','" & Me.Alumno & "'," & Me.No & ",'" & Me.Calificacion & "', '" & Me.Conducta & "','" & Me.Parent!cbo_periodo & "','" & Me.Parent!cbo_materia & "','" & Me.Parent!cboprofesor & "','" & Me.Parent!cbo_evaluacion & "','" & Me.Parent!cboteval & "','" & Date & "')"
End If

Como poco te faltan unas comillas dobles después de la última comilla simple del Dcount. Fíjate en mi código de ejemplo.

¡Gracias!  pero no entiendo. De hecho el código funciona pero no permite el avance al segundo registro (el next to) que es lo que necesito

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas