Consulta con recordset (no me sale)

Tengo un ligero problemilla con un formulario. He intentado que funcione pero mis conocimientos de SQL son limitados por no decir nulos. Os pongo en antecedentes:

Tengo una tabla de PERSONAL donde cada personal puede tener uno, dos o más cursos. Para ello he creado 3 campos independientes de donde obtengo la información de los cursos que han realizado y que luego me sirven para, o bien buscar en una consulta SQL o bien INSERTARLOS en la tabla de FORMACIONPERSONAL.

Lo que quería hacer es una consulta que me busque por el NOMBRECURSO y si ese trabajador ya ha realizado ese curso que me ponga un box donde me lo diga y no me permita duplicarlo o, por el contrario, si no ha realizado ese curso que me lo INSERTE.

He conseguido hacer que me inserte los curso, pero es que me los inserta todos, duplicados y no duplicados. Todo esto está en un botón que pone "Grabar" y que ejecute el código: Si estan en blanco alguno de los campos no deja seguir. Si están los 3 campos (Fecha curso, nhoras y nombrecurso) con datos, que ejecute la consulta y en la consulta que vaya leyendo cada registro que sale (supongo que es eso del recordset)y que compare si los cursos son iguales, hasta que llegue al final de los registros (eso hará que el curso no aparezca como duplicado) y si lo encuentra que me ponga otro box que me diga que ese trabajador ya hizo ese curso.

Y al darle al boton de GRABAR, me pone "Calculando ..." y se cuelga el access ...

Os pongo el código a ver si me podeis ayudar ... Gracias de antemano.

Private Sub Comando46_Click()

Dim strcurso As String
Dim cursoc, dni, dnic As String
Dim fecha As Date

Dim cadSQL As String
dni = Me.dni
dnic = Me.dni
cursoc = Me.cursoc

' Compruebo que los campos no están vacíos.

If IsNull(fechac) Or IsNull(horasc) Or IsNull(cursoc) Then
MsgBox "No se pueden dejar campos en blanco", vbCritical, "ATENCION"
Exit Sub
End If

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim SQL As String

Set db = CurrentDb
SQL = "SELECT nombrecurso FROM formacionpersonal WHERE dni ='" & dnic & "'"
Set rs = db.OpenRecordset(SQL)

Do While rs.EOF = False
  rs.MoveFirst
  If rs.Fields("nombrecurso") <> cursoc Then Exit Do
  ' Comparar el valor del registro actual con el valor de nombrecurso
  If rs.Fields("nombrecurso") = cursoc Then
       'En caso de que los valores coincidan se envía un mensaje de advertencia
       MsgBox "No se puede duplicar la formación. Esa formación ya existe."
       Exit Sub
  End If
  rs.MoveNext
Loop

'En caso de que la formación no coincida, inserta el curso en la tabla FORMACIONPERSONAL

cadSQL = "INSERT INTO formacionpersonal " & "(dni, fechacurso, nombrecurso, nhoras) " & "VALUES ('" & dnic & "','" & fechac & "', '" & cursoc & "', '" & horasc & "')"
CurrentDb.Execute cadSQL

' Pongo los valores en blanco

Me.cursoc = Null
Me.fechac = Null
Me.horasc = Null
Me.fechac.SetFocus

Forms!copiadepersonal.formacionp.Form.Requery

End Sub

1 respuesta

Respuesta
2

Te indico una forma más sencilla de comprobar si ya tienes registrada en la tabla los mismos datos para "dni, fechacurso, nombrecurso, nhoras" en un registro: Usa la función DCount(). Si encuentra coincidencias te devolverá el número de las mismas (en tu caso 1, ya que no se pueden repetir, en teoría), y si no la encuentra te dará 0. En función de ese valor, avisas o insertas, por ejemplo (revisa los nombres):

If DCount("*","formacionpersonal","dni='" & Me.DNI & "' AND fechacurso=#" & Me.fechacurso & "#" AND nombrecurso='" & Me.nombrecurso & "' AND nhoras=" & Me.nhoras)>0 Then

MsgBox "El alumno ya está matriculado"

Else

CurrentDb.Execute "INSERT INTO..."

End If

Un saludo.


Amplio la respuesta.

Si lo quieres hacer por medio de un recordset, tienes una forma más rápida que recorrerlo todo registro a registro, parecida a la anterior:

1º/ Abres el recordset sobre una consulta que devuelva los 4 campos que no se pueden repetir para el dni, algo así:

set rst=CurrentDb.Openrecordset("SELECT * FROM formacionpersonal WHERE dni='" & Me.DNI & "' AND fechacurso=#" & Me.fechacurso & "#" AND nombrecurso='" & Me.nombrecurso & "' AND nhoras=" & Me.nhoras)

2º/ miras si devuelve o no registros, por ejemplo con la propiedad Recordcount:

If rst.Recordcount=0 Then 'No devuelve registros

'Insertas

Else

'Avisas

End If

Estoy con la primera opción, la de dCount pero se para en me.fechac y me sale un error: "No se encontró el método o el dato miembro". Después probare con la segunda.

Tienes que ajustar los nombres a los que tienes, yo los puse un poco "a boleo". Los que llevan el Me. Delante son los nombres de los controles de tu formulario, los otros, los que van antes de los signos =, son los nombres que tienen los campos en tu tabla (que tampoco sé a ciencia cierta si es formacionpersonal o otra...)

Gracias .... he encaminado la consulta y ahora ya me funciona. Muchisimas gracias. Al final el numero de horas y la fecha no eran tan importantes, debido a que en otra tabla ya tengo cargados todos los posibles cursos de 20 y 6 horas.

Al final lo he dejado tal que así:

Set Rst = CurrentDb.OpenRecordset("SELECT * FROM formacionpersonal WHERE dni = '" & dnic & "' AND nombrecurso = '" & cursoc & "'")

y funciona!!!!!!

Gracias

Que funcione es lo importante, y que lo hayas adaptado a tus necesidades.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas