FoxPro/Visual FoxPro - Mostrar al usuario que se corre un proceso

 
Vista:
sin imagen de perfil

Mostrar al usuario que se corre un proceso

Publicado por miguel (3 intervenciones) el 30/03/2014 05:37:16
Preparo una aplicación en Visual Foxpro 6.0 y en una de las opciones del menu tengo un boton para indexar archivos,
pero cuando lo pulso, el programa dá la impresion de que está congelado, pero en realidad está reconstruyendo los indices de los archivos.
¿Como puedo hacer para que al pulsar el boton referido salga una barra que indique el avance del proceso de indexación, algo parecido a: ##################
10% 20% .....
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Mostrar al usuario que se corre un proceso

Publicado por Fidel José (558 intervenciones) el 30/03/2014 15:38:23
En VFP 6.0 no te recomiendo utilizar una clase de barra de progreso o similares mientras generas índices. Tampoco puedes implementar en código nativo gif animadas o cosas por el estilo.
Yo utilizo un código como el siguiente para lograr:
1) No omitir el comando DELETE TAG ALL, antes de regenerar las etiquetas de índices, porque de lo contrario, la tabla de indexado (CDX) tendrá los nodos duplicados inútilmente.
2) Mostrar que algo está haciendo el equipo, sobre todo, si se detiene.
3) Interferir lo menos posible con el proceso de indexado (que puede ser muy lento, dependiendo de la estructura de las tablas, de la complejidad de las etiquetas y de la cantidad de registros).

En este caso, supongo que no se cierran todas las tablas. En general, para un entorno multiusuario, es necesario saber primero si hay usuarios que tienen el sistema abierto. También se puede comprobar por bajo nivel si una tabla está abierta en otro equipo, pero es un tanto lento. La comprobación se hace normalmente a través de una tabla en la que se registran los usuarios al inicio.

Pasos de reindexado
1) Comprobar si hay usuarios activos
2) Bloqueo de uso del sistema
3) Cerrar todas las tablas en el equipo que reindexa (CLOSE DATABASES ALL)
4) Rutina de reindexado
5) Liberación del bloqueo de uso del sistema
6) Apertura de tablas (si es que es necesario).

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
PROCEDURE GetIndex()
local lcRoot,lcTabla,lcUse,lnFall,lnReind
Store 0 to lnFall,lnReind
 
LcRoot="RutadeTablas"       && por ejemplo lcRoot="c:\MyApp\Datos" * Generalmente una propiedad de _screen.
 
* 1
LcTabla="COMPROD"          && tabla de la que se generan las etiquetas de índice
lcUse=ADDBS(lcRoot)+"COMPROD"
&& si la tabla está abierta, la cerramos. Esto es muy bueno porque baja cualquier caché.
IF USED(lcTabla)
	SELECT (lcTabla)
	USE
ENDIF
USE (lcUse) IN 0 EXCLUSIVE
* Si la apertura en exclusive falla, se debe saltar el reindexado. En VP6 no existe TRY CATCH ENTRY, solamente tienes ON ERROR, pero lo puedes utilizar.
IF USED(lcTabla)
	SELECT (lcTabla)                 && debes seleccionar la tabla siempre
	WaitIndex(.T.)                         && llamado a la rutina WaitIndex()
	INDEX ON NUMERO TAG CMPPNUM
	INDEX ON IDCLIEN TAG CMPPID
	INDEX ON DTOS(FECHA) TAG CMPPFE
	INDEX ON ENTREGA TAG CMPTREG
	USE                                        && siempre debes cerrar la tabla después de crear las etiquetas.
	lnReind = lnReind + 1
ELSE
	lnFall=lnFall + 1
ENDIF
 
* 2
LcTabla="BUYMOV"
lcUse=ADDBS(lcRoot)+"COMPROD"
IF USED(lcTabla)
	SELECT (lcTabla)
	USE
ENDIF
USE (lcUse) IN 0 EXCLUSIVE
IF USED(lcTabla)
	SELECT BUYTRAN
	WaitIndex(.t.)
	INDEX ON CODocumen+trim(ref) TAG BUYCOD
	INDEX ON IDPROV+DTOS(VENCERA) TAG BUYTRAN
	INDEX ON DTOS(VENCERA)+IDPROV TAG BUYVEN
	INDEX ON IMPORTE TAG BTRIMP
	USE
	lnReind = lnReind + 1
ELSE
	lnFall=lnFall + 1
ENDIF
 
* 3 Continúa con el resto de tablas a indexar
 
* Finaliza el proceso
WAIT CLEAR
Messagebox(ltrim(str(lnReind))+" Tablas reindexadas"+chr(13);
	+ltrim(str(lnFall))+" Tablas no pudieron reindexarse",0,"Reindexado")
ENDPROC
 
 
*****************************
PROCEDURE WaitIndex(lNotWait)
*****************************
DELETE TAG ALL
IF !lNotWait
	WAIT "Generando índices de "+Alias()+"  "+ltrim(str(Reccount()))+"regs..." WINDOW AT 25,50  NOWAIT
ENDIF
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
sin imagen de perfil

Mostrar al usuario que se corre un proceso

Publicado por miguel (3 intervenciones) el 31/03/2014 05:21:49
Muchas gracias Fidel (...) muy claro el ejemplo y sobre todo ya estoy claro de no poder mostrar la pretendida barra de avance; me limitaré a mostrar el mensaje por medio de "WAIT WINDOW", estoy muy agradecido
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
sin imagen de perfil

Mostrar al usuario que se corre un proceso

Publicado por miguel (3 intervenciones) el 31/03/2014 05:18:58
Muchas gracias Fidel (...) muy claro el ejemplo y sobre todo ya estoy claro de no poder mostrar la pretendida barra de avance; me limitaré a mostrar el mensaje por medio de "WAIT WINDOW", estoy muy agradecido
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