** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Problema con vbYesNoCancel
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoProblema con vbYesNoCancel

 Responder Responder
Autor
Mensaje
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Tema: Problema con vbYesNoCancel
    Enviado: 03/Septiembre/2020 a las 18:46
Hola, 

Tengo un problema con todos los formularios, pensaba que funcionaban bien pero no es asi. Os explico mi problema. 
Tengo un formulario para dar de entrada reparaciones, en el cual relleno todo y hasta ahi perfecto. El problema digamos viene por ejemplo cuando entro a modificar algo y le doy al boton salir que tiene el siguiente codigo: 

Dim MensajeQuieresCerrar, EstiloQuieresCerrar, TítuloQuieresCerrar, RespuestaQuieresCerrar
MensajeQuieresCerrar = " ESTAS A PUNTO DE CERRAR EL FORMULARIO " & vbCrLf & vbCrLf _
        & " ¿ SEGURO QUE QUIERES CERRARLO ? " ' Define el mensaje.
EstiloQuieresCerrar = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.
TítuloQuieresCerrar = "¡¡ ATENCION !!" ' Define el título.
RespuestaQuieresCerrar = MsgBox(MensajeQuieresCerrar, EstiloQuieresCerrar, TítuloQuieresCerrar)
If RespuestaQuieresCerrar = vbYes Then
    DoCmd.Close acForm, Me.name
If RespuestaQuieresCerrar = vbNo Then
    End
End If

Este por si solo si no he modificado nada en el formulario funciona bien, si le marco NO no sale y se queda en el sitio. Pero el problema viene cuando por ejemplo le doy a que si y he hecho cambios. Ahi es cuando actua el evento Form_BeforeUpdate que tengo otro mensaje de si quiero guardar los cambios con vbYesNoCancel el cual el vbYes guarda cambios, el vbNo logicamente no guarda, pero ahora viene el tema, cuando le doy a vbCancel que tengo puesto el END el sigue cerrando el formulario y guardando los datos. El codigo del evento Form_BeforeUpdate es el siguiente: 

Dim MENSAJE, Estilo, Título, Respuesta
MENSAJE = " ESTE REGISTRO HA SIDO MODIFICADO " & vbCrLf _
        & " ¿ CONFIRMAR LOS CAMBIOS ? " ' Define el mensaje.
Estilo = vbYesNoCancel + vbQuestion + vbDefaultButton1 ' Define los botones.
Título = "¡¡ ATENCION !!" ' Define el título.
Respuesta = MsgBox(MENSAJE, Estilo, Título)
If Respuesta = vbYes Then
   Exit Sub
If Respuesta = vbNo Then
    Me.Undo
If Respuesta = vbCancel Then
    End
End If
End If
End If


Que estoy haciendo mal? He probado de todo sin exito, siempre acaba cerrandose.

Muchas gracias por delantado.

Saludos
Luis
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11809
Enlace directo a este mensaje Enviado: 03/Septiembre/2020 a las 19:09
Los IF's no están bien encadenados:

If RespuestaQuieresCerrar = vbYes Then
    DoCmd.Close acForm, Me.name
If RespuestaQuieresCerrar = vbNo Then
    End
End If

El control de si es No sólo se hace si cumple que es Yes ... lo cuál es obviamente imposible.

IF .... Then
 ....
End IF
IF .... Then
 ....
End IF


o
IF ... Then
   ....
elseIF .... then
   ...
end if

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Enviado: 03/Septiembre/2020 a las 20:11
Acabo de cambiarlo asi y tampoco, sigue cerrando, eso si, ahora creo que no guarda aunque lo cierre.

Editado por luixin - 03/Septiembre/2020 a las 20:11
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 13125
Enlace directo a este mensaje Enviado: 04/Septiembre/2020 a las 00:05
Pon un punto de interrupción y sigue paso a paso el código para ver como se comporta.

Por cierto: la declaración de variables es mejorable. Te falta indicar el tipo. Tal como están ahora todas son de tipo Variant (cuestión de eficiencia)
Xavi, un minyó de Terrassa

Mi web
Arriba
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Enviado: 04/Septiembre/2020 a las 08:22
Buenas, gracias por tu respuesta.

A lo de la interrupción no se a qué te refieres, y sobre lo de las variables podrías darme un ejemplo? Todo lo que sea mejorar y optimizar es de ayuda.

Saludos
Luis

Editado por luixin - 04/Septiembre/2020 a las 09:11
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4582
Enlace directo a este mensaje Enviado: 04/Septiembre/2020 a las 18:38
Buenas

Abres el IDE  (ventana de VBE)  pulsando la combinación de teclas ALT + F11

Pulsas click con el ratón encima de la linea de código que quieres que el código se pare

Luego ejecutas el código te posiciones al inicio de la función o procedimiento y luego pulsa la tecla F5  para pasar a la siguiente linea pulsa F8 ,........

otra opción seria ejecutando el formulario en cuestión (teniendo el punto de interacción a marcado en rojo como en la siguiente imagen) y el código se pararía en ese punto.



punto de interrupcion




 


Editado por javier.mil - 04/Septiembre/2020 a las 20:03
Arriba
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Enviado: 05/Septiembre/2020 a las 12:06
Ya lo he hecho y se para en el End, pero no entiendo para que sirve, si ya sabia que el End no lo hacia. 
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 947
Enlace directo a este mensaje Enviado: 05/Septiembre/2020 a las 12:22
Hola,
Sólo por intentarlo, porque no cambias el
End
por
Cancel=true

La instrucción End, yo siempre la he usado asociada a la Intrucción Open y mirando en la ayuda, dice:

"Finaliza la ejecución inmediatamente. Nunca se requiere por sí mismo, pero se puede colocar en cualquier lugar de un procedimiento para finalizar la ejecución del código, cerrar los archivos abiertos con la instrucción Open y borrar las variables."

Al estar dentro del evento BeforeUpdate, igual viene de ahí el problema.
Saludos
Espero te sirva !!!!!!
Iñaki
Arriba
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Enviado: 05/Septiembre/2020 a las 14:05
Publicado originalmente por jilo jilo escribió:

Hola,
Sólo por intentarlo, porque no cambias el
End
por
Cancel=true

La instrucción End, yo siempre la he usado asociada a la Intrucción Open y mirando en la ayuda, dice:

"Finaliza la ejecución inmediatamente. Nunca se requiere por sí mismo, pero se puede colocar en cualquier lugar de un procedimiento para finalizar la ejecución del código, cerrar los archivos abiertos con la instrucción Open y borrar las variables."

Al estar dentro del evento BeforeUpdate, igual viene de ahí el problema.
Saludos

Eso ya lo probe y sin exito. Lo que he probado hoy que si que me funciona es  en el boton de salir que me pregunta si quiero cerrar si le doy al SI hacer un Call Form_BeforeUpdate(0) entonces si le doy a cancelar si que me cancela. Pero si le doy a que si que quiero guardar me vuelve a pedir si quiero guardar otra vez, osea que se repite, pero lo por demas el funcionamiento seria el correcto.

Tambien he cambiado la estructura de los Msgbox como comentabais de la siguiente manera, a ver que os parece.

If Me.Dirty Then
Dim GuardarCambios As Integer
GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
Select Case GuardarCambios
Case 6 'Yes
     Exit Sub
Case 7 'No
    Me.Undo
Case 2 'Cancel
    Cancel = True
    End
End Select
End If

Saludos
Luis


Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11809
Enlace directo a este mensaje Enviado: 05/Septiembre/2020 a las 15:29
Sin analizar nada más .... ese End ¿que pinta ahí?.

Por cierto, si se hace la sangría al código se lee mucho mejor:

    If Me.Dirty Then
        Dim GuardarCambios As Integer
        GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
        Select Case GuardarCambios
            Case 6 'Yes
                Exit Sub
            Case 7 'No
                Me.Undo
            Case 2 'Cancel
                Cancel = True
                End -> borrarla
        End Select
    End If
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
luixin Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 03/Septiembre/2020
Localización: Castellon
Estado: Sin conexión
Puntos: 11
Enlace directo a este mensaje Enviado: 06/Septiembre/2020 a las 10:39
El End se me ha pasado que estaba haciendo pruebas. 

Creo que alf ianl lo he solucinado de la siguiene manera, aunque si le doy al si me lo vuelve a preguntar si guardar cambios, asi que creo que tendria que cambiar el Exit Sub del Yes por Domd.Save por ejemplo no?

Esto para el boton de salir:

'SALIR
If Me.NewRecord Then
    DoCmd.Close acForm, Me.name
Else
Call Form_BeforeUpdate(0)
Dim Salir As Integer
Salir = MsgBox("ESTAS A PUNTO DE CERRAR EL FORMULARIO" & vbCrLf & vbCrLf & "¿SEGURO QUE QUIERES CERRARLO?", vbCritical + vbYesNo, "¡¡ATENCION!!")
Select Case Salir
Case 6 'Yes
    DoCmd.Close acForm, Me.name
Case 7 'No
    Cancel = True
End Select
End If

Y esto para el evento Form_BeforeUpdate

'GUARDAR CAMBIOS
If Me.Dirty Then
Dim GuardarCambios As Integer
GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
Select Case GuardarCambios
Case 6 'Yes
     Exit Sub
Case 7 'No
    Me.Undo
Case 2 'Cancel
    End
End Select
End If

Como lo veis? funcionar funciona.

Saludos
Luis
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11809
Enlace directo a este mensaje Enviado: 06/Septiembre/2020 a las 10:58
Uno de los teoremas básicos de la informática es:

      "Si funciona, ... ¿pa'que lo arreglas?"

Vamos que si te funciona, dedica tu tiempo a otros problemas, que seguro que los tienes.  Wink

Un saludo.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable