Página 1 de 1

Barra de indexação / pesquiza

Enviado: 08 Jan 2006 16:45
por Vander
Bom amigos

1 - Tem como criar uma barra de indexação que mostre op progresso baseado no total de registros a indexar, exemplo:

arquivo de clientes com 1000 registros
arquivo de estoque com 6000 registros
..
..
arquivo usuario 5 registros

total de registros a processar digamos 9000

então a barra de progresso irá mostrar o progresso basedo nos 9000 registros que é o total a processar.

Eu uso uma rotina em clipper / DOS mas não consegui passar para FW.

2 - Tem como criar barra de progresso para as pesquizas e relatórios ?


Espero que como sempre possam me ajudar e desde já agradeço.

vander

Enviado: 09 Jan 2006 14:47
por rochinha
Amiguinho

Acrescente este código ao .PRG principal

Código: Selecionar todos

FUNCTION dbProgress( cIndice, cMensagem )
  LOCAL cComplete := LTRIM(STR(INT((RECNO()/LASTREC()) * 100)))
  cMensagem := OemToAnsi( iif(cMensagem=nil,"Indexacao de ",cMensagem) )
  MENSAGEM(OemToAnsi(cMensagem + cIndice + " " + cComplete + "% Completada."))
  RETURN(.T.)

FUNCTION MENSAGEM( MENSAGEM, TEMPO )
   MENSAGEM := OemToAnsi(MENSAGEM)
   IF TEMPO <> NIL
      MSGSTOP( MENSAGEM )
   ELSE
      [b]oWnd[/b]:SetMsg( MENSAGEM )
   ENDIF
Lembre-se de altera o oWnd para o nome da variavel de objeto de sua Window.

@braços :?)

Enviado: 10 Jan 2006 09:10
por gvc
Qdo vc vai indexar o arquivo, use o eval do comando index.
Vc cria uma funçaõ/code block para uma função que move o seu meter.

index on <chave> to <arquivo> eval <função/code block>

Cada registro, quando indexado, chama a função/code block

Enviado: 10 Jan 2006 13:29
por Stanis Luksys
Olá,

Se usar o eval aproveite e use a cláusula every, exemplo:

index on clientes to indice eval funcao evary 10

Assim a funcao do eval só é executada a cada 10 registros, bom para bancos grandes...


Falo...

Enviado: 10 Jan 2006 21:22
por rochinha
Amiguinhos

Pegando carona em suas dicas e de minha falta de memória acrescento:

index on <chave> to <arquivo> eval dbProgress( <arquivo>, "Aguarde:" )

Não use o METER pois o mesmo degrada o desempenho do aplicativo e pode derruba-lo.

@braços :?)

Enviado: 11 Jan 2006 16:30
por Vander
Valeu pela ajuda.

Rochinha, a sua função é muito boa, mas continuo sem solução para a minha questão, pois continua fazendo a contagem individual e não total, ou seja vai de 0 a 100% para cada índice e não é barra.


Vander

Enviado: 11 Jan 2006 16:31
por Vander
Valeu pela ajuda.

Rochinha, a sua função é muito boa, mas continuo sem solução para a minha questão, pois continua fazendo a contagem individual e não total, ou seja vai de 0 a 100% para cada índice e não é barra.


Vander

Enviado: 11 Jan 2006 17:55
por Stanis Luksys
Amigo,

Para fazer uma contagem TOTAL é necessário antes vc abrir todos os DBFs e contar quantos registros cada um tem.

Depois implemetar uma função que incremete o registro atual ao total geral e vai tirando a porcentagem.

Isso pode ser útil para criar DUAS barras de progresso, conforme esta tela q vou postar, onde utilizei a miniGUI, que trabalha de maneira muito semelhante ao FiveWin.

Imagem



Para fazer estas barras foi simples, controlo elas artraves da clausula EVAL do comando INDEX, conforme exemplo:

Código: Selecionar todos


// no programa que indexa
index on xxx to xxxx eval Prog_Ind()


function Prog_Ind()

    nReg_Processados := nReg_Processados + 1
    
    oJanela.oBarraProgresso1.value  := (RecNo()/LastRec())*100

    oJanela.oBarraProgresso2.value  := (nReg_Processados/nTotaldeRegistros)*100

return .t.
Note q a variavel "nTotaldeRegistros" foi obtida antes somando o total de todos os registros de todos os arquivos atarves com comando count ( ou da funcao lastRec(), tanto faz )


Espero ter colaborado de alguma forma, apesar de ter deixado um pouco de utilizar o FiveWin, sempre achei a sintaxe muito parecida com a da MiniGUI, e tenho certeza que este código pode ser adaptado para a FW.

Falou...

Enviado: 12 Jan 2006 04:19
por rochinha
Amiguinho

Voce ira precisar de algo assim:

Código: Selecionar todos

// Testing FiveWin own meter controls

#include "FiveWin.ch"

static oDlg

//----------------------------------------------------------------------------//

function Main()

   local nActual := 0, oMeter
   nActual1 := 0
   nActual2 := 0
   nTotal1  := 50  // registros em cada dbf devendo ser atualizado para o recco() atual
   nTotal2  := 100 // registros totais

   DEFINE DIALOG oDlg FROM 1, 1 TO 20, 44 ;
      TITLE "Testing the Meter controls"

   @ 2, 2 METER oMeter1 VAR nActual1 TOTAL nTotal1 OF oDlg SIZE 135, 10
   @ 4, 2 METER oMeter2 VAR nActual2 TOTAL nTotal2 OF oDlg SIZE 135, 10

   @ 5, 12 BUTTON "&Increase"   OF oDlg SIZE 40, 14 ;
      ACTION (oMeter1:Set( nActual1 + 1 ),oMeter2:Set( nActual2 + 1 ),;
              iif(nActual1>=nTotal1,oMeter1:Set( 0 ),0))

   ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

procedure AppSys   // XBase++ requirement

return

//----------------------------------------------------------------------------//
@braços :?)

Enviado: 03 Mar 2006 17:52
por Vagner
Olá Vander,
Se quiser um meter na barra de mensagem, verifique minha classe em www.fivewin.com.br em dicas + dicas, procure por VBar ou VMsgBar, vai encontrar tanto para clipper como para [x]Harbour