Totalizar Horas(RESOLVIDO)

Bom dia Amigos,

Sei que esse tópico já foi mais do que discutido aqui, mas estou tentando conseguir totalizar as horas usando a macro do scriptcase e não funciona de jeito nenhum.

Temos 3 campos - hora_inicio, hora_retorno, total_descanso, os 3 campos são do tipo “time” e estamos usando uma cópia que pegamos aqui no fórum, mas não tem jeito de funcionar, segue abaixo o código.

Poderiam me ajudar e me mostrar aonde estou errando? Desde já agradeço

**Inicio
$descanso = sc_time_diff({hora_retorno}, “hh:ii”, {hora_inicio}, “hh:ii”); // Calcula diferença devolve matriz
$totalhoras = $descanso[0]; // Recebe horas da matriz
$totalominutos = $descanso[1]; // Recebe minutos da matriz

{total_descanso} = $totalhoras; // Atribui a soma de horas ao campo

OBS: o formato de horas já coloquei em maiúsculo e não resolve e outra coisa, esse cálculo é feito dentro de um grid view, no evento ajax onchange

fim*****

Amigos peço-lhes ajuda!!

Eu calculo direto do BD com o SQL abaixo:

SELECT
cartaoID, emissao, data_mov, hs_in, hs_out, hs_brk_in,
hs_brk_out, obs, funcID, status, loja_intervalo,tp_lanche,tp_atraso,
@t_hs := SUBTIME(hs_out,hs_in) as t_horas,
@t_int:= SUBTIME(hs_brk_in,hs_brk_out) as t_intervalo,
@dif_i:= IF(tp_lanche=‘S’,@t_int, if(@t_int>loja_intervalo,SEC_TO_TIME(TIME_TO_SEC(@t_int) - TIME_TO_SEC(loja_intervalo)),0) ) as dif_intervalo,
@dif_hs := SEC_TO_TIME(TIME_TO_SEC(@t_hs) - TIME_TO_SEC(@dif_i)) as dif_horas
FROM cartao_ponto
WHERE (funcID = ‘[sm_global_func]’) AND
(data_mov BETWEEN ‘[dt_inicio]’ AND ‘[dt_fim]’)

Obrigado Pessanha,

vou tentar fazer aqui e posto o resultado.

Valeu!!!

Uma pergunta, eu gostaria que enquanto a pessoa estiver digitando as horas, ele já calcule o total de horas de descanso e ao final também as horas trabalhadas, já subtraindo o descanso.

Então como não está gravado no banco ainda, acho que não seria possível usar como você mandou ou seria?

Alguém mais poderia me dar uma mãozinha, estou batendo cabeça nisso…

Agradeço

Sim!

você pode usar este mesmo SQL, usando o “sc_lookup” no onAfterinsert. (Voce tem que adaptar o exemplo abaixo)

sc_lookup(ds,“SELECT
cartaoID, emissao, data_mov, hs_in, hs_out, hs_brk_in,
hs_brk_out, obs, funcID, status, loja_intervalo,tp_lanche,tp_atraso,
@t_hs := SUBTIME(hs_out,hs_in) as t_horas,
@t_int:= SUBTIME(hs_brk_in,hs_brk_out) as t_intervalo,
@dif_i:= IF(tp_lanche=‘S’,@t_int, if(@t_int>loja_intervalo,SEC_TO_TIME(TIME_TO_SEC(@t_int) - TIME_TO_SEC(loja_intervalo)),0) ) as dif_intervalo, <----- aqui, uso para subtrair
@dif_hs := SEC_TO_TIME(TIME_TO_SEC(@t_hs) - TIME_TO_SEC(@dif_i)) as dif_horas
FROM cartao_ponto
WHERE (funcID = ‘[sm_global_func]’) AND
(data_mov BETWEEN ‘[dt_inicio]’ AND ‘[dt_fim]’)”);

if( !empty({ds}) ) {

   //resultado
   {tot_intervalo} = {ds}[0][14];
   {tot_horas}     =  {ds}[0][13];

}

Informo que tentei com o método acima, mas por algum motivo não deu certo!!

Agradeço a paciência!!

Marcelo

Marcelo veja se esse modelo te ajuda.

$times = array(
{tempo1},
{tempo2},
);

$seconds = 0;

foreach ( $times as $time ){
list( $g, $i, $s ) = explode( ‘:’, $time );
$seconds += $g * 3600;
$seconds += $i * 60;
$seconds += $s;
}

$hours = floor( $seconds / 3600 );
$seconds -= $hours * 3600;
$minutes = floor( $seconds / 60 );
$seconds -= $minutes * 60;

// echo $hours . ‘:’ . $minutes . ‘:’ . $seconds;

$tempo_total = $hours . ‘:’ . $minutes . ‘:’ . $seconds;

{tempo_total} = $tempo_total;

Utilizei o código citado e tive resultado esperado trabalhando com horas possitivas. Porém, qdo preciso trabalhar com horas negatívas o resultado já não foi o mesmo.

Meu problema é o seguinte, tenho um banco de horas onde alguns funcionários tem saldo positivo de horas e outro com déficit ex: funcionário no final do mês cumpriu 5h a menos então seria somado as suas horas o valor de 5h negativas .

Imaginando que o funcionário tinha saldo positivo de 1:00 vou acrescentar -5:00 tendo o total de -4:00.

Infelizmente não é isso que ocorre qdo faço a subtração utilizando o código acima.

Alguém teria alguma ideia de como resolver isso?

Amigos, o calculo da diferença de horas entre dois campos DateTime pode ser feito usando o comando SQL abaixo.

SELECT REPLACE(ROUND(TIMEDIFF(‘2016-02-25 17:00:00’, ‘2016-02-25 10:15:00’)/10000,2),’.’,’:’);

Neste exemplo o resultado é 6:45

marcelo.mytecnologia: [Editar]
Boa Noite,

Após diversas tentativas e frustrações resolvi meu problema através de uma trigger no Banco MySql. Para quem tem a mesma dificuldade, segue a resolução que utilizei:

No meu caso o Cliente queria um campo para ver total de horas de descanso, um campo para ver total de horas trabalhadas e um campo com o resultado do total de horas trabalhadas - total de horas de descanso. Assim mesmo SEPARADO, era a necessidade que o mesmo tinha…

No MySql você tem a opção de “GATILHO(portugues)” ou “Trigger(inglês)” ->Escolha a opção ON BEFORE UPDATE ou ON BEFORE INSERT o que lhe atender melhor…

SET NEW.total_descanso = TIMEDIFF(new.hora_retorno, new.hora_parada),
NEW.total_trabalhado = TIMEDIFF(new.hora_saida, new.hora_entrada),
NEW.diferenca = TIMEDIFF(new.total_trabalhado, new.total_descanso)

Para quem ainda tiver com dúvida, no scriptcase não é preciso fazer nada, quando você clicar para inserir ou atualizar o banco dispara a TRIGGER automaticamente…

Obrigado a todos que tentaram e me ajudaram de alguma forma!!!