Barra de indexação / pesquiza

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Barra de indexação / pesquiza

Mensagem 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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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 :?)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem 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
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem 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...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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 :?)
Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Mensagem 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
Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Mensagem 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
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem 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...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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 :?)
Avatar do usuário
Vagner
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 07 Jul 2004 14:42

Mensagem 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
Abraços
Vagner Wirts
São Paulo-Brasil
Responder