En este artículo se muestra cómo utilizar el control Common Dialog para actualizar tablas vinculadas en la base de datos. El control Common Dialog está disponible con herramientas de Microsoft Office 2000 Developer Edition. Las tablas vinculadas se pueden residir en una o varias bases de datos back-end.
Para un ejemplo de un método diferente para volver a vincular las tablas que utiliza funciones de interfaz (API) de programación de aplicaciones de Microsoft Windows, consulte el programa de ejemplo Developer Solutions (Solutions9.mdb.) Para obtener Solutions9.mdb, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
ACC2000: Pedidos y Developer Solutions Sample Databases disponibles en Microsoft Developer Network (MSDN)
Abrir la base de datos Solutions9.mdb, seleccione utilizar varias bases de datos en el cuadro Seleccionar una categoría de ejemplos y, a continuación, haga clic en Vincular tablas en el inicio en el cuadro Seleccione un ejemplo .
Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se utilizan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos que cumplan sus requisitos específicos. Un programa que utiliza dividir el diseño de la base de datos tiene sus tablas en una base de datos en una ubicación de red compartida (la base de datos back-end) y todos sus consultas, formularios, informes, macros y módulos en otra base de datos en cada equipo cliente (la base de datos front-end). La base de datos front-end todas sus tablas de vínculos a la base de datos back-end. Si se mueve la base de datos back-end, se producirán errores en el programa. Puede habilitar el programa para detectar que el archivo de back-end de base de datos que faltan desde su ubicación esperada y, a continuación, solicita al usuario para la nueva ubicación.
En el ejemplo siguiente se muestra cómo volver a vincular datos de tabla en el programa. Este método utiliza un formulario que un usuario puede abrir para volver a vincular las tablas de back-end y otro formulario opcional que puede comprobar automáticamente el vínculo de servicios de fondo cuando se abre la base de datos.
Este artículo se supone que tiene el control Microsoft Common Dialog , que está disponible con herramientas de Microsoft Office 2000 Developer Edition. Si no tiene este control, omita la función Browse() en el ejemplo.
Nota : si utiliza el control Common Dialog y planea distribuir el programa de base de datos, debe utilizar el Asistente de empaquetado y distribución para incluir el control del diálogo común de archivo, Comdlg32.ocx y su DLL compatibles con los archivos de instalación. Para obtener más información acerca del uso del Asistente de empaquetado y distribución, vea los artículos enumerados en la sección "Referencias" de este artículo.
Método para volver a vincular tablas de base de datos back-end
Precaución : Si sigue los pasos descritos en este ejemplo, modificará la base de datos de ejemplo Neptuno.mdb. Quizás desee hacer una copia de seguridad del archivo Neptuno.mdb y realizar estos pasos sobre una copia de la base de datos.
Cree un nuevo archivo de base de datos de Access en blanco y asígnele el nombre FrontEnd.mdb .
En el menú archivo , elija Obtener datos externos y, a continuación, haga clic en Vincular tablas .
Busque y seleccione la base de datos de ejemplo Neptuno.mdb y, a continuación, haga clic en vínculo . En el cuadro de diálogo Vincular tablas , haga clic en Seleccionar todo y, a continuación, haga clic en Aceptar .
Cree el siguiente formulario nuevo no basado en ninguna tabla o consulta en la vista Diseño:
formulario: frmNewDataFile
Cuadro de texto:
Nombre: txtFileName Ancho: 3 "
Control del diálogo común:
Nombre: xDialog
Botón de comando:
Nombre: cmdBrowse Título: Examinar... En el clic: =Browse()
Botón de comando:
Nombre: cmdLinkNew Título: Actualizar vínculos En el clic: =Processtables()
Botón de comando:
Nombre: cmdCancel Título: Cancelar OnClick: [Procedimiento de evento] Cancelar: Sí
En el menú Ver , haga clic en código .
Escriba o pegue el siguiente procedimiento:
Private Sub cmdCancel_Click()
On Error GoTo Err_cmdCancel_Click
MsgBox "Link to new back-end cancelled", vbExclamation, "Cancel Refresh Link"
DoCmd.Close acForm, Me.Name
Exit_cmdCancel_Click:
Exit Sub
Err_cmdCancel_Click:
MsgBox Err.Description
Resume Exit_cmdCancel_Click
End Sub
En el menú Depurar , haga clic en Compilar de aplicaciones para usuario .
Guarde el formulario frmNewDataFile y ciérrelo.
En la ventana base de datos, haga clic en módulos y, a continuación, haga clic en nuevo .
En el menú Herramientas , haga clic en referencias , seleccione Biblioteca de objetos Microsoft DAO 3.6 si no está ya seleccionada y, a continuación, haga clic en Aceptar .
Escriba o pegue el siguiente código:
Dim UnProcessed As New Collection
Public Function Browse()
' Prompts user for back-end database file name.
On Error GoTo Err_Browse
Dim strFilename As String
Dim oDialog As Object
Set oDialog = [Forms]![frmNewDatafile]!xDialog.Object
With oDialog ' Ask for new file location.
.DialogTitle = "Please Select New Data File"
.Filter = "Access Database(*.mdb;*.mda;*.mde;*.mdw)|" & _
"*.mdb; *.mda; *.mde; *.mdw|All(*.*)|*.*"
.FilterIndex = 1
.ShowOpen
If Len(.FileName) > 0 Then ' user responded, put selection into text box on form.
[Forms]![frmNewDatafile]![txtFileName] = .FileName
End If
End With
Exit_Browse:
Exit Function
Err_Browse:
MsgBox Err.Description
Resume Exit_Browse
End Function
Public Sub AppendTables()
Dim db As DAO.Database, x As Variant
Dim strTest As String
' Add names of all table with invalid links to the Unprocessed Collection.
Set db = CurrentDb
ClearAll
For Each x In db.TableDefs
If Len(x.Connect) > 1 And Len(Dir(Mid(x.Connect, 11))) = 0 Then
' connect string exists, but file does not
UnProcessed.Add Item:=x.Name, Key:=x.Name
End If
Next
End Sub
Public Function ProcessTables()
Dim strTest As String
On Error GoTo Err_BeginLink
' Call procedure to add all tables with broken links into a collection.
AppendTables
' Test for existence of file name\directory selected in Common Dialog Control.
strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
On Error GoTo Err_BeginLink
If Len(strTest) = 0 Then ' File not found.
MsgBox "File not found. Please try again.", vbExclamation, "Link to new data file"
Exit Function
End If
' Begin relinking tables.
Relinktables (strTest)
' Check to see if all tables have been relinked.
CheckifComplete
DoCmd.Echo True, "Done"
If UnProcessed.Count < 1 Then
MsgBox "Linking to new back-end data file was successful."
Else
MsgBox "Not All back-end tables were successfully relinked."
End If
DoCmd.Close acForm, [Forms]![frmNewDatafile].Name
Exit_BeginLink:
DoCmd.Echo True
Exit Function
Err_BeginLink:
Debug.Print Err.Number
If Err.Number = 457 Then
ClearAll
Resume Next
End If
MsgBox Err.Number & ": " & Err.Description
Resume Exit_BeginLink
End Function
Public Sub ClearAll()
Dim x
' Clear any and all names from the Unprocessed Collection.
For Each x In UnProcessed
UnProcessed.Remove (x)
Next
End Sub
Public Function Relinktables(strFilename As String)
Dim dbbackend As DAO.Database, dblocal As DAO.Database, ws As Workspace, x, y
Dim tdlocal As DAO.TableDef
On Error GoTo Err_Relink
Set dbbackend = DBEngine(0).OpenDatabase(strFilename)
Set dblocal = CurrentDb
' If the local linked table name is found in the back-end database
' we're looking at, Recreate & Refresh its connect string, and then
' remove its name from the Unprocessed collection.
For Each x In UnProcessed
If Len(dblocal.TableDefs(x).Connect) > 0 Then
For Each y In dbbackend.TableDefs
If y.Name = x Then
Set tdlocal = dblocal.TableDefs(x)
tdlocal.Connect = ";DATABASE=" & _
Trim([Forms]![frmNewDatafile]![txtFileName])
tdlocal.RefreshLink
UnProcessed.Remove (x)
End If
Next
End If
Next
Exit_Relink:
Exit Function
Err_Relink:
MsgBox Err.Number & ": " & Err.Description
Resume Exit_Relink
End Function
Public Sub CheckifComplete()
Dim strTest As String, y As String, notfound As String, x
On Error GoTo Err_BeginLink
' If there are any names left in the unprocessed collection,
' then continue.
If UnProcessed.Count > 0 Then
For Each x In UnProcessed
notfound = notfound & x & Chr(13)
Next
' List the tables that have not yet been relinked.
y = MsgBox("The following tables were not found in " & _
Chr(13) & Chr(13) & [Forms]![frmNewDatafile]!txtFileName _
& ":" & Chr(13) & Chr(13) & notfound & Chr(13) & _
"Select another database that contains the additional tables?", _
vbQuestion + vbYesNo, "Tables not found")
If y = vbNo Then
Exit Sub
End If
' Bring the Common Dialog Control back up.
Browse
strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
If Len(strTest) = 0 Then ' File not found.
MsgBox "File not found. Please try again.", vbExclamation, _
"Link to new data file"
Exit Sub
End If
Debug.Print "Break"
Relinktables (strTest)
Else
Exit Sub
End If
CheckifComplete
Exit_BeginLink:
DoCmd.Echo True ' Just in case of error jump.
DoCmd.Hourglass False
Exit Sub
Err_BeginLink:
Debug.Print Err.Number
If Err.Number = 457 Then
ClearAll
Resume Next
End If
MsgBox Err.Number & ": " & Err.Description
Resume Exit_BeginLink
End Sub
En el menú Depurar , haga clic en Compilar de aplicaciones para usuario .
Guarde el módulo como RelinkCode y ciérrelo.
Cambiar el nombre la base de datos ejemplo de Neptuno.mdb o muévalo a otra carpeta del disco duro para que las tablas vinculadas en FrontEnd.mdb se necesite actualizarse.
Abra el formulario frmNewDataFile y, a continuación, haga clic en el botón Examinar .
En el cuadro de diálogo , Seleccione Nuevo archivo de datos , busque Neptuno.mdb en su nueva carpeta y, a continuación, haga clic en Abrir .
Observe que la ruta de acceso y el nombre de la base de datos aparece en el cuadro de texto en el formulario.
Haga clic en el formulario en el botón de Actualizar vínculos .
Observe que recibe el mensaje siguiente cuando finalice el procedimiento:
Vincular a nuevo archivo de datos back-end tuvo éxito.
Crear un formulario de inicio para comprobar las tablas vinculadas
Para comprobar los vínculos a tablas de back-end automáticamente cada vez que abra la base de datos de FrontEnd.mdb, puede crear un formulario oculto para ese propósito; para ello, siga estos pasos:
Cree un nuevo formulario que no esté basado en ninguna tabla o consulta de la vista Diseño.
En el menú Ver , haga clic en código .
Escriba el siguiente procedimiento para ejecutar cuando se abre el formulario:
Private Sub Form_Open(Cancel As Integer)
' Tests a linked table for valid back-end.
On Error GoTo Err_Form_Open
Dim strTest As String, db As DAO.Database
Dim td As DAO.TableDef
Set db = CurrentDb
For Each td In db.TableDefs
If Len(td.Connect) > 0 Then ' Is a linked table.
On Error Resume Next ' Turn off error trap.
strTest = Dir(Mid(td.Connect, 11)) ' Check file name.
On Error GoTo Err_Form_Open ' Turn on error trap.
If Len(strTest) = 0 Then ' No matching file.
If MsgBox("Couldn't find the back-end file " & _
Mid(td.Connect, 11) & ". Please choose new data file.", _
vbExclamation + vbOKCancel + vbDefaultButton1, _
"Can't find backend data file.") = vbOK Then
DoCmd.OpenForm "frmNewDataFile" ' Open prompt form.
DoCmd.Close acForm, Me.Name
Exit Sub ' to refresh links
Else
MsgBox "The linked tables can't find their source. " & _
"Please log onto network and restart the application."
End If
End If
End If
Next ' Loop to next tabledef.
DoCmd.Close acForm, Me.Name
Exit_Form_Open:
Exit Sub
Err_Form_Open:
MsgBox Err.Number & ": " & Error.Description
Resume Exit_Form_Open
End Sub
En el menú Depurar , haga clic en Compilar de aplicaciones para usuario .
Guarde el formulario como frmCheckLink y ciérrelo.
Para establecer frmCheckLink como el formulario de inicio, en las Herramientas de menú haga clic en Inicio , seleccione frmCheckLink en la lista Mostrar formulario/página y, a continuación, haga clic en Aceptar .
Para hacer frmCheckLink un formulario oculto, haga clic con el botón secundario en frmCheckLink en la ventana base de datos, haga clic en Propiedades en el menú contextual, haga clic para seleccionar la casilla de verificación oculto en el cuadro de diálogo frmCheckLink propiedades y, a continuación, haga clic en Aceptar .
Mover la base de datos de ejemplo Neptuno.mdb a otra carpeta del disco duro para que se tenga que actualizar las tablas vinculadas en FrontEnd.mdb.
Cierre y vuelva a abrir FrontEnd.mdb.
Observe que recibe el siguiente mensaje de error
No puede encontrar el database file de archivo back-end Elija nuevo archivo de datos.
donde database file es el nombre ruta de acceso y de la base de datos back-end.
Si hace clic en Aceptar , el formulario frmNewDataFile abre para que seleccione una nueva base de datos back-end y, a continuación, actualiza los vínculos de tabla. Si hace clic en Cancelar , recibirá el siguiente mensaje de error:
Las tablas vinculadas no encuentra su origen. Inicie sesión en red y reinicie el programa.
Para información adicional sobre cómo personalizar el ejemplo de actualización de tablas vinculadas en el ejemplo de soluciones de desarrollo del programa (Solutions9.mdb), haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
ADT/ODE cómo modificar el módulo de RefreshTableLinks en Solutions.mdb
Para obtener información adicional acerca del Asistente de empaquetado y distribución, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 209862
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.