Página 1 de 1

HELP URGENTE TO PERDIDO

Enviado: 12 Jan 2005 15:38
por managercorp
TENHO UM ARQ. COM 15201254 REGISTROS E PRECISO
IMPRIMIR OS DADOS DE UM DETERMINADO PERIODO
EX: CLIENTES QUE ESTAVAM NA ESCOLA EM 01/05/2004
SO QUE EU NAO TENHO ESTA DATA NO ARQUIVO
O QUE EU TENHO E UM PERIODO
EX: DATA CHEGADA = 01/04/2004
DATA SAIDA = 01/06/2004
ENTAO ESTE PASSOU PELO PERIODO SOLICITADO E SERA
IMPRESSO.
A DUVIDA E O SEGUINTE, COMO NAO TENHO UMA DATA GRAVADA E SIM UM PERIODO QUE SERA VALIDO DENTRO DA DATA SOLICITADA, COMO FACO PARA USAR UM SEEK OU DBSEEK PARA UM DETERMINADO PERIODO.
NO MOMENTO EU FACO UM LOP DA 1.DATA EX: 01/04/2004
ADICIOANDO +1 ATE A ULTIMA DATA EX: 01/06/2004
E VEJO SE A DATA SOLICITADA PASSA POR ESTE DIA
FUNCIONA, SO QUE O PROBLEMA E QUE FICA MUITO LENTO
POIS SE EU PECO UM RELATORIO DAS PESSOAS QUE PASSARAM PELA EMPRESA EM UM PERIODO DE 2 MESES A ROTINA VAI FAZER UM LOP DE 60 VEZES PARA CADA REGISTRO.

*** EXISTE ALGUM SEEK POR PERIODO OU ALGUM INDICE ? *****
HELP, HELP, HELP...

ALEXANDRE
alexandre@managercorp.com.br
solucoeshotel@bol.com.br
solucoeshotel@hotmail.com (MSN)

Enviado: 12 Jan 2005 16:35
por Augusto
Experimente:

Código: Selecionar todos

set SOFTSEEK ON
sele SEU_ARQ
seek DT_CHEGADA=mDATA
if .not. EOF() .and. DT_SAIDA <= mDATA
   (registro válido ... )
else
   (registro inexistente ou inválido)
endif

duvida continua PLEASSSEEE

Enviado: 12 Jan 2005 18:51
por managercorp
********** A SOLUCAO APRESENTADA ***********
set SOFTSEEK ON
sele SEU_ARQ
seek DT_CHEGADA=mDATA
if .not. EOF() .and. DT_SAIDA <= mDATA
(registro válido ... )
else
(registro inexistente ou inválido)
endif
**********************************************
COMO FALEI ANTES ASSIM NAO FUNCIONA POIS A DATA DE
CHEGADA DT_CHEGADA NAO EXISTE:
EXEMPLO:
INFORME O PERIODO DESEJADO: 01/05/2004 A 15/05/2004
SO QUE O CLIENTE CHEGOU DIA 20/04/2004 E SAIU DIA 12/05/2004
VEJA QUE A DATA DE CHEGADA E DIFERENTE DA INFORMADA E QUE A DATA DE SAIDA TAMBEM E DIFERENTE DA INFORMADA
SO QUE ELE ESTAVA NA EMPRESA NESTE PERIODO
OU SEJA ELE NEM CHEGOU DIA 01 NEM SAIU DIA 15
MAS MESMO ASSIM E PARA APARECER NO RELATORIO POIS
O MESMO ESTAVA NA EMPRESA NO MEIO DO PERIODO
ISTO NUM ARQ COM 15424552 REGISTROS , COMO FACO PARA PESQUISAR TODOS QUE PASSARAM PELO PERIODO SOLICITADO, ATENCAO NAO E QUEM CHEGOU DIA TAL OU SAIU DIA TAL E SIM QUEM ESTAVA NO DIA TAL DO PERIOSO SOLICITADO
ISTO TUDO DENTRO DE UM DO WHILE.

Enviado: 12 Jan 2005 19:30
por Augusto
Veja bem... o meu intúito é de te ajudar... certo ??

Pelo que pude perceber nessa sua segunda colocação, vc precisa testar se o período solicitado está compreendido no período gravado no arquivo logo, o comando SEEK não atenderá sua necessidade. O que poderá fazer é usar um filtro do tipo SET FILTER ou outro mais rápido onde você possa selecionar "todos"os registros que atendam sua necessidade.

Exemplo:

Código: Selecionar todos

use SEU_ARQ
set filter to DT_CHEGADA <= PER_INICIO .and. DT_SAIDA >= PER_FIM
go top
if eof()
   (não há registros para o período solicitado)
else
   (somente os registros que atendem seu filtro serão impressos)
endif

VALEU AUGUSTO, MAS E INOPERANTE

Enviado: 12 Jan 2005 20:49
por managercorp
VALEU AUGUSTO, MAS E INOPERANTE
UM SET FILTER NA QTD DE REGISTRO QUE TENHO
FICA ABSURDAMENTE LENTO..
VALEU A ATENCAO
E SE TIVER MAIS ALGUMA SUGESTAO AGRADECO MUITO

Enviado: 12 Jan 2005 21:05
por Augusto
Prq vc não cria um DBF temporário com estrutura identica ao arquivo principal?? É mais rápido do que qqr SET FILTER... Tipo...

Código: Selecionar todos

sele 1
use SEU_TMP
zap
sele 2
use SEU_ARQ

do while .not. eof()
   if DT_CHEGADA <= PER_INICIO .and. DT_SAIDA >= PER_FIM
      sele 1
      append blank
      replace REG with SEU_ARQ->REG
      sele 2
   endif
   skip
enddo

sele 1
(imprime relatório)

Enviado: 12 Jan 2005 22:05
por Toledo
Alexandre,

Como você só tem a data de chegada e a data de saída no DBF, fica impossível utilizar o SEEK, mas o que você poderia fazer era verificar se a data de chegada ou a data de saída esta dentro do período que você deseja imprimir.

Por exemplo:
Legenda:
DC_ = Data de Chegada
DS_ = Data de Saída

PI_ = Período Inicial
PF_ = Período Final

Código: Selecionar todos

SELECT 1
USE SEU_DBF
GO TOP
DO WHILE !EOF()
 IF (DC_ >= PI_ .AND. DC_ <= PF_) .OR.;
    (DS_ >= PI_ .AND. DS_ <= PF_)
    @ PROW(), PCOL() SAY "Este reg está dentro do Período"
 ENDIF
 SKIP
ENDDO
Abraços,

E TOLEDO ?

Enviado: 18 Jan 2005 19:12
por managercorp
ACHO QUE VOCE NAO ACOMPANHOU O INICIO DO ASSUNTO
O MEU PROBLEMA NAO E FILTRAR, ISTO NAO TEM MISTERIO
O PROBLEMA E A VELOCIDADE DESTE FILTRO................
....................

Re: E TOLEDO ?

Enviado: 18 Jan 2005 21:41
por Augusto
managercorp escreveu:ACHO QUE VOCE NAO ACOMPANHOU O INICIO DO ASSUNTO
O MEU PROBLEMA NAO E FILTRAR, ISTO NAO TEM MISTERIO
O PROBLEMA E A VELOCIDADE DESTE FILTRO................
....................
Bem meu nobre... Não que eu queira falar pelos demais companheiros... Mas acho que nem eu nem nenhum deles, vamos poder te dar qqr outra solução uma vez que as que foram apresentadas, "normalmente" são as utilizadas para um problema como o seu, entretanto, se me permite uma crítica e com todo respeito, o maior erro não está na suposta "limitação" ou "deficiência" do Clipper para questões como a sua mais sim, no erro conceitual na criação da estrutura desse DBF, isso porque a quantidade de registros não interfere de forma "imperativa" na velocidade da pesquisa se vc optar pela criação de um DBF temporário para tal, sem contar que em casos como esse até a velocidade do processador e o tamanho de memória da máquina em uso, são fatores relevantes para uma resposta mais rápida na utilização de qualquer das soluções dadas.
Volto a afirmar que a 2a. alternativa apresentada por mim é a mais "perto" da solução do seu problema, exceto se algum outro colega mais experiente que o Toledo tenha algo a dizer.

Enviado: 20 Jan 2005 08:56
por Tim9
Oi Alexandre!

Fique esperto! pois na solução apresentada pelo Toledo não tem filtro, apesar que nesta solução vai ler todos os registros.

Vc tem índice desse arquivo com a chave da data de chegada?
Se tiver creio que vc pode usar o que já foi recomendado pelos colegas com o SET SOFTSEEK ON dentro da solução do Toledo. Pense!