Crear y Recuperar tus Tablas o Datos de una BD Access Sencilla

Aveces nos preguntamos como crear un (Respaldo, Back-Up, Copia de Seguridad, etc...) de una base de datos sencilla

No se trata solo de copiar y pegar un Fichero o Archivo .mdb o .accdb

Preguntaba alguien.....

1) Lo que realmente busco es extraer toda la data de mis tablas y crear un fichero aparte .mdb o .accdb

Tambien que en el proceso de la extraccion se lleve las Relaciones.........

2) Luego de haber realizado esta operacion me la grabe con la fecha del sistema para asi saber de que dia pertenece la data o informacion

3) Y claro esta poder recupear la data o tablas desde mi base de datos en uso.....

Ok. Para todo esto tenemos que crear un modulo que realize las opciones 1 y 2

El Codigo

Option Compare Database

Public Sub CopiarTabasRelaciones(strFile As String)

' Funcion para copiar solo las tablas de la base de datos

' y sus relaciones

' strFile - es el nombre que le vas a dar a la copia. En este caso yo la llamare copia

On Error GoTo E_Handle

Dim dbFE As Database, dbBE As Database

Dim tdf As TableDef

Dim rel As Relation

Dim fld As Field

Dim astr(1 To 100, 1 To 4) As String

Dim intLoop As Integer, intRelCount As Integer, intTableCount As Integer

Dim strTable As String

Set dbFE = CurrentDb

intLoop = 1

If Len(Dir(strFile)) = 0 Then

Set dbBE = DBEngine(0).CreateDatabase(strFile, dbLangGeneral)

Else

Set dbBE = DBEngine(0).OpenDatabase(strFile)

End If

For Each rel In dbFE.Relations

For Each fld In rel.Fields

astr(intLoop, 1) = rel.Table

astr(intLoop, 2) = rel.ForeignTable

astr(intLoop, 3) = fld.Name

astr(intLoop, 4) = fld.ForeignName

intLoop = intLoop + 1

Next fld

Next rel

intRelCount = dbFE.Relations.Count - 1

For intLoop = intRelCount To 0 Step -1

'dbFE.Relations.Delete dbFE.Relations(intLoop).Name

Next intLoop

intTableCount = dbFE.TableDefs.Count - 1

For intLoop = intTableCount To 0 Step -1

strTable = dbFE.TableDefs(intLoop).Name

If Left(strTable, 4) <> "MSys" And Left(strTable, 4) <> "USys" And Len(dbFE.TableDefs(intLoop).Connect) = 0 Then

DoCmd.TransferDatabase acExport, "Microsoft Access", strFile, acTable, strTable, strTable

End If

Next intLoop

For intLoop = 1 To intRelCount + 1

Set rel = dbBE.CreateRelation(astr(intLoop, 1) & astr(intLoop, 2), astr(intLoop, 1), astr(intLoop, 2))

rel.Fields.Append rel.CreateField(astr(intLoop, 3))

rel.Fields(astr(intLoop, 3)).ForeignName = astr(intLoop, 4)

dbBE.Relations.Append rel

Next intLoop

MsgBox "Proceso Concluido con exito" & vbCrLf & _

"La copia se ha grabado en " & vbCrLf & _

CurrentProject.path & "\(Copia del " _

& Format(Date, "dd-mm-yyyy") & ") " _

& CurrentProject.Name & vbCrLf & _

"Solo hemos copiado las Tablas y Sus Relaciones, y tomado" & vbCrLf & _

"La fecha del sistema, para asi saber el dia de respaldo" & vbCrLf & _

"Y Recuperar la que necesitemos.........................", vbInformation, "Grabado"

sExit:

On Error Resume Next

Set rel = Nothing

Set dbFE = Nothing

dbBE.Close

Set dbBE = Nothing

Exit Sub

E_Handle:

MsgBox Err.Description & vbCrLf & "CopiarTabasRelaciones", vbOKOnly + vbCritical, "Error: " & Err.Number

Resume sExit

End Sub

Y Despues otro modulo que me realize la Opcion 3

El Codigo

Option Compare Database

Option Explicit

'******************* Jefferson Jimenez **************************

'****************** Cabimas, Venezuela **************************

'************************* Mayo 2009 ****************************

'****************************************************************

'Primero Elimino las Relaciones de las Tablas Actuales, _

..... Habiendo eliminado las relaciones, elimino las tablas .......

Function DltTblAct()

Dim dbFE As Database, dbBE As Database

Dim tdf As TableDef

Dim rel As Relation

Dim fld As Field

Dim astr(1 To 100, 1 To 4) As String

Dim intLoop As Integer, intRelCount As Integer, intTableCount As Integer

Dim strTable As String

Set dbFE = CurrentDb

intLoop = 1

For Each rel In dbFE.Relations

For Each fld In rel.Fields

astr(intLoop, 1) = rel.Table

astr(intLoop, 2) = rel.ForeignTable

astr(intLoop, 3) = fld.Name

astr(intLoop, 4) = fld.ForeignName

intLoop = intLoop + 1

Next fld

Next rel

intRelCount = dbFE.Relations.Count - 1

For intLoop = intRelCount To 0 Step -1

dbFE.Relations.Delete dbFE.Relations(intLoop).Name

Next intLoop

intTableCount = dbFE.TableDefs.Count - 1

For intLoop = intTableCount To 0 Step -1

strTable = dbFE.TableDefs(intLoop).Name

If Left(strTable, 4) <> "MSys" And Left(strTable, 4) <> "USys" And Len(dbFE.TableDefs(intLoop).Connect) = 0 Then

DoCmd.DeleteObject acTable, strTable

End If

Next intLoop

End Function

'Ahora Copio de la Base de Datos BackUp a la Base _

de Datos Actual todas las Tablas _

que en ella estan... Incluso con sus Relaciones

Public Function ImportDb(strPath As String) As Boolean

On Error Resume Next

Dim db, cdb As Database

Dim td As TableDef

Dim strTDef, strDocName, strRName, _

strTName, strFTName, strFName, _

strFFName As String

Dim intConst As Integer

Dim rel As Relation

Dim nrel As Relation

Dim varAtt As Variant

Dim fld As Field

Set db = DBEngine.Workspaces(0).OpenDatabase(strPath, True)

For Each td In db.TableDefs

strTDef = td.Name

If Left(strTDef, 4) <> "MSys" Then

DoCmd.TransferDatabase acImport, "Microsoft Access", strPath, acTable, _

strTDef, strTDef, False

End If

Next

Set cdb = CurrentDb

For Each rel In db.Relations

With rel

strRName = .Name

strTName = .Table

strFTName = .ForeignTable

varAtt = .Attributes

Set nrel = cdb.CreateRelation(strRName, strTName, strFTName, varAtt)

For Each fld In .Fields

strFName = fld.Name

strFFName = fld.ForeignName

nrel.Fields.Append nrel.CreateField(strFName)

nrel.Fields(strFName).ForeignName = strFFName

Next

cdb.Relations.Append nrel

End With

Next

MsgBox "Concluido Exitosamente", vbInformation, "Gracias"

Set fld = Nothing

Set nrel = Nothing

Set rel = Nothing

Set cdb = Nothing

Set td = Nothing

db.Close

Set db = Nothing

ImportDb = True

End Function