Progresso com PACK e COPY FIELDS
Enviado: 22 Set 2007 18:57
Pessoal, é possível implementar uma barra de progressão quando da utilização dos comandos PACK e COPY FIELDS?
Antonio Carlos
Antonio Carlos
Código: Selecionar todos
use arquivo.dbf
arq=0
totalrec=lastrec()
conta=0
x_arecop()
quitCódigo: Selecionar todos
FUNCTION X_ARECOP
dbeval( {|| x_arecop2() } )
retuCódigo: Selecionar todos
FUNCTION X_ARECOP2
conta=conta+iif((totalrec/30)<30,30,int(totalrec/30))
conta=iif(conta>totalrec,totalrec,conta)
?tran(conta/totalrec*100,"@E 999.9%") // -> mostra evolução
arq=arq+1
c="lixo"+strzero(arq,2,0)
copy to &c next iif((totalrec/30)<30,30,int(totalrec/30))
retuClaro. Isso é bem possível de acontecer. Mas é realmente em uma pequena parte dos casos. Pra maioria, reaproveitar é uma opção muito melhor que o PACK.isso de reaproveitar registros não pode tornar (em determinados casos) o arquivo "fragmentado"?
Código: Selecionar todos
// PROGRAMA EXEMPLO PARA MOSTRAR BARRA DE ROLAGEM NA TELA QUANDO ESTIVER
// COPIANDO, INDEXANDO OU QUALQUER OUTRA OPERAۂO EM ARQUIVO
// PROGRAMADOR: CLODOALDO MONTEIRO
// DIREITOS...: GAS INFORMATICA
// LIB........: GASP52PM.LIB
// FUNۂO.....: POE_GAUGE(MENSAGEM,TITULO1,TITULO2)
// A FUNۂO PODE MOSTRAR UMA BARRA DE ROLAGEM OU UM CONTADOR DE REGISTROS
#include "INKEY.CH"
drvmenucen=.f. // vari vel para a funcao DBOX
drvcorpad="W+/RB" ; drvcorbox="W+/B" // cores default
drvcormsg="W+/N*" ; drvcorenf="W+/R"
drvcorget="W+/BG" ; drvcortel="W+/B"
drvcorhlp="GR+/G" ; drvcortna="GR/N"
drvtitpad="GR+/RB" ; drvtitbox="GR+/B" // cores dos titulos default
drvtitmsg="GR+/N*" ; drvtitenf="GR+/R"
drvtitget="GR+/BG" ; drvtittel="GR+/B"
drvtithlp="W+/G" ; drvtittna="W/N"
use EMP new excl // ABRE O ARQUIVO EMP PARA TESTAR OS COMANDOS COM A FUNۂO POE_GAUGE
// indexando registros
clea
POE_GAUGE("Criando ¡ndices.",,,13,30) // MOSTRA UM BOX NA TELA COM UMA MENSSAGEM
INDE ON EMP_COD TO EMP1 EVAL POE_GAUGE() EVERY (LASTREC()/20) // indexando...
// emp_cod ‚ um campo do arquivo EMP
// logalizando registros
clea
go top
POE_GAUGE("Pesquisando...|ESC interrompe","AGUARDE...","Processados:",16,28)
LOCA FOR emp_nomecr='xxmaria' WHIL INKEY()!=K_ESC .AND. POE_GAUGE() // tenta localizar registro desejado
// emp_nomecr ‚ um campo do arquivo EMP
// Depois do comando WHIL vocˆ pode colocar qualquer fun‡Æo e pode
// at‚ mostrar um box com uma menssagem e esperando que o usu rio
// fa‡a alguma a‡Æo.
// copiando arquivos
CLEA
POE_GAUGE("Compactando o arquivo EMP.DBF","AGUARDE!","Registros feitos:",15,28) // msg de gauge
GO TOP // inicio do dbf
COPY TO tmp WHILE POE_GAUGE() // copia reg nao excluido para tmp
RETU //FIM DO PROGRAMA PRINCIPAL
FUNC POE_GAUGE(msg_,tit_,tit_reg,m_l,m_c) // coloca gauge(BARRA DE ROLAGEM) na tela
STATIC l_g, c_g, ct_g:=0, so_conta // linha e coluna do inicio gauge
LOCAL x, defa_dev, i
IF msg_!=NIL // mensagem da dbox
so_conta=(tit_reg!=NIL) // vai contar ou colocar %
ct_g=0 // contador de registro ja processados
IF so_conta // se vai contar concatena msg que
msg_+="|*|"+tit_reg+" 0" // vamos mostrar qtde de reg processados
ELSE // processo em todo o arq
msg_+="|*|"+REPL("°",20) // concatena gauge no final
ENDI
x=DBOX(msg_,10,,,.f.,tit_) // coloca msg na tela
SETCOLOR(drvtitbox) // cor do titulo para gauge
l_g = m_l // linha e
c_g = m_c // coluna de inicio do gauge
IF so_conta // vai contar registro
c_g+=LEN(tit_reg)+1 // posiciona cursor apos msg de proc
ENDI
ELSE // coloca o gauge
ct_g++ // conta quantos ja foi feito
IF so_conta // gauge em contador
IF INT(ct_g/30)=ct_g/30 // mostra em 30 em 30
x=RIGHT(SPACE(8)+STR(ct_g),8) // coloca qtde na tela sem
FOR i=1 TO 8 // usar o SAY (pode estar imprimindo)
POKE(-18432,(l_g*160)+((c_g+i)*2),ASC(SUBS(x,i+1,1)))
NEXT
ENDI
ELSE // gauge com percentual
@ l_g,c_g SAY REPL("Û",MIN(ct_g,20)) // coloca na msg
END IF
ENDI
RETURN .t. // sempre retorna verdadeiroCódigo: Selecionar todos
use arquivo.dbf
priv conta:=0
priv tudo:=lastrec()
go top
copy to temp while copia()
quit
function copia
conta++
@10,10 say conta/tudo*100 //-> mostra %
retu .t.Código: Selecionar todos
USE ARQ
SET DELE ON //seleciona só os registros ativos
COUNT TO M_VAR //cria uma variável com o total de registros ativos
Código: Selecionar todos
USE ARQ //abre o seu arquivo
SET DELE ON //seleciona somente os registros ativos
GO TOP //vai para o início do arquivo
COPY TO TEMP WHILE COPIA() //copia para um arquivo temporário usando uma função para mostrar a progressão dos registros
CLOSE ALL //fecha todos os arquivos
ERASE ARQ.DBF //apaga arquivo com registros deletados
RENAME TEMP.DBF TO ARQ.DBF //renomeia arquivo temporário
... depois você deve reconstruir os índices novamente.
O comando COUNT é traduzido para uma expressão complexa utilizando DBEval() pra realizar uma contagem filtrada, enquanto que o LastRec() é uma função que só retorna a quantidade de registros.Eu não uso muito o lastrec() e sim o comando COUNT, que acho que é a mesma coisa