como cancelar um locate

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem 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.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

como cancelar um locate

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

como cancelar um locate

Mensagem 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.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem 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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

como cancelar um locate

Mensagem por Jairo Maia »

Porter, troque então o LastKey() por Inkey(), ficando assim:
locate for alltrim(variavel) $ ncliente while Inkey() <> 27
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem por porter »

obrigado Jairo, agora funcionou certinho.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

como cancelar um locate

Mensagem por JoséQuintas »

Nessas horas um gráfico pode ajudar a não ter a sensação de que travou.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem por porter »

bom dia, mais um detalhe, como faço para mostrar os registros processados pelo locate ?
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

como cancelar um locate

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem 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.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

como cancelar um locate

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1058
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

como cancelar um locate

Mensagem por porter »

obrigado Jairo, era isso que eu precisava.

Abraço.
Responder