Copiar datos de tablas de una base a otra - Access 2007
Tengo 2 bases de datos, una de ofertas y otra de trabajos adjudicados. Quisiera saber si es posible transferir los datos de las tablas de la base de ofertas cuando estén adjudicadas a la otra base de datos, teniendo en cuenta que las tablas son iguales en estructura y relaciones.
1 Respuesta
Ainhoa: Si que es posible, pero un tema es la transferecia y otra la "Sustitución".
Mira en la ayuda de Access el Método.
DoCmd. TransferDatabase acExport, "Microsoft Access", ...
Si no tienes a mano la ayuda, en éste enlace de Microsoft, tienes lo mismo.
Mis saludos >> Jacinto
Buenas tardes Jacinto,
Muchas gracias por responder. He estado ojeando tu propuesta, pero entiendo que este método funciona para transferir todos los datos de una tabla a otra, pero yo lo que necesito es transferir sólo parte de los datos. En ningún caso pretendo sustituir datos de ninguna de las bases.
¿Es así o lo estoy mirando mal?
Saludos,
Ainhoa
Ainhoa: Si es como dices, y por eso tecomentaba arriba>> ...pero un tema es la transferecia y otra la "Sustitución"
La verdad es que no acababa de entender bien tu propósito y veamos si lo he entendido.
Tienes una Tabla Ofertas en una BD y en Otra BD una Tabla TrabajosAdjudicados que tienen identica estructura, pero por lógica la segunda tendrá menos registros que la primera.
Sin entrar en que se pueda hacer con distintos códigos, al final se tratará de ejecutar una Consulta de Anexar Datos (INSERT INTO.. ) con un criterio adecuado.
'Esto va después de Importar y Tabla Origen es la Importada y Destino es la que se quiere ampliar Dim StrSQL As String StrSQL = "INSERT INTO TablaDestino " StrSQL = StrSQL & "SELECT TablaOrigen.* " StrSQL = StrSQL & "FROM TablaOrigen LEFT JOIN TablaDestino ON TablaOrigen.Identificador = TablaDestino.Identificador " StrSQL = StrSQL & "WHERE ((([TablaDestino]![Identificador]) Is Null));" CurrentDb. Execute StrSQL, dbFailOnError
Yo lo haría desde la segunda BD, en el evento al Cargar(Form_Load), del primer formulario que se abra:
1.-
Dim TablaFuente As String, BDOrigen As String 'Estos son Nombres Inventados TablaFuente = "Ofertas" BDOrigen = "Ofertas" Call EliminaTablaSiExiste(TablaFuente) DoCmd. TransferDatabase acImport, "Microsoft Access", RutaImport & BDOrigen & ".accdb", acTable, TablaFuente, TablaFuente, False, False 'Aquí ya tendremos la Tabla Importada que he llamado igual que la Original
2.-
Este Sub Elimina la Tabla antes de Importar.
Sub EliminaTablaSiExiste(ObjetoDestino) Set dbs = CurrentDb Call ExisteObjeto(ObjetoDestino) If Existe = False Then MsgBox "La Tabla " & ObjetoDestino & " no existe en ésta BD. El Proceso seguirá", vbInformation, "MENSAJE INFORMATIVO" Exit Sub Else StrSQL = "DROP TABLE " & ObjetoDestino & ";" DoCmd.SetWarnings False dbs.Execute StrSQL, dbFailOnError DoCmd.SetWarnings True End If End Sub
3.-
Y esta Funcion es la que sondea si existe la Tabla.
Function ExisteObjeto(NombreObjeto) Existe = False EsConsulta = False EsTabla = False For Each Objeto In CurrentDb.QueryDefs If NombreObjeto = LCase(Objeto.Name) Then Existe = True EsConsulta = True Exit For End If Next If Not Existe Then EsConsulta = False For Each Objeto In CurrentDb.TableDefs If NombreObjeto = LCase(Objeto.Name) Then Existe = True EsTabla = True Exit For End If Next End If End Function ' ExisteObjeto
Quizá lo podia haber hecho mas corto, pero así tienes una panorámica general de Procedimientos y Funciones que puedes usar en otras ocasiones. Mis saludos >> Jacinto
Buenos días Jacinto,
Muchas gracias por tu respuesta. Creo que no me expliqué bien, perdona. Lo que quiero hacer es volcar los datos de la tabla ofertas a las base de datos de trabajos adjudicados cuando me adjudiquen un trabajo nuevo, pero sólo los trabajos adjudicados. El resto no me interesa exportarlos y los registros que ya existen en la base de trabajos adjudicados no quiero borrarlos. Sólo quiero adicionar los nuevos registros. Es decir, la base ofertas siempre tendrá muchos más registros que la base de trabajos adjudicados. Las tablas son idénticas en ambas bases y tienen el mismo nombre. Con tu propuesta tendría que eliminar la tabla fuente antes de importar la tabla origen si no lo he entendido mal, ¿no?
Saludos,
Ainhoa
Ainhoa: Si en el Código hay algo ue se me haya escapado, es posible ue ocurra lo ue comentas.
No es ese el Objetivo, sino a grandes rasgos el Siguiente.
1.- Al abrir la BD importa la Tabla llamemosle grande, previo borrado de esa misma si está presente por alguna razón.
2.- Actualiza la Tabla de esa BD ue abrimos, "solo" con los registros que faltensegún un criterio seguro. Sea simple o compuesto.
Eso es todo.
Ando un poco liado pero si por alguna razón ves que no vas a salir, me lo comentas e intento preparar un ejemplo y te facilito el enlace.
Como hay otras maneras de resolver el Problema, otra sería
En la segunda BD vincularle la Tabla Ofertas.
Seguir la metodología del INSERT sin más. Eso sí el WHERE debe contener la o las condiciones adecuadas. Yo te he citado una pero creo que en tu caso harán falta dos.
Mis saludos >> Jacinto
Buenos días Jacinto, la verdad es que te agradecería un ejemplo. No sé si voy a ser capaz de hacerlo sola, aunque voy a intentarlo, a ver si consigo que funcione.
Saludos,
Ainhoa
Ainhoa: Si no es hoy casi seguro que mañana preparo el Ejemplo y te mando el enlace.
Mis saludos >> Jacinto
Ainhoa: Tal como te había prometido, en éste enlace tienes el Ejemplo con un Word que solo tiene una breve explicación.
http://www.mediafire.com/download/e154nginbyla9s3/InsertCriterios.rar
Ahora que ya está preparado el ejemplo, te comento lo que apunto en el Word y es que seguro tendrás tus razones para tener dos Bases de Datos. Sin conocerlos yo lo hubiera hecho en la misma BD. Mis saludos >> Jacinto
¡Gracias por tu ayuda Jacinto! Lo descargo y espero conseguirlo. La razón de tener 2 bases de datos iguales es la capacidad. Se hacen muchas ofertas, que ocupan mucho espacio, pero sólo se consigue parte de ellas.
Muchas gracias de nuevo.
Saludos,
Ainhoa
Ainhoa: Por nada. Si tienes dificultades me comentas, y admitiendo que cada uno tengamos nuestro punto de vista y no hay buenos ni malos, en lo referente la "capacidad", supongo que es porque guardas las Ofertas "dentro" de la BD.
Si eso es así puedes contemplar la alternativa de guardar las Ofertas fuera de la BD y concentrar la Gestión en una sola BD, pero como te cito solo es a titulo de sugerencia.
Mis saludos >> Jacinto
Hola Jacinto, no entiendo eso de guardar las ofertas fuera de la base de datos. Se supone que la información está almacenada en las tablas, que están relacionadas entre ellas para vincular la información, ¿no?
Saludos,
Ainhoa
Ainhoa: He supuesto que las Ofertas son documentos de Word o PDF etc que guardas en algún campo como Adjuntos o bien que guardas la literalidad en un Campo Memo, ya que de otro modo no veo el crecimiento de la BD por unos registros llamesmole "Normales", sin adjuntos ni Objetos OLE...
De no ser esa la estructura, alguna razón habrá para ese crecimiento.
Mis saludos >> Jacinto
No Jacinto, las ofertas las elaboro con la propia base de datos. En ella realizo todos los cálculos de todas las variables. Tengo unas 50 tablas, todas relacionadas entre sí, cada una de ellas con diferentes aspectos de la oferta. Dentro de una oferta puede haber 1 referencia o 100. Por eso, al ir realizando ofertas, se van incrementando los registros de todas las tablas, con lo que la base al final resulta muy pesada. Por eso quiero separar las referencias adjudicadas a otra base de datos idéntica, que así pesará menos. Además, una vez adjudicadas, necesito incorporar otras funciones de gestión como pedidos modificaciones,...que no existen en la base de ofertas.
He mirado tu ejemplo y ahora creo que entiendo el sistema. Mañana cuando regrese a la oficina intentaré ponerlo en práctica y espero o tener que molestarte de nuevo.
Una vez más, muchísimas gracias por tu ayuda. Sin ti no lo habría logrado, seguro.
Saludos,
Ainhoa
- Compartir respuesta