Problema com Datas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Problema com Datas

Mensagem por raquelreis »

Boa Tarde à Todos mais uma vez.

Pessoal tenho mais um problema com clipper/dbf.
Tenho uma tabela e preciso pegar o valor da última data, ou seja,
tenho na tabela os campos data, codigo, cor, tamanho.
Quando o codigo, a cor e o tamanho forem iguais aos informados pelo cliente
pegar a última data, pois no banco posso ter:
data codigo cor tamanho
01/02/2011 2 preto 5
05/07/2011 2 preto 5
30/09/2011 2 preto 5
Como pegar a data 30/09/2011?
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Problema com Datas

Mensagem por ANDRIL »

Nao sei como esta seu codigo, seus indices etc, baseando apenas como se resolver, eu faria um INDICE temporario, filtrando estas opcoes digitados pelo operador, na ordem dita por voce.

Código: Selecionar todos

//campos data, codigo, cor, tamanho

*--cria um idx para buscar os dados de codigo+cor+tamanho e de lambuja indexa da data mais nova para mais velha
*--estou supondo que data é do tipo date, codigo é numerico e cor/tamanho sao caracter
INDEX ON padl(CODIGO,6)+cor+tamanho+DESCEND(dtos(data)) TO idx1
go top

*--faz a busca atraves dos dados informados pelo operador
seek padl(CODIGO,6)+cor+tamanho

*--se encontrar, o primeiro registro sera o de data mais nova
if found()
   ultdata=data
   else
   wait"nada foi encontrado com estas informacoes. Tecle algo"
endif
Boa sorte!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Problema com Datas

Mensagem por raquelreis »

Bom dia,

Agradeço a ajuda Andril, porém eu já faço uma busca no dbf e preciso filtrar a data dentro de um período.

Código: Selecionar todos

SELE CADSAI
      SET ORDER TO 1
      SET SOFTSEEK ON
      SEEK SUBSTR(DTOC(pDTINI),7,4)+SUBSTR(DTOC(pDTINI),4,2)+SUBSTR(DTOC(pDTINI),1,2)+pCODIGO
      SET SOFTSEEK OFF

      TOTPRODUTO := 0

      WHILE CTOD(CADSAI->DATA) <= CTOD(dthoje) .AND. !EOF()
           
           IF CODIGO = pCODIGO .AND. COR = pCOR .AND. TAMANHO = pTAMANHO .AND.;
              (CTOD(CADSAI->DATA) >= pDTINI .AND. CTOD(CADSAI->DATA) <= pDTFIM) 
           
                TOTPRODUTO+= QUANT
          
           ENDIF
           SKIP
      END

Com isso eu pego quantas vendas que houve no período informado.
Mas ainda tenho que mostrar a data da última venda idependente do período.
Não sei se fui clara, desculpe.
Data/Codigo é do tipo caracter e Cor/Tamanho é do tipo numério.

Agradeço!
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Problema com Datas

Mensagem por ANDRIL »

Entao, vamos aproveitar a sua estrutura, usando o do while.

Código: Selecionar todos

   SELE CADSAI
   SET ORDER TO 1
   SET SOFTSEEK ON
   SEEK SUBSTR(DTOC(pDTINI),7,4)+SUBSTR(DTOC(pDTINI),4,2)+SUBSTR(DTOC(pDTINI),1,2)+pCODIGO
   SET SOFTSEEK OFF

   TOTPRODUTO := 0
   DatMaisNova=ctod(CADSAI)

   WHILE CTOD(CADSAI->DATA) <= CTOD(dthoje) .AND. !EOF()
     
     IF CODIGO = pCODIGO .AND. COR = pCOR .AND. TAMANHO = pTAMANHO .AND.;
       (CTOD(CADSAI->DATA) >= pDTINI .AND. CTOD(CADSAI->DATA) <= pDTFIM) 
        DatMaisNova=MAX( DatMaisNova, ctod(CADSAI) )
        TOTPRODUTO+= QUANT
     
     ENDIF
     SKIP
   END
? DatMaisNova

Nao testei, veja se funciona.
Abracos
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Problema com Datas

Mensagem por raquelreis »

Muito obrigada mais uma vez Andril,

Testei seu código e deu erro. Não entendi bem o que vc fez.

Mas CADSAI é o nome do meu dbf.
DATA é o campo do dbf que quero usar.
Mudei na linha abaixo e funcionou:

Código: Selecionar todos

DatMaisNova=ctod(DATA)
e

Código: Selecionar todos

DatMaisNova=MAX( DatMaisNova, ctod(DATA))
Porém acho que não consegui me espressar bem.
Tenho o seguinte
codigo cor tamanho data
01 preto 21 01/08/2011
01 preto 23 06/08/2011
01 branco 21 19/08/2011
01 branco 21 05/09/2011 -->ultima venda do produto 01 branco com tamanho 21
01 preto 21 10/09/2011 -->ultima venda do produto 01 preto com tamanho 21
No relatório exibo apenas as vendas ocorridas no período que o usuário informou (ex.: 01/08/2011 e 31/08/2011) e no fim do relatorio
quando foi a ultima venda do produto. Não importando mais o período que o usuário informou.
Fiz assim, mas ainda não funcionou.

Código: Selecionar todos

      SELE CADSAI
      SET ORDER TO 1
      SET SOFTSEEK ON
      SEEK SUBSTR(DTOC(pDTINI),7,4)+SUBSTR(DTOC(pDTINI),4,2)+SUBSTR(DTOC(pDTINI),1,2)+pCODIGO
      SET SOFTSEEK OFF

      DTMAISNOVA=CTOD(DATA)
      TOTPRODUTO := 0
      WHILE CTOD(CADSAI->DATA) <= CTOD(dthoje) .AND. !EOF()
       
           IF CODIGO = pCODIGO .AND. COR = pCOR .AND. TAMANHO = pTAMANHO .AND. (CTOD(CADSAI->DATA) >= pDTINI .AND. CTOD(CADSAI->DATA) <= pDTFIM) 
              TOTPRODUTO+= QUANT
           ENDIF
           SKIP
           IF CODIGO = pCODIGO .AND. COR = pCOR .AND. TAMANHO = pTAMANHO
              DTMAISNOVA=MAX(DTMAISNOVA,CTOD(DATA))
           ENDIF
           SKIP
      END
Agradeço!
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Problema com Datas

Mensagem por rochinha »

Amiguinhos,

Raquel enquanto voce faz a leitura tente armazenar a ultima data caso ela seja maior que a ja armazenada, ou seja:

- guarde a primeira data de venda do periodo
- pegue a proxima e compare, se for maior guarde, senao pule para a proxima.

Provavelmente voce tera de usar algum vetor para ir armazenando as ocorrencias de itens, pois podem ser muitos ou poucos e em cada uma das ocorrencias voce vai colocando ou nao a ultima movimentacao.

Tendo em vista que voce esta formando esta verificação on the fly. seu vetor tera tamanho X de 2, onde X é o numero variável de itens e 2 as dimensoes, uma para o codigo do item e outra para a ultima data.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder