** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Error al borrar un registro
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoError al borrar un registro

 Responder Responder Página  12>
Autor
Mensaje
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Tema: Error al borrar un registro
    Enviado: 18/Agosto/2017 a las 18:56
Hola amigos

Tengo dos formularios AGENDA y B (B por abreviar)

El formulario AGENDA tiene un campo principal autonumérico llamado IdAgenda

El formulario B tiene a su vez un subformulario SB que está basado en otra consulta donde existe un campo NEvento

De vez en cuando me interesa relacionar algún registro de AGENDA con un determinado registro de SB y eso queda definido en aquellos registros donde NEvento=IdAgenda

El caso es que cuando quiero borrar un registro del SB, si tiene un registro asociado en AGENDA, también quiero que se me borre,

SB es un formulario continuo, me sitúo en el registro a borrar y le doy a un botón(CmdEliminarActuacion)con el siguiente código

Private Sub CmdEliminarActuacion_Click()

If Not IsNull(Me.NEvento) Then
    DoCmd.OpenForm "AGENDA"
    Forms!AGENDA.RecordsetClone.FindFirst "IdAgenda=" & Me.NEvento
    
        If Forms!AGENDA.RecordsetClone.NoMatch Then
            MsgBox "No existe ningún registro en la agenda relacionado con esta actuación"

        Else
            Forms!AGENDA.Bookmark = Forms!AGENDA.RecordsetClone.Bookmark
            DoCmd.RunCommand acCmdSelectRecord
            DoCmd.RunCommand acCmdDeleteRecord
            
        End If
       
DoCmd.Close acForm, "AGENDA"

End If

MsgBox "se borrara el registro actual"
   
    On Error GoTo ErrorAlEliminar

    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

SalirDelError:
    Exit Sub

ErrorAlEliminar:
    MsgBox Err.Description
    Resume SalirDelError
End Sub


Fijaros que en una línea pone:

MsgBox "se borrara el registro actual"

Eso produce una pausa, le doy a aceptar y me borra el registro de SB

El caso es que si no pongo esa línea, me dice que el motor de la base de datos detuvo el proceso porque otro usuario está intentando modificar los mismos datos que usted al mismo tiempo

y entonces, le doy de nuevo al botón, se me ejecuta la macro, no encuentra el registro de la agenda porque se borró la primera vez, vuelve B (al cerrarse AGENDA) y esta vez si borra el registro de SB


Es como si el msgbox, diera tiempo al motor para situarse. Es decir, con el Msgbox funcióna perfecto, sin el msgbox se para sin borrar el registro de SB

¿sabríais darme alguna explicación?

Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 19/Agosto/2017 a las 00:34
Hola buenas noches.
Yo lo haría con menos código, así:

Private Sub CmdEliminarActuacion_Click()
'Para el caso en que no necesitaras saber si existe o no el Registro
CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento
End Sub

Private Sub CmdEliminarActuacion_Click()
'Para el caso en que SI necesitaras saber si existe o no el Registro
Dim Rs as Dao.Recordset
Set Rs = Currentdb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento)
If Rs.NoMatch Then
   CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento
Else
  Msgbox "no existe el Registro que busca"
End If
End Sub

Te ahorras todo el código que ves.

Si quieres hacer la prueba y nos cuentas.

Saludos.


Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 20/Agosto/2017 a las 22:42
Hola VIMIPAS

Tu código me gusta porque no se abre AGENDA y efectivamente es más rápido. Sin embargo observo lo siguiente:

En el caso en que sí desee saber si existe el registro de AGENDA, el código que me has indicado, no me lo dice, NoMatch siempre es falso y creo que es porque la línea
Set Rs = Currentdb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento) no cambia el valor de NoMatch a verdadero en caso de que no exista el registro. Me parece que solo cambia con el FindFirst y el Seek (eso dice en la ayuda)aunque este último no sé manejarlo.

Creo que me pusiste cambiadas las líneas de verdadero y falso del If
pero las corregí.

Como tampoco me importa si existe o no el registro, simplemente que si existe lo borre, me voy a quedar con la primera parte del código y no me lío con el NoMatch

Lo dejo asi:

Private Sub CmdEliminarActuacion_Click()
   CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.NEvento

On Error GoTo ErrorAlEliminar
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord
SalirDelError:
    Exit Sub
ErrorAlEliminar:
    MsgBox Err.Description
    Resume SalirDelError
End Sub

De todas formas, el mensaje de que hay un usuario intentando modificar el registro, me sale de vez en cuando, con o sin msgbox. me obliga a dar dos veces y sigo sin encontrar explicación ya que esto pasa aunque esté yo solo con la base. Pienso que es una manía de Access porque otra cosa no se me ocurre.




Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 22/Agosto/2017 a las 17:41
Como os dije en el mensaje anterior, el código de VIMIPAS está muy bien, y es un sistema que usaré en adelante porque me encuentra un registro de un formulario sin tener que abrirle.

Con respecto al error que os he mencionado, no sabría decir cuando pasa y cuando no, no encuentro ninguna lógica pero no es un gran inconveniente, así que si en algún momento tengo más datos sobre este asunto ya os diré. Me doy por satisfecho y podéis cerrar el hilo. Muchisimas gracias VIMIPAS por lo que me has enseñado.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 23/Agosto/2017 a las 23:50
Hola de nuevo.

Perfecto si así lo consideras, como es tu propio código y tus necesidades quedan cubiertas, resuelto pues.

No obstante, se puede resolver mi código de esta manera también:

Private Sub CmdEliminarActuacion_Click()
'Para el caso en que SI necesitaras saber si existe o no el Registro
Dim Rs as Dao.Recordset
Set Rs = Currentdb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento)
If Not Rs.EOF Then 'Es el equivalente, con un solo registro, para el caso en que tuviesemos varios registros, como digo es equivalente a Do While Not Rs.Eof
   CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.Nevento
Msgbox "correcto, existía el registro y lo hemos eliminado"
Else
  Msgbox "no existe el Registro que busca"
End If
End Sub

Creo que así aprendemos todos algo mas. Entre otras cosas, no es necesario poner rutina de errores, ya que el propio código determina si existe o no existe el registro para eliminarlo. Si si existe, lo elimina y no hay errores, y para el caso de Si no existe, te avisa y no hay errores.

Y otra aclaración mas, en tu última respuesta indicas que el código mío busca un registro en un formulario.... pues no, es tu código el que lo busca en un formulario, ya que abres el formulario "Agenda" y ahí lo busca, pero en mi caso.... tan solo lo busca directamente en la tabla, mediante el Dim Rs as Dao.Recordset. Te sugiero que leas todo lo que puedas sobre las variables Recordset (conjunto de registros o de un registro nada mas, como es tu caso, que se buscan dentro de una tabla). Son muy interesantes y con velocidad ultra rápida, de seguro que mas rápida que abrir un formulario, buscarlo, eliminarlo y cerrarlo.

Saludos.


Editado por VIMIPAS - 23/Agosto/2017 a las 23:58
Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 29/Agosto/2017 a las 17:56
Hola VIMIPAS

Está muy bien lo que me has indicado, esta vez con la propiedad EOF
De esta manera evito abrir el formulario, y buscar el registro con FindFirst.

Lo dejo todo asi:
Private Sub CmdEliminarActuacion_Click()

   Dim Rs As DAO.Recordset
   Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
   
   If Not Rs.EOF And Not IsNull(Me.NEvento) Then
   
   CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.NEvento
   
   Else
   MsgBox "No existe ningún registro relaccionado en AGENDA"
   
   End If

    On Error GoTo ErrorAlEliminar

    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

SalirDelError:
    Exit Sub

ErrorAlEliminar:
    MsgBox Err.Description
    Resume SalirDelError
End Sub



El código va muy bien a la hora de eliminar el registro relacionado en Agenda, y me avisa si no existe.

De todas formas, a la hora de eliminar el registro del formulario donde reside el código, la segunda parte del código, donde he puesto el control de errores, he probado quitar el control y dejar solo
     DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

El caso es que me sigue dando error de vez en cuando, que sigue diciendo "el motor de la base de datos detuvo el proceso porque otro usuario está intentando modificar los mismos datos que usted al mismo tiempo"

y cuando le doy a depurar está en amarillo la línea

DoCmd.RunCommand acCmdDeleteRecord

Así que al final dejo el control de errores porque prefiero que al usuario no le salga el código en la opción de depurar.
El problema se soluciona ejecutando la macro otra vez, la segunda vez no encuentra el registro de AGENDA porque se borró en la primera ejecución, pero luego borra el registro del formulario actual sin problemas.

No consigo averiguar un patrón que me determine cuando pasa esto y cuando no. De todas formas, me doy por satisfecho y muchas gracias VIMIPAS por tu ayuda   






Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 29/Agosto/2017 a las 19:12
Hola de nuevo, he hecho pruebas y una manera de que no me salga ese error al ejecutar la segunda parte del código es esta:

    Me.NEvento.SetFocus
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

Es decir, sitúo el foco en un control del registro y le doy a eliminar
Porqué pasa esto no lo sé, ya que aunque el foco no estuviera en ese control, el registro activo ya existe. Pero el caso es que no me da error y puedo eliminar el control de errores.




Editado por Antonalo - 30/Agosto/2017 a las 02:40
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 29/Agosto/2017 a las 21:37
Hola Antonalo.

Veamos a ver si lo he entendido.

Tienes un FORMULARIO: B, y dentro del mismo tienes un SUBFORMULARIO: SB ¿De acuerdo?

Cuando abres el formulario B, directamente está bajo abierto también el subformulario SB ¿De acuerdo?

1.- ¿Que tabla lleva asociada el formulario B?
2.- ¿Que tabla lleva asociada el subformulario SB?
3.- ¿Están vinculados por algún campo el formulario y el subformulario (yo supongo que sí, pero...), repito están vinculados por algún campo?

Por favor, puedes contestar a estas 5 preguntas que te hago y ya veo yo lo que se me ocurre.

Gracias.

Saludos.
Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 30/Agosto/2017 a las 10:20
Hola VIMIPAS, La realidad es un poquito más complicada de lo que en principio expuse para no extenderme innecesariamente, pero no creo que
me dejara nada esencial. La situación real es esta:

Tengo cuatro tablas:

CASOS, PROCEDIMIENTOS, ACTUACIONES, AGENDA.

Un caso tiene varios procedimientos y un procedimiento tiene varias actuaciones. Una Actuación puede (o no) requerir de una gestión y para ello habrá un campo llamado NEvento (no requerido) que nos envíe a un registro de la tabla AGENDA donde NEvento = IdAgenda, que es un dietario que nos avisa de las tareas diarias, y nos dice, en su caso lo que hay que hacer, donde, con quien etc para dar cumplimiento a esa actuación perteneciente a un procedimiento que a su vez pertenece a un caso.


Los formularios son dos

CASOS Y AGENDA

CASOS basado en la tabla CASOS con campos IdCaso IdProcedimiento
Este Formulario tiene DOS subformularios: PROCEDIMIENTOS que a su vez tiene otro subformulario, ACTUACIONES.

El subformulario PROCEDIMIENTOS tiene IdProcedimiento e IdCaso

y está enlazado a Casos mediante el campo IdCaso , Esto está reflejado
en las propiedades, en vinciular campos principales con campos secundarios y ahí pongo IdCaso del principal con IdCaso del secundario.

De esta manera, cuando abro el caso, puedo pasar por sus dos o tres procedimientos

Y Luergo está el "SubSubFormulario" ACTUACIONES, basado en la tabla ACTUACIONES, con campos IdActuación, IdProcedimeiento y NEvento

Por supuesto, está enlazado al Subformulario PROCEDIMIENTOS mediante la vinculación de los campos IdProcedimiento.
Este "SubSubFormulario" está en forma de formularios continuos para ver todas las actuaciones a la vez de un procedimiento determinado perteneciente a un Caso. Y tiene un campo NEvento mediante el que puedo relacionar un registro con otro registro de la Agenda sin más que asignar a Nevento el número de IdAgenda.

El caso es que a veces, una actuación hay que eliminarla y entonces quiero que se elimine también el registro de la Agenda en caso de existir. El código tal cual es este:

Private Sub CmdEliminarActuacion_Click()

   If Not IsNull(Me.NEvento) Then
        Dim Rs As DAO.Recordset
        Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
       
        If Not Rs.EOF Then
       
        CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.NEvento
       
        Else
        MsgBox "No existe ningún registro relacionado en AGENDA"
       
        End If
    End If

    Me.NEvento.SetFocus
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

End Sub

Este código está asociado a un botón. Primero selecciono cualquier campo del SubSubActuaciones y le doy al botón.

No sé porqué, el hecho de haber introducido la línea Me.NEvento.SetFocus
Me libra del error indicado, ya que el registro, creo yo, está activo al haberlo seleccionado previamente. Si quito la linea Me.NEvento.SetFocus me da el error indicado, y me avisa que es el error 3197

Editado por Antonalo - 30/Agosto/2017 a las 10:38
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 31/Agosto/2017 a las 17:26
Hola de nuevo, Antonalo.

En primer lugar comentar que la exposición está muy bien explicada, sin embargo cuando dices:

Este Formulario tiene DOS subformularios: PROCEDIMIENTOS, que a su vez tiene otro subformulario, ACTUACIONES.

Yo creo que deberías decir:

Este Formulario tiene UN subformulario: PROCEDIMIENTOS que a su vez tiene otro subformulario, ACTUACIONES.

Seguramente considerarás (si estoy en lo cierto) de que es otra forma de denominar lo mismo, pero no tiene mayor importancia, de la misma forma que en tu exposición inicial también estaba bien explicado, no hacía falta explicarlo todo, considero.

Pero a la vista de tanto formulario, se me ocurre hacerte esta pregunta:

¿En cual de todos los formularios (voy a llamarle formularios, ahora, a todos los "formularios" que tienes abiertos, así no nos liamos entre Form y SubForm) está el botón que ejecuta la operación y que a veces da error? Mas que nada por si "NO ESTUVIERA EN EL FORMULARIO QUE DEBERÍA ESTAR".... porque yo creo que debería estar en el formulario "ACTUACIONES".

Ya me lo dirás.

Por otro lado, vamos a acotar posibles errores y adecuamos el código, todavía mas, a lo que necesitas (en caso de que esté el botón en ACCIONES, aún no se la respuesta hasta que no contestes), con esto:

If Len(Nz(Me.Nevento, "")) = 0 Then Exit Sub ‘Creo que esto elimina mas problemas
        Dim Rs As DAO.Recordset
        Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
        
        If Not Rs.Eof Then ‘Si hay algún registro, el único, o es que ¿puede haber mas registros en IDAGENDA iguales?. OJO A ESTO

Rst.delete  ‘Lo borro, entendiendo que tan solo hay uno (en el otro método borrabámos varios, si hubiera iguales. OJO A ESTO.

        Else
       

MsgBox "No existe ningún registro relacionado en AGENDA"
        
        End If
    End If


Rs.Close’Cerramos el Recordset

Set Rs=Nothing’Liberamos memoria

‘¿Tenemos claro lo que he preguntado de SI EL BOTÓN ESTÁ EN FORMULARIO ACTUACIONES?


    Me.NEvento.SetFocus
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

 

‘Observo que esto para eliminar el registro del formulario ACTUACIONES es lo que pone el asistente de Access, por lo que antes de borrarlo te pregunta el sistema “Está a punto de eliminar un registro, quiere: SI/NO

‘¿Es cierto esto que digo ahora de que te hace la pregunta?

End Sub

Bueno, te espero y seguimos.

Saludos.


Editado por VIMIPAS - 31/Agosto/2017 a las 17:29
Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 31/Agosto/2017 a las 18:40
Hola, sí, pongo bastante esfuerzo en explicar, me parece importante no dar por obvio que los demás entienden lo que no ven. Prefiero que me toméis por pesado a que no me entendáis.

Me parece muy acertada la corrección sobre la "jerarquía" de formularios. En este caso, decir que un formulario tiene dos subformularios, es incorrecto. 

El botón que ejecuta el código se encuentra en el último subformulario, es decir, en ACTUACIONES, en el encabezamiento. Tiene formato de formularios continuos y los campos están organizados de forma tabular.

He tomado nota de tus correcciones, lo único que la primera linea la he modificado porque no quiero Exit Sub, quiero borrar el registro de actuaciones aunque no exista NEvento en el formulario.

Solo puede existir un solo registro en la AGENDA con ese número ya que NEvento lo he hecho coincidir previamente con el IdAgenda, y este es un campo Autonumérico. Por tanto se puede aplicar la corrección que me indicas en el caso de existir un único registro en AGENDA.

Total que lo dejo así (de momento)

Private Sub CmdEliminarActuacion_Click()

   If Len(Nz(Me.NEvento, "")) <> 0 Then
        Dim Rs As DAO.Recordset
        Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
        
        If Not Rs.EOF Then
        Rs.Delete
        
        Else
        MsgBox "No existe ningún registro relacionado en AGENDA"
        
        End If
    End If
    
    Rs.Close
    Set Rs = Nothing

    'Me.NEvento.SetFocus
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

End Sub

Observa que he inhabilitado la línea Me.NEvento.SetFocus 
Ya que ahora no me está dando el error 3197 (linea bastante tonta pero evitaba el error)

Y sí, siempre, a la hora de eliminar el registro de ACTUACIONES, me avisa el programa de que se va a eliminar un registro etc..

Lo que me pasaba con el error solo me pasaba la primera vez, al darle por segunda vez al botón, ocurría que no encontraba el registro de AGENDA, (ya se había borrado la primera vez) y luego borraba sin problemas el registro de ACTUACIONES.

El caso es que he hecho varias pruebas y el error ya no se produce, el porqué no lo tengo muy claro pero parece que las correcciones que me has indicado van muy bien. De verdad, muchas gracias por tu tiempo y tu interés VIMIPAS. Voy a esperar un poco y si no se reproduce el error, os digo para que cerréis.








Editado por Antonalo - 31/Agosto/2017 a las 20:01
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 31/Agosto/2017 a las 22:11
Hola Antonalo.

Con foreros como tu, que estudias lo que te ponen y lo practicas y rematas a tu gusto, vale la pena, por lo tanto las gracias son para ti, que también te las mereces.

En base a que siempre quieres que se borren los registros del SubFormulario ACCIONES, yo "también de momento" le haría esta corrección, que yo mismo he cometido:

 If Len(Nz(Me.NEvento, "")) <> 0 Then
        Dim Rs As DAO.Recordset
        Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
        
        If Not Rs.EOF Then
        Rs.Delete
        
        Else
        MsgBox "No existe ningún registro relacionado en AGENDA"
        
        End If
Rs.Close
    Set Rs = Nothing
    End If
    

    'Me.NEvento.SetFocus
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

End Sub

Si hasta ahora no te ha dado error lo que acabo de incluir dentro del If/End If (cerrar rs y quitar memoria) es porque siempre has tenido algún registro relacionado entre ACTUACIONES y AGENDA, en caso contrario el sistema te habría dicho que la variable Rs no edxiste (siempre y cuando tengas arriba del módulo del SubFormulario ACCIONES Option Explicit).

Para veas que yo, por supuesto, también me equivoco.

Te importaría, no obstante, aclararme esto:

Lo que me pasaba con el error solo me pasaba la primera vez, al darle por segunda vez al botón, ocurría que no encontraba el registro de AGENDA, (ya se había borrado la primera vez) y luego borraba sin problemas el registro de ACTUACIONES.

Ahí, no termino de entender lo que subrayo y pongo en rojo.

Ya que en la primera vez, también habría borrado el registro de ACTUACIONES. ¿No?. Entonces ¿para que darle una segunda vez?. Lo dicho, ahí me has dejado K.O.

Saludos.


Editado por VIMIPAS - 31/Agosto/2017 a las 22:12
Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 01/Septiembre/2017 a las 21:31
Hola VIMIPAS
Me costó darme cuenta de que habías cambiado de sitio las Líneas para cerrar y borrar Rs.
Efectivamente, Rs solo se crea cuando NEvento tiene algún valor, en caso contrario Rs no se crea y al intentar borrar algo que no existe daría error, ya que Option Explicit siempre la tengo puesta por defecto.

La segunda cuestión es en realidad el motivo original de mi hilo:

Como ves, el código tiene dos partes, en la primera, si NEvento existe en ACTUACIONES, busca ese mismo número en el campo IdAgenda de la tabla AGENDA y borra ese registro en caso de que nadie lo haya borrado antes; y sino, nos avisa de que no existe ese registro en AGENDA.

A continuación, y aparentemente lo más fácil, el código borra el registro de ACTUACIONES, exista NEvento o no, es igual, queremos borrar ese registro y punto.
Pero es en este momento donde me aparecía el error 3197. Al principio tenia puesto el control de errores simplemente ma lanzaba el mensaje. Al quitar el control de errores, me dice el número de error y me sale para depurar, cosa que no quiero que le salga al usuario. Pero al depurar, me di cuenta de que la la línea que causaba el error era

DoCmd.RunCommand acCmdDeleteRecord

Es decir, no me dejaba eliminar el registro de ACTUACIONES. Sin embargo, la primera parte del código sí se había ejecutado y el registro de la AGENDA ya había desaparecido. A continuación daba a finalizar en el mensaje de error y el registro de ACTUACIONES seguía tal cual.
A continuación, al darle una segunda vez al botón (asegurándome siempre de que el registro que quiero borrar sea el registro activo ya que es un formulario continuo) El código vuelve a ejecutar la primera parte y esta vez, no encuentra el registro de AGENDA, ya que lo borró la primera vez. Me avisa por tanto de que no existe, vale, y ahora borra el registro de ACTUACIONES con el consiguiente mensaje de que se va a borrar un registro etc... Es decir, la segunda vez no se detiene el código.

Cuando añadí la línea tonta de Me.Evento.SetFocus, no sé porqué pero ya no me decía lo de que había otro usuario intentando modificar los mismos datos (3197)

Con el código que me has enseñado, esto ya definitivamente no pasa, no tengo claro porqué pasaba antes pero quería averiguar una cosa y he aprendido unas cuantas cosas así que estoy más que satisfecho.

Te pego el código que tengo, tal cual. Puedes observar que he dejado como comentario una línea que me pusiste primero. La quiero a modo de biblioteca, porque aunque en este caso no me haga falta, creo que es muy útil como enseñanza.

Private Sub CmdEliminarActuacion_Click()

   If Len(Nz(Me.NEvento, "")) <> 0 Then
        Dim Rs As DAO.Recordset
        Set Rs = CurrentDb.OpenRecordset("SELECT AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda =" & Me.NEvento)
       
        If Not Rs.EOF Then
        Rs.Delete
       
        'CurrentDb.Execute "DELETE AGENDA.IdAgenda FROM AGENDA WHERE AGENDA.IdAgenda = " & Me.NEvento
        'Esta linea anterior borraría todos los registros de la agenda que tuvieran IdAgenda =Nevento, pero solo hay uno
        'Por eso basta con Rs.Delete
       
        Else
        MsgBox "No existe ningún registro relacionado en AGENDA"
       
        End If
       
        Rs.Close
        Set Rs = Nothing
       
    End If
    
    DoCmd.RunCommand acCmdSelectRecord
    DoCmd.RunCommand acCmdDeleteRecord

End Sub






Editado por Antonalo - 01/Septiembre/2017 a las 21:36
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5218
Enlace directo a este mensaje Enviado: 02/Septiembre/2017 a las 22:49
Hola de nuevo.

Tan solo me quedaría preguntarte por la relación que une ambos campos (cada uno de su tabla), porque yo he partido de la teoría de que la relación es de la tabla ACCIONES  la tabla AGENDA.

Pero.... no he supuesto que sea de ACCIONES (NEvento) (uno) a AGENDA (IdAgenda) (muchos)...

Podrías tu decirme bien detallado cual es la relación hecha por tí.

Saludos.
Gracias
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 03/Septiembre/2017 a las 10:19
Pues el formulario relaciones esta basado en esto:

SELECT ACTUACIONES.*, AGENDA.IdAgenda, AGENDA.FechaEvento
FROM AGENDA RIGHT JOIN ACTUACIONES ON AGENDA.IdAgenda = ACTUACIONES.NEvento
ORDER BY ACTUACIONES.FechaResolucion;

Y ahora que lo pienso, creo que no debería aparecer para nada la AGENDA en el formulario ACTUACIONES.

El procedimiento para relacionar ambos formularios es así: Cuando se crea un nuevo registro en ACTUACIONES, es posible que haya que hacer alguna tarea para llevarla a cabo. Entonces hay que crear una tarea en AGENDA,un nuevo registro con una fecha, un empleado que se va a encargar, con quien se va a reunir, el día la hora etc.. y se nos genera un IdAgenda autonumérico. Ese IdAgenda se copia luego en el campo NEvento de ACTUACIONES, para en un momento dado dirigirnos al registro de agenda que está relacionado con esa actuación. Pero en principio AGENDA Y ACTUACIONES son independientes y no tiene porque haber ninguna relación. Solo existe relación en el caso de que creemos un registro de AGENDA para esa ACTUACIÓN, y sería solo uno.

Bien, he probado basar ACTUACIONES En esto:

SELECT ACTUACIONES.*
FROM ACTUACIONES
ORDER BY ACTUACIONES.FechaResolucion;


Me va perfectamente, incluso con el antiguo código, el que me daba error, que había otro usuario etc. Es muy posible que el problema fuera que access no quisiera borrar a la vez dos registros con una relación interna.



Editado por Antonalo - 03/Septiembre/2017 a las 10:41
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable