Access 2003 - actualizar tabla vinculada

Te escribo para consultarte sobre una peculiaridad: tengo una bd en red; luego tengo una tabla en cada equipo vinculada a una tabla en esa bd en red.
La consulta es, ¿se puede actualizar (no copiar) los datos? O sea, no deseo que se repitan datos.
1

1 Respuesta

276.915 pts. Access... ser o no ser. Esa es la cuestión
En general tienes dos sistemas para coger la información de las tablas de otra base de datos.
El primero es importar las tablas. Con este sistema importas la información que hay en ese momento, pero tus tablas quedan totalmente separadas de la tabla "madre", de manera que si hay cambios en la tabla "madre" tu BD no los registra.
El otro sistema es a través de la vinculación. Si vinculas las tablas de tu BD sí quedan "unidas", pero piensa que quedan unidas en sentido bidireccional. Es decir, que cualquier modificación en la tabla "madre" se te reflejará en tu BD, pero también modificación que tú hagas en tu BD se reflejará en la tabla "madre".
Para vincular tablas en Access 2003 lo que tienes que hacer es lo siguiente:
- Te sitúas en cualquier espacio en blanco de la ventana Base de datos, teniendo el apartado tablas seleccionado.
- Haces click con el botón derecho del ratón en ese espacio en blanco
- En el menú emergente que te sale le das a la opción "Vincular tablas..."
- Te aparecerá una pantalla de navegación donde podrás seleccionar primero la BD y después las tablas que quieres vincular.
Verás que, cuando te aparezca la tabla vinculada en la ventana Base de Datos aparece con un icono diferente al de una tabla "normal". Así sabrás, a primera vista, qué tablas son vinculadas y qué tablas son "normales".
Espero haberte ayudado. Suerte!
Disculpame, no fui muy específico. Sigo la consulta:
Vinculé una tabla (que es la misma en cada ordenador) con la tabla en red. Es bidireccional y hasta donde sé no tiene arreglo.
La tabla vinculada en cada equipo se tendría que actualizar de una tabla no vinculada, o sea, en cada equipo existen dos tablas: una donde se guardan datos desde un formulario (tabla1); y otra que es la vinculada (tabla2).
Lo que necesito es que se actualice la tabla2 (vinculada) sin que se repitan datos al volcarlos desde la tabla1.
¿Cómo puedo hacerlo? Muchas gracias.
Saludos, Fabricio.
¿Tienes un identificador inequívoco en esa tabla (una clave principal? Si lo tienes, ¿qué nombre de campo tiene? Y ya de paso, ¿cómo se llaman las tablas, tanto la vinculada como la normal?
Ya me dirás.
No le he creado una columna de identificador inequívoco, tiene la columna de ID.
Las tablas se llaman: 'REGISTRO DATOS' (tabla1) y 'Tabla vinculada en Red' (tabla2). Tienen la misma estructura.
Saludos, Fabricio.
Ya vi tu mensaje, pero lo que pides es una cosa un poco complicada que no puedo responder en cinco minutos. De hecho, es un poco complicada.
En cuanto tenga un momento te escribo el "rollazo" de explicación.
Gracias por tu paciencia.
Hola, mientras escribes el rollazo de tablas te consulto dos tonterías más (=D):
1) En la opción 'Herramientas/Inicio...' uno puede modificar la vista de la "aplicación" de tal forma que hasta se puede esconder todo (hasta la barra donde se encuentra la opción 'Herramientas'): ¿Cómo hago para restaurar la vista?
2) Cuando uno exporta a otra aplicación de Office (como excel, por ejemplo), pero al exportar por ejemplo un campo Hora no te exporta con un tipo Hora sino que te tira unos datos raros y luego hay que cambiarlos manualmente: ¿Hay forma de que te lo exporte ya con el formato hora?
Saludos, Fabricio.
Vamos a ver...
Lo que te voy a explicar te aconsejo que lo pruebes antes o bien con dos bases independientes de las que tienes o bien que lo pruebes con un solo registro, pues todo depende de ese campo identificador que te comentaba al principio. No lo hagas pues con todos los datos porque si falla puedes llenar la tabla vinculada con un montón de registros que quizá no sean lo que quieres. ¡OJO!
También doy por supuesto que el ID es el primer campo de las tablas. Si no se cumple esta condición coméntamelo porque si no el código no te funcionará (problemillas de una solución "a distancia" sin ver que c... estoy haciendo... je, je...).
Los nombres del código deben coincidir con los que tú tengas en tu BD. Por eso comprueba que haya escrito bien los nombres de las tablas (por si acaso). Para distinguirlos mejor te comento que todos están (y deben estar) entre comillas.
También debes asegurarte que Access no te bloquea la ejecución de código.
Vamos allá:
1.- Te creas en algún formulario un botón de comando, que será el que pulsaremos para realizar la actualización.
2.- En vista diseño, haces click con el botón derecho del ratón sobre el botón y seleccionas la opción "Generar evento...". En la pantalla que aparece le dices que quieres generar código.
3.- Te aparecerá el editor de VB (VBE), con dos líneas por defecto (Private Sub... y End Sub). Esas líneas no las debes tocar. Escribiremos el código en medio de ellas.
4.- Antes de hacer nada más, en el VBE, te vas a menú Herramientas->Referencias..., y en la pantalla que te sale debemos registrar la biblioteca DAO. Para ello, buscas una referencia llamada "Microsoft DAO 3.6 Object Library". Marcas su check y aceptas.
5.- Volvemos a las dos líneas que comentábamos antes. Le escribes el siguiente código (te lo he puesto con comentarios para que sepas qué hace cada cosa):
Ojo! Antes de darle al código mírate los comentarios que te pongo después del código ;)
---
Private Sub Comando0_Click()
'Establecemos un control de errores
On Error GoTo sol_err
'Declaramos las variables
Dim dbs As DAO.Database
Dim rst, rstv As DAO.Recordset
Dim noEsta As Variant
Dim vId As Integer
'Creamos los recordset sobre las tablas
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("REGISTRO DATOS")
Set rstv = dbs.OpenRecordset("Tabla Vinculada en Red")
'Nos situamos en el primer registro
rst.MoveFirst
'Iniciamos la rutina de examinar los identificadores
Do Until rst.EOF
'Cogemos el valor del ID
vId = rst.Fields(0).Value
'Comparamos si ese valor ya existe en la tabla vinculada
noEsta = DLookup("[Id]", "Tabla Vinculada en Red", "[Id]=" & vId)
'Si no está ese valor noEsta devuelve NULL. A partir de ahí tomamos
'una decisión a través del IF
If IsNull(noEsta) Then
'Cogemos los valores de los campos y los pasamos a la vinculada
With rstv
rstv.AddNew
rstv.Fields(0).Value = rst.Fields(0).Value
rstv.Fields(1).Value = rst.Fields(1).Value
rstv.Fields(2).Value = rst.Fields(2).Value
rstv.Update
End With
End If
'Nos movemos al siguiente registro
rst.MoveNext
'Repetimos la rutina con ese nuevo registro
Loop
'Lanza un mensaje de que todo ha ido bien
MsgBox "Actualización realizada correctamente", vbInformation, "OK"
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
rstv.Close
dbs.Close
Set rst = Nothing
Set rstv = Nothing
Set dbs = Nothing
Exit Sub
'Manejamos el error
sol_err:
MsgBox "Se ha producido el error " & Err.Number & vbCrLf & Err.Description
Resume Salida
End Sub
---
Como no sé cuántos campos tienes en las tablas tendrás que modificar tú el código. Te explico una cosa: ¿Ves el bloque
With rstv
rstv.AddNew
rstv.Fields(0).Value = rst.Fields(0).Value
rstv.Fields(1).Value = rst.Fields(1).Value
rstv.Fields(2).Value = rst.Fields(2).Value
rstv.Update
End With
?
OK. Este bloque corresponde a una tabla con tres campos. Cuando el recordset selecciona el campo para él el primero es cero (0), y de ahí que ponga rst. Fields(0). Tú tienes que contar cuántos campos tiene tu tabla y restarle uno. Si tiene 7 campos deberías escribir, en ese bloque:
With rstv
rstv.AddNew
rstv.Fields(0).Value = rst.Fields(0).Value
Bla, bla, bla...
rstv.Fields(6).Value = rst.Fields(6).Value
End with
Como ves las equivalencias de número de campo son idénticas tanto a la izquierda como a la derecha de la igualdad.
Y con eso y un bizcocho, hasta mañana a las ocho :D
---
Te respondo a tus otras preguntas, aunque debo decirte, simplemente para tu conocimiento, que hay expertos que quizá te hubieran descartado, porque les molesta que haya más de una consulta en una consulta (¿será por qué así no se obtienen más puntos? ;). Personalmente a mi me importan poco los puntos, pero, por si te encuentras con una consulta descartada, este bien bien podría ser el motivo. Simplemente para tu información :)
1.- Para restaurar la vista basta que abras la BD manteniendo pulsada la tecla mayúsculas (shift). Si te salen avisos de advertencia, tales como si quieres habilitar macros, etc., debes contestar a todo manteniendo la tecla shift pulsada. En pocas palabras, te pegas a ella hasta que veas que la BD está completamente abierta.
2.- No sé cómo exportas a Excel pero quizá te exporte mal el formato porque en la tabla o consulta no tienes definido correctamente el tipo de campo. Échale un vistazo a la tabla que contiene el dato. Por ejemplo, lo suyo sería que definieras el campo como Fecha/hora, y en sus propiedades (la media parte inferior que se ve cuando pones la tabla en vista diseño), en formato, debería estar puesto, por ejemplo, "Hora corta" (hay otras opciones de formato de hora que no recuerdo ahora).
Si quieres, puedes crearte un botón de comando para exportar directamente a Excel desde un formulario. Basta que le escribas este código:
---
Private Sub...
DoCmd.OutputTo acOutputTable, "Tabla1", acFormatXLS, "C:\Tabla1.xls", True
End Sub
---
Las equivalencias en el anterior código son:
Tabla1 -> deberías poner el nombre de tu tabla o consulta
C:\Tabla1.xls -> deberías poner la ruta y el nombre de archivo, con la extensión, que quieres que se genere
True -> significa que, tras la exportación, se te abrirá el Excel. Si no quieres que eso suceda cambias ese True por False.
Y eso es todo.
Suerte!
Felicitarte por tu ayuda. Ha funcionado de mil maravillas: lo he probado con todos los usuarios y, amén de la red que es un poco detestable, lo demás funciona genial. Se guarda todo muy bien.
¿Puedo seguir consultándote aquí o debería abrir otra?
Saludos, Fabricio.
Mara aurë, Fabricio!
Lo ideal sería que abrieras otra consulta, no tanto por el tema de puntos sino porque con los títulos de vuestras consultas se puede ayudar a otra gente que tenga un problema parecido. Si ahora me consultas sobre informes, por decir algo, nadie más que tú y yo se va a enterar (y quien lea esta consulta hasta el final).
Estoy a unos veinte minutos de acabar de contestar una consulta, y creo que ya volveré a aparecer como disponible. Intenta, si es posible, crear otra consulta por el motivo que te he comentado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas