Error en el codigo para salir sin guardar registro en access

Llevo dandole vueltas a un codigo para que salga del formuario sin guardar un registro si el campo Nombre no esta cubierto y me da error, el codigo que le puse es este:

Private Sub cmdSalir_Click()
    On Error GoTo Err_Cerrar_Click
    If IsNull(Me.subFrmPedidos.Form.Nombre.Value) Then
    DoCmd.RunCommand acCmdUndo
    End If
    DoCmd.Close acForm, Me.Name
Exit_Cerrar_Click:
    Exit Sub
Err_Cerrar_Click:
    MsgBox Err.Description
    Resume Exit_Cerrar_Click
End Sub

Debido al control de errores me dice que la opción deshacer no esta disponible, si lo quito el error que da es el 2046 y me dice lo mismo.

Es un formulario con un subformulario y es en este donde esta el campo Nombre.

1 respuesta

Respuesta
1

Ahí tienes una posible sistemática para solventar tu problema.

Ten en cuenta que el "comportamiento natural" de Access es, a la mínima que puede, guardar el registro. Y eso significa que si, por ejemplo, por en medio actúa algún código, Access va y... ¡Zas! Salvaguarda el registro.

Esto funciona como un Excel: si tú escribes en varias celdas y después le das a deshacer lo que has hecho va volviendo a atrás; pero si tú escribes en varias celdas y le das a guardar ya has perdido la acción del comando deshacer.

Como en Access ese guardado se produce sin que tú te percates cuando intentas deshacer Access te dice que "naranjas de la china".

En estos casos tienes dos opciones:

1.- Eliminar el registro (con algún botón para hacer clic sobre él)

2.- Dejar el registro que no es correcto, pero "actuar por detrás". Por ejemplo: yo sé que un registro no es correcto si el campo X y el campo Y están en blanco. Pues genero una consulta de eliminación, que sitúo en algún evento que considere oportuno, y elimino todos los registros con X e Y nulos.

Si el problema de deshacer es que efectivamente no hay nada que deshacer se gestiona con un control de errores. No recuerdo que número de error marca, pero si fuera, por ejemplo, el 700, pues haces, simplemente:

...

If err.number=700 then

resume next

else

msgbox "Se ha producido el error " & err.number & " - " & err.description

end if

...

A ver si con estas ideas puedes sacar algo en claro.

Buena tardes he seguido tu consejo y lo he conseguido de esta manera:

 Dim miSql As String
   miSql = "Delete TActividades.Id, TActividades.idGasto, TActividades.Nombre, TActividades.Horas" _
                & " FROM TActividades" _
                & " WHERE TActividades.Nombre is null"
    If IsNull(Me.subFrmTActividades.Form.Nombre.Value) Then
        DoCmd.SetWarnings False
        DoCmd.RunSQL miSql
        DoCmd.SetWarnings True
     Else
        DoCmd.Close acForm, Me.Name
    End If

Espero que el codigo sea valido o seria mejor de otra forma "más limpia".

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas