Resumo somando horas - mantendo formato hh:mm

Alguém já precisou exibir no resumo totais no formato hh:mm ?
Estou precisando fazer um resumo somando as horas, mas, no formato hh:mm .

utilizo totailizacoes calculando direto no BD

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

No Scriptcase na Grid consulta você não vai conseguir somar diretamente o tempo.

Ai pode fazer essa dica; exemplo o tempo na sua tabela seja ‘time’ MySQL / MariaDB, transformar tudo em segundos, somar e converter em horas para apresentar o Total Geral.

Na SQL da Consulta:

SELECT
	LancamentoID,
	HoraInicial,
	HoraFinal,
	TIMEDIFF(HoraFinal, HoraInicial) AS TempoDecorridoHoras
FROM
	teste

Habilitar em Layotus o Rodapé:

No campo Valor no Layout do Rodapé:

Total Tempo Horas = [glo_TotalTempoHoras]

No Evento OnFooter:

/* Macro sc_lookup */

if (empty({sc_where_atual})){
	$sql ="
	SELECT
		TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)))),'%H:%i:%s') AS Tempo_Soma
	FROM
		teste
	";	
} else{
	$sql ="
	SELECT
		TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)))),'%H:%i:%s') AS Tempo_Soma
	FROM
		teste
	{sc_where_atual}
	";
}

sc_lookup(chk_soma, $sql);

if (empty({chk_soma[0][0]})) {
	[glo_TotalTempoHoras] = '00:00:00';
} else {
	[glo_TotalTempoHoras] = {chk_soma[0][0]};
}

Marcar a Variável global para ficar como saída:

Resultado Final:

Obrigado pela resposta.
Eu consigo fazer o calculo.
O que eu não consigo é no resumo mostrar os valores no formato de hh:mm.
Mas os valores em formato decimal fica correto.
Exemplo: 16 horas e 30 minutos fica 16,5, mas, o cliente quer ver-> 16:30

Obrigado pela resposta.
Eu consigo fazer o calculo.
O que eu não consigo é no resumo mostrar os valores no formato de hh:mm.
Mas os valores em formato decimal fica correto.
Exemplo: 16 horas e 30 minutos fica 16,5, mas, o cliente quer ver-> 16:30

O Resumo de horas pela própria GRID ela não vai fazer, apenas se usar a rotina que passei:
image

/* Macro sc_lookup */

if (empty({sc_where_atual})){
	$sql ="
	SELECT
		TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)))),'%H:%i:%s') AS Tempo_Soma
	FROM
		teste
	";	
} else{
	$sql ="
	SELECT
		TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)))),'%H:%i:%s') AS Tempo_Soma
	FROM
		teste
	{sc_where_atual}
	";
}

sc_lookup(chk_soma, $sql);

if (empty({chk_soma[0][0]})) {
	[glo_TotalTempoHoras] = '00:00:00';
} else {
	[glo_TotalTempoHoras] = {chk_soma[0][0]};
}

Mas você pode usar o SELECT para criar um botão que vai passar a seleção como
variável global para outra consulta que você vai fazer usando o SELECT de resumo
para transformar em horas:
SELECT
TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)))),’%H:%i:%s’) AS Tempo_Soma
FROM
teste

Com isso você vai ter a consulta principal detalhada e uma consulta somente para exibir os resumos do jeito que o cliente pediu, mas o Scriptcase sozinho não vai fazer a soma, mas você fazendo uma segunda consulta resumida e linkando ela com a primeira da certo.


Tem outra opção também criar uma tabela temporária e limpar e popular ela através de um app controle ou no evento OnValidate da grid usando a tabela temporária, com
os campos desejados e as horas acumuladas ao lado do tempo de cada linha, ai a linha
final de cada grupo ficaria com o total de horas acumuladas das linhas anteriores.

SET @TempoAcumuladoSegundos = 0;
SELECT
	LancamentoID,
	HoraInicial,
	HoraFinal,
	TIMEDIFF(HoraFinal, HoraInicial) AS TempoDecorridoHoras,
	@TempoSegundos := TIME_TO_SEC(TIMEDIFF(HoraFinal, HoraInicial)) AS TempoSegundos,
	@TempoAcumuladoSegundos :=	@TempoAcumuladoSegundos + @TempoSegundos AS SegundosAcumulado,
	SEC_TO_TIME(@TempoAcumuladoSegundos) AS HorasAcumuladas	
FROM
	teste	

Entendi. Muito obrigado pelas respostas.
Eu vou acrescentar estas opções nas que estou testando para implementar.
A que estou tentando fazer neste momento é apenas via javascript converter o resultado decimal em formato de hora, já depois de todos os calculos em decimal.
Para isto eu preciso substituir o código do botão “atualizar” na seleção da quebra de forma a acrescentar meu código para reformatar os valores.
Caso eu consiga eu posto por aqui, senão vou tentar utilizar uma das duas opções que você me mandou.

1 Curtida

Consegui fazer o que eu queria, mas, precisei criar um botão e executar o código abaixo no botão:
function atu(){
//var table = document.getElementById(“tb01”);
$(’#tb01 tr’).each(function(){
$(this).find(‘td’).each(function(){
console.log("\n");
console.log($(this));
var celula = $(this).text();
var cmin = ‘’;
if(celula.indexOf(",") != -1){
console.log(celula);
var aCel = celula.split(’,’);
var hora = aCel[0];
var min = aCel[1] * 60 / 100 ;
console.log(min.length);
min = min.toFixed(0);
if(min.length == 1){
cmin = “0” + min;
}else{
cmin = min;
}
$(this).text(hora + ‘:’ + cmin );

            }

            //do your stuff, you can use $(this) to get current cell
        })
    })
}