Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

leo_SJCampos

Somar Valores por Semana

Recommended Posts

Olá Galera,

Estou precisando de um HELP

Preciso fazer um relatorio semanal de valores vindo de uma base de dados(my-sql)

Acontece que esse relatorio precisa contar uma semana a partir do primeiro dia de cada mês, mesmo esse dia sendo na sexta feira, ou seja essa semana teria somente 2 dias... entendeu?

 

Nao tenho nem ideia de como fazer isso...

 

é mais ou menos assim:

 

11/2010

primeira semana : 100

segunda semana: 200

terceira semana: 250

quarta semana: 180

quinta semana: 70

 

o mes de novembro de 2010 tem 5 semanas, sendo que a ultima só tem 3 dias, por isso o valor é mais baixo..

fui claro?

alguem poderia me ajudar?

Valeu galera...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo saber o primeiro dia de cada mês é fácil dia 1 ^_^

Para saber o dia da semana utilize a função date() e a mktime().

 

$dia = 1; //primeiro dia do mês
$mes = date('m'); //mes atual
$ano = date('Y'); //ano atual

$dia_semana = date('w',mktime(0,0,0,$mes,$dia,$ano));

echo $dia_semana;
Desta forma você descobre qual dia da semana é o dia 1.

 

Depois é só fazer a lógica para separar as semanas.

 

Estude as funções que mensionei clicando nos links que lhe passei.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá amigo leo.

 

Primeira coisa é saber quantos dias tem no mês.

Para isso você precisa do ultimo dia do mês.

 

Isto você disse que já sabe fazer certo?

Tendo o ultimo dia do mês você vai fazer um loop por ele.

A exemplo de novembro um for onde $i é 1 e ele é menor ou igual a 30 dias

Dentro deste loop você vai pegar os dias da semana e quando chegar no sabado você muda a posição do array onde seria

$array[contador_da_semana][dia] = dia da semana; por exemplo.

 

use o exemplo que achar melhor:

 

$semanas = array();
$j = 1;
for ($i=1; $i<=$ultimoDia; $i++) {
     $semanas[$j][$i] = date('l',mktime(0,0,0,$mes,$i,$ano));
     if (date('w',mktime(0,0,0,$mes,$i,$ano))==6) $j++;
}
ou

 

$semanas = array();
$j = 1;
for ($i=1; $i<=$ultimoDia; $i++) {
     $semanas[$j][date('l',mktime(0,0,0,$mes,$i,$ano)] = $i;
     if (date('w',mktime(0,0,0,$mes,$i,$ano))==6) $j++;
}
ou ainda

 

$semanas = array();
$j = 1;
for ($i=1; $i<=$ultimoDia; $i++) {
     $semanas[$j][date('w',mktime(0,0,0,$mes,$i,$ano)] = $i;
     if (date('w',mktime(0,0,0,$mes,$i,$ano))==6) $j++;
}
Assim você vai ter um array bi-dimensional com as datas que precisa em separado

para poder usar em seu relatório e de quebra ainda pode usar um count() para saber

quantas semanas tem no mês. ^_^

 

Entendeu?

 

Se tiver dúvidas de como o array vai ficar use um echo '<pre>' seguido de um print_r()

para visualizar.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá.. desculpe a demora pela resposta.. mas tentei utilizar o seu exemplo com valores genericos, mas deu um erro...

 

$semanas = array();
$j = 1;
for ($i=1; $i<=30; $i++) {
     $semanas[$j][$i] = date('l',mktime(0,0,0,11,$i,2010);
     if (date('w',mktime(0,0,0,11,$i,2010))==6) 
                
                $j++;
	 	......
}

da erro na linha 4

 

Parse error: syntax error, unexpected ';' in C:\wamp\www\semana.php on line 5

 

o que é isso galera?

 

valeu pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo leo_SJCampos tente desta forma:

 

$semanas = array();
$j = 1;
for ($i=1; $i<=30; $i++) {
     $semanas[$j][$i] = date('l',mktime(0,0,0,11,$i,2010));
     if (date('w',mktime(0,0,0,11,$i,2010))==6) $j++;
}

Realmente eu me esqueci de um ')';

 

Mas já corrigi o post.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Periscuelo agora deu certo... só preciso de mais uma ajuda para que eu possa prosseguir...

 

com esse codigo, tenho esse retorno

 

$j = 1;
for ($i=1; $i<=$ultimo_dia; $i++) {
     $semanas[$j][$i] = date('l',mktime(0,0,0,$mes,$i,$ano));
     if (date('w',mktime(0,0,0,$mes,$i,$ano))==6)
	 	 $j++;
}

Array

(

[1] => Array

(

[1] => Wednesday

[2] => Thursday

[3] => Friday

[4] => Saturday

)

 

[2] => Array

(

[5] => Sunday

[6] => Monday

[7] => Tuesday

[8] => Wednesday

[9] => Thursday

[10] => Friday

[11] => Saturday

)

 

[3] => Array

(

[12] => Sunday

[13] => Monday

[14] => Tuesday

[15] => Wednesday

[16] => Thursday

[17] => Friday

[18] => Saturday

)

 

[4] => Array

(

[19] => Sunday

[20] => Monday

[21] => Tuesday

[22] => Wednesday

[23] => Thursday

[24] => Friday

[25] => Saturday

)

 

[5] => Array

(

[26] => Sunday

[27] => Monday

[28] => Tuesday

[29] => Wednesday

[30] => Thursday

[31] => Friday

)

 

)

 

 

Eu preciso somar os valores de um select do banco por semana... agora aonde eu coloco isso no codigo?

 

Valeu pela ajuda parceiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

que confuso isso..

 

exporte a tabela, e poste a estrutura aqui.

acredito que a função nativa WEEKOFYEAR()

 

pode te ajudar, assim como aqui:

http://forum.imasters.com.br/index.php?/topic/415706-logica-para-aniversariantes-da-semana/page__view__findpost__p__1638040

 

sei lá.. mas me parece que às vezes a galera gosta de se matar com php, qndo existe uma solução com sql

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso somar valores por semana, sendo que a semana sempre começa pelo primeiro dia do mês, independente em qual dia cair, mesmo se for sabado, a semana terá 1 dia..

 

A tabela esta assim

 

Cod fatur data

4022 185 2009-01-02

4024 843 2009-01-10

4025 266 2009-01-22

 

essa tabela tem muitos registros e preciso somar o campo fatur e exibir por semana

Compartilhar este post


Link para o post
Compartilhar em outros sites

roda assim cara:

 

SELECT WEEKOFYEAR(data) AS semana, data, SUM(valor)  FROM `fatura` GROUP BY semana
única coisa depois disso, é que você vai precisar isolar os meses.. pq sei lá, a semana 6 de Janeiro de 2009, tem alguns dias de Fevereiro tb(ou isso não importa)

?

 

--
-- Estrutura da tabela `fatura`
--

CREATE TABLE IF NOT EXISTS `fatura` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `valor` float NOT NULL,
  `data` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Extraindo dados da tabela `fatura`
--

INSERT INTO `fatura` (`id`, `valor`, `data`) VALUES
(1, 185, '2009-01-02'),
(2, 843, '2009-01-10'),
(3, 266, '2009-01-22'),
(4, 20, '2009-01-04'),
(5, 50, '2009-01-09'),
(6, 70, '2009-01-12');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu tentei desse jeito. mas ele ta somando a semana mesmo eu colocando no where que o mes era aquele corrente.. exemplo disso é o mês de fevereiro.. ele tem 5 semanas e a ultima só tem um dia.. e o valor que veio pra mim é de como se fosse uma semana cheia...

 

5	2010-02-06	1509
6	2010-02-12	649
7	2010-02-20	565
8	2010-02-27	977

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe amigo leo_SJCampos. Agora que entendi que o resultado final do que você quer

é a soma. Desta forma o array fica bem mais simples. Tente assim:

 

$ultimoDia = 30;
$mes = 11;
$ano = 2010;
$j = 1;
for ($i=1; $i<=$ultimoDia; $i++) {
     if ($i==1 || date('w',mktime(0,0,0,$mes,$i,$ano))==0) $semanas[$j]['inicial'] = date('Y-m-d',mktime(0,0,0,$mes,$i,$ano));
     if ($i==$ultimoDia || date('w',mktime(0,0,0,$mes,$i,$ano))==6) {
         $semanas[$j]['final'] = date('Y-m-d',mktime(0,0,0,$mes,$i,$ano));
         $j++;
     }
}
Desta forma basta fazer a query dentro de um loop.

 

$soma = array();
foreach ($semanas AS $nSemana=>$array) {
    $sql = 'SELECT SUM(valor) AS valor FROM fatura WHERE data BETWEEN \''.$array['inicial'].'\' AND \''.$array['final'].'\'';
    $query = mysql_query($sql) or die(mysql_error());
    $result = mysql_fetch_assoc($query);
    $soma[$mes][$nSemana] = $result['valor'];
}
Assim você vai ter um array com o mes, o número da semana do mês e o valor.

Acredito que isto te ajude.

 

Abraços.

 

P.S.

 

O Amigo William pelo jeito tem uma solução mais pratica.

Veja também o que ele tem a dizer. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai é só usar um pouquinho de criatividade (lógica) né amigo leo_SJCampos.

Já demonstrei como criar / trabalhar com array bidimensional.

Qual a dificuldade?

 

Tente assim:

 

foreach ($soma AS $nMes=>$array) {
    foreach ($array AS $nSemana=>$valor) {
        echo 'O mês é o '.$nMes.' a semana é a número '.$nSemana.' e o valor é '.$valor.PHP_EOL.PHP_EOL;
    }
}
Da uma estudada cara se não daque a pouco você não consegue imprimir o texto em

caixa alta junto com os valores das variáveis e vai perguntar denovo como faz. :P

É simples amigo, basta estudar um pouquinho o código.

 

É muito melhor ajudar quando agente ve que a pessoa está se esforçando pelomenos um pouquinho pra

entender o que esta fazendo. Que tal você começar a se esforçar?

 

http://www.php.net/manual

 

Com todas estas dicas basta agora você adaptar a idéia ao seu código.

 

Abraços.

 

P.S.

 

Se o amigo William apresentar algo mais simples via SQL, tente entender a query

dele ao invés de só utilizar e perguntar como faz pra imprimir x parte. Estude. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

exporta a tua tabela, e posta o sql de criação junto com alguns registros..

 

mas roda assim:

SELECT WEEKOFYEAR( `data` ) AS `semana` , `data` , SUM( `valor` )
FROM `fatura`
WHERE YEAR( `data` ) = '2010'
AND MONTH( `data` ) = '01'
GROUP BY `semana`
veja que você só precisa mudar o ano e o mês

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.