Eliminar registros con recordset

Finalmente me he animado a intentar utilizar los recordset pero no consigo que funcionen.
Concretamente lo que quiero hacer es borrar de una tabla llamada "LEADATRIBUTO" los registros que cumplan con una determinada condición (concretamente aquellos cuyo ID_LEAD sea igual al ID_LEAD del formulario desde el que lo ejecuto)
Al final el problema lo he resuelto usando una sentencia SQL de las de toda la vida, que sí funciona a la perfección:
DoCmd.RunSQL "Delete * FROM LEADATRIBUTO WHERE ID_LEAD=" & Me.ID_LEAD & ";"
Sin embargo me queda la duda de qué estoy haciendo mal con la parte del recordset.
He fusilado un código que encontré por ahí y lo he adaptado a lo mío pero no me funciona; es una cosa extrañísima, en algunos registros sólo me borra uno de los registros coincidentes, con lo que tengo que ejecutarlo tantas veces como registros haya en la tabla LEADATRIBUTO y en otros casos directamente no hace nada de nada.
¿Qué es lo que está mal en este código?
Dim Buscadb As Database
Dim Buscaws As Workspace
Dim Busca As Recordset

Set Buscaws = DBEngine.Workspaces(0)
Set Buscadb = Buscaws.Databases(0)
Set Busca = Buscadb.OpenRecordset("LEADATRIBUTO")
If Busca.EOF = False Then
Busca.MoveFirst
While Busca.EOF = False
If Me.ID_LEAD = Busca![ID_LEAD] Then
Busca.Delete
Busca.MoveLast 
End If
Busca. MoveNext
Wend
End If

1 Respuesta

Respuesta
1
Te comento un par de cosas. La primera parte no está mal pero es innecesaria ya que no es obligatorio usar diferentes workspaces para lo que quieres hacer (estas generando como una nueva instancia de Access para ejecutar una simple consulta de actualización de datos en una tabla local, sin ejecuciones en paralelo...).
Lo importante es que en el bucle (entre While y Wend) tienes un delete (borra registro activo) y luego un movelast (ir al último registro) seguido de un movenext (siguiente registro). Por ello, cuando haces la primera pasada y borras el primer registro te vas al último y luego al siguiente (que no existe ya que no hay nada tras el último). Por eso en la segunda pasada EOF es igual a True (estas tras el último registro) y ya no se ejecuta nada más.
Te copio tu código con algún cambio más (cierro recordset establezco a Nothing la variable de base de datos para liberar recursos tras haberlos usado).
Cordiales saludos.
Dim Buscadb As Database, Busca As Recordset
Set Buscadb=CurrentDb
Set Busca = Buscadb.OpenRecordset("LEADATRIBUTO")
If Busca.EOF = False Then
Busca.MoveLast
Busca.MoveFirst
While Busca.EOF = False
If Me.ID_LEAD = Busca![ID_LEAD] Then
Busca.delete
End if
Busca.MoveNext
Wend
End if
Busca.Close
Set Buscadb=Nothing
Muchas gracias por tu ayuda, la verdad es que leyendo tu código suena más "lógico" que el mío.
Como te digo, lo fusilé de otro sitio y ahí estaba lo del workspace que, por desconocimiento, no me atreví a quitarlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas