Página 1 de 1

Termômetro de Processamento

Enviado: 01 Set 2012 02:57
por Josmar dos Santos
Bom dia pessoal, estou tentando introduzir uma Função do Ramalho no meu sisteminha, mas estou tendo problemas. O que estou querendo na verdade é fazer o termômetro rodar em um processamento de relatório.
Essa é a função e a declaração do mesmo retirados do livro:

Código: Selecionar todos

FUNCTION TERMOH(VALOR)
IF VALOR <=1
   PUBLIC TELABOX
   SAVE SCREEN TO TELABOX
   SETCOLOR("W+/N")
   @ 15,09 SAY "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"
   @ 16,09 SAY "º        PORCENTUAL DA TAREFA EXECUTADA         º"
   @ 17,09 SAY "ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ º"
   @ 18,09 SAY "º   1   10  20  30  40  50  60  70  80  90  100 º"
   @ 19,09 say "º ÚÙ...|....|...|...|...|...|...|...|...|...À¿  º"
   @ 20,09 say "º ³                                          ³  º"
   @ 21,09 SAY "º ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  º"
   @ 22,09 SAY "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
ELSE
   @ 20,11 SAY REPLICATE(CHR(219),VALOR/2)
ENDIF
RETURN NIL

USE ORDEM
VALOR=0
ULTIMO=LASTREC()
TERMOH(VALOR)
T=0
C=0
DO WHILE .NOT. EOF()
T=T+ORDEM
SKIP
VALOR=(++C)*100/ULTIMO
TERMOH(VALOR)
ENDDO
REST SCREEN FROM TELABOX

Esse é do meu relatório:

Código: Selecionar todos

#include "OFIC.CH"
SET COLOR TO 21,79
SAVE SCREEN TO TELA1
SET COLOR TO G+/W
@ 04,07 CLEAR TO 11,51
@ 04,7 TO 11,51
SELECT 44
IF USEREDE("ORDEM",.F.,30,.F.) 
   IF(!FILE("ORDEMX.CDX"))
   _FECHA()
     INDEX ON COD TAG ORDEM_1 TO ORDEMX
     INDEX ON DTOS(DATA)+DTOS(DATA)+NOME_FUNC1 TAG ORDEM_2 TO ORDEMX
     INDEX ON DTOS(DATA)+DTOS(DATA)+NOME_FUNC2 TAG ORDEM_3 TO ORDEMX
    _ABRE()
    ENDIF
    DBSETINDEX("ORDEMX")
ELSE
   TONE( 250, 4 )
   MENSAGEM( "Nao foi possivel abrir arquivo ORDEM", 5 )
   RETURN 0
ENDIF
SELECT ORDEM 
ORDSETFOCUS("ORDEM_2")
GOTO TOP
SET COLOR TO W/G+
FILTRO_1 := CTOD( "  /  /  " )
FILTRO_2 := CTOD( "  /  /  " )
FILTRO_3 := SPACE(10)
DATA:=FILTRO_1
DATA:=FILTRO_2
NOME_FUNC1:=FILTRO_3
@ 05, 08 SAY "Digite a data inicial:" GET FILTRO_1
@ 07, 08 SAY "Digite a data final..:" GET FILTRO_2
@ 09, 08 SAY "Digite o nome do funcion rio:" GET FILTRO_3
SET CURSOR ON
READ
SET CURSOR OFF
IF LASTKEY()=27
   RESTORE SCREEN FROM TELA1
   RETURN
ENDIF
VDIR:=DIRNAME()
DIRE:=VDIR+"\MEMOS"
ARQUIVO:="OFIC_02"
IMPRESSORA:="Impressora"
TIPO_PRN=""
TIPO_PRN=MENU_PRN3(ARQUIVO)
IF EMPTY(TIPO_PRN)
    RETURN
ENDIF
SET CURSOR OFF
VALOR=0
ULTIMO=LASTREC()
TERMOH(VALOR)
SET PRINTER TO (ARQUIVO+".PRN")
SET DEVICE TO PRINTER
X=0
PAG=1
SAI_DA="S"
TOT_0001:=TOT_0002:=TOT_0003:=0
T=0
C=0
DO WHILE .NOT. EOF()
   IF INKEY()=27
      SET DEVICE TO SCREEN
      SAI_DA=PERGUNTA("Continua a impress„o ?")
      SET DEVICE TO PRINTER
      IF SAI_DA="N"
         EXIT
      ENDIF
   ENDIF
   SET FILTER TO ORDEM->DATA>=FILTRO_1 .AND. ORDEM->DATA<=FILTRO_2 .AND. ORDEM->NOME_FUNC1=FILTRO_3 
   IF !(ORDEM->DATA>=FILTRO_1 .AND. ORDEM->DATA<=FILTRO_2 .AND. ORDEM->NOME_FUNC1=FILTRO_3 )
      T=T+ORDEM
      SKIP
      VALOR=(++C)*100/ULTIMO
      TERMOH(VALOR)
   ENDIF
   IF X=0
      IF TIPO_PRN<>"T"
         @ 00,01 SAY CHR(18)
      ENDIF
      @ 01,01 SAY CHR(15)+ "RELAT. SERVICO  " + ;
      "                                             Pagina: ";
      +subs(str(pag+10000,5),2)
      @ 02,01 SAY "ORDEM MECANICA"+"   Inicial: "+dtoc(filtro_1)+;
      "  Final: "+dtoc(filtro_2)+;
      "   Data: " +dtoc(dat_hoje)
      PAG++
      @ 02,01 SAY ""
      @ 03,01 SAY REPL("=",77)
      @ 04,001 SAY "NUMERO:"
      @ 04,009 SAY "DATA:"
      @ 04,020 SAY "FUNC:"
      @ 04,035 SAY "M.OBRA:"
      @ 04,053 SAY "PECAS:"
      @ 04,069 SAY "SUBT:"
      @ 05,01 SAY REPL("=",77)
      X=06
   ENDIF
   @ X,001 SAY NUMERO
   @ X,009 SAY DATA
   @ X,020 SAY NOME_FUNC1
   IF !EMPTY(VALOR1)
      @ X,032 SAY VALOR1
   ENDIF
   IF !EMPTY(T12)
      @ X,047 SAY T12
   ENDIF
   xSALDO:=VALOR1+T12
   IF !EMPTY(xSALDO)
      @ X,062 SAY xSALDO
   ENDIF
   TOT_0001=TOT_0001+VALOR1
   TOT_0002=TOT_0002+T12
   TOT_0003=TOT_0003+xSALDO
   X=X+1
   SKIP
   IF X>58 .OR. EOF()
      IF EOF()
         TOTIMPM(2)
      ELSE
         TOTIMPM(1)
      ENDIF
      X=1
   ENDIF
ENDDO
RESTORE SCREEN FROM TELABOX
EJECT
SET DEVICE TO SCREEN

FUNCTION TOTIMPM
PARA PAR1
IF PAR1=2
   X=59
ENDIF
@ X+0,01 SAY REPL("-",77)
IF PAR1=2
   @ X+1,001 SAY "TOTAL"
ELSE
   @ X+1,001 SAY "SUBTOTAL"
ENDIF
@ X+1,032 SAY TOT_0001 PICTURE "@Z 999,999.99"
@ X+1,049 SAY TOT_0002 PICTURE "@Z 999,999.99"
@ X+1,065 SAY TOT_0003 PICTURE "@Z 999,999.99"
@ X+2,01 SAY REPL("-",77)

O principal erro que está gerando é o compilador não aceitar esse comando acima "T=T+ORDEM", está acusando variável não declarada..Bom, acho que vários de vocês trabalha com termômetro. Andei pesquisando no fórum e achei alguma coisa a respeito desse assunto, só que vejo o pessoal usá-lo mais em indexação de arquivos..
Se alguém poder me ajudar agradeço ...

Josmar :%

Termômetro de Processamento

Enviado: 01 Set 2012 07:57
por esgici
Ola Abby

First, please don't panic !
Compiler escreveu:T = T + ORDEM : Variable doesn't exist : ORDEM
is right, because ORDEM isn't variable, name of your table and alias assigned to it.

Probably you want say this :

Código: Selecionar todos

T = T + ORDEM->(RECNO())
or anything else; but must be exist and numeric.

Happy Clipper'ing :D

Termômetro de Processamento

Enviado: 01 Set 2012 11:30
por Imatech
Ola Abby !

Sugiro que faça a conferencia nos codigos exemplo do livro...

Segue uma provavel correção:

Código: Selecionar todos


#include "OFIC.CH"

   SET COLOR TO 21, 79
   SAVE SCREEN TO TELA1
   SET COLOR TO G +/ W
   @ 04, 07 CLEAR TO 11, 51
   @ 04, 7 TO 11, 51
   SELECT 44
   IF USEREDE( "ORDEM", .F. , 30, .F. )
      IF( !File( "ORDEMX.CDX" ) )
         _FECHA()
         INDEX ON COD TAG ORDEM_1 TO ORDEMX
         INDEX ON DToS( DATA ) + DToS( DATA ) + NOME_FUNC1 TAG ORDEM_2 TO ORDEMX
         INDEX ON DToS( DATA ) + DToS( DATA ) + NOME_FUNC2 TAG ORDEM_3 TO ORDEMX
         _ABRE()
      ENDIF
      dbSetIndex( "ORDEMX" )
   ELSE
      Tone( 250, 4 )
      MENSAGEM( "Nao foi possivel abrir arquivo ORDEM", 5 )
      RETURN 0
   ENDIF
   SELECT ORDEM
   ordSetFocus( "ORDEM_2" )
   GOTO TOP
   SET COLOR TO W/G +
   FILTRO_1 := CToD( " / / " )
   FILTRO_2 := CToD( " / / " )
   FILTRO_3 := Space( 10 )
   DATA := FILTRO_1
   DATA := FILTRO_2
   NOME_FUNC1 := FILTRO_3
   @ 05, 08 SAY "Digite a data inicial:" GET FILTRO_1
   @ 07, 08 SAY "Digite a data final..:" GET FILTRO_2
   @ 09, 08 SAY "Digite o nome do funcionrio:" GET FILTRO_3
   SET CURSOR ON
   READ
   SET CURSOR OFF
   IF LastKey() == 27
      RESTORE SCREEN FROM TELA1
      RETURN
   ENDIF
   VDIR := DIRNAME()
   DIRE := VDIR + "\MEMOS"
   ARQUIVO := "OFIC_02"
   IMPRESSORA := "Impressora"
   TIPO_PRN := ""
   TIPO_PRN := MENU_PRN3( ARQUIVO )
   IF Empty( TIPO_PRN )
      RETURN
   ENDIF
   SET CURSOR OFF
   VALOR := 0
   ULTIMO := LastRec()
   TERMOH( VALOR )
   SET PRINTER TO ( ARQUIVO + ".PRN" )
   SET DEVICE TO PRINTER
   X := 0
   PAG := 1
   SAI_DA := "S"
   TOT_0001 := TOT_0002 := TOT_0003 := 0
   T := 0
   C := 0
   DO WHILE .NOT. EOF()
      IF Inkey() == 27
         SET DEVICE TO SCREEN
         SAI_DA := PERGUNTA( "Continua a impress„o ?" )
         SET DEVICE TO PRINTER
         IF SAI_DA == "N"
            EXIT
         ENDIF
      ENDIF
      SET FILTER TO ORDEM -> DATA >= FILTRO_1 .AND. ORDEM -> DATA <= FILTRO_2 .AND. ORDEM -> NOME_FUNC1 == FILTRO_3
      IF !( ORDEM -> DATA >= FILTRO_1 .AND. ORDEM -> DATA <= FILTRO_2 .AND. ORDEM -> NOME_FUNC1 == FILTRO_3 )
         // T := T + ORDEM // IGNORADO: CÓDIGO SEM UTILIDADE
         SKIP
         VALOR := ( ++ C ) * 100/ULTIMO
         TERMOH( VALOR )
      ENDIF
      IF X == 0
         IF TIPO_PRN <> "T"
            @ 00, 01 SAY Chr( 18 )
         ENDIF
         @ 01, 01 SAY Chr( 15 ) + "RELAT. SERVICO " + ;
            "                      Pagina: ";
            + subs( Str( pag + 10000,5 ), 2 )
         @ 02, 01 SAY "ORDEM MECANICA" + " Inicial: " + DToC( filtro_1 ) + ;
            " Final: " + DToC( filtro_2 ) + ;
            " Data: " + DToC( dat_hoje )
         PAG ++
         @ 02, 01 SAY ""
         @ 03, 01 SAY REPL( "=", 77 )
         @ 04, 001 SAY "NUMERO:"
         @ 04, 009 SAY "DATA:"
         @ 04, 020 SAY "FUNC:"
         @ 04, 035 SAY "M.OBRA:"
         @ 04, 053 SAY "PECAS:"
         @ 04, 069 SAY "SUBT:"
         @ 05, 01 SAY REPL( "=", 77 )
         X := 06
      ENDIF
      @ X, 001 SAY NUMERO
      @ X, 009 SAY DATA
      @ X, 020 SAY NOME_FUNC1
      IF !Empty( VALOR1 )
         @ X, 032 SAY VALOR1
      ENDIF
      IF !Empty( T12 )
         @ X, 047 SAY T12
      ENDIF
      xSALDO := VALOR1 + T12
      IF !Empty( xSALDO )
         @ X, 062 SAY xSALDO
      ENDIF
      TOT_0001 := TOT_0001 + VALOR1
      TOT_0002 := TOT_0002 + T12
      TOT_0003 := TOT_0003 + xSALDO
      X := X + 1
      SKIP
      IF X > 58 .OR. EOF()
         IF EOF()
            TOTIMPM( 2 )
         ELSE
            TOTIMPM( 1 )
         ENDIF
         X := 1
      ENDIF
   ENDDO
   RESTORE SCREEN FROM TELABOX
   EJECT
   SET DEVICE TO SCREEN

FUNCTION TOTIMPM

   PARA PAR1

   IF PAR1 == 2
      X := 59
   ENDIF
   @ X + 0, 01 SAY REPL( "-", 77 )
   IF PAR1 == 2
      @ X + 1, 001 SAY "TOTAL"
   ELSE
      @ X + 1, 001 SAY "SUBTOTAL"
   ENDIF
   @ X + 1, 032 SAY TOT_0001 PICTURE "@Z 999,999.99"
   @ X + 1, 049 SAY TOT_0002 PICTURE "@Z 999,999.99"
   @ X + 1, 065 SAY TOT_0003 PICTURE "@Z 999,999.99"
   @ X + 2, 01 SAY REPL( "-", 77 )


Termômetro de Processamento

Enviado: 01 Set 2012 12:34
por Josmar dos Santos
Boa tarde amigos, obrigado pelo help ! Conforme orientação de ambos, fiz os testes e o erro de variável não se apresenta mais, porém, agora preciso de vocês no sentido de fazer a barra progressiva aparecer no momento de processar o relatório. Na Situação em que se encontra o código, aparece apenas o termômetro e não a barra progressiva que é o objetivo final. Devo observar a vocês que o termômetro está aparecendo após o processamento de relatório, ou seja, dentro da tela (sem barra progressiva, apenas o termômetro). Vale lembrar que esse relatório é uma saída para tela e não para impressora. Já fiz várias alterações, mudei de posicionamento os códigos e não obtive sucesso. Conta com a colaboração de vocês..
Um abraço.

Josmar

:xau

Termômetro de Processamento

Enviado: 01 Set 2012 13:05
por Imatech
Set Device TO Screen
TERMOH( VALOR )
Set Device TO Printer

Código: Selecionar todos


#include "OFIC.CH"

   SET COLOR TO 21, 79
   SAVE SCREEN TO TELA1
   SET COLOR TO G +/ W
   @ 04, 07 CLEAR TO 11, 51
   @ 04, 7 TO 11, 51
   SELECT 44
   IF USEREDE( "ORDEM", .F. , 30, .F. )
      IF( !File( "ORDEMX.CDX" ) )
         _FECHA()
         INDEX ON COD TAG ORDEM_1 TO ORDEMX
         INDEX ON DToS( DATA ) + DToS( DATA ) + NOME_FUNC1 TAG ORDEM_2 TO ORDEMX
         INDEX ON DToS( DATA ) + DToS( DATA ) + NOME_FUNC2 TAG ORDEM_3 TO ORDEMX
         _ABRE()
      ENDIF
      dbSetIndex( "ORDEMX" )
   ELSE
      Tone( 250, 4 )
      MENSAGEM( "Nao foi possivel abrir arquivo ORDEM", 5 )
      RETURN 0
   ENDIF
   SELECT ORDEM
   ordSetFocus( "ORDEM_2" )
   GOTO TOP
   SET COLOR TO W/G +
   FILTRO_1 := CToD( " / / " )
   FILTRO_2 := CToD( " / / " )
   FILTRO_3 := Space( 10 )
   DATA := FILTRO_1
   DATA := FILTRO_2
   NOME_FUNC1 := FILTRO_3
   @ 05, 08 SAY "Digite a data inicial:" GET FILTRO_1
   @ 07, 08 SAY "Digite a data final..:" GET FILTRO_2
   @ 09, 08 SAY "Digite o nome do funcionrio:" GET FILTRO_3
   SET CURSOR ON
   READ
   SET CURSOR OFF
   IF LastKey() == 27
      RESTORE SCREEN FROM TELA1
      RETURN
   ENDIF
   VDIR := DIRNAME()
   DIRE := VDIR + "\MEMOS"
   ARQUIVO := "OFIC_02"
   IMPRESSORA := "Impressora"
   TIPO_PRN := ""
   TIPO_PRN := MENU_PRN3( ARQUIVO )
   IF Empty( TIPO_PRN )
      RETURN
   ENDIF
   SET CURSOR OFF
   VALOR := 0
   ULTIMO := LastRec()
   TERMOH( VALOR )
   SET PRINTER TO ( ARQUIVO + ".PRN" )
   SET DEVICE TO PRINTER
   X := 0
   PAG := 1
   SAI_DA := "S"
   TOT_0001 := TOT_0002 := TOT_0003 := 0
   T := 0
   C := 0
   DO WHILE .NOT. EOF()
      IF Inkey() == 27
         SET DEVICE TO SCREEN
         SAI_DA := PERGUNTA( "Continua a impress„o ?" )
         SET DEVICE TO PRINTER
         IF SAI_DA == "N"
            EXIT
         ENDIF
      ENDIF
      SET FILTER TO ORDEM -> DATA >= FILTRO_1 .AND. ORDEM -> DATA <= FILTRO_2 .AND. ORDEM -> NOME_FUNC1 == FILTRO_3
      IF !( ORDEM -> DATA >= FILTRO_1 .AND. ORDEM -> DATA <= FILTRO_2 .AND. ORDEM -> NOME_FUNC1 == FILTRO_3 )
         // T := T + ORDEM // IGNORADO: CÓDIGO SEM UTILIDADE
         SKIP
         VALOR := ( ++ C ) * 100/ULTIMO
         Set Device TO Screen
         TERMOH( VALOR )
         Set Device TO Printer
      ENDIF
      IF X == 0
         IF TIPO_PRN <> "T"
            @ 00, 01 SAY Chr( 18 )
         ENDIF
         @ 01, 01 SAY Chr( 15 ) + "RELAT. SERVICO " + ;
            "                      Pagina: ";
            + subs( Str( pag + 10000,5 ), 2 )
         @ 02, 01 SAY "ORDEM MECANICA" + " Inicial: " + DToC( filtro_1 ) + ;
            " Final: " + DToC( filtro_2 ) + ;
            " Data: " + DToC( dat_hoje )
         PAG ++
         @ 02, 01 SAY ""
         @ 03, 01 SAY REPL( "=", 77 )
         @ 04, 001 SAY "NUMERO:"
         @ 04, 009 SAY "DATA:"
         @ 04, 020 SAY "FUNC:"
         @ 04, 035 SAY "M.OBRA:"
         @ 04, 053 SAY "PECAS:"
         @ 04, 069 SAY "SUBT:"
         @ 05, 01 SAY REPL( "=", 77 )
         X := 06
      ENDIF
      @ X, 001 SAY NUMERO
      @ X, 009 SAY DATA
      @ X, 020 SAY NOME_FUNC1
      IF !Empty( VALOR1 )
         @ X, 032 SAY VALOR1
      ENDIF
      IF !Empty( T12 )
         @ X, 047 SAY T12
      ENDIF
      xSALDO := VALOR1 + T12
      IF !Empty( xSALDO )
         @ X, 062 SAY xSALDO
      ENDIF
      TOT_0001 := TOT_0001 + VALOR1
      TOT_0002 := TOT_0002 + T12
      TOT_0003 := TOT_0003 + xSALDO
      X := X + 1
      SKIP
      IF X > 58 .OR. EOF()
         IF EOF()
            TOTIMPM( 2 )
         ELSE
            TOTIMPM( 1 )
         ENDIF
         X := 1
      ENDIF
   ENDDO
   EJECT
   SET DEVICE TO SCREEN
   RESTORE SCREEN FROM TELABOX

FUNCTION TOTIMPM

   PARA PAR1

   IF PAR1 == 2
      X := 59
   ENDIF
   @ X + 0, 01 SAY REPL( "-", 77 )
   IF PAR1 == 2
      @ X + 1, 001 SAY "TOTAL"
   ELSE
      @ X + 1, 001 SAY "SUBTOTAL"
   ENDIF
   @ X + 1, 032 SAY TOT_0001 PICTURE "@Z 999,999.99"
   @ X + 1, 049 SAY TOT_0002 PICTURE "@Z 999,999.99"
   @ X + 1, 065 SAY TOT_0003 PICTURE "@Z 999,999.99"
   @ X + 2, 01 SAY REPL( "-", 77 )
...


Termômetro de Processamento

Enviado: 02 Set 2012 01:40
por Josmar dos Santos
Bom dia, fiz os testes que o presente colega me passou mas não obtive sucesso. Baixei uns exemplos aqui do fórum e vou tentar fazer teste com eles também. Quem sabe né ? pode ser essa função que esteja com problema..

Josmar

Termômetro de Processamento

Enviado: 02 Set 2012 06:34
por JoséQuintas
Para o gráfico precisa de duas variáveis: a posição atual e o total.
Se o arquivo estiver em ordem de número de registro, pode usar RecNo() e LastRec(), senão tem que usar um contador.

A rotina normal seria algo mais ou menos assim:

use arquivo
nTotal := LastRec()
nAtual := 0
Do While .Not. Eof()
Grafico(nAtual++,nTotal)
Skip
Enddo


E a outra parte seria o gráfico baseado nos dois números.
Um exemplo simples, usando as 80 colunas na tela:

Function Grafico(nAtual,nTotal)
@ MaxRow(), 0 Say Replicate("X",(80*nAtual/nTotal))
Return NIL

Termômetro de Processamento

Enviado: 02 Set 2012 12:48
por billy1943
Eu já usei essa função do Ramalho há muito tempo.
Ocorre que hoje ela sofreu algumas restrições:

1. Os computadores hoje são tremendamente mais rápidas, impressoras idem.

2. Os softwares de hoje, inclusive o Clipper trabalhando em conjunto com rotinas do Windows mais recentes, permitem "Preview"
do que vai ser impresso.

3. Não dá mais "tempo" para você interromper um relatório que está sendo impresso, pois o teste que a tecla <ESC> é/foi pressionada,
em uma impressora laser rápida quando detectado, a impressora já teria terminado ou quase a sua impressão; e não dá mais para
desligá-la como no tempo das matriciais.

4. O que pode demorar mais hoje em dia, pode ser:
a) a indexação de vários bancos, pois, se for um só você não terá "tempo" de ver o termômetro
b) a gravação de um arquivo a partir de outros

5. Nesses casos, a exibição do termômetro pode inclusive atrasar o processamento.

Assim, Josmar, se o seu sistema não se enquadrar nas premissas acima, desenvolva e implemente a função.

Termômetro de Processamento

Enviado: 02 Set 2012 13:37
por Euclides
Oi pessoal,
Concordo com o conceito de ´máquinas rápidas´ e ´hoje em dia´, ... mas vamos ao problema do colega...
Hoje é domingo e depois da corrida F1, tive algum tempo livre...
Adaptei a rotina do Ramalho e utilizando um FOR... NEXT, simulando uma leitura de arquivo.
A rotina do Ramalho fala em PERCENTUAL, por isso, devemos calcular o valor de 1% antes de chamar o ´termômetro´.
Adaptei o ´termômetro´para incrementos de 2% (o original estava meio ´descalibrado´).
Utilizei o FreeTSlice para não ´entupir´ o processador no INKEY()
A ´coisa´ficou assim:

Código: Selecionar todos

/*  Linkar com: blinker fi meter, ..\obj\timeslic  */
static sTela

FUNCTION MAIN
local ny:=0, nVal:=0, nTot:=2000000  //  Pode colocar recno()
local nPrc:=nTot/100  //  Valor de 1%
local nMet:=nPrc*2    //  Divisões do ´termômetro´ (2%)
   FreeTSlice()
   save screen to sTela
   cls
   TERMOH(nY)
for nY=1 to nTot
    @ 2,2 say nY
    if nY>=nMet
       TERMOH(nY/nPrc)
       nMet+=(nPrc*2)   //  Divisões do ´termômetro´ (2%)
    endif    
next
   @ 2,2 say "Tecle para Terminar"
   inkey(0)
   rest screen from sTela
return nil
*
FUNCTION TERMOH(VALOR)
IF VALOR <=1
   SETCOLOR("W+/N")
   @ 15,09 SAY "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"
   @ 16,09 SAY "º            PERCENTUAL DA TAREFA EXECUTADA            º"
   @ 17,09 SAY "ºÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĺ"
   @ 18,09 SAY "º  1   10   20   30   40   50   60   70   80   90  100 º"
   @ 19,09 say "º ÚÙ...|....|....|....|....|....|....|....|....|....À¿ º"
   @ 20,09 say "º ³                                                  ³ º"
   @ 21,09 SAY "º ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ º"
   @ 22,09 SAY "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"
ELSE
   @ 20,12 SAY REPLICATE(CHR(219),VALOR/2)
ENDIF
RETURN NIL

É só trocar o FOR... NEXT pela rotina DO... WHILE do report.
O nTot seria o recno() se não utilizar filtros ou ordscopes
T+
Euclides