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: 1057
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: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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: 1057
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: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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: 1057
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 1057
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: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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: 1057
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: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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: 1057
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