Página 1 de 1

METER - CAUSA LENTIDÃO

Enviado: 20 Abr 2005 09:21
por CARDIM
Bom dia turma

Amigos, preciso de ajuda.
Por favor digam que eu estou errado.

Estamos em fase de conversão para o FW26/clipper e fui substituir o famoso "Processando. Aguarde..." pelo "METER".

Tentei simular num DBF real do sistema, contendo 20000 rec e 10 indices (CDX) numa máquina 566 e constatei que a indexação ficou mais lenta 6 vezes (45s antes contra 270s).

Testei num Pentium 4 com 100000 rec e deu a mesma proporção.

Ora, a nossa ideia era colocar o "METER" em todo processamento pesado e indexação.

Temos clientes de todo tipo, alguns com arquivos com mais de 300.000 lançamentos, aproximadamente 100 estações e muitas delas desatualizadas (pão-duros, né??. Não podemos piorar o desempenho em função do mais bonito.

Lá vai o Fonte:

ANTES: -----------------------------------------------------

Código: Selecionar todos

MsgRun( "REINDEXANDO COMERCIAL. AGUARDE!!!....... ","", ;
{|oInd|IF(.NOT.INDSCCoInd) , WINDEXOU:=.F.,.T.)})

FUNC INDSCC
IF.NOT.FUSEX("1","CADCLIEN")
RETU.F.
ELSE
ERASE ICLIEN.CDX
ENDIF
INDEX ON CLIENCOD TAG 01 TO ICLIEN
INDEX ON TRANSCOD TAG 02 TO ICLIEN
INDEX ON VENDECOD TAG 03 TO ICLIEN
INDEX ON STR(REGIOCOD,3,0)+FANTASIA TAG 04 TO ICLIEN
INDEX ON BANCOCOD TAG 05 TO ICLIEN
INDEX ON CONDICOD TAG 06 TO ICLIEN
INDEX ON CLIENTE TAG 07 TO ICLIEN
INDEX ON CGC TAG 08 TO ICLIEN
INDEX ON CPF TAG 09 TO ICLIEN
INDEX ON FANTASIA TAG 10 TO ICLIEN
RETU .T.
DEPOIS------------------------------------------------------

Código: Selecionar todos

MsgMeter( { | oMeter, oText, oDlg, lEnd | ;
IF(.NOT.INDSCC( oMeter, oText, oDlg, @lEnd ) , ; 
WINDEXOU:=.F. ,.T. ) } , ;
"REINDEXANDO COMERCIAL ...........","Aguarde" )

FUNC INDSCC
IF.NOT.FUSEX("1","CADCLIEN")
RETU.F.
ELSE
ERASE ICLIEN.CDX
ENDIF
oMeter:nTotal = RecCount()
oMeter:ctext = "REINDEXANDO CLIENTES 01/10"
INDEX ON CLIENCOD TAG 01 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 02/10"
INDEX ON TRANSCOD TAG 02 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 03/10"
INDEX ON VENDECOD TAG 03 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 04/10"
INDEX ON STR(REGIOCOD,3,0)+FANTASIA TAG 04 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 05/10"
INDEX ON BANCOCOD TAG 05 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 06/10"
INDEX ON CONDICOD TAG 06 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 07/10"
INDEX ON CLIENTE TAG 07 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 08/10"
INDEX ON CGC TAG 08 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 09/10"
INDEX ON CPF TAG 09 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
oMeter:ctext = "REINDEXANDO CLIENTES 10/10"
INDEX ON FANTASIA TAG 10 TO ICLIEN ;
EVAL ( oMeter:Set( RecNo() ), SysRefresh(), ! lEnd )
RETU .T.

**********************************************
Fico no aguardo dos sábios de plantão..

{}

Cardim
www.cardim.com.br

Enviado: 01 Mai 2005 19:58
por rochinha
Amiguinho

Eu não uso o METER mas apresento a porcentagem da indexação na barra de status de meu sistema usando uma função simples.

...
INDEX ON chave TO indice FOR criterio ;
EVAL dbProgress( oWnd. indice )
...
Passe no primeiro parâmetro a referencia da janela de seu sistema e no segundo o nome do indice.

/*
*
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
* Descricao:
* *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
*
*/
FUNCTION dbProgress( oWnd, cIndice )
LOCAL cComplete := LTRIM(STR(INT((RECNO()/LASTREC()) * 100)))
cTexto := OemToAnsi("Indexando arquivo "+cIndice+" (" + cComplete + ")% Completada.")
oWnd:SetMSG( cTexto )
RETURN(.T.)

@braços :?)