Página 1 de 1

Problema com Datas

Enviado: 04 Out 2011 17:18
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?

Problema com Datas

Enviado: 04 Out 2011 21:48
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!

Problema com Datas

Enviado: 05 Out 2011 11:25
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!

Problema com Datas

Enviado: 05 Out 2011 12:45
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

Problema com Datas

Enviado: 05 Out 2011 14:49
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!

Problema com Datas

Enviado: 05 Out 2011 17:33
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.