rrh 0 Denunciar post Postado Junho 7, 2013 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.599288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.5Horas Trabalhadas 3899288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.599288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.5Horas Trabalhadas 5799288 | ROGERIO | 12-06-2013 | SAB | 08:30 | 18:00 | 9.5 Compartilhar este post Link para o post Compartilhar em outros sites
mangakah 217 Denunciar post Postado Junho 7, 2013 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
rrh 0 Denunciar post Postado Junho 8, 2013 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
mangakah 217 Denunciar post Postado Junho 8, 2013 Explique melhor... Compartilhar este post Link para o post Compartilhar em outros sites
rrh 0 Denunciar post Postado Junho 8, 2013 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.599288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5 Horas Trabalhadas 3899288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.599288 | 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.599288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5 Horas Trabalhadas 3899288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.599288 | 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
mangakah 217 Denunciar post Postado Junho 8, 2013 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
rrh 0 Denunciar post Postado Junho 8, 2013 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.599288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5 Horas Trabalhadas 3899288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.599288 | 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
rrh 0 Denunciar post Postado Junho 8, 2013 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.599288 | ROGERIO | 07-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SEX | 08:30 | 18:00 | 9.599288 | ROGERIO | 08-06-2013 | SAB | 08:30 | 18:00 | 9.5 Horas Trabalhadas 3899288 | ROGERIO | 09-06-2013 | DOM | 08:30 | 18:00 | 9.599288 | 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
mangakah 217 Denunciar post Postado Junho 8, 2013 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
rrh 0 Denunciar post Postado Junho 8, 2013 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
mangakah 217 Denunciar post Postado Junho 9, 2013 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
rrh 0 Denunciar post Postado Junho 9, 2013 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
mangakah 217 Denunciar post Postado Junho 9, 2013 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
rrh 0 Denunciar post Postado Junho 9, 2013 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