Bloqueo de Formulario luego de un select

Tengo un formulario en el que pido usuario y contraseña, válido si son correctos mediante un evento en un botón con un SELECT, después presenta una pantalla con varias opciones y una de ellas es dar mantenimiento a la tabla de usuarios y cuando ingreso a actualizar el formulario de usuarios me presenta los datos bloqueados y me dice "No se puede actualizar este recordset", e intentado varias cosas y no se como quitar este bloqueo, agedecería mucho que me ayuden con la solución.

3 respuestas

Respuesta
1
Con la información que das no sé muy bien dónde puede estar el error. Si quieres, pásame la BD comprimida en zip y los pasos que debo seguir para llegar a este error que te sale, y le echaré un vistazo.
Mi mail es [email protected]
Espero tus comentarios.
Un saludo.
... http://neckkito.eu5.org ...
Muchas gracias por contestar a mi pregunta, te comento que estoy trabajando con access 2003 y que el código del evento para la validadción del Usuario y la contraseña es el siguiente, como te decía el problema se da luego cuando paso al menu principal y abro el formulario de mantenimiento de la tabla de usuarios, si lo pruebo directamente desde el menu principal me funciona muy bien pero cuando empiezo con la validadión de los usuarios me presenta el error "No se puede actualizar este recordset".
Private Sub Comando8_Click()
Dim algo As String
Dim db As Database
Dim SQLline As String
Dim Result As Object
If TextoUsuario = " " Or TextoContraseña = " " Then
algo = MsgBox("Por favor, complete todos los campos", 16, "Omisión")
Else
SQLline = "SELECT * FROM Usuarios WHERE Usuario = '" & Me.TextoUsuario & "' and contraseña = '" & Me.TextoContraseña & "';"
Set db = CurrentDb()
Set Result = db.OpenRecordset(SQLline)
If Result.EOF And Result.BOF Then
algo = MsgBox("El nombre de usuario o contraseña son incorrectos", 16, "Discrepancia")
Else
Usuario2 = TextoUsuario
ExpedientePer = Result.ExpedientePersonal
RegistroSani = Result.RegistroSanitario
RegistroPsic = Result.RegistroPsicológico
SeguimientoGen = Result.SeguimientoGeneral
DoCmd.OpenForm "Pantalla Principal"
End If
Result.Close
db.Close
Set Result = Nothing
Set db = Nothing
End If
End Sub
Acabo de crearme una miniBD para emular tu código y en principio a mí me funciona todo correctamente, y no consigo replicar tu error.
La he creado en Access 2007 y después la he convertido en compatible con 2003, y aún así me sigue funcionando correctamente. Si quieres echarle un vistazo para ver si hay algo "importante" que quizá por desconocimiento no haya añadido puedes mirarla aquí.
Lo único que veo un poco "raro" es que cuando utilizas código VB las SQL no llevan el punto y coma del final. Por eso, en la línea
SQLline = "SELECT * FROM Usuarios WHERE Usuario = '" & Me.TextoUsuario & "' and contraseña = '" & Me.TextoContraseña & "';"
yo le he quitado el punto y coma, quedando
contraseña = '" & Me.TextoContraseña & "'"
El lunes tendré acceso a un Access 2003 y lo volveré a probar, a ver si consigo hacer que me salte el error.
Ya me dirás si detectas algo "diferente" entre tu BD y la que te cuelgo en la red.
Gracias por atender a mi pregunta, hay algo que yo no tengo muy claro cuando defino
Dim Result As Object
se puede también definir como
Dim Result As Recordset
Que diferencia hay entre las dos definiciones y luego en el
Result.Close si lo he definido como objeto, el Openrecordset del select también se cierra o es necesario una instrucción más para cerrarlo.
Para que me entiendas un Recordset es un Object; es decir, que son lo mismo pero no ;)
En Access 2007 y 2010 siempre, por experiencia, defino los recordset como Recordset. En Access 2003 a veces el código me ha dado problemas si lo definía de esta manera, por lo que definiéndolo como Object me evitaba estos problemas. ¿Por qué? Ciertamente, no lo sé: si no funciona uno pon el otro.
Aunque no sea el mismo tipo de consulta te recomiendo que visites esta duda y la respuesta que da el "experto" (no es de Todoexpertos), porque explica clarísimamente qué es un Object (tanto pregunta como respuesta son muy breves pero clarísimos). Eso está aquí.
Y, evidentemente, si lo cierras con rst. Close (rst es tu Result) lo cierras sin importar si lo has definido como Object o como Recordset.
Aprovecharé para comentarte un par de cosillas, por si no las sabes:
- La primera es una recomendación y evidentemente es una cosa mía "personal": yo normalmente no defino la variable dbs porque, cuando establezco el recordset, lo establezco de la siguiente manera:
Set rst = currentDb.OpenRecordset
Así me ahorro tener que definir una variable y asignarle un valor.
Sí defino dbs cuando en el código manejo varios recordset. Así, cuando con el tiempo reviso el código, si no veo Dim dbs sé que el código es "sencillo" (remarco lo de entre comillas). Si veo Dim dbs sé que la cosa se "complica" porque hay varios Recordsets en el código.
- La segunda es informativa, por si no lo sabes:cuando cierras dbs y rst con close todavía quedan "restos" de información en la RAM, y muchos restos acumulados pueden llegar a ralentizar el ordenador. Por ello escribes Set rst = Nothing y Set dbs = Nothing, para "limpiar" la RAM. ;)
Ya me dirás si tienes alguna duda o problemilla.
Respuesta
1
Cual es le código del evento. Podría ser que n oestas cerrando el recordset o que estas bloqueando los registros con el tipo de bloqueo del recordet
Manda tu código
En primer lugar muchas gracias por contestar a mi pregunta, te comento que estoy trabajando con access 2003 y que el código del evento para la validadción del Usuario y la contraseña es el siguiente, como te decía el problema se da luego cuando paso al menu principal y abro el formulario de mantenimiento de la tabla de usuarios, si lo pruebo directamente desde el menu principal me funciona muy bien pero cuando empiezo con la validadión de los usuarios me presenta el error "No se puede actualizar este recordset".
Private Sub Comando8_Click()
Dim algo As String
Dim db As Database
Dim SQLline As String
Dim Result As Object
If TextoUsuario = " " Or TextoContraseña = " " Then
algo = MsgBox("Por favor, complete todos los campos", 16, "Omisión")
Else
SQLline = "SELECT * FROM Usuarios WHERE Usuario = '" & Me.TextoUsuario & "' and contraseña = '" & Me.TextoContraseña & "';"
Set db = CurrentDb()
Set Result = db.OpenRecordset(SQLline)
If Result.EOF And Result.BOF Then
algo = MsgBox("El nombre de usuario o contraseña son incorrectos", 16, "Discrepancia")
Else
Usuario2 = TextoUsuario
ExpedientePer = Result.ExpedientePersonal
RegistroSani = Result.RegistroSanitario
RegistroPsic = Result.RegistroPsicológico
SeguimientoGen = Result.SeguimientoGeneral
DoCmd.OpenForm "Pantalla Principal"
End If
Result.Close
db.Close
Set Result = Nothing
Set db = Nothing
End If
End Sub
Sencillo estas abriendo db como un objeto no como un recordset
Al cerrar cierras el objeto pero no el recordset :)
Entonces los bloqueos siguen.
Intenta declararlo como recordset
Cier
Pero si lo declaro como recordset,¿Puedo recuperar el contenido de los campos de la tabla? Los necesito para realizar algunas validaciones en otros formularios.
Si
Respuesta
Tendría que enviarme tu formulario en un zip, porque así sin ver está difícil ver que pasa. Solo que trabajo en access 2002, solo indicame que quieres que haga porque no se porque pero estos días me han pedido mucha ayuda y los he ido sacando poco a poco pues tengo que cumplir con mis deberes laborales.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas