Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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.
Explique melhor...
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
Tente zerar o array [inline]$horas[/inline] na instrução:
if ($linha['diasemana'] == $autosoma) {
$horas = array();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.
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
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 />";
}Agora sim, obrigado. Como o array $horas foi zerado agora não consigo um total geral. Como reverter isso?
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.";
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>";
}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>";
}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...
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 />
Então é só colocar essa instrução:
Após todos os [inline]echo[/inline], ou seja, antes de:
$fun[] = $linha['nrfun'];