** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Abrir dos formularios a la vez
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoAbrir dos formularios a la vez

 Responder Responder
Autor
Mensaje
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Tema: Abrir dos formularios a la vez
    Enviado: 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?

Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 872
Enlace directo a este mensaje Enviado: 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


Editado por jilo - 02/Febrero/2019 a las 18:35
Espero te sirva !!!!!!
Iñaki
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 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.
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 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.


Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11053
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 388
Enlace directo a este mensaje Enviado: 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.




Editado por Antonalo - 03/Febrero/2019 a las 12:37
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable