ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Contabilizar Dias

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Qui Dez 22, 2016 9:42 am    Assunto: Contabilizar Dias Responder com Citação

Pessoal,

Tenho vários períodos em duas categorias.

Preciso compilar o total de dias em cada categoria tirando as repetições.
Exemplo:

Categoria A:

01/04/2000 até 20/06/2003
05/05/2001 até 26/08/2004
(...)

Categoria B:
01/04/2001 até 20/06/2013
05/09/2015 até 20/08/2016
02/02/2000 até 21/07/2003
(...)

Qual a melhor maneira de fazer? Acho que fazer no "feijão" vai consumir muito tempo e memória.

Obrigado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Dez 22, 2016 10:15 am    Assunto: Responder com Citação

como serão apresentadas as datas?

banco de dados ou o usuário vai informar?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Qui Dez 22, 2016 10:22 am    Assunto: Responder com Citação

leo_cj escreveu:
como serão apresentadas as datas?

banco de dados ou o usuário vai informar?


Banco de dados.

Vão ser lançados direto no banco para posterior compilação e apresentação do resultado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Dez 22, 2016 10:56 am    Assunto: Responder com Citação

Bom dia,

Como você pretende apresentar o resultado? Como seria fazer no "feijão"?


Editado pela última vez por imex em Dom Out 01, 2023 4:04 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
hisley
Novato
Novato


Registrado: Sábado, 2 de Outubro de 2010
Mensagens: 1

MensagemEnviada: Qui Dez 22, 2016 8:22 pm    Assunto: Re: Contabilizar Dias Responder com Citação

considere o intervalo

AMin até AMax

Queremos testar se Data1 até Data2 está no intervalo acima.

Use a Função InRange

If InRange(AValue,AMin,AMax) then

Caso seja verdade teremos que fazer a junção dos intervalos com datas coincidentes

AMin:=MinValue(AMin,Data1);

AMax:=MaxValue(Amax,Data2);

Utilize uma variável Double para calcular a diferença de dias.

Var Dias:Double;

Dias:=AMax-AMin;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Seg Dez 26, 2016 10:38 pm    Assunto: Responder com Citação

imex escreveu:
Bom dia,

Como você pretende apresentar o resultado? Como seria fazer no "feijão"?


Array com três campo ou uma tabela com 3 Colunas com todas as datas entre a menor data e maior data. Verificar se a data já tem a categoria preenchida senão preencher com a categoria e o motivo.

Depois fazer um select com um count () por categoria.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sáb Dez 31, 2016 10:35 am    Assunto: Responder com Citação

Não sei se entendi corretamente o contexto, mas acho que você teria que utilizar uma query para obter os registros por ordem de categoria e data inicial. Depois utilizaria um looping para ler os registros, calculando o total de dias entre a data inicial e a data final para acumular. O único detalhe é que você teria que guardar a data final do registro anterior em uma variável para verificar se ela é maior que a data inicial do registro atual; se for o calculo seria feito utilizando a data final do registro anterior e a data final do registro atual.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
edsedsrp
Novato
Novato


Registrado: Terça-Feira, 3 de Junho de 2014
Mensagens: 39

MensagemEnviada: Qua Jan 04, 2017 3:39 pm    Assunto: VEJA SE ENTENDI Responder com Citação

VC QUERIA QUE FOSSE ASSIM ??


01/04/2000 30/04/2000
10/04/2000 10/05/2000

SE FOSSE ESSE INTEVALO ENTAO SERIA 30 + 30 - 20 = 40 ???

OU SEJA DO DIA 10 AO 30 ESTA REPETINDO ENTAO NAO CONTARIA???
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Qua Jan 04, 2017 11:26 pm    Assunto: Re: VEJA SE ENTENDI Responder com Citação

edsedsrp escreveu:
VC QUERIA QUE FOSSE ASSIM ??


01/04/2000 30/04/2000
10/04/2000 10/05/2000

SE FOSSE ESSE INTEVALO ENTAO SERIA 30 + 30 - 20 = 40 ???

OU SEJA DO DIA 10 AO 30 ESTA REPETINDO ENTAO NAO CONTARIA???

edsedsrp exatamente.

A ideia é a seguinte (usando as datas do primeiro post):

Categoria A - total 1608
01/04/2000 - 20/06/2003 - 1175
05/05/2001 - 26/08/2004 - 433 (excluiu o tempo entre 05/05/2001 a 20/06/2003 que é repetido 776)

Categoria B - total 5237

02/02/2000 - 21/07/2003 - 1265
01/04/2001 - 20/06/2013 - 3622 (excluiu o tempo entre 01/04/2001 a 21/07/2003 que é repetido 840)
05/09/2015 - 20/08/2016 - 350

Caso ocorram intervalos completamente contidos em outros, ele apresenta o período, por ordem crescente de datas iniciais, e considera o saldo zero para aquela janela de tempo. Ex:

Categoria A - total 1608
01/04/2000 - 20/06/2003 - 1175
01/05/2000 - 01/06/2003 - 0
05/05/2001 - 26/08/2004 - 433

Isso para a verificação. Na impressão do relatório eu vou suprir aqueles que sejam iguais a zero.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Qua Jan 04, 2017 11:35 pm    Assunto: Responder com Citação

imex escreveu:
Não sei se entendi corretamente o contexto, mas acho que você teria que utilizar uma query para obter os registros por ordem de categoria e data inicial. Depois utilizaria um looping para ler os registros, calculando o total de dias entre a data inicial e a data final para acumular. O único detalhe é que você teria que guardar a data final do registro anterior em uma variável para verificar se ela é maior que a data inicial do registro atual; se for o calculo seria feito utilizando a data final do registro anterior e a data final do registro atual.

Espero que ajude


Essa é a ideia, mas considero isso meio como no "feijão". Antigo "método da bolha". Acho que processando N períodos para N clientes pode ser muito demorado.

Pensei em colocar algum parâmetro no SELECT que já identificasse os "períodos contidos" setando-os como zero e depois só executasse o looping para aqueles que não tivessem o 0 setado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jan 05, 2017 9:39 am    Assunto: Responder com Citação

Para termos uma ideia, qual a quantidade aproximada de períodos e clientes?
Qual banco de dados (e versão) você está utilizando? Acho que depende um pouco do BD utilizado, mas acredito que para identificar se o período está contido no anterior será necessário acessar o registro anterior e isso vai exigir em relação ao processamento da query, lembrando também que o trabalho na aplicação vai ser o mesmo em relação aos períodos que não forem "zero".
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mrjorio
Novato
Novato


Registrado: Segunda-Feira, 24 de Setembro de 2012
Mensagens: 85

MensagemEnviada: Dom Jan 15, 2017 4:29 pm    Assunto: Responder com Citação

imex escreveu:
Para termos uma ideia, qual a quantidade aproximada de períodos e clientes?
Qual banco de dados (e versão) você está utilizando? Acho que depende um pouco do BD utilizado, mas acredito que para identificar se o período está contido no anterior será necessário acessar o registro anterior e isso vai exigir em relação ao processamento da query, lembrando também que o trabalho na aplicação vai ser o mesmo em relação aos períodos que não forem "zero".


Períodos de 1 a mais ou menos 200.

Clientes por volta de 250.

Banco de dados SQLite3.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Jan 16, 2017 8:48 pm    Assunto: Responder com Citação

Não tenho nenhuma experiência com o SQLite, então posso estar enganado, mas pela pesquisa rápida que fiz me parece que o SQLite não possui uma função específica para acessar o registro anterior, parece que a alternativa seria utilizar uma subquery. Se for isso mesmo, acredito que a perda de performance na query para comparar os periodos não vai valer a pena.
Não sei quanto tempo demora para ler essa quantidade de registros no ambiente que você está utilizando, mas acho que o processamento a ser feito dentro do looping na aplicação é bem pequeno, teria basicamente 2 Ifs para fazer a comparação com o periodo anterior e uma subtração para obter a quantidade de dias.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB