vba - registros - Ejecutando el código antes de abrir cualquier formulario en Access
filtrar formulario access vba (6)
Entonces tengo una base de datos de Access con un frente y un back-end. Pronto lo distribuiré a los usuarios, pero no tengo control sobre dónde colocarán exactamente los archivos en sus computadoras. Sin embargo, creo que puedo contar con que coloquen las partes frontal y posterior en la misma carpeta.
Como tal, cuando se abra el front-end, quiero que verifique que las tablas vinculadas estén conectadas correctamente a la base de datos back-end. Tengo código de trabajo para esto; sin embargo, no sé dónde ponerlo. Cuando se abre la interfaz, se abre automáticamente un formulario de menú (configurado a través del cuadro de diálogo de inicio). He puesto el código en el evento OnOpen
, que pensé que ocurría antes de que se carguen los datos, pero cuando OnOpen
esto, recibo un mensaje que me dice que no se puede encontrar el back-end (está buscando en su ubicación anterior).
Básicamente, ¿hay algún evento que pueda usar que se ejecute antes de que se abra cualquier formulario?
Antes de poner su parte frontal y posterior en la misma carpeta, piense en ello. ¿No vale la pena tener 2 carpetas? ¿Qué ocurre con los usuarios múltiples en la misma computadora que accede a la misma base de datos de fondo? ¿Qué hay de los múltiples usuarios que acceden al mismo databse a través de una red? ¿Cuál es la necesidad de tener una tipología de front end-back end si su aplicación es básicamente una aplicación de un solo usuario?
¿Por qué no agrega un cuadro de diálogo a su aplicación, en caso de que se pierda su conectividad? Puede crear un objeto fileDialog en su código, lo que le permite al usuario buscar un archivo * mdb en cualquier lugar de su computadora / red. Entonces es posible controlar que el archivo mdb seleccionado contenga todas las tablas solicitadas y abra los enlaces correspondientes (supongo que está utilizando el comando transferDatabase).
¿Y qué pasa con las herramientas / referencias adicionales que necesitará para que su aplicación se ejecute cuando la distribuirá a sus usuarios finales? Por defecto, MS Access registra los 3 básicos:
- Visual Basic para la aplicación
- Biblioteca de Microsoft Access
- Biblioteca Microsoft DAO
Si su aplicación necesita algo más, como ADO u objetos de Office (ADODB.recordset o barras de comandos de Office, por ejemplo), tendrá que agregar las referencias manualmente para cada instalación, ya que el usuario final no podrá abrir la ventana de VBA. y acceder al menú de herramientas / referencias.
Por lo tanto, si necesita implementar su aplicación en varias computadoras, le recomiendo encarecidamente que utilice una herramienta de implementación como esta gratuita . Necesitará unas horas para poder usarlo correctamente, pero el resultado lo vale. Podrá dar a sus clientes un módulo de instalador real. Creará carpetas, agregará atajos solicitados y administrará referencias en el registro de la computadora. ¡Esto hará que su implementación sea indolora!
EDIT: la macro autoexec es definitivamente la solución correcta para llamar al código antes de cualquier evento.
EDITAR: no olvide que sus usuarios finales pueden sacar provecho de la versión en tiempo de ejecución de Access, ¡que es gratis!
Como dijo Matt, crea una macro, llámala "autoexec", y selecciona "RunCode" como macro action. El argumento Nombre de la función debe ser el nombre de la función que desea ejecutar (y no un sub), y si la función no tiene argumentos, aún debe poner () al final, o no funcionará.
Crea una macro y nómbrala "autoexec". Para la macro acción, seleccione "RunCode" y luego establezca el nombre de la función en el nombre de la función que usa para verificar las tablas vinculadas.
Por lo general, prefiero crear una pequeña forma que ejecute una serie de comprobaciones, como encontrar el back-end y demás, y establecer varias opciones. El código para el evento abierto de este formulario podría ser:
Me.Visible = False
''Determines if the database window is displayed
SetProp "StartupShowDBWindow", False, dbBoolean
''Hide hidden and system objects
SetOption "Show Hidden Objects", False
SetOption "Show System Objects", False
''Find back end
CheckLinkPath
Guardo una tabla de tablas para vincular en el front-end y si falta alguna, este formulario se puede utilizar para informar el error, o cualquier otro error para ese asunto.
Set RS = CurrentDb.OpenRecordset("Select TableName From sysTables " _
& "WHERE TableType = ''LINK''")
RS.MoveFirst
strConnect = db.TableDefs(RS!TableName).Connect
If Not FileExists(Mid(strConnect, InStr(strConnect, "DATABASE=") + 9)) Then
''All is not well
blnConnectError = True
Else
Do Until RS.EOF()
If db.TableDefs(RS!TableName).Connect <> strConnect Then
blnConnectError = True
Exit Do
End If
RS.MoveNext
Loop
End If
Si todo está bien, la forma pequeña llama al menú principal o formulario y el usuario nunca ve el formulario de verificación. También usaría este formulario para abrir una solicitud de contraseña, si es necesario.
Como otros han sugerido, utilizaría la macro AutoExec en este caso. Si su código que verifica las tablas vinculadas actualmente es un sub, cámbielo a una función que devuelva TRUE si tiene éxito. A continuación, puede utilizar la columna "condiciones" en la macro AutoExec para salir de la aplicación con un cuadro de diálogo de error fácil de usar si el código de la tabla de enlace falla. Su macro AutoExec podría ser algo así como:
- Llame a su función LinkTables (), establezca la condición para finalizar el inicio si falla.
- Llame a su formulario de menú de inicio "Principal".
Puede enviarles un archivo * .BAT que copie las bases de datos a c: / temp (o la carpeta que elija. Configure los enlaces a esta carpeta antes de crear el archivo BAT. Ciérrelo y envíelo por correo electrónico. tengo que preocuparme por el código extra necesario.