Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Qui Dez 22, 2016 9:42 am Assunto: Contabilizar Dias |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
leo_cj Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Dez 22, 2016 10:15 am Assunto: |
|
|
como serão apresentadas as datas?
banco de dados ou o usuário vai informar? |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Qui Dez 22, 2016 10:22 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
imex Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Dez 22, 2016 10:56 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
hisley Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Sábado, 2 de Outubro de 2010 Mensagens: 1
|
Enviada: Qui Dez 22, 2016 8:22 pm Assunto: Re: Contabilizar Dias |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Seg Dez 26, 2016 10:38 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
imex Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Dez 31, 2016 10:35 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
edsedsrp Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Terça-Feira, 3 de Junho de 2014 Mensagens: 39
|
Enviada: Qua Jan 04, 2017 3:39 pm Assunto: VEJA SE ENTENDI |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Qua Jan 04, 2017 11:26 pm Assunto: Re: VEJA SE ENTENDI |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Qua Jan 04, 2017 11:35 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
imex Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jan 05, 2017 9:39 am Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
mrjorio Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Segunda-Feira, 24 de Setembro de 2012 Mensagens: 85
|
Enviada: Dom Jan 15, 2017 4:29 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
imex Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jan 16, 2017 8:48 pm Assunto: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
|