none
saber como unir dos tablas de acces RRS feed

  • Pregunta

  • tengo una base de datos creada en acces, le doy copia a otra persona, posteriormente yo introducco datos nuevos en mi base y la otra persona

    por su parte introduce datos en su copia diferentes de los mios.

    como podemos actualizar ambas bases para que haya lo mismo en una que en la otra.

     

    jueves, 17 de febrero de 2011 17:22

Respuestas

  • Hola:

    En Access, lo más parecido a "unir dos tablas" se llama «sincronizar dos bases de datos», para que en un momento determinado, las dos bases tengan los mismos datos.

    Para ello, tienes que definir qué base de datos va a actuar de «diseño principal», para que posteriormente puedas crear réplicas de esa base de datos, llamémosla «base de datos principal».

    Una vez asignado el diseño principal a una base de datos, la estructura de ésta última no se puede modificar, porque de hacerse, puede ser que tengas problemas a la hora de sincronizar los datos, por tanto, sería conveniente que antes de hacer la replicación, la estructura de la base de datos se encuentra acabada.

    Se puede modificar, pero si ya se ha replicado, obviamente las nuevas modificaciones no surtirán efecto en las bases de datos replicadas.

    Antes de explicarte el proceso para crear la réplica y sincronizar los datos, lo primero que vas a hacer es CREARTE UNA COPIA DE SEGURIDAD DE LA BASE DE DATOS, ya que al convertir una base de datos en un Diseño principal, se realizan cambios en la base de datos, y ÉSTOS CAMBIOS NO SE PUEDEN DESHACER, es decir, no se puede revertir la base de datos a su estado original. Por éste motivo, se aconseja crear primero una copia de seguridad, vaya a ser que no te guste el proceso de réplica y sincronización y desees recuperar el estado original de la base de datos. ¿De acuerdo?

    Dicho esto, te diré que lo más fácil es utilizar el propio Microsoft Access para crear la réplica y la sincronización de los datos. Pero si lo deseas hacer mediante programación, no te va a quedar más remedio que referenciar en tu proyecto las siguientes bibliotecas COM:

      - La versión más reciente que tengas de la clásica biblioteca de ADO,
        Microsoft ActiveX Data Object 2.x

      - Microsoft Jet and Replication Objects 2.6 Library.

    Como no has indicado el lenguaje de desarrollo que utilizas, yo te voy a poner los ejemplos utilizando el lenguaje Visual Basic .NET.

    Para convertir la base de datos en un Diseño principal, ejecutarías el siguiente procedimiento:

      ''' <summary>
      ''' Crea un diseño principal en la base de datos de Access especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <remarks></remarks>
      Public Sub CreateMainDesign(ByVal basePrincipal As String)
    
        Dim jro As JRO.Replica = Nothing
    
        Try
          jro = New JRO.Replica()
    
          jro.MakeReplicable(basePrincipal, False)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(jro)
          jro = Nothing
    
        End Try
    
      End Sub
    
    
    

    Y para crear una réplica de la base de datos principal, ejecutarías éste otro procedimiento:

      ''' <summary>
      ''' Crea una nueva réplica de la base de datos de Access principal especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <param name="baseReplicada">Ruta de la base de datos replicada.</param>
      ''' <param name="descripcion">Descripción de la base de datos replicada.</param>
      ''' <remarks></remarks>
      Public Sub CreateNewReplica(ByVal basePrincipal As String, _
                    ByVal baseReplicada As String, _
                    ByVal descripcion As String)
    
        Dim conn As ADODB.Connection = Nothing
        Dim jro As JRO.Replica = Nothing
    
        Try
          ' Abrimos la conexión de manera exclusiva.
          '
          conn = New ADODB.Connection()
    
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Mode=Share Exclusive;" & _
                            "Data Source=" & basePrincipal
          conn.Open()
    
          jro = New JRO.Replica()
    
          jro.ActiveConnection = conn
    
          jro.CreateReplica(baseReplicada, descripcion, _
                   Global.JRO.ReplicaTypeEnum.jrRepTypeFull, _
                   Global.JRO.VisibilityEnum.jrRepVisibilityGlobal)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(jro)
          jro = Nothing
    
          ' Si procede cerramos la conexión.
          If ((conn IsNot Nothing) AndAlso (conn.State <> 0)) Then _
            conn.Close()
    
          Runtime.InteropServices.Marshal.ReleaseComObject(conn)
          conn = Nothing
    
        End Try
    
      End Sub
    
    
    

    Finalmente, para sincronizar los datos, ejecutarías el siguiente procedimiento:

      ''' <summary>
      ''' Crea una nueva réplica de la base de datos de Access principal especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <param name="baseReplicada">Ruta de la base de datos replicada.</param>
      ''' <remarks></remarks>
      Public Sub SynchronizeReplica(ByVal basePrincipal As String, _
                     ByVal baseReplicada As String)
    
        Dim conn As ADODB.Connection = Nothing
        Dim jro As JRO.Replica = Nothing
    
        Try
          Dim repMaster As New JRO.Replica
          Dim RepNorthwind As New JRO.Replica
    
          ' Abrimos la conexión de manera exclusiva.
          '
          conn = New ADODB.Connection()
    
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Mode=Share Exclusive;" & _
                            "Data Source=" & basePrincipal
          conn.Open()
    
          jro = New JRO.Replica()
    
          jro.ActiveConnection = conn
    
          ' Sincronizamos los valores.
          '
          jro.Synchronize(baseReplicada, _
                  Global.JRO.SyncTypeEnum.jrSyncTypeImpExp, _
                  Global.JRO.SyncModeEnum.jrSyncModeDirect)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(JRO)
          jro = Nothing
    
          ' Si procede cerramos la conexión.
          If ((conn IsNot Nothing) AndAlso (conn.State <> 0)) Then _
            conn.Close()
    
          Runtime.InteropServices.Marshal.ReleaseComObject(conn)
          conn = Nothing
    
        End Try
    
      End Sub
    
    
    

    Ahora, cuando desees crear una réplica, ejecutarías:

            Try
                ' Indicamos la base de datos que va a actuar de diseño principal.
                '
                CreateMainDesign("C:\Mis documentos\BasePrincipal.mdb")
               
                ' Creamos una nueva réplica de la base de datos principal.
                '
                CreateNewReplica("C:\Mis documentos\BasePrincipal.mdb", _
                                 "C:\Mis documentos\Replica1BasePrincipal.mdb", _
                                 "Primera rèplica de la base de datos BasePrincipal.mdb.")

                MessageBox.Show("Se ha replicado satisfactoriamente la base de datos.")

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    Te advierto que si la base de datos ya tiene establecido un Diseño principal, obtendrás un error si intentas crearlo de nuevo nuevo, por lo que al procedimiento CreateMainDesing deberías de ejecutarlo una sola vez.

    Asimismo, te indico que he tenido que utilizar el proveedor de datos Microsoft.ACE.OLEDB.12.0, porque no he sido capaz de crear la réplica mediante el proveedor Microsoft.Jet.OLEDB.4.0, el cual también lo tengo instalado en mi equipo, pero ignoro el motivo por el cual éste último no creaba la réplica, y a decir verdad, no tengo ni tiempo ni ganas de averiguarlo. Mira a ver si a ti te funciona.

    Por último, cuando desees sincronizar un conjunto de réplicas, ejecutarías:

            Try
                ' Sincronizamos las bases de datos
                '
                SynchronizeReplica("C:\Mis documentos\BasePrincipal.mdb", _
                                   "C:\Mis documentos\Replica1BasePrincipal.mdb")

                MessageBox.Show("La sincronización ha finalizado satisfactoriamente.")

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    ¡Eso es todo! Ni que decir tiene que a la otra persona le tienes que entregar una réplica de la base de datos principal.

    Para más información, consulta los siguientes artículos (en inglés):

    Implementing Database Replication with JRO

    Synchronize Method (JRO)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    sábado, 19 de febrero de 2011 12:11

Todas las respuestas

  • Hola:

    En Access, lo más parecido a "unir dos tablas" se llama «sincronizar dos bases de datos», para que en un momento determinado, las dos bases tengan los mismos datos.

    Para ello, tienes que definir qué base de datos va a actuar de «diseño principal», para que posteriormente puedas crear réplicas de esa base de datos, llamémosla «base de datos principal».

    Una vez asignado el diseño principal a una base de datos, la estructura de ésta última no se puede modificar, porque de hacerse, puede ser que tengas problemas a la hora de sincronizar los datos, por tanto, sería conveniente que antes de hacer la replicación, la estructura de la base de datos se encuentra acabada.

    Se puede modificar, pero si ya se ha replicado, obviamente las nuevas modificaciones no surtirán efecto en las bases de datos replicadas.

    Antes de explicarte el proceso para crear la réplica y sincronizar los datos, lo primero que vas a hacer es CREARTE UNA COPIA DE SEGURIDAD DE LA BASE DE DATOS, ya que al convertir una base de datos en un Diseño principal, se realizan cambios en la base de datos, y ÉSTOS CAMBIOS NO SE PUEDEN DESHACER, es decir, no se puede revertir la base de datos a su estado original. Por éste motivo, se aconseja crear primero una copia de seguridad, vaya a ser que no te guste el proceso de réplica y sincronización y desees recuperar el estado original de la base de datos. ¿De acuerdo?

    Dicho esto, te diré que lo más fácil es utilizar el propio Microsoft Access para crear la réplica y la sincronización de los datos. Pero si lo deseas hacer mediante programación, no te va a quedar más remedio que referenciar en tu proyecto las siguientes bibliotecas COM:

      - La versión más reciente que tengas de la clásica biblioteca de ADO,
        Microsoft ActiveX Data Object 2.x

      - Microsoft Jet and Replication Objects 2.6 Library.

    Como no has indicado el lenguaje de desarrollo que utilizas, yo te voy a poner los ejemplos utilizando el lenguaje Visual Basic .NET.

    Para convertir la base de datos en un Diseño principal, ejecutarías el siguiente procedimiento:

      ''' <summary>
      ''' Crea un diseño principal en la base de datos de Access especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <remarks></remarks>
      Public Sub CreateMainDesign(ByVal basePrincipal As String)
    
        Dim jro As JRO.Replica = Nothing
    
        Try
          jro = New JRO.Replica()
    
          jro.MakeReplicable(basePrincipal, False)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(jro)
          jro = Nothing
    
        End Try
    
      End Sub
    
    
    

    Y para crear una réplica de la base de datos principal, ejecutarías éste otro procedimiento:

      ''' <summary>
      ''' Crea una nueva réplica de la base de datos de Access principal especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <param name="baseReplicada">Ruta de la base de datos replicada.</param>
      ''' <param name="descripcion">Descripción de la base de datos replicada.</param>
      ''' <remarks></remarks>
      Public Sub CreateNewReplica(ByVal basePrincipal As String, _
                    ByVal baseReplicada As String, _
                    ByVal descripcion As String)
    
        Dim conn As ADODB.Connection = Nothing
        Dim jro As JRO.Replica = Nothing
    
        Try
          ' Abrimos la conexión de manera exclusiva.
          '
          conn = New ADODB.Connection()
    
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Mode=Share Exclusive;" & _
                            "Data Source=" & basePrincipal
          conn.Open()
    
          jro = New JRO.Replica()
    
          jro.ActiveConnection = conn
    
          jro.CreateReplica(baseReplicada, descripcion, _
                   Global.JRO.ReplicaTypeEnum.jrRepTypeFull, _
                   Global.JRO.VisibilityEnum.jrRepVisibilityGlobal)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(jro)
          jro = Nothing
    
          ' Si procede cerramos la conexión.
          If ((conn IsNot Nothing) AndAlso (conn.State <> 0)) Then _
            conn.Close()
    
          Runtime.InteropServices.Marshal.ReleaseComObject(conn)
          conn = Nothing
    
        End Try
    
      End Sub
    
    
    

    Finalmente, para sincronizar los datos, ejecutarías el siguiente procedimiento:

      ''' <summary>
      ''' Crea una nueva réplica de la base de datos de Access principal especificada.
      ''' </summary>
      ''' <author>Enrique Martínez «SoftJaén» - 2011</author>
      ''' <param name="basePrincipal">Ruta de la base de datos principal.</param>
      ''' <param name="baseReplicada">Ruta de la base de datos replicada.</param>
      ''' <remarks></remarks>
      Public Sub SynchronizeReplica(ByVal basePrincipal As String, _
                     ByVal baseReplicada As String)
    
        Dim conn As ADODB.Connection = Nothing
        Dim jro As JRO.Replica = Nothing
    
        Try
          Dim repMaster As New JRO.Replica
          Dim RepNorthwind As New JRO.Replica
    
          ' Abrimos la conexión de manera exclusiva.
          '
          conn = New ADODB.Connection()
    
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Mode=Share Exclusive;" & _
                            "Data Source=" & basePrincipal
          conn.Open()
    
          jro = New JRO.Replica()
    
          jro.ActiveConnection = conn
    
          ' Sincronizamos los valores.
          '
          jro.Synchronize(baseReplicada, _
                  Global.JRO.SyncTypeEnum.jrSyncTypeImpExp, _
                  Global.JRO.SyncModeEnum.jrSyncModeDirect)
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          Throw
    
        Finally
          ' Disminuimos el contador de referencias y liberamos el objeto.
          Runtime.InteropServices.Marshal.ReleaseComObject(JRO)
          jro = Nothing
    
          ' Si procede cerramos la conexión.
          If ((conn IsNot Nothing) AndAlso (conn.State <> 0)) Then _
            conn.Close()
    
          Runtime.InteropServices.Marshal.ReleaseComObject(conn)
          conn = Nothing
    
        End Try
    
      End Sub
    
    
    

    Ahora, cuando desees crear una réplica, ejecutarías:

            Try
                ' Indicamos la base de datos que va a actuar de diseño principal.
                '
                CreateMainDesign("C:\Mis documentos\BasePrincipal.mdb")
               
                ' Creamos una nueva réplica de la base de datos principal.
                '
                CreateNewReplica("C:\Mis documentos\BasePrincipal.mdb", _
                                 "C:\Mis documentos\Replica1BasePrincipal.mdb", _
                                 "Primera rèplica de la base de datos BasePrincipal.mdb.")

                MessageBox.Show("Se ha replicado satisfactoriamente la base de datos.")

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    Te advierto que si la base de datos ya tiene establecido un Diseño principal, obtendrás un error si intentas crearlo de nuevo nuevo, por lo que al procedimiento CreateMainDesing deberías de ejecutarlo una sola vez.

    Asimismo, te indico que he tenido que utilizar el proveedor de datos Microsoft.ACE.OLEDB.12.0, porque no he sido capaz de crear la réplica mediante el proveedor Microsoft.Jet.OLEDB.4.0, el cual también lo tengo instalado en mi equipo, pero ignoro el motivo por el cual éste último no creaba la réplica, y a decir verdad, no tengo ni tiempo ni ganas de averiguarlo. Mira a ver si a ti te funciona.

    Por último, cuando desees sincronizar un conjunto de réplicas, ejecutarías:

            Try
                ' Sincronizamos las bases de datos
                '
                SynchronizeReplica("C:\Mis documentos\BasePrincipal.mdb", _
                                   "C:\Mis documentos\Replica1BasePrincipal.mdb")

                MessageBox.Show("La sincronización ha finalizado satisfactoriamente.")

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    ¡Eso es todo! Ni que decir tiene que a la otra persona le tienes que entregar una réplica de la base de datos principal.

    Para más información, consulta los siguientes artículos (en inglés):

    Implementing Database Replication with JRO

    Synchronize Method (JRO)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    sábado, 19 de febrero de 2011 12:11
  • Hola SoftJaén

     

    Necesito comunicarme con usted! 

    Sigue mi mail: v-62edpo@mssupport.microsoft.com

    Y mi MSN: portescheller@msn.com

     

    Gracias.


    Eduardo Portescheller - LATAM Forum Support Engineer
    Microsoft Corporation
    martes, 22 de febrero de 2011 19:31
    Moderador