¿Por qué el código siguiente no me abre el formulario que se especifica en la última línea?

Tengo un formulario a modo de diálogo "DiálogoConsulta" con el usuario, en el que debe introducir datos para realizar una búsqueda, en caso de que haya información que coincida se abrirá un formulario "ResultConsulReg" con estos registros, en caso contrario, en este último formulario, es decir, en el que muestra los registros que coinciden con la búsqueda tengo el siguiente código:

Private Sub Form_Load()

DoCmd.Close acForm, "DiálogoConsulta"
If CurrentRecord <= 0 Then
MsgBox "No se encontraron registros en la base de datos", vbInformation, "MAC 8"
DoCmd.Close acForm, "ResultConsulReg"
DoCmd.OpenForm "DiálogoConsulta"
End If
End Sub

La idea es que en caso de que el formulario no contenga información o registros le mande al usuario un mensaje y me regrese al primer formulario, es decir, al modo de diálogo que en este caso lleva por nombre "DiálogoConsulta", pero este formulario no se abre y como tengo oculto el entorno de Access, no tengo manera de continuar con la ejecución de la Base de Datos.

Respuesta
1

Abrir un formulario, verificar si tiene datos (¿?) Y si no los tiene abrir otro formulario (en este caso regresar al anterior) podrá funcionar en un entorno normal.

Si se oculta la ventana de Access lo mínimo e indispensable es que el formulario se abra con su propiedad 'emergente' activada o no será visible.

Lo recomendable es evitar 'un viaje de ida y vuelta', y antes de abrir un formulario verificar que tiene contenido y del resultado de esa verificación:

. A - Si tiene datos se abre el formulario con las mínimas e imprescindibles condiciones que requiere el tener la ventana de Access oculta (abrirlo como emergente), será visible cuando se cierre el llamante (que parece tener su propiedad MODAL activada).

.B- Se le envía un mensaje al usuario y (sin salir del formulario) se regresa al punto de partida para iniciar una nueva búsqueda (o la acción alternativa que corresponda).

Sobre como verificar en su evento 'LOAD' si el formulario que se abre tiene datos hay varios métodos (algunos ya publicados), lamentablemente los formularios carecen de la propiedad 'HasData', que si tienen los informes.

¡Gracias! Muchísimas gracias por tu acertados comentarios. Saludos desde Aguascalientes, México

Respecto a que ese mismo código funcione bien en otra ubicación solo añadiré un detalle:

Los módulos solo pueden interrumpir su ejecución (equivale a abrir un paréntesis) si al formulario se le abre desde VBA como modal, al cerrarse regresara justo a la línea que sigue y continuara con lo que reste del módulo (lo finalizara, al menos esa es la teoría).

Se puede verificar de forma sencilla, añadiendo antes del 'End Sub' un mensaje personalizado, algo como:

MsgBox " Fin de --- Private Sub Form_Load() -----"

Si aparece el mensaje es que finalizo el bucle
(Normalmente no acostumbro a emitir mensajes, interrumpen el código, envío los mensajes de control a la ventana de inmediato y los consulto si tengo alguna duda del orden en que se ejecutan los eventos o si alguno 'se extravía')

2 respuestas más de otros expertos

Respuesta
1

Hay muchas formas veamos 2

1. En el formulario DiálogoConsulta puede validar si la tabla o condulta origen de datos del formulario a abrir tiene registros con

IF DCOUNT("*","tabla","id=" & Me.id)>0 Then

' Pueden ser más criterios

    DoCmd. OpenForm "formulario",, filtro

' Filtro o SQL

ELSE

    Msgbox "No hay registros"

END IF

2. Al abrir el segundo formulario.

Evento al cargar... 

Forms!ResultConsulReg.visible=False

Evento al abrir

IF Me.RecordsetClone.Recorcount=0 THEN

  Msgbox "No ha registros"

   Cancel=True

End If

Evento al descargar

Forms!ResultConsulReg.visible=True

NOTA: Puedo cometer errores de escritura porque respondo de mi móvil.

Respuesta
1

Te doy una respuesta rápida: No te abre el formulario DiálogoConsulta porque en el código que esta en el form ResultConsulReg tu cierras éste formulario antes de abrir el otro. Es decir al ejecutar la línea DoCmd. Close acForm, "ResultConsulReg" ya no se ejecuta la linea que sigue y que abre el otro form.

La manera ideal de hacer esto en Access es tener un formulario dividido: en el encabezado el usuario escribe el texto o segmento de texto a buscar y a medida que escribe, en el detalle se va filtrando que registros cumplen con el criterio, mediante el evento Al Cambiar o al oprimir un botón Buscar le das Requery al form para que se actualize con el filtro del texto escrito en el query, fuente de datos del form.

¡Gracias! Agradezco tu atención. Con respecto a tu respuesta rápida, te comento que aunque puede parecer inverosímil, tengo otra base de datos con el mismo código, sólo cambian los nombres de los Forms y esa base lo hace sin ningún problema. Ya revisé las propiedades de ambos formularios y no encuentro diferencia.

Si cambias el orden te va ha funcionar. Primero abres DiálogoConsulta y luego cierras ResultConsulReg
Suerte!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas