Ir para conteúdo

POWERED BY:

Arquivado

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

rrh

Inserir linha de subtotal

Recommended Posts

Estou querendo fazer um controle de horas semanais trabalhadas. Estou precisando saber como fazer para a cada vez que o loop identificar a string "SAB" seja exibida uma nova linha com um subtotal da semana. Consegui chegar ao código abaixo:

 

<?php

include "config.php";


$sql = "SELECT baliza.*, bancohoras.* FROM baliza INNER JOIN bancohoras ON baliza.nrfun = bancohoras.nrfun WHERE bancohoras.nrfun = 99288 ORDER BY data";
   $query = mysql_query ($sql) or die ('Não foi possível conectar ao banco de dados.');


//DEFINE DIA PARA AUTOSOMA
$autosoma = "SAB";

while ($linha = mysql_fetch_array ($query)){

$horas_trabalhadas = strtotime ($linha['ht']) - strtotime($linha['hi']);
$horas[] = $horas_trabalhadas/3600;

   if ($linha['diasemana'] == $autosoma) {

       echo "Horas Trabalhadas ".array_sum ($horas)."<br />";
}


echo $linha['nrfun']." | ";
echo $linha['nome']." | ";
echo date ('d-m-Y',strtotime ($linha['data']) )." | ";
echo $linha['diasemana']." | ";
echo date ('H:i',strtotime ($linha['hi']) )." | ";
echo date ('H:i',strtotime ($linha['ht']) )." | ";

echo $horas_trabalhadas/3600;

$fun[] = $linha['nrfun'];


echo "<br />";

}
?>

 

 

Mas ele me informa o subtotal antes da linha que contém a string "SAB" e não após como eu preciso, vejam:

99288 | ROGERIO | 06-06-2013 | QUI | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5
Horas Trabalhadas 38
99288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5
Horas Trabalhadas 57
99288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então é só colocar essa instrução:

    if ($linha['diasemana'] == $autosoma) {


        echo "Horas Trabalhadas ".array_sum ($horas)."<br />";

}

Após todos os [inline]echo[/inline], ou seja, antes de:

$fun[] = $linha['nrfun'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

kkkkk... Quando não se tem o conhecimento tudo parece coisa de outro mundo! Obrigado.

 

Agora pode me ajudar a exibir subtotais por período? Do jeito que fiz o valor do subtotal está acumulativo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que postei acima com as alterações que você me passou eu tenho o seguinte resultado:

 

99288 | ROGERIO | 06-06-2013 | QUI | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 38
99288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 57

 

 

Agora eu preciso saber como afzer para exibir assim:

 

 

99288 | ROGERIO | 06-06-2013 | QUI | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 38
99288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 19

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente zerar o array [inline]$horas[/inline] na instrução:


if ($linha['diasemana'] == $autosoma) {

$horas = array();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou mas assim:

 

if ($linha['diasemana'] == $autosoma) {
	$total = array_sum ($horas); 
		$horas = array (); 

 

 

Agora sem querer abusar, como eu faço para exibir o subtotal sem chegar no SAB:

 

99288 | ROGERIO | 06-06-2013 | QUI | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 38
99288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 19

99288 | ROGERIO | 18-06-2013 | SEG | 08:30 | 18:00 | 9.5

Horas Trabalhadas 9.5

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui assim exibir o subtotal de horas antes de chegar no SAB:

 

<?php
	if ($linha['diasemana'] == $sab){
	  $total = array_sum ($horas); 
	   $horas = array (); //zera o array para reiniciar a soma

	if ($total >= $carga) {$n = "Crédito de " . ($total - $carga);}
	if ($total <= $carga) {$n = "Débito de " . ($carga - $total);}
		echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$total." Horas semanais | ".$n." - Horas</td></tr>";

	}

}
		echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$total = array_sum ($horas) ." Horas semanais | ".$n." - Horas</td></tr>";
?>

 

Porém quando chega no SAB a linha subtotal repete:

 

99288 | ROGERIO | 06-06-2013 | QUI | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 38
99288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5
99288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 19

99288 | ROGERIO | 18-06-2013 | SAB | 08:30 | 18:00 | 9.5

Horas Trabalhadas 9.5

Horas Trabalhadas 9.5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode, após terminado o laço while, verificar se o array [inline]$horas[/inline] não está vazio, se não estiver, apresente a soma.

($linha = mysql_fetch_array ($query)){
  // ...
}



if (!empty($horas)) {
   echo "Horas Trabalhadas ".array_sum ($horas)."<br />";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora sim, obrigado. Como o array $horas foi zerado agora não consigo um total geral. Como reverter isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma variável chamada [inline]$soma_total[/inline] (p.ex) antes do laço while e vá adicionando a essa variável o valor de [inline]$horas_trabalhadas[/inline] no decorrer do loop:

$soma_total = 0;
while ($linha = mysql_fetch_array ($query)) {
     $soma_total += $horas_trabalhadas;
     // ...

Já fora do loop, você poderá imprimir o valor total:

echo "O total de horas trabalhadas foi de " . $soma_total . "horas.";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Analisando ainda falta uma coisa. Nesta parte do código:

if (!empty($horas)){
	echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$stotal." Horas semanais | ".$n." Horas </font></td></tr>";
	}

as variáveis [inline]$total[/inline] e [inline]$n[/inline] estão repetindo o último resultado.

 

 

Resolvi assim, mas eu achei que ficou muito esquisito, pois repeti parte do código:

if (!empty($horas)){ 
        echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$stotal = array_sum($horas)." Horas semanais | "; 
if ($stotal >= $carga_semanal) {$n = "<font color='red'>Crédito de " . ($stotal - $carga_semanal);}
    if ($stotal <= $carga_semanal) {$n = "<font color=''>Débito de " . ($carga_semanal - $stotal);} 
echo $n." Horas </font></td></tr>";
        }

O que você acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você estiver usando o operador de atribuição ([inline]=[/inline]) ao invés do atribuidor de adição [inline]+=[/inline], a variável terá seu valor sobrescrito/substituído a cada iteração do laço. Assim, no final, o valor da variável será o do "último resultado"... Provavelmente é isso que está acontecendo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou postando o código completado com comentários com destaque em vermelho e negrito na parte em que tenho dúvida.

 

<?php

include "cabecalho.php";
include "config.php";


$carga_semanal = "40"; // Limite de horas por semana
$carga_mensal = 0;// Variável para armazenar o total de horas
$nrfun = $_GET["nrfun"];

if (empty ($nrfun)) {

echo "Não existem registros a exibir"; break;
}

$sql = "SELECT * FROM baliza WHERE nrfun = '$nrfun' ";
$query = mysql_query($sql);
$res = mysql_fetch_assoc ($query);

echo $res['nome'];


?>

<table class="tblGrid">

<?php

$sql = "SELECT * FROM bancohoras WHERE nrfun = '$nrfun' AND horas = 'T' OR horas = 'F' ORDER BY data ";

$query = mysql_query ($sql) or die (mysql_error());


$sab = "SAB";// Define o dia para inserir linha de subtotal

while ($linha = mysql_fetch_array ($query)){

$horas_trabalhadas = strtotime ($linha['ht']) - strtotime($linha['hi']);
$horas[] = $horas_trabalhadas/3600;

$carga_mensal += $horas_trabalhadas / 3600;

?>

<tr>
<td><?php echo date ('d-m-Y',strtotime ($linha['data'])) ?></td>
<td><?php echo $linha['diasemana'] ?></td>
<td><?php echo date ('H:i',strtotime ($linha['hi'])) ?></td>
<td><?php echo date ('H:i',strtotime ($linha['ht'])) ?></td>
<td><?php echo $linha['horas'] ?></td>
<td><?php echo $horas_trabalhadas/'3600' ?></td>
</tr>

<?php

if ($linha['diasemana'] == $sab)
{

$stotal = array_sum ($horas);
$horas = array (); //zera o array para reiniciar a soma

//Esses dois if aqui que eu repeti lá embaixo

if ($stotal >= $carga_semanal) {$n = "<font color='red'>Crédito de " . ($stotal - $carga_semanal);}
if ($stotal <= $carga_semanal) {$n = "<font color=''>Débito de " . ($carga_semanal - $stotal);}

echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$stotal." Horas semanais | ".$n." Horas </font></td></tr>";

}

}

if (!empty($horas)){

echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$stotal = array_sum($horas)." Horas semanais | ";
//Aqui ocorre a repetição que achei estranha
if ($stotal >= $carga_semanal) {$n = "<font color='red'>Crédito de " . ($stotal - $carga_semanal);}
if ($stotal <= $carga_semanal) {$n = "<font color=''>Débito de " . ($carga_semanal - $stotal);} echo $n." Horas </font></td></tr>";

}

echo "<tr bgcolor='#E6E6FA'><td colspan='6'>".$carga_mensal." Horas Trabalhadas no mês</td></tr>";

?>

</table>
<br />

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.