Access - Compactar y reparar back end

 
Vista:
sin imagen de perfil

Compactar y reparar back end

Publicado por carlos (46 intervenciones) el 29/09/2023 19:00:02
Necesito compactar y reparar el back end desde el front end por vba al cerrar el último formulario de la aplicación, no lo he logrado y necesito me ayuden
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Compactar y reparar back end

Publicado por Joan (90 intervenciones) el 02/10/2023 19:16:56
Hola, aquí te dejo una forma de compactar y reparar el back-end:

El código lo saqué de internet, si buscas hay muchas formas de hacerlo.

'Tengo un formulario llamado FrmCompactar. Un textbox llamado, ctrlListBox. Un botón con nombre, compactar.

1
2
3
4
5
6
7
8
9
10
Private Sub Form_Load()
 
Dim link As String
link = Nz(DLookup("vinculo", "TVinculo")) 'Cuando vinculo las tablas, guardo el link para que así ya aparezca directamente la ruta en ctrlListBox al compactar, también si sabes que es siempre la misma ponla directamente entre comillas.
 
Me.ctrlListBox = link
 
Me.txtfocus.SetFocus
 
End Sub


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub compactar_Click()
 
On Error GoTo Err_Local
 
DoCmd.Hourglass True
 
funCompactarBDVinculadas
 
DoCmd.Hourglass False
 
MsgBox "La Base de Datos ha sido compactada y reparada correctamente. BDLLE se cerrará.", vbInformation, "Compactación correcta"
 
DoCmd.Quit
 
Exit_Local:
   Exit Sub
 
Err_Local:
    MsgBox err.Description, vbCritical, "Error N.:  " & err.Number
    Resume Exit_Local
 
End Sub


Crea un módulo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Option Compare Database
Option Explicit
 
Function funCompactarBDVinculadas()
 
    On Error GoTo Err_Function_Compactar
 
    Dim dbs As DAO.Database
    Dim strDynamicArray() As String    'Nombre matriz
    Dim strRutaOrigenDatos As String
    Dim strPwdOrigenDatos As String
    Dim strBDaCompactar As String
    Dim intContador1 As Integer
    Dim intContador2 As Integer
    Dim strNombreBD As String
    Dim strNombreBDCompactada As String
    Dim strNombreBDTrabajo As String
 
    Set dbs = CurrentDb()
 
    For intContador1 = 0 To dbs.TableDefs.Count - 1
        If left(dbs.TableDefs(intContador1).Name, 4) <> "MSys" Then
            If (dbs.TableDefs(intContador1).Attributes And dbAttachedTable) Or (dbs.TableDefs(intContador1).Attributes And dbAttachedODBC) Then
                If left(dbs.TableDefs(intContador1).Name, 4) <> "~TMP" Then
                    strBDaCompactar = dbs.TableDefs(intContador1).Name
                    strRutaOrigenDatos = dbs.TableDefs(strBDaCompactar).Connect
                    strBDaCompactar = Mid(strRutaOrigenDatos, InStrRev(strRutaOrigenDatos, "\") + 1)
                    ReDim Preserve strDynamicArray(intContador1)
                    strDynamicArray(intContador1) = strBDaCompactar
 
                    For intContador2 = 0 To intContador1 - 1
                        If strDynamicArray(intContador2) = strBDaCompactar Then
                            GoTo Continua_Local_Function:
                        End If
                    Next intContador2
 
                    Forms!frmCompactar!ctrlListBox.Value = strBDaCompactar
 
                    Rem El numero 10 sale porque  ";DATABASE=" tiene 10 caracteres
                    Rem codigo anadido por: Juan Menendez/Mastercafe  (BBDD ahora con Password)
                    If left(strRutaOrigenDatos, 10) = ";DATABASE=" Then     'no tiene password
                        strRutaOrigenDatos = Mid(strRutaOrigenDatos, 11, Len(strRutaOrigenDatos))
                        strRutaOrigenDatos = left(strRutaOrigenDatos, Len(strRutaOrigenDatos) - Len(strBDaCompactar))
                        strPwdOrigenDatos = ""
                    Else
                        strPwdOrigenDatos = Mid(strRutaOrigenDatos, InStr(1, strRutaOrigenDatos, ";PWD=Contraseñasilatiene") + 5, InStr(1, strRutaOrigenDatos, ";database=") - (InStr(1, strRutaOrigenDatos, ";PWD=") + 5))
                        strRutaOrigenDatos = Mid(strRutaOrigenDatos, InStr(1, strRutaOrigenDatos, ";database=") + 10, Len(strRutaOrigenDatos))
                        strRutaOrigenDatos = left(strRutaOrigenDatos, Len(strRutaOrigenDatos) - Len(strBDaCompactar))
                    End If
 
                    If Len(Dir(strRutaOrigenDatos & strBDaCompactar)) = 0 Then
                        Beep
                        MsgBox "ERROR al Compactar: " & vbCr & vbCrLf & _
                               "En el directorio, no existe el Back-End", vbCritical, "Error N.:  " & err.Number
                        GoTo Exit_Function_Compactar
                    End If
 
                    strNombreBD = strRutaOrigenDatos & strBDaCompactar
                    strNombreBDCompactada = strRutaOrigenDatos & "C_" & strBDaCompactar
                    strNombreBDTrabajo = strRutaOrigenDatos & "T_" & strBDaCompactar
 
                    If Len(Dir(strNombreBDCompactada)) > 0 Then
                        Kill strNombreBDCompactada
                    End If
 
                    If strPwdOrigenDatos <> "" Then
                        DBEngine.CompactDatabase strNombreBD, strNombreBDCompactada, ";pwd=" & strPwdOrigenDatos, , ";pwd=" & strPwdOrigenDatos
                    Else
                        DBEngine.CompactDatabase strNombreBD, strNombreBDCompactada
                    End If
 
                    If Len(Dir(strNombreBDTrabajo)) > 0 Then
                        Kill strNombreBDTrabajo
                    End If
 
                    Name strNombreBD As strNombreBDTrabajo
                    Name strNombreBDCompactada As strNombreBD
                    Kill strNombreBDTrabajo
                End If
            End If
        End If
    Next intContador1
 
 
Continua_Local_Function:
    Erase strDynamicArray
    dbs.Close
    Set dbs = Nothing
 
 
    If Len(strBDaCompactar) = 0 Then
        MsgBox "No ha sido posible Compactar" & vbCrLf & _
               "Es posible que no tengas ninguna Tabla Vinculada en esta Base de Datos.", vbExclamation, "No existe BD"
 
        If MsgBox("Quieres abrir el asistente de las tablasvinculadas?", vbInformation + vbYesNo, "Asistente") = vbYes Then
            DoCmd.OpenForm "FrmVincula" 'Nombre del formulario de vinculación del back-end
            MsgBox "Solo se han vinculado las tablas pero no se ha hecho ninguna Compactacion." & vbCrLf & _
                   "Ahora deberias volver a compactar.", vbInformation, "Aviso"
        End If
 
        GoTo Exit_Function_Compactar
    End If
 
 DoCmd.Hourglass False
 
 
Exit_Function_Compactar:
 
    Exit Function
 
Err_Function_Compactar:
    Select Case err.Number
 
        Case 2501
            Rem No hacer nada. Aparece este error cuando se cancela el DialogBox
 
        Case Else
            Rem error no previsto
            MsgBox err.Description, vbCritical, "Error Function N.:  " & err.Number
 
    End Select
 
    Resume Exit_Function_Compactar:
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Compactar y reparar back end

Publicado por carlos (46 intervenciones) el 02/10/2023 19:38:15
gracias una vez más amigo Joan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar