Tengo una aplicación en Access que debe ofrecer un número único de registro y después llamar a diversos formularios de distintos departamentos para que se procesen esos expedientes. Las necesidades de esos departamentos son muchas y variadas, con distintas tablas asociadas cada una de ellas. Una aplicación así en Access me da mucho miedo, porque puede crecer hasta el infinito (y más allá) con los correspondientes problemas de accesos concurrentes en red, bloqueos y demás.
La solución es crear una pequeña aplicación desde la que genero los números de registro, y con un formulario dotado de múltiples botones que llaman a las aplicaciones de cada departamento, cada una de las cuales reside en un .mdb (o .accdb) distinto con sus propios formularios y tablas. Al cerrar esas aplicaciones, se vuelve a abrir la principal, con lo que la sensación para el usuario es la de usar un único programa.
El código que pongo en la aplicación central es el siguiente:
Private Sub Comando0_Click()
' Definimos la aplicación que vamos a llamar, y la rodeamos de dobles comillas
bdllamada = Chr(34) & "c:\caminocompleto\nombreBD.accdb" & Chr(34)
' Llamamos a Access, le decimos la BDD que debe abrir y le pasamos el parámetro
' correspondiente a la aplicación padre, a la que deberá volver después
Call Shell("msaccess.exe " & bdllamada & " /cmd " & Application.CurrentDb.Name, vbMaximizedFocus)
' Activamos los eventos
DoEvents
' Cerramos la aplicación actual
DoCmd.Quit
End Sub
El quid de la cuestión está en el
/cmd . Lo que va a continuación es un parámetro que se le pasa a la aplicación que se abre, y se puede rescatar mediante la función
Command().
En la aplicación hija se incluye el siguiente código:
Public padre As String
Private Sub Form_Open(Cancel As Integer)
' Recogemos el parámetro que nos indica a dónde volver
padre = Command()
End Sub
Private Sub Form_Close()
' Al cerrar, volvemos a llamar al padre
Call Shell("msaccess.exe " & Chr(34) & padre & Chr(34), vbMaximizedFocus)
End Sub