Imprimir página | Cerrar ventana

Abrir dos formularios a la vez

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84268
Fecha de impresión: 17/Agosto/2019 a las 19:48


Tema: Abrir dos formularios a la vez
Publicado por: Antonalo
Asunto: Abrir dos formularios a la vez
Fecha de publicación: 02/Febrero/2019 a las 18:15
Hola amigos:

Tengo una BD con un formulario inicial, VENCIMIENTOSGEN.

Tengo un segundo formulario AVISOS  donde un empleado (IdEmisor) puede escribir avisos para otro empleado IdDestinatario.

Quiero que si en el formulario AVISOS, hay avisos sin leer para un determinado empleado, nada más abrirse el formulario inicial VENCIMIENTOSGEN,  Se lance un mensaje avisando de los avisos que tiene sin leer y le pregunte si quiere abrirlos y en caso afirmativo se abra el formulario AVISOS con sus avisos sin leer

Bueno, pues está casi conseguido excepto un pequeño detalle: el formulario AVISOS  se abre pero el foco no se traslada a ese formulario, es decir se abren los dos, pero sigo viendo VENCIMIENTOSGEN y no consigo trasladar el foco.

El código es el siguiente pero fijaros solo a partir de la raya, lo anterior es para que el código reconozca al empleado que usa ese ordenador.

Private Sub Form_Open(Cancel As Integer)

Dim NombreOrdenador As String
Dim IdEmpleado As Byte
Dim NombreEmpleado As String
Dim NAvisos As Byte

NombreOrdenador = Environ("ComputerName")
IdEmpleado = DLookup("IdEmpleado", "EMPLEADOS", "Ordenador= '" & NombreOrdenador & "'")
NombreEmpleado = DLookup("NomEmpleado", "EMPLEADOS", "IdEmpleado=" & IdEmpleado)
NAvisos = DCount("IdDestinatario", "AVISOS", "IdDestinatario=" & IdEmpleado & "And Leido =" & 0)


'----------------------------------------------------------------
If NAvisos <> 0 Then
      If MsgBox(UCase(NombreEmpleado) & ", TIENES " & NAvisos & "  AVISOS SIN LEER" _
        & vbCrLf & vbCrLf & "¿QUIERES LEERLOS AHORA?", vbYesNo, "AVISOS SIN LEER") = vbYes Then
'        Cancel = True
        DoCmd.OpenForm "AVISOS", acNormal, , "IdDestinatario=" & IdEmpleado & "And Leido =" & 0, , , 1
     Forms!AVISOS.SetFocus  
        
        
    End If
End If
End Sub

El caso es que Forms!AVISOS.SetFocus   no funciona, y creo que es porque el formulario VENCIMIENTOSGEN no ha acabado de abrirse, de hecho, el mensaje se lanza antes de que aparezca.

solamente, si activo la linea cancel=true, entonces funciona, pero solo se abre avisos, yo quiero que se abran los dos y el foco en avisos.

He probado con al cargar, al activar.. con resultados parecidos.

¿como lo podría hacer?




Respuestas:
Publicado por: jilo
Fecha de publicación: 02/Febrero/2019 a las 18:35
Hola
Prueba a abrirlo en modo acDialog, a ver si te sirve
DoCmd.OpenForm "AVISOS", acNormal, , "IdDestinatario=" & IdEmpleado & "And Leido =" & , ,acDialog , 1


-------------
Espero te sirva !!!!!!
Iñaki


Publicado por: Antonalo
Fecha de publicación: 02/Febrero/2019 a las 19:16
Pues sí que sirve.

He desactivado Cancel=True, para que se me abra despues de AVISOS, y 

eliminado   Forms!AVISOS.SetFocus  ya que AVISOS en diálogo se ha cerrado y eso daría error

En principio, el modo diálogo es suficiente para ellos. Para mí me queda la intriga de porqué no puedo abrirlo en modo normal.


Publicado por: Antonalo
Fecha de publicación: 03/Febrero/2019 a las 09:21
Lo he pensado y creo que ya lo entiendo. Por si acaso hay alguna remota posibilidad de que alguien sepa menos que yo, lo voy a explicar (lo que a mi me parece).

En los eventos de al abrir y al cargar, el foco siempre acaba en el formulario al que se ha llamado. Si en el código del evento se llama a otro, ese otro se abrirá, y el foco irá a él pero el código no se detiene y al final volverá al primero que se ha llamado porque el proceso aún no había terminado. Sin embargo, al abrir el segundo en el modo diálogo, el proceso se detiene en ese segundo formulario, esperando una respuesta del usuario. Cuando el usuario cierra el segundo formulario, el proceso continúa y el primer formulario se abre y se enfoca. Por eso, creo que si quiero abrir el segundo en modo normal, tengo que elegir algún evento que ocurra después de que el primero se haya abierto.

Para lo que yo quiero, el modo diálogo me vale perfectamente, Muchas gracias Jilo.

Podéis cerrar amigos.




Publicado por: Mihura
Fecha de publicación: 03/Febrero/2019 a las 09:58
Cuando te pasa eso que relatas (por ejemplo le pasas el foco a un campo y quieres que se lance el código del 'recibir foco' del mismo) y quieres salvarlo hay un 'truqui' muy efectivo y es usar el evento Timer del form.

En tu caso:
- realizas lo que tengas que hacer en el Open del formulario
- le das valor al cronómetro para que se ejecute
- en el evento Timer:
   - pones el cronómetro a 0 (para que no se vuelva a ejecutar)
   - abres el formulario






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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Antonalo
Fecha de publicación: 03/Febrero/2019 a las 12:37
Ah pues ya lo he probado. En vez de el evento Open, utilizo el evento timer con el mismo código y aprovecho la idea de Jilo de abrir en modo diálogo. Además pongo el intervalo del cronómetro en 2000 y el código lo pone a cero  y queda genial. la verdad es que siempre que os pregunto algo, quedo encantado. Sois los mejores.

Private Sub Form_Timer()
Dim NombreOrdenador As String
Dim IdEmpleado As Byte
Dim NombreEmpleado As String
Dim NAvisos As Byte

NombreOrdenador = Environ("ComputerName")
IdEmpleado = DLookup("IdEmpleado", "EMPLEADOS", "Ordenador= '" & NombreOrdenador & "'")
NombreEmpleado = DLookup("NomEmpleado", "EMPLEADOS", "IdEmpleado=" & IdEmpleado)
NAvisos = DCount("IdDestinatario", "AVISOS", "IdDestinatario=" & IdEmpleado & "And Leido =" & 0)

    If NAvisos <> 0 Then
          If MsgBox(UCase(NombreEmpleado) & ", TIENES " & NAvisos & "  AVISOS SIN LEER" _
            & vbCrLf & vbCrLf & "¿QUIERES LEERLOS AHORA?", vbYesNo, "AVISOS SIN LEER") = vbYes Then
    
            DoCmd.OpenForm "AVISOS", acNormal, , "IdDestinatario=" & IdEmpleado & "And Leido =" & 0, , acDialog, 1
            
          End If
    End If

Me.TimerInterval = 0
End Sub

Como véis, combino las dos ideas. Gracias de nuevo, Mihura y Jilo. podéis cerrar.





Imprimir página | Cerrar ventana