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.