TRUCO 1: ¿Cómo usar CompactDatabase con un base de datos con contraseña? (Aplicable a las versiones 4.0 y 5.0).
La documentación de la función CompactDatabase indica que acepta cuatro parámetros:
DBEngine.CompactDatabase base_datos_ant, base_datos_nva _ [, inf_local [, opciones]]
Si se intenta compactar una base de datos protegida con contraseña obtendremos un error. Parece evidente que es necesario otro parámetro donde indicar la contraseña.
Si observamos el método CompactDatabase del objeto DBEngine en el "Examinador de Objetos", se puede comprobar que acepta cinco parámetros y no cuatro como indica la documentación:
DBEngine.CompactDatabase SrcName, DstName, DstConnect, _ Options, SrcConnect
Estableciendo el último parámetro a ";pwd=contraseña", se puede compactar una base de datos protegida.
TRUCO 2: Error al establecer la propiedad MatchEntry del DBCombo (Aplicable a las versiones 4.0 y 5.0).
Cuando se intenta establecer la propiedad MatchEntry de un control DBCombo a "1 - Extended Matching" (en tiempo de diseño o ejecución), VB puede mostrar el mensaje de error "Propiedad de solo lectura". El problema ocurre porque "Extended Matching" puede ser sólo usado con DBCombos cuya propiedad Style es "2 - Dropdown List". Cambie el estilo de forma adecuada para que este error desaparezca.
TRUCO 3: ¿Cómo establecer márgenes cuando se imprime con el RichTextBox? (Aplicable a las versiones 4.0/32 bits y 5.0).
Si se utiliza el método SelPrint para imprimir el contenido de un control RichTextBox, se puede observar que se genera un margen a cada lado de la página de una pulgada.
El control RichTextBox no ofrece ninguna posibilidad para cambiar el margen, pero afortunadamente se puede llevar a cabo esta funcionalidad utilizando la API de programación.
Se puede hacer una llamada a la función SendMessage para enviar mensajes del tipo EM_SETTARGETDEVICE y EM_FORMATRANGE al RichTextBox. Para ver un ejemplo de cómo utilizar estos mensajes en una aplicación VB, es recomendable la lectura del siguiente artículo de la base de conocimiento de Microsoft:
146022 How to Set Up the RichTextBox Control for WYSIWYG Printing
TRUCO 4: Acceso a bases de datos seguras desde VB4 (Aplicable a la versión 4.0).
La documentación de VB4 es confusa a la hora de explicar cómo abrir bases de datos seguras de Access. La apertura de este tipo de bases de datos es distinta dependiendo de si la aplicación es de 16-bit ó 32-bit.
Para programas de 16-bit, se debe crear un fichero NOMBREAPLICACION.INI con las siguientes secciones:
[Data]
Database=C:\DIRECTORIO\NOMBREBASEDATOS.MDB
[Options]
SystemDB=C:\DIRECTORIO\SYSTEM.MDA
Para abrir la base de datos hay que utilizar el siguiente código:
Dim sNombreUsuario As String
Dim sContraseña As String
Dim bd As Database
Dim ws As Workspace
sNombreUsuario = "Nombre de usuario"
sContraseña = "Contraseña"
' Creación de workspace seguro
With DBEngine
.IniPath = "C:\DIRECTORIO\NOMBREAPLICACION.INI"
.DefaultUser = sNombreUsuario
.DefaultPassword = sContraseña
End With
Set ws = DBEngine.CreateWorkspace("MiWorkspace", _sNombreUsuario, sContraseña)
Set bd = ws.OpenDatabase("D:\DIRECTORIO\NOMBREBASEDATOS.MDB"...)
Los programas de 32-bit no requieren un fichero .INI, ni hacer uso de las propiedades DefaultUser y DefaultPassword. Sólo es necesario establecer la propiedad SystemDB del objeto DBEngine indicando cuál es la base de datos de sistema:
Dim sNombreUsuario As String
Dim sContraseña As String
Dim bd As Database
Dim ws As Workspace
sNombreUsuario = "Nombre de usuario"
sContraseña = "Contraseña"
' Creación de workspace seguro
DBEngine.SystemDB = "C:\DIRECTORIO\SYSTEM.MDW"
Set ws = DBEngine.CreateWorkspace("MiWorkspace", _sNombreUsuario, sContraseña)
Set bd = ws.OpenDatabase("C:\DIRECTORIO\NOMBREBASEDATOS.MDB"...)
TRUCO 5: Captura de errores del DBGrid en tiempo de ejecución
(Aplicable a la versión 4.0).
El control DBGrid ha sido diseñado para mostrar mensajes de error, no sólo cuando ocurre un error, sino también bajo circunstancias "normales", tales como cuando el parámetro Cancel es establecido a True en los eventos BeforeDelete o BeforeUpdate.
Se pueden capturar estos errores y mostrar nuestros propios mensajes (o ninguno) escribiendo código en el evento no documentado DBGrid_Error:
Private Sub DBGrid_Error(ByVal DataError As Integer, Response _As Integer)
' La acción fue cancelada...
If DataError = 16389 Then
' Mostrar un mensaje de error o no hacer nada
Response = vbDataErrContinue
End If
End Sub