Crear Copia de seguridad (tablas libres)

298 views
Skip to first unread message

Enrique

unread,
May 30, 2017, 11:44:32 PM5/30/17
to Comunidad de Visual Foxpro en Español

Hola a todos; Estoy tratando de hacer en un botón de comandos, en el evento clic, respaldos del sistema. La idea es que cuando quieran puedan hacer respaldos. Buscando en la Internet encontré el siguiente código dado por Gabriel que deseo implementar. El problema que tengo y que no doy con la solución es que siempre manda el mensaje de MESSAGEBOX("Nada para copiar en &ruta"). Que puede estar fallando, si los archivos que necesito respaldar están en la ruta "\\quique\C:\TIQUET" , Alguna sugerencia de como poder implementar. 

 

rutaback="C:\BACKUP"

ruta="\\quique\C:\TIQUET"                  && ruta="\\Equipo\Carpeta\SubCarpeta"  

nFiles=ADIR(gafiles,"&ruta\*.dbf")

IF nFiles=0

MESSAGEBOX("Nada para copiar en &ruta")

return 0

ENDIF

FOR i=1 TO ALEN(gafiles,1)

cFile=JUSTSTEM(GETFILE[i,1])

ldoit=.t.

lClose=.f.

IF !USED(cfile)

gFile=ADDBS(ruta)+cFile

WAIT WINDOW "abriendo &gfile como &cfile" AT 12,15 nowait

 

USE (gfile) IN 0 SHARED

ldoit=USED(cfile)

lClose=lDoit

ENDIF

IF ldoit 

 

cbackFile="b_"+cfile

cFilegen=ADDBS(rutaback)+cBackFile

WAIT WINDOW "Copiando &cfile a &cBackFile en &rutaback" AT 12,15 nowait

 

SELECT (cfile)

AFIELDS(gaStruct)

lMemo=.f.

FOR xi=1 TO ALEN(gaStruct,1)

IF gasTruct[xi,2]="M"

lMemo=.t.

EXIT

ENDIF

NEXT

CREATE TABLE &cFilegen FREE FROM ARRAY gaStruct

SELECT (CFILE)

IF !lMemo

SCAN

SCATTER MEMVAR

INSERT INTO (cBackFile) FROM MEMVAR

ENDSCAN

 

else

SCAN

SCATTER MEMO MEMVAR

INSERT INTO (cBackFile) FROM MEMVAR

ENDSCAN

endif

SELECT (cBackFile)

USE

IF lClose

SELECT (CFILE)

USE

ENDIF

ENDIF

NEXT

 

WAIT WINDOW "terminado " AT 12,15


Muchas gracias.


Qsoft

unread,
May 31, 2017, 3:49:29 AM5/31/17
to publice...@googlegroups.com
asi?

ruta="\\quique\C:\TIQUET\*.dbf"                  && ruta="\\Equipo\Carpeta\SubCarpeta"  

nFiles=ADIR(gafiles,ruta)


te sucede el mismo error?



Enrique Vasquez B.

Qsoft

unread,
May 31, 2017, 3:55:44 AM5/31/17
to publice...@googlegroups.com
puede ser che non tengas derecho a accedere a ese recurso compartido...controla que la fuente de datos sea accessible en la red. He hecho una prueba en la red donde trabajo y funziona sin problemas.

puedes copiar y pegar la ruta \\quique\C:\TIQUET\ en el explorer de windows a ver si te lo muestra o te da algun mensaje de error. si el resultado de la funcion ADIR es 0 o inferior es porque non ha podido crea la matriz....

Enrique Vasquez B.

Jorge L. Florez C.

unread,
May 31, 2017, 11:10:40 AM5/31/17
to publice...@googlegroups.com
Hola

Creo que seria algo asi

x=adir( gafiles, ruta + "*.dbf" )

Saludos
Jorge Florez

Roberto Tello & Asoc. - Estudio Informatico

unread,
May 31, 2017, 12:12:06 PM5/31/17
to publice...@googlegroups.com

Adjunto un formulario que uso para hacer backup cada vez que salen de sistema... en sistemas chicos con pocas tablas, y funciona muy bien. 

No es diseño mio. No recuerdo quien me lo facilitó. Le hice algunas mejoras y funciona muy bien.

Crea los dias de la semana, y hace copia solo de las tablas que han tenido cambios, en el dia de la semana correspondiente.-

Espero te sirva.-

Renombrar la extension del adjunto a .rar

Saludos.-

Roberto

SAN JUAN - ARGENTINA

--
Roberto H. Tello & Asoc.
Estudio Informático
Msn: robertote...@hotmail.com
Skype: robertotellomoreno
BACKUPTABLAS._rar

Elides Paredes

unread,
May 31, 2017, 1:51:00 PM5/31/17
to Comunidad de Visual Foxpro en Español, rl...@uolsinectis.com.ar
Amigo Roberto.

Muchas gracias por compartir tu formulario.
Le hice unos pequeños cambios y hace todo exactamente como quería que funcionara hace años. Sin embargo, no había podido hacerlo  y ahora veo porque. La lógica es un poco complicada aunque después de verla la puedo entender.

De verdad estoy muy agradecido.

Saludos 
Elides Paredes
Barquisimeto Venezuela

Enrique

unread,
May 31, 2017, 4:54:43 PM5/31/17
to Comunidad de Visual Foxpro en Español, rl...@uolsinectis.com.ar
Hola Roberto. Muchas gracias por compartir el código. Al implementarlo manda el siguiente error:

"Invalid patch or file name",  mostrando la linea del error en; CD &ruta 

Este es el código que puse ;

SET SAFE OFF
SET TALK OFF
SET ESCAPE OFF
SET CURSOR OFF
SET DELETE ON
CLOSE DATA ALL
CLOSE TABLES ALL

ruta = 'W:'+SYS(2003)

directorio = .T.
on error  directorio = .F.
cd c:\backup\datos\lun
on error

if not directorio
MKDIR c:\backup\datos\lun
MKDIR c:\backup\datos\mar
MKDIR c:\backup\datos\mie
MKDIR c:\backup\datos\jue
MKDIR c:\backup\datos\vie
MKDIR c:\backup\datos\sab
MKDIR c:\backup\datos\dom
endif

CD &ruta      && Error que manda vfp

DO CASE
  CASE DOW(DATE())=1
    _DIA='DOM'
  CASE DOW(DATE())=2
    _DIA='LUN'
  CASE DOW(DATE())=3
    _DIA='MAR'
  CASE DOW(DATE())=4
    _DIA='MIE'
  CASE DOW(DATE())=5
    _DIA='JUE'
  CASE DOW(DATE())=6
    _DIA='VIE'
  CASE DOW(DATE())=7
    _DIA='SAB'
ENDCASE
CREA CURSOR CURARCH(DIRECTORIO C(100), ARCHIVO C(80), BYTES N(10), FECHA D, HORA C(8), FECHA2 D, HORA2 C(8))
SELECT CURARCH
*********************************************************************
ADIR(VECAUX,'&ruta\*.DBF')
I=1
DO WHILE I<=ALEN(VECAUX))
  APPE BLANK
  REPLACE DIRECTORIO WITH '&ruta\'
  REPLACE ARCHIVO    WITH VECAUX(I)
  REPLACE BYTES      WITH VECAUX(I+1)
  REPLACE FECHA      WITH VECAUX(I+2)
  REPLACE HORA       WITH VECAUX(I+3)
  I=I+5
ENDDO
*********************************************************************
ADIR(VECAUX,'&ruta\*.CDX')
I=1
DO WHILE I<=ALEN(VECAUX))
  APPE BLANK
  REPLACE DIRECTORIO WITH '&ruta\'
  REPLACE ARCHIVO    WITH VECAUX(I)
  REPLACE BYTES      WITH VECAUX(I+1)
  REPLACE FECHA      WITH VECAUX(I+2)
  REPLACE HORA       WITH VECAUX(I+3)
  I=I+5
ENDDO
*********************************************************************
ADIR(VECAUX,'&ruta\*.FPT')
I=1
DO WHILE I<=ALEN(VECAUX))
  APPE BLANK
  REPLACE DIRECTORIO WITH '&ruta\'
  REPLACE ARCHIVO    WITH VECAUX(I)
  REPLACE BYTES      WITH VECAUX(I+1)
  REPLACE FECHA      WITH VECAUX(I+2)
  REPLACE HORA       WITH VECAUX(I+3)
  I=I+5
ENDDO
*********************************************************************
ADIR(VECAUX,'&ruta\*.TBK')
I=1
DO WHILE I<=ALEN(VECAUX))
  APPE BLANK
  REPLACE DIRECTORIO WITH '&ruta\'
  REPLACE ARCHIVO    WITH VECAUX(I)
  REPLACE BYTES      WITH VECAUX(I+1)
  REPLACE FECHA      WITH VECAUX(I+2)
  REPLACE HORA       WITH VECAUX(I+3)
  I=I+5
ENDDO
CREA CURSOR CURBACK(ARCHIVO C(80), FECHA D, HORA C(8))
DO CASE
  CASE DOW(DATE())=1
    ADIR(VECAUX,'C:\BACKUP\datos\DOM\*.*')
  CASE DOW(DATE())=2
    ADIR(VECAUX,'C:\BACKUP\datos\LUN\*.*')
  CASE DOW(DATE())=3
    ADIR(VECAUX,'C:\BACKUP\datos\MAR\*.*')
  CASE DOW(DATE())=4
    ADIR(VECAUX,'C:\BACKUP\datos\MIE\*.*')
  CASE DOW(DATE())=5
    ADIR(VECAUX,'C:\BACKUP\datos\JUE\*.*')
  CASE DOW(DATE())=6
    ADIR(VECAUX,'C:\BACKUP\datos\VIE\*.*')
  CASE DOW(DATE())=7
    ADIR(VECAUX,'C:\BACKUP\datos\SAB\*.*')
ENDCASE
SELECT CURBACK
I=1
DO WHILE I<=ALEN(VECAUX))
  APPE BLANK
  REPLACE ARCHIVO    WITH VECAUX(I)
  REPLACE FECHA      WITH VECAUX(I+2)
  REPLACE HORA       WITH VECAUX(I+3)
  I=I+5
ENDDO
SELECT CURARCH
GO TOP
DO WHILE NOT EOF()
  _ARCHIVO=ARCHIVO
  SELECT CURBACK
  LOCATE FOR ARCHIVO=_ARCHIVO
  IF FOUND()
      _FE2=FECHA
      _HR2=HORA
      SELECT CURARCH
      REPLACE FECHA2 WITH _FE2
      REPLACE HORA2  WITH _HR2
    ELSE
      SELECT CURARCH
  ENDIF
  SKIP
ENDDO
DELE ALL FOR FECHA=FECHA2 AND HORA=HORA2    && BORRO LOS ARCHIVOS QUE NO HAN SUFRIDO MODIFICACIONES
DELE ALL FOR ALLT(ARCHIVO) = 'FOXUSER.FPT'  && BORRO LOS ARCHIVOS QUE NO HAN SUFRIDO MODIFICACIONES
DELE ALL FOR ALLT(ARCHIVO) = 'FOXUSER.DBF'  && BORRO LOS ARCHIVOS QUE NO HAN SUFRIDO MODIFICACIONES
****************************************************************************************
PUBLIC VEC(RECC(),3)
GO TOP
_CANT=0
_BYTES=0
DO WHILE NOT EOF()
  _CANT=_CANT+1
  VEC(_CANT,1)=ARCHIVO
  VEC(_CANT,2)=DIRECTORIO
  VEC(_CANT,3)=BYTES
  _BYTES=_BYTES+BYTES
  SKIP
ENDDO
RELEASE CURARCH
_alto=4.4
_ancho=48.2
_paso=333/_CANT
_tot=0
_bases=0
I=1
A=0
THISFORM.LABEL5.VISIBLE=.F.
THISFORM.LABEL1.VISIBLE=.T.
THISFORM.LABEL2.VISIBLE=.T.
THISFORM.LABEL3.VISIBLE=.T.
THISFORM.LABEL4.VISIBLE=.T.
THISFORM.TIEMPO_TOTAL.VISIBLE=.T.
THISFORM.TIEMPO_PARCIAL.VISIBLE=.T.
THISFORM.ESTIMADO.VISIBLE=.T.
THISFORM.TRANSCURRIDO.VISIBLE=.T.
THISFORM.ESTIMADO.VALUE=0
THISFORM.TRANSCURRIDO.VALUE=0
_TIEMPO_ACUMULADO=0
THISFORM.REFRESH
IF I<=_CANT
    THISFORM.CUADRO.VISIBLE=.T.
    THISFORM.PORCENTAJE.VISIBLE=.T.
    DO WHILE I<=_CANT AND A#27
      A=INKEY()
      BASE=VEC(I,1)
      THISFORM.BASE.CAPTION=BASE
      THISFORM.REFRESH
      _DES='C:\BACKUP\datos\'+_DIA+'\'+ALLT(BASE)
      _ORI=ALLT(VEC(I,2))+ALLT(BASE)
      _TIME1=SECONDS()
      COPY FILE &_ORI TO &_DES
      _TIME2=SECONDS()
      _TIEMPO_ACUMULADO=_TIEMPO_ACUMULADO+_TIME2-_TIME1
      _TOTAL=_BYTES*_TIEMPO_ACUMULADO/(THISFORM.TRANSCURRIDO.VALUE+VEC(I,3))
      _MIN=INT(_TOTAL/60)
      _SEG=_TOTAL-(60*_MIN)
      THISFORM.TIEMPO_TOTAL.VALUE=ALLT(STR(_MIN))+"' "+ALLT(STR(_SEG))+'"'
      _MIN=INT(_TIEMPO_ACUMULADO/60)
      _SEG=_TIEMPO_ACUMULADO-(60*_MIN)
      THISFORM.TIEMPO_PARCIAL.VALUE=ALLT(STR(_MIN))+"' "+ALLT(STR(_SEG))+'"'
      THISFORM.ESTIMADO.VALUE=_BYTES
      THISFORM.TRANSCURRIDO.VALUE=THISFORM.TRANSCURRIDO.VALUE+VEC(I,3)
      _TOT=_TOT+VEC(I,3)*333/_BYTES
      THISFORM.CUADRO.WIDTH=INT(_TOT)
      THISFORM.PORCENTAJE.CAPTION=STR(INT(_TOT*100/333),3)+'%'
      THISFORM.REFRESH
      I=I+1
      IF I>_CANT
        EXIT
      ENDIF
    ENDDO
=messagebox('PROCESO TERMINADO',64,'BACKUP')
  ELSE
    =MESSAGEBOX('No Existen Diferencias Entre los Archivos a Copiar y los Copiados...',0+16+0,'MENSAJE!!!')
ENDIF
SET ESCAPE ON
SET CURSOR ON

*ENDIF

THISFORM.RELEASE

Enrique

unread,
May 31, 2017, 4:56:53 PM5/31/17
to Comunidad de Visual Foxpro en Español


Gracias Enrique: Estoy tratando de ver esa posibilidad.

muchas gracias. 

Enrique

unread,
May 31, 2017, 5:03:23 PM5/31/17
to Comunidad de Visual Foxpro en Español
Hola Elides: Puedes compartir el código que mando Roberto Tello, A mi no me funciono. El directorio donde tengo mis tablas es en C:\tiquet

muchas gracias.

enrique

Roberto Tello & Asoc. - Estudio Informatico

unread,
May 31, 2017, 5:04:12 PM5/31/17
to publice...@googlegroups.com

Fijate te paso el de otro proyecto... el anterior lo tengo andando... fijate que debe tener creada la carpeta o unidad W, a lo mejor es eso.-

Igual te paso otro

Saludos.-

Roberto

--
BACKUP_TABLAS._rar

Elides Paredes

unread,
May 31, 2017, 5:07:16 PM5/31/17
to Comunidad de Visual Foxpro en Español
ruta = 'W:'+SYS(2003)
fíjate en la linea busca W, en tu caso como el mio es C;+ sys(2003) directorio predeterminado. en mi caso C:\proyecto, si dejo W sería W:\proyecto eso da error.

Saludos

oa 

Enrique

unread,
May 31, 2017, 5:30:32 PM5/31/17
to Comunidad de Visual Foxpro en Español, rl...@uolsinectis.com.ar
Hola Roberto. Muchas gracias ahora funciono muy bien. 

El código en la carpeta BACKUP,  agrego subcarpetas de la semana, en la del día miércoles (hoy), respaldo los archivos (tablas).
Muy buena rutina, te felicito y ¿te pido autorización para ocuparla ?.

Saludos Cordiales

Enrique Ruiz Araneda
Santiago de Chile

Roberto Tello & Asoc. - Estudio Informatico

unread,
May 31, 2017, 7:00:15 PM5/31/17
to publice...@googlegroups.com

De la misma manera que me llegó a mi, esta disponible para quien le sirva.-

Saludos.-

Roberto

San Juan-Argentina

--

Marcelo Barberis

unread,
Jun 1, 2017, 7:18:42 AM6/1/17
to publicesvfoxpro
Hola amigo te paso algo que tengo sobre respaldos, son tres proyectos, se usa winrar para hacer los respaldos, tambien puedes restaurar lo mismo, y hay para mysql, espero te sirva

--
Marcelo Barberis Gutierrez
Sistemas Informaticos
Villa Montes - Bolivia
Telef.: +591-76830544

Elides Paredes

unread,
Jun 1, 2017, 8:11:06 AM6/1/17
to Comunidad de Visual Foxpro en Español
Estimados amigos.

Mis saludos
al código aportado por el amigo  le agregué algo muy sencillo pero creo que puede ayudar mucho:la idea es crear un txt donde se indique cuando fue la última vez que ingresó al sistema
para buscar el último respaldo. .



SET DATE FRENCH 
cCadena = "Fecha del ültimo Respaldo: "+CDOW(DATE())+ ', ' + DTOC(DATE())+  ', Hora ' + TIME()
SET SAFETY OFF 
SET SECONDS OFF 
= STRTOFILE(ccadena,"C:\BACKUP\leer.txt",0)
THISFORM.RELEASE
sar el código aquí...


Luego en el prg salir incluí también ésto.

*SALIR
* Antes de salir crea un respaldo de las tablas
* modificadas en el día.
*------------------------
* MESSAGEBOX("haré respaldo",0+64,"Respaldo")
DO FORM c:\hielo\formularios\respaldo_de_seguridad_tablas.scx

CLEAR EVENTS
SET SYSMENU TO DEFAULT
CLEAR WINDOW
CLOSE DATABASES
CLOSE ALL


 La idea es que al salir automáticamente haga el respaldo y cree un archivo TXT  con una descripción que indique cuando fue la última.

Saludos
Elides Paredes
Barquisimeto Venezuela

Pd. Se que es sencillo pero estoy muy contento de haber visto éste hilo y solo quise aportar un granito de arena.

Enrique Ruiz Araneda

unread,
Jun 1, 2017, 9:13:40 AM6/1/17
to publice...@googlegroups.com
Muchas Gracias Elides por tu aporte. Me servirá mucho.

saludos cordiales.

Enrique Ruiz Araneda
--
          Enrique Ruiz Araneda
Reply all
Reply to author
Forward
0 new messages