FoxPro/Visual FoxPro - Eliminar del todo datos en tablas en un Ejecutable

   
Vista:
Imágen de perfil de Jorge

Eliminar del todo datos en tablas en un Ejecutable

Publicado por Jorge (3 intervenciones) el 12/10/2015 02:42:03
Hola a todos, espero se encuentren bien. La inquietud que tengo en estos momentos es que no se como hacer para que en mi ejecutable, yo pueda borrar del todo los datos que no necesito en mi base de datos, normalmente quedan marcados y no son tomados en cuenta en mi información, pero me ocupan espacio en la memoria. Alguno tiene presente algún codigo que pueda hacer que funcione cuando quiera hacer mantenimiento a mi base de datos en mi ejecutable, tengo el siguiente código pero no me funciona:



El caso 1 supuestamente es para regenerar los índices, y el 2 es para eliminar los registros marcados con DELETE.

Si alguien me puede ayudar, se lo agradecería.

Saludos.

Imagen1
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

Eliminar del todo datos en tablas en un Ejecutable

Publicado por Fidel José (319 intervenciones) el 12/10/2015 16:55:26
Más allá de algún error de ortografía, tu código tiene algunos problemas:
1) No tiene ningún análisis de estado de error. Con lo cual no sabes si se compactó o no lo que tenía que compactarse
2) AdbObject() es una función tuya? No hay idea de que devuelva algo o gener un Array tablas.
3) Debes separar el procedimiento en dos partes: 1) con la lista, array, cursor, etc de las tablas a compactar, 2) con el procedimiento de compactado (para cada tabla).
4) Apelar a REINDEX es una practica deficiente. Debes tener escrita en alguna parte las instrucciones de reindexación por cada tabla. Si tus CDX SE PONEN EN CERO, no te servirá de nada el REINDEX.

Te tiro un ejemplo básico (donde la parte 1) la tendrás que armar como la necesites).
El procedimiento de compactado (try_to_pack) crea un objeto "empty" que es lo que devuelve, con tres propiedades: DoPack (boolean) que nos dice si se compactó o no la tabla, Warning (boolean) que testea que se haya podido reabrir una tabla que estaba abierta y Message (character) que muestra algunas ocurrencias posibles (estado de error o Alerta).

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
PROCEDURE compactar()
**********************
TRY
	LOCAL lcFolder,lcListTables,i,;
		lcMessage,;
		lcTable,;
		loObj as Object,;
		loEx as Exception
 
	lcMessage = ""
	lcfolder = "\\server\myApp\Folder_data"
	lcListTables = "Clientes,Proveedores,Productos,"
 
	FOR i = 1 TO GETWORDCOUNT(m.lcListTables,",")
		lcTable = GETWORDNUM(m.lclistTables,m.i,",")
		loObj = Try_to_pack(ADDBS(m.lcFolder) + m.lcTable
		IF VARTYPE(loObj) = "O"
			* Reporte
			lcMessage = m.lcMessage ;
				+"Tabla = "+m.lcTable ;
				+"Pack = "+TRANSFORM(loObj.DoPack) ;
				+IIF(loObj.Warning,"Warning","") ;
				+IIF(EMPTY(loObj.Message),"",loObj.Message) ;
				+CHR(13)+CHR(10)
 
		ENDIF
 
	NEXT
CATCH TO loex
	loex.UserValue=PROGRAM()
	* ShowError(loex)
FINALLY
	loObj = null
ENDTRY
ENDPROC
 
*******************************
PROCEDURE Try_To_Pack
*******************************
LPARAMETERS tc_path_table
 
TRY
	LOCAL lReopen,;
		lShared,;
		lcCursor,;
		lDoPack,;
		loResp as Object,;
		loPack as Exception,;
		loErrGen as Exception
 
	loResp = NEWOBJECT("Empty")
	ADDPROPERTY(loResp,"DoPack",.f.)
	ADDPROPERTY(loResp,"Message","")
	ADDPROPERTY(loREsp,"Warning",.F.)
 
	lcCursor = JUSTSTEM(m.tc_Path_table)
 
	* Si la tabla está abierta, se debe cerrar
	IF USED(m.lcCursor)
		lReOpen = .t.
		lShared = IIF(ISEXCLUSIVE(m.lcCursor),.F.,.T.)
		USE IN SELECT(m.lcCursor)
	ENDIF
 
	* Si la tabla está en uso por otro usuario
	* No se podrá abrir en Exclusive y dará un error
	* El error no se debe mostrar (o si)
	TRY
		IF !USED(lcCursor)
			USE (lcFullTabla) IN 0 EXCLUSIVE
			SELECT (lcCursor)
			PACK
			USE
			loResp.dopack = .t.
			loREsp.Message = m.lcCursor + " » Tabla Compactada." + CHR(13)
		ENDIF
 
	CATCH TO loPack
		loResp.Message=m.lcCursor + " » Tabla en Uso por otro Usuario" + CHR(13)
	ENDTRY
 
	IF m.lReopen
		IF m.lShared
			USE (m.tc_path_table) IN 0 SHARED
 
		ELSE
			USE (m.tc_path_table) IN 0 EXCLUSIVE
		ENDIF
	ENDIF
 
 
CATCH TO loErrGen
	loErrgen.UserValue=PROGRAM()
	loResp.Message = loResp.Message ;
		+"Error en "+PROGRAM()+CHR(13)
 
	* ShowError(loErrGen)
FINALLY
	IF m.lReopen AND !USED(m.lcCursor)
		loResp.Warning = .t.
		loResp.Message = loREsp.Message ;
			+ m.lcCursor ;
			+ " no puedo abrirse en modo "+IIF(m.lShared,"compartido","exclusivo")
	ENDIF
ENDTRY
 
RETURN loResp
ENDPROC
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

Eliminar del todo datos en tablas en un Ejecutable

Publicado por Saul (676 intervenciones) el 12/10/2015 19:22:23
Hola te mando como lo hago yo, tienes que hacer un form donde pones los siguientes metodos

Metodo ObtieneTablas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lretorno = .F.
IF MESSAGEBOX("Antes de ejecutar este proceso debe sacar a todos" + CHR(13) + "los usuarios de esta empresa.", 321, "Advertencia:") = 1
     CLOSE DATABASES ALL
     USE gcBase.dbc ALIAS base
 
     SELECT ALLTRIM(objectname) AS nombre FROM Base WHERE ATC("table", objecttype) > 0 ORDER BY 1 INTO ARRAY vtablas
     IF _TALLY > 0
          lretorno = .T.
     ELSE
          DIMENSION vtablas(1)
          vtablas[1] = ""
     ENDIF
     CLOSE DATABASES ALL
     DIMENSION vtablas1(1)
     vtablas1[1] = ""
ENDIF
RETURN lretorno


Metodo ProcesarPack
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
SET EXCLUSIVE ON
DIMENSION vtablas(1)
DIMENSION vtablas1(1)
IF thisform.obtienetablas()
     j = ALEN(vtablas)
     thisform.barra.initbar(j)
     WAIT WINDOW NOCLEAR NOWAIT "Comprimiendo los datos, un momento por favor."
     CLOSE DATABASES ALL
	 OPEN DATABASE gcBase
     FOR i = 1 TO j
          IF EMPTY(vtablas(i))
               LOOP
          ENDIF
          thisform.barra.actualizabarra(i)
          USE EXCLUSIVE (ALLTRIM(vtablas(i)))
          PACK
          REINDEX
     ENDFOR
     RELEASE vtablas
     CLOSE DATABASES ALL
     OPEN DATABASE bGeneral
     j = ALEN(vtablas1)
     thisform.barra.initbar(j)
     FOR i = 1 TO j
          IF EMPTY(vtablas1(i))
               LOOP
          ENDIF
          thisform.barra.actualizabarra(i)
          USE EXCLUSIVE (ALLTRIM(vtablas1(i)))
          PACK
          REINDEX
     ENDFOR
ELSE
     WAIT WINDOW TIMEOUT 15 "Proceso cancelado, cualquier tecla para continuar."
ENDIF
SET EXCLUSIVE OFF

Suerte..
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