Respaldos en VFP9

Hola Amigo!
De antemano un coordial saludo por tu colaboración en esta gran red y por compartir tus conocimientos a los que necesitamos un poquito de orientación por parte de expertos como tu.
Bueno, mira tengo una duda:
Quisiera que me orientaras como puedo crear un respaldo de mi base de datos desde vfp. Eh echo respaldos lógicos con mysqldump desde mysql pero lo que no se es que si se puede implementar desde vfp. Estoy trabajando con VFP9.
Mi intención es acceder a un menu en vfp previamente diseñado y desde una opción generar mi respaldo en un archivo dentro de mi disco duro. Y otra para volver a cargar mi respaldo.
Te agradezco la atención, y espero tu respuesta que me seria de gran ayuda.

1 respuesta

Respuesta
1
Tengo un amigo que hizo un código que imita al mysqldump, pero te daré una opción más fácil aunque más larga, la idea es copiar los datos de una tabla en un archivo de texto, y luego volcarlo a una db nuevamente usando comandos de mysql
Y es asi,
Primero recorremos toda la BD y cada tabla copiamos a una archivo de texto.
if sqlexec(xControl,"show tables","tablas")>=0
 xCamino = "\elcamino\"
 sele tablas
 go top
 L=0
 do while !eof()
  L=L + 1
  xCampo  = field(1)
  xDato   = &xCampo
  xSql    = "select * from "+alltr(xDato)
  xDato   = alltr(xDato)
  xApunta = fcreate(xCamino+xDato+".txt")
  ?'Copiando '+xDato+" - "+str(l)+" de "+str(recco("tablas"))
  if sqlexec(xControl,xSql,xDato)>=0
   sele (xDato)
   go top
   do while !eof()
    for c=1 to fcount()
     xContenido = field(c)
     xContenido = &xContenido
     do case
      case type('xContenido')='C' or type('xContenido')='M'
       xContenido = '>'+xFormato(xContenido)+'>'
       if isnull(xContenido)
        xContenido = '>'+space(10)+'>'
       endif
      case type('xContenido')='N' or type('xContenido')='Y'
       xContenido = '>'+str(xContenido,14,4)+'>'
       if isnull(xContenido)
        xContenido = '>'+'0.0000'+'>'
       endif
      case type('xContenido')='D'
       xContenido = '>'+dtoc(xContenido)+'>'
       if isnull(xContenido)
        xContenido = '>'+'01/0/1900'+'>'
       endif
      case type('xContenido')='L'
       if xContenido
        xContenido = '>'+'.T.'+'>'
       else
        xContenido = '>'+'.F.'+'>'
       endif
      case type('xContenido')='T'
       xContenido = '>'+TTOC(xContenido)+'>'
       if isnull(xContenido)
        xContenido = '>'+space(10)+'>'
       endif
      case type('xContenido')='U'
       xContenido = '>'+'TIPO DE DATO INDEFINIDO'+'>'
     endcase
     =fwrite(xApunta,xContenido+'¦')
    endfor
    =fputs(xApunta," ")
    Se le (xDato)
    Skip
   Enddo
   =fclose(xApunta)
  Endif
  Se le tablas
  Skip
Enddo
Esta es la version que carga del txt a mysql
xAntes  = sys(5)+curdir()
xCamino = getdir()
set defa to (xCamino)
xCamino = strtran(xCamino,"\","/")
a=adir(matriz,"*.txt")             
for c=1 to a
 xTabla = substr(matriz(c,1),1,atc(".",matriz(c,1))-1)
 xSql = 'load data infile "'+xCamino+matriz(c,1)+'" into table '+xTabla+' FIELDS TERMINATED BY "¦" ENCLOSED BY ">" LINES TERMINATED BY "\r\n" '
 if sqlexec(xControl,xSql)>0
  ?xSql
 else
  &msgDb
Endif
Endfor
set defa to (xAntes)
Y eso es todo, podes modificar a tu medida
Gracias por tu ayuda Amigo, veras tengo unas dudas esper me orientes un poco más ya que algunas instrucciones y funciones no conozco, te lo agradezco.
Te pongo aquí el código que me pasaste y te comento mis dudas en negritas según mi análisis:
if sqlexec(xControl,"show tables","tablas")>=0
 xCamino = "\elcamino\"  A que te refieres (Es la ruta donde el respaldo se almacenara y que yo voy asignar dentro de mi dico duro).
 sele tablas
 go top
 L=0
 do while !eof()
  L=L + 1
  xCampo  = field(1)
  xDato   = &xCampo
  xSql    = "select * from "+alltr(xDato)
  xDato   = alltr(xDato)
  xApunta = fcreate(xCamino+xDato+".txt") A que te refieres (Es el archivo de texto que se va a crear con los nombres de las tablas que tengo en mi DB y se va almacenar en la ruta que yo asigne en mi disco duro para mi respaldo).
  ?'Copiando '+xDato+" - "+str(l)+" de "+str(recco("tablas"))
  if sqlexec(xControl,xSql,xDato)>=0
   sele (xDato)
   go top
   do while !eof()
    for c=1 to fcount()
     xContenido = field(c)
     xContenido = &xContenido
     do case
      case type('xContenido')='C' or type('xContenido')='M' A que te refieres con los parametros :::: C, M, Y, D, L, U estos aparecen en las lineas de abajo.
       xContenido = '>'+xFormato(xContenido)+'>' Que funcion realiza la intruccion xFormato.
       if isnull(xContenido)
        xContenido = '>'+space(10)+'>'
       endif
      case type('xContenido')='N' or type('xContenido')='Y'
       xContenido = '>'+str(xContenido,14,4)+'>'
       if isnull(xContenido)
        xContenido = '>'+'0.0000'+'>'
       endif
      case type('xContenido')='D'
       xContenido = '>'+dtoc(xContenido)+'>'
       if isnull(xContenido)
        xContenido = '>'+'01/0/1900'+'>' Cual es la funcion de la fecha que propones en esta linea.
       endif
      case type('xContenido')='L'
       if xContenido
        xContenido = '>'+'.T.'+'>'
       else
        xContenido = '>'+'.F.'+'>'
       endif
      case type('xContenido')='T'
       xContenido = '>'+TTOC(xContenido)+'>'
       if isnull(xContenido)
        xContenido = '>'+space(10)+'>'
       endif
      case type('xContenido')='U'
       xContenido = '>'+'TIPO DE DATO INDEFINIDO'+'>'
     endcase
     =fwrite(xApunta,xContenido+'¦')
    endfor
    =fputs(xApunta," ")
    sele (xDato)
    skip
   enddo
   =fclose(xApunta)
  Endif
  Se le tablas
  skip
enddo
Esta es la version que carga del txt a mysql
xAntes  = sys(5)+curdir()
xCamino = getdir()
set defa to (xCamino)
xCamino = strtran(xCamino,"\","/")
a=adir(matriz,"*.txt")             
for c=1 to a
 xTabla = substr(matriz(c,1),1,atc(".",matriz(c,1))-1)
 xSql = 'load data infile "'+xCamino+matriz(c,1)+'" into table '+xTabla+' FIELDS TERMINATED BY "¦" ENCLOSED BY ">" LINES TERMINATED BY "\r\n" '
 if sqlexec(xControl,xSql)>0
  ?xSql
 else
  &msgDb
Endif
Endfor
set defa to (xAntes)
Este método que me proporcionas se emplea para realizar todo el respaldo de mi base de dato sin importar el numero de tablas que tenga. ¿Y el respaldo queda en un solo archivo?
Aun no lo he probado pero hoy lo voy a checar... gracias nuevamente por tu grandiosa idea es genial. Espero tu respuesta.
Ok, xCamino se refiere a la ruta (el path) donde se crearan los archivos de copia, ejemplo c:\micopia\ pero podes para empezar usar uno fijo
xApunta = fcreate(xCamino+xDato+".txt") se refiere al archivo de texto a ser creado, ejemplo clientes.txt, productos.txt (con el mismo nombre de la tabla)
C, M, Y, D, L, U son resultados que devuelve la funcion type() de fox, si es numerico devuelve N si es logico L y asi sucesivamente, te recomiendo mirar en la ayuda la funcion TYPE()
XFormato, disculpame, lo olvide, es una funcion que cree para que converta un texto acorde para que sea grabado en mysql, ejemplo no puedes guardar el texto "mi casa queda cerca de o'higuins" sino "mi casa queda cerca de o\'higuins" asi la funcion reemplaza por el caracter correspondiente, la funcion es esta.
function xFormato
lparameter xDato
xDato=STRTRAN(xDato, chr(92), '\\') 
xDato=STRTRAN(xDato, chr(39), "\'") 
xDato=STRTRAN(xDato, chr(34), '\"') 
return(xDato)
Si quieres puedes omitirlo para empezar,
Con respecto a las fechas debes enviar como carácter, con la función DTOC(tuCampoDeFecha)
Si, efectivamente el crea la copia sin importar el numero de tablas, pero NO EN UN ÚNICO archivo, sino un archivo de texto por cada tabla, si quieres puedes juntarlo en uno solo, pero este es el comienzo
saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas