Problema con vbYesNoCancel |
Responder |
Autor | |
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
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
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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 |
|
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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)
|
|
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
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 |
|
javier.mil
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Colaborador Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4812 |
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. Editado por javier.mil - 04/Septiembre/2020 a las 20:03 |
|
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
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.
|
|
jilo
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Colaborador Unido: 19/Diciembre/2004 Localización: TAFALLA Estado: Sin conexión Puntos: 959 |
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 |
|
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
Enviado: 05/Septiembre/2020 a las 14:05 |
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 |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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:
|
|
luixin
Nuevo Unido: 03/Septiembre/2020 Localización: Castellon Estado: Sin conexión Puntos: 46 |
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
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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. Un saludo.
|
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |