Página 1 de 1

como cancelar um locate

Enviado: 19 Ago 2014 08:49
por porter
olá pessoal, gostaria de saber como faço para cancelar um locate no clipper 5.2, tenho um arquivo com muitos registros, e quando, o locate não localiza nenhum registro que satisfaça a condição, o processamento demora para ser finalizado até o final do arquivo, então quero cancelar a consulta, estou fazendo o locate da seguinte forma:

LOCATE FOR ALLTRIM(variavel) $ NCLIENTE

obrigado.

como cancelar um locate

Enviado: 19 Ago 2014 09:43
por Jairo Maia
Olá porter,

Você pode usar a cláusula While e estabelecer uma condição para encerrar. Por exemplo:

Código: Selecionar todos

LOCATE FOR ALLTRIM(variavel) $ NCLIENTE While LastKey() != K_ESC

como cancelar um locate

Enviado: 19 Ago 2014 09:48
por billy1943
Além de seguir a proposição do Jairo Maia, que também seria a minha primeira sugestão, ou seja, acrescentar uma condição lógica, tipo varredura de teclado, pois o sistema sempre fica pesquisando para ver se alguma tecla foi pressionada, e, assim, se você teclar a tecla <ESC> e havendo essa condição no seu comando, o processamento deve ser interrompido.

Quando os arquivos são muito grandes o comando LOCATE não é apropriado, sendo indicado a procura por meio de índices e o uso de SET SOFTSEEK ON e
SET SOFTSEEK OFF cuja localização é super rápida.

como cancelar um locate

Enviado: 19 Ago 2014 12:20
por porter
mas eu estou teclando Esc e não acontece nada, continua processando o locate, e o meu Set Escape está true, estou fazendo assim:

locate for alltrim(variavel) $ ncliente while lastkey() <> 27

como cancelar um locate

Enviado: 19 Ago 2014 13:26
por Jairo Maia
Porter, troque então o LastKey() por Inkey(), ficando assim:
locate for alltrim(variavel) $ ncliente while Inkey() <> 27

como cancelar um locate

Enviado: 19 Ago 2014 13:35
por porter
obrigado Jairo, agora funcionou certinho.

como cancelar um locate

Enviado: 19 Ago 2014 22:24
por JoséQuintas
Nessas horas um gráfico pode ajudar a não ter a sensação de que travou.

como cancelar um locate

Enviado: 20 Ago 2014 11:11
por porter
bom dia, mais um detalhe, como faço para mostrar os registros processados pelo locate ?

como cancelar um locate

Enviado: 20 Ago 2014 11:31
por Jairo Maia
Porter, acho que você foi claro, e é muito simples isso. Porém, penso que pode estar embutido ai uma outra questão que seria você querer apresentar o registro que atende a condição, e o usuário escolher se é aquele ou pesquisar o próximo. Por exemplo, se você pede para buscar os clientes que tenham JOAO, ele para no primeiro cliente que tenha JOAO, mas você quer ver o próximo cliente por exemplo. Pergunto porque são formas diferentes de sugerir.

como cancelar um locate

Enviado: 20 Ago 2014 13:26
por porter
olá Jairo, sei que o locate percorre registro por registro, eu gostaria de mostrar alguma informação referente o registro atual, porque quando acontece do locate não encontrar nada, o usuário acha que o sistema está travado, entendeu, então se mostrar o numero do registro ou o nome do cliente, o usuário perceberá que o processo está em andamento.

obrigado.

como cancelar um locate

Enviado: 20 Ago 2014 14:35
por Jairo Maia
Olá Porter,

Uma forma bem simples, mas acho que dá para você ter uma ideia de como fazer com os recursos de seu sistema:

Código: Selecionar todos

nQualOrdem := DbSetOrder( 0 )  // deixa area desindexada, para apresentar registros em sequencia

nCursor := SetCursor( 0 )  // tira cursor da tela
cTela := SaveScreen( 0, 0, MaxRow(), MaxCol() )
cTotalRegs := LTrim( Str( Recc() ) )

nLin := ( MaxRow() / 2 ) - 2
nCol := ( MaxCol() - 40 ) / 2

SetColor( "GR+/N" )
@ nLin+1, nCol Say Space( 40 )  // limpa a linha da mensagem
DispBox( nLin, nCol, nLin+2, nCol+40 )

nLin += 1  // ajusta para a função MostraMsg()
nCol += 2
      
Locate For AllTrim(variavel) $ ncliente While MostraMsg()
      
SetCursor( nCursor )                           // Volta estado anterior do cursor
DbSetOrder( nQualOrdem )                       // restabele a ordem anterior
RestScreen( 0, 0, MaxRow(), MaxCol(), cTela )  // volta tela

/*
  Exibe registro que está sendo pesquisado
*/
Func MostraMsg()
 If Inkey() = 27
  Return .f.
 EndIf
 @ nLin, nCol Say "Processando Registro => " + LTrim( Str( Recn() ) ) + " de " + cTotalRegs
Return .t.

como cancelar um locate

Enviado: 20 Ago 2014 15:35
por porter
obrigado Jairo, era isso que eu precisava.

Abraço.