Como calcular um periodo com data e hora com o SUM?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Como calcular um periodo com data e hora com o SUM?

Mensagem por ANDRIL »

Pessoal deu branco...

Estou precisando calcular o periodo abaixo:

Código: Selecionar todos

SUM TOTAL to vlr FOR ctod(DATA_VENDA)>=ctod("24/12/2008".AND.HORA_V>="23:14".AND.;
ctod(DATA_VENDA)<=ctod("25/12/2008").AND.HORA_V<="05:13"

Notem que o periodo pega 2 dias com isso nao consigo obter o valor do calculo, dando zerado, sei que estou errando em algo.

Tem como fazer este calculo, ou mesmo usando DBEVAL() nao sei passar os parametros necessarios.

Fico no aguardo,

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por Maligno »

Veja o arquivo STD.CH no diretório INCLUDE da sua instalação e note que o comando SUM será convertido, na etapa de pré-processamento, numa chamada à função DBEVAL().

Outra coisa: sempre que comparar datas, use a função DTOS() para converter para o formato ANSI (AAAAMMDD). Só assim a comparação será feita de forma correta. Em qualquer linguagem sempre será assim.

Se tiver dúvida de como fazer qualquer tipo de comparação, um conselho: faça você mesmo num pedaço de papel, com alguns dados de teste. Às vezes isso facilita o raciocínio. O programa fará exatamente do mesmo jeito que você fizer. Se você fizer certo, claro. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por ANDRIL »

Obrigado Maligno!

Quanto ao DTOS() eu tambem utilizo, mais nao teve nenhum efeito no exemplo acima.

Veja se coloco:

Código: Selecionar todos

SUM TOTAL to vlr FOR ctod(DATA_VENDA)>=ctod("24/12/2008").AND.;
ctod(DATA_VENDA)<=ctod("25/12/2008")
Funciona normal. Acho que o problema é quando se coloca o HORARIO usando tudo .AND., embora nós entendemos, acho que o computador interpreta de outra maneira. É essa maneira que estou tentando descobrir...

Digo isso pq teoricamente o que citei no primeiro post, entendemos a logica, mais ja o micro não!

Até ja fiz uma função especifica para calcular (como se fosse o SUM) divida em 3 calculos ao final soma-se e obtem-se o resultado exato, mais se conseguisse entender a logica, poderia usar a expressao em comandos do proprio CLIPPER, como INDEX, TOTAL, APPEND facilitando e agilizando o processo.

Ate+,


Vou continuar procurando e se algum colega souber
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por Maligno »

Mas a expressão abaixo não funcionaria?

Código: Selecionar todos

SUM TOTAL to vlr FOR DTOS(DATA_VENDA) >= "20081224" .AND. HORA_V >= "23:14" .AND.;
DTOS(DATA_VENDA) <= "20081225" .AND. HORA_V <= "05:13"
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por Maligno »

Lembrando que HORA_V também deve estar no formato "99:99", como a constante de comparação. Mas se a hora foi assim gravada, deveria ter sido eliminado o sinal ":", que é um desperdício. Mas tudo bem. Na comparação os dois valores devem tê-lo ou não, ao mesmo tempo, claro.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por ANDRIL »

Entao:

Alterei a sua expressao que deu erro devido os tipos de dados ficou assim:

Código: Selecionar todos

set filter to DTOS(ctod(DATA_VENDA)) >= dtos(ctod("2008/12/24")) .AND.;
 HORA_V >= "23:14:00" .AND.DTOS(ctod(DATA_VENDA)) <= dtos(ctod("2008/12/25"));
 .AND. HORA_V <= "05:13:00"
Testei agora com SET FILTER mais nao retorna nenhum registro. A falha esta na expressao, mais onde??? Pra gente, esta claro o que queremos, mais no processamento nao encontra nenhum...

Sera impossivel....
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Como calcular um periodo com data e hora com o SUM?

Mensagem por Maligno »

Partindo do princípio que a data armazenada no banco é um campo DATE, a expressão DTOS(ctod(DATA_VENDA)) está errada, pois transforma a data em caractere, mas depois tenta convertar data para caractere de novo. Se for usar DTOS(), esqueça a outra função, porque senão não vai funcionar mesmo. O correto é DTOS(DATA_VENDA), simplesmente.

Mais: o formato da hora que você agora mostrou é diferente do formato anterior. Normalmente não faria diferença, já que a comparação funcionaria. Mas confira o formato, para não correr risco.

E outra: a expressão dtos(ctod("2008/12/25")) é desnecessária. Já que é uma constante, apenas troque para "20081225", simplesmente. Além do quê, dependendo da configuração do seu SET DATE, a conversão sairá errada.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder