** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Backup backend
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoBackup backend

 Responder Responder
Autor
Mensaje
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Tema: Backup backend
    Enviado: 31/Mayo/2023 a las 19:59
Hola a todos, tengo problemas con el codigo a continuacion para crear un Backup de mi Backend, el error obtenido es el error 52, este es el codigo.

Private Sub Command0_Click()
On Error GoTo Err_backup
    
Dim strFullPath As String
Dim strBackendFile As String
Dim strPath As String
Dim strSourceFile As String
Dim strDestinationFile As String

' obtiene la ruta del back-end usando una tabla vinculada como referencia.
' La función MID elimina la información de conexión, incluida la contraseña

strFullPath = Mid(DBEngine.Workspaces(0).Databases(0).TableDefs("Actual_Volume").Connect, 1)

'MsgBox (strFullPath)

' aisla el nombre de la base de datos backend
    For i = Len(strFullPath) To 1 Step -1
        If Mid(strFullPath, i, 1) = "\" Then
            strBackendFile = Mid(strFullPath, (i + 1))
            Exit For
        End If
    Next

    For N = Len(strBackendFile) To 1 Step -1
        If Mid(strBackendFile, N, 1) = "." Then
            strBackendFile = Left(strBackendFile, (N - 1))
            Exit For
        End If
    Next

' elimine el nombre de archivo de la base de datos para aislar la ruta
    For i = Len(strFullPath) To 1 Step -1
        If Mid(strFullPath, i, 1) = "\" Then
            strPath = Left(strFullPath, i)
            Exit For
        End If
    Next

' reconstruye las rutas de archivo de origen y destino
'al archivo de destino se incluye el día abreviado de la semana
' \backup\ este directorio debe de existir

strSourceFile = strPath & strBackendFile & ".accdb"
strDestinationFile = strPath & "backup\" & strBackendFile & "-" & WeekdayName(Weekday(DATE), True) & ".accdb"
FileCopy strSourceFile, strDestinationFile
MsgBox "The back-end database has been backed up.", vbOKOnly, "Success"

Exit_Backup:
Exit Sub

Err_backup:
If Err.Number = 0 Then
    ElseIf Err.Number = 70 Then
        MsgBox "The file is currently in use and therefore is locked and cannot be copied at this time. Please ensure that all forms, reports, and queries are closed, and that no one is using the database and try again.", vbOKOnly, "File Currently in Use"
    ElseIf Err.Number = 53 Then
        MsgBox "The Source File '" & strSourceFile & "' could not be found. Please validate the location and name of the specifed Source File and try again", vbOKOnly, "File Not Found"
    Else
        MsgBox "Microsoft Access has generated the following error" & vbCrLf & vbCrLf & "Error Number: " & Err.Number & vbCrLf & "Error Source: ModExtFiles / CopyFile" & vbCrLf & "Error Description: " & Err.Description, vbCritical, "An Error has Occured"
End If

Resume Exit_Backup

End Sub

Hice algunos debug.prints para validar las rutas origen y destino y veo estan bien, alguna idea donde puede estar el problema?

Saludos

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 31/Mayo/2023 a las 20:40
Imagino que el error 52 lo da en la línea en que intentas crear la base de datos con la copia de seguridad. Ahora no recuerdo de qué va ese error, pero si lo da en esa línea seguramente es porque hay alguna falta en la cadena de texto con la ruta y nombre de la copia de seguridad. He comprobado que la instrucción WeekdayName(Weekday(DATE), True) & ".accdb" devuelve ju..accdb y eso provocará un error  al intentar guardar el archivo.

Si es eso, yo te sugiero que utilices otro tipo de personalización para las copias de seguridad. Si te sirve, yo les suelo poner al final la fecha y hora con minutos y segundos, así es prácticamente imposible que se repita ese nombre. Puedes sustituir la línea donde das finalmente el nombre a la copia de seguridad, en vez de esto:

strDestinationFile = strPath & "backup\" & strBackendFile & "-" & WeekdayName(Weekday(DATE), True) & ".accdb"

utiliza esto otro:

strDestinationFile = strPath & "backup\" & strBackendFile & "-" & Format(Date,"ddmmyyyy_hhnnss") & ".accdb"
Saludos,

Juan M. Afan de Ribera
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 31/Mayo/2023 a las 20:50
Además de lo que te decía en el anterior mensaje, pienso que la rutina para extraer nombre y ruta puedes simplificarlo mucho si lo haces de esta otra manera:


    strFullPath = Mid(DBEngine.Workspaces(0).Databases(0).TableDefs("Actual_Volume").Connect, 1)

    ' extraemos nombre del back end
    strBackEndFile = Dir(strFullPath)
    
    ' extraemos ruta del back end
    strPath = Replace(strFullPath, strBackEndFile, "")
    
    ' quitamos la extensión al nombre del back end
    strBackEndFile = Replace(strBackEndFile, ".accdb", "")

    ... aquí el resto del código
Saludos,

Juan M. Afan de Ribera
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 31/Mayo/2023 a las 21:51
Una disculpa Happy por no poner en donde me tira el error.

El error me lo da en esta línea:

strDestinationFile = strPath & "backup\" & strBackendFile & "-" & WeekdayName(Weekday(DATE), True) & ".accdb"
Haciendo un debug print no me da esos .. que le arroja a usted.
Debug.Print strSourceFile
Debug.Print strDestinationFile

MS Access;PWD=1234;DATABASE=C:\Apps\My_db\Datos\MART_BackEnd.accdb
MS Access;PWD=1234;DATABASE=C:\Apps\My_db\Datos\backup\MART_BackEnd-Wed.accdb

Me convencen sus comentarios para tener la fecha, hora minutos en segundos en que se creo al copia de seguridad y la simplicacion del codigo. Los aplicare una vez solucionado el problema con la copia de seguridad. 

Un saludo

Erick Gamer

Aprendiz de todos, maestro de nadie.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 31/Mayo/2023 a las 23:30
Yo comentaba que si imprimía esto (que es parte de la cadena que haces servir para formar el strDestinationFile)

?WeekdayName(Weekday(DATE), True)

me imprimía esto

ju.

(supongo que a tí te aparece Wed porque tienes configurado Windows con idioma inglés) pero fíjate que acaba con un punto. Si luego le añades & ".accdb", la cadena terminará con algo como ju..accdb o Wed..accdb

En todo caso, si lo que dices en tu última respuesta de que strDestinationFile contiene la cadena "MS Access;PWD=1234;DATABASE=C:\Apps\My_db\Datos\backup\MART_BackEnd-Wed.accdb", si das la instrucción de guardar un fichero en esa ruta, windows devolverá el error de que no puede, ya que esa cadena no está apuntando a ninguna ruta válida. Debes asegurarte de que la strDestinationFile contiene únicamente la ruta y el nombre de la copia de seguridad. Por ejemplo: C:\Apps\My_db\Datos\backup\MART_BackEnd-Wed.accdb

Entonces, si la ruta de la carpeta es válida supongo que ya podrás guardar el archivo sin más problemas
Saludos,

Juan M. Afan de Ribera
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 31/Mayo/2023 a las 23:38
Disculpa, ya entiendo, me he equivocado antes cuando te aconsejaba simplificar la obtención de las cadenas. Quedaría así:

strFullPath = Mid(DBEngine.Workspaces(0).Databases(0).TableDefs("Actual_Volume").Connect, 1)

' extraemos nombre del back end
    strBackEndFile = Mid(strFullPath, InStr(strFullPath, "DATABASE=") + 9)
    strBackEndFile = Dir(strBackEndFile)
    
    ' extraemos ruta del back end
    strPath = Replace(strFullPath, strBackEndFile, "")
    
    ' quitamos la extensión al nombre del back end
    strBackEndFile = Replace(strBackEndFile, ".accdb", "")

' resto del código
Saludos,

Juan M. Afan de Ribera
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 01/Junio/2023 a las 00:49
Hola Happy,

Le he pasado una ruta valida manualmente y el error persiste:

strDestinationFile = "C:\Apps\My_db\Datos\backup\" & strBackendFile & "-" & Format(DATE, "ddmmyyyy_hhnnss") & ".accdb"
Debug.Print strDestinationFile
Resultado:
C:\Apps\My_db\Datos\backup\MART_BackEnd-31052023.accdb

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 01/Junio/2023 a las 09:14
Por lo que he comprobado el error 52 dice "Nombre o número de archivo incorrecto" y en un mensaje anterior dices que ese error salta en la línea

strDestinationFile = strPath & "backup\" & strBackendFile & "-" & WeekdayName(Weekday(DATE), True) & ".accdb"

esto me tiene algo confundido. ¿Estás seguro? Porque el error según lo entiendo yo, no tiene lógica que salte en esa línea, sino en la siguiente, la línea

FileCopy strSourceFile, strDestinationFile

Por favor, comprueba si strSourceFile es un fichero válido y si strDestinationFile está formado adecuadamente. Tú me dices por ejemplo que haces esto:

strDestinationFile = "C:\Apps\My_db\Datos\backup\" & strBackendFile & "-" & Format(DATE, "ddmmyyyy_hhnnss") & ".accdb"
Debug.Print strDestinationFile

Resultado:
C:\Apps\My_db\Datos\backup\MART_BackEnd-31052023.accdb

y esto tampoco lo entiendo, pues la parte de la cadena que dice "Format(DATE,"ddmmyyyy_hhnnss") tendría que provocar que el resultado fuera algo diferente del que pones ahí, ya que esa instrucción le está pidiendo que ponga las horas minutos y segundos y no lo veo en ese resultado. Debería salir algo como

C:\Apps\My_db\Datos\backup\MART_BackEnd-31052023_235903.accdb (o algo así, dependiendo de cuándo hayas ejecutado esa instrucción)

En todo caso, en este enlace dan una explicación del error 52 y las causas que pueden provocar el error: https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/bad-file-name-or-number-error-52 

Repasa bien los nombres de los archivo, tanto el archivo origen, como el archivo destino y comprueba manualmente si el de origen realmente existe (haz la prueba copiando esa ruta en el navegador de archivos) y si el de destino realmente apunta a una carpeta que ya haya sido creada y que la cadena no tenga caracteres prohibidos o cosas por el estilo, de manera que el sistema rechace la creación del fichero



Editado por happy - 01/Junio/2023 a las 09:15
Saludos,

Juan M. Afan de Ribera
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 02/Junio/2023 a las 22:33
Hice estos pequeños cambios en estas líneas y ahora funciona.

  strSourceFile = CurrentProject.path & "\Datos\" & strBackendFile & ".accdb"
    strDestinationFile = CurrentProject.path & "\Datos\backup\" & strBackendFile & "-" & Format(DATE, "ddmmyyyy_hhnnss") & " .accdb"


Solo un detalle, las hrs, minutos y segundos no me los da, lo que me da un en su lugar es esto:
NombreDb-02062023_000000 

El OS lo tengo en ingles.

Erick Gamer.


Editado por Erick Gamer - 02/Junio/2023 a las 22:35
Aprendiz de todos, maestro de nadie.
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 02/Junio/2023 a las 22:44
Happy, cambie el formato de Data a Now() y ahora funciona no se si este descontinudao ese tipo de formato pero no me daba la hora, minutos y segundos.

Quedo así:
strDestinationFile = CurrentProject.path & "\Datos\backup\" & strBackendFile & "-" & Format(Now(), "ddmmyyyy_hhmmss") & " .accdb"

Erick Gamer

Aprendiz de todos, maestro de nadie.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 03/Junio/2023 a las 08:07
Sí, sí, tienes razón. Al darle como dato la fecha actual no le estamos dando posibilidad de imprimir la hora minutos y segundos. Fallo mío, fallo mío Ouch
Saludos,

Juan M. Afan de Ribera
Arriba
Erick Gamer Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 08/Mayo/2016
Localización: Mexico
Estado: Sin conexión
Puntos: 387
Enlace directo a este mensaje Enviado: 05/Junio/2023 a las 16:13
Se puede cerrar este hilo.

Muchas Gracias Thumbs Up

Erick Gamer
Aprendiz de todos, maestro de nadie.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable