Função para incrementar horas em AdvPL

Olá pessoal…

Hoje vou mostrar uma função que desenvolvi para incrementar horas em AdvPL, por exemplo, incrementar 1 hora na hora atual.

AdvPL

AdvPL

Essa função, recebe 3 parâmetros, a hora inicial (por exemplo, “20:00:00”), a quantidade de horas a ser somada (por exemplo, 5) e se irá ser 24 horas (.T. se for Sim, e .F. se for Não), no caso se for 24 horas o resultado respeitará o limite de “23:59:59”.

Abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zSomaHora
Função que gera a soma de horas através de um valor numérico passado
@author Atilio
@since 18/07/2017
@version 1.0
@type function
	@param cHora, characters, Hora Inicial a ser considerada
	@param nQtdHoras, numeric, Quantidade de Horas a ser somada
	@param l24Horas, logical, Utilizará a máscara de 24 horas? (Máximo de 23:59:59)
@example Exemplos abaixo:
	u_zSomaHora("00:00:00", 5)       //Retorna "05:00:00"
	u_zSomaHora("10:00:00", 5)       //Retorna "15:00:00"
	u_zSomaHora("20:00:00", 5)       //Retorna "01:00:00"
	u_zSomaHora("20:00:00", 5, .F.)  //Retorna "25:00:00"
/*/

User Function zSomaHora(cHora, nQtdHoras, l24Horas)
	Local aArea       := GetArea()
	Local cHoraFim    := ""
	Local nHora       := 0
	Default cHora     := Time()
	Default nQtdHoras := 0
	Default l24Horas  := .T.
	
	//Pega as horas e soma com a quantidade desejada
	nQtdHoras := Int(nQtdHoras)
	nHora     := Val(SubStr(cHora, 1, At(':', cHora)-1)) + nQtdHoras
	
	//Se for menor que 10 horas
	If nHora < 10
		cHoraFim := StrZero(nHora, 2)+":"+SubStr(cHora, At(':', cHora)+1, Len(cHora))
	
	Else
		//Se utilizar a máscara de 24 horas (até 23:59:59)
		If l24Horas
			If nHora > 23
				nHora := nHora - (24 * Int(nHora / 24))
			EndIf
			cHoraFim := StrZero(nHora, 2)+":"+SubStr(cHora, At(':', cHora)+1, Len(cHora))
			
		//Senão, pode ser qualquer máscara de hora (por exemplo, 100:59:59)
		Else
			cHoraFim := cValToChar(nHora)+":"+SubStr(cHora, At(':', cHora)+1, Len(cHora))
		EndIf
	EndIf
	
	RestArea(aArea)
Return cHoraFim

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação