As vezes necessitamos saber se uma rotina esta sendo executada ou se a maquina simplesmente travou, principalmente em indexações, portanto saco desta função simples para tal:
FUNCTION dbProgress( cIndice, cMensagem )
LOCAL cComplete := LTRIM(STR(INT((RECNO()/LASTREC()) * 100)))
cMensagem := iif(cMensagem=nil,"Indexacao de ",cMensagem)
MENSAGEM(cMensagem + cIndice + " " + cComplete + "% Completada.")
RETURN(.T.)
FUNCTION MENSAGEM( TEXTO, PAUSA )
//
// -> Funcao que imprime mensagens na tela
//
// TEXTO => Recebe o texto a ser impresso na linha de mensagem.
// TEMPO => Recebe o tempo de espera para a mensagem.
//
STATIC ULT_MENSAGEM := ""
LOCAL ULT_CURSOR := SETCURSOR(), DE_VI_CE
IF TEXTO = NIL; TEXTO := ""; ENDIF
CURSOR( DESLIGA )
IF SET( 20 ) = "PRINTER"
DE_VI_CE = "PRINTER"
SET( 20 , "SCREEN" )
ENDIF
@ 0, 75 SAY STR(MEMORY(0),5) COLOR CONTECOR[ 13 ]
IF m->defPDV = 'X'
IF m->defTEFON = .T.
@ MAXROW()-1, 00 SAY 'TEF-ON ' COLOR CONTECOR[ 2 ]
ELSE
@ MAXROW()-1, 00 SAY 'TEF-OFF' COLOR CONTECOR[ 2 ]
ENDIF
ENDIF
IF m->defCUPOM = 'X'
@ MAXROW(), 11 SAY STR(M->NO_CUPOM+1,1)+'³'+PADC( TEXTO, 56 ) COLOR CONTECOR[ 2 ]
ELSE
@ MAXROW(), 11 SAY PADC( TEXTO, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
IF PAUSA = NIL
ULT_MENSAGEM := TEXTO
ELSE
TEC_MOU( PAUSA )
@ MAXROW(), 11 SAY PADC( ULT_MENSAGEM, 58 ) COLOR CONTECOR[ 2 ]
ENDIF
IF DE_VI_CE = "PRINTER"
Set( 20, "PRINTER" )
ENDIF
SETCURSOR( ULT_CURSOR )
RETURN NIL
Esta função poderá ser colocada em qualquer lugar, até em uma rotina de impressão já que sabemos que quando mandamos imprimir, não é possivel apresentar nada na tela sem o devido direcionamento.
Para usa-la nas nossas indexações basta fazer assim:
INDEX ON ... EVAL dbProgress( "NomeDoIndice" )
@braços :?)