Olá pessoal…
Visto a necessidade de converter um valor numérico para o padrão de horas (HH:MM) em AdvPL, desenvolvi uma rotina genérica que visa suprir essa necessidade.
Para utilizá-la é bem simples, basta chamar a rotina passando o primeiro parâmetro o valor numérico, e o segundo o caracter de separação (como ‘h’ ou ‘:’), por exemplo, se eu quero mostrar 13h45, teria que fazer u_zVal2Hora(13.45, ‘h’).
Abaixo o código fonte utilizado:
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zVal2Hora
Converte valor numérico (ex.: 15.30) para hora (ex.: 15:30)
@author Atilio
@since 20/09/2014
@version 1.0
@param [nValor], Numérico, Valor numérico correspondente as horas
@param [cSepar], Caracter, Caracter de separação (ex.: 'h', ':', etc)
@return cHora, Variável que irá armazenar as horas
@example
u_zVal2Hora(1.50, 'h') //01h30
u_zVal2Hora(1.50, ':') //01:30
/*/
User Function zVal2Hora(nValor, cSepar)
Local cHora := ""
Local cMinutos := ""
Default cSepar := ":"
Default nValor := -1
//Se for valores negativos, retorna a hora atual
If nValor < 0
cHora := SubStr(Time(), 1, 5)
cHora := StrTran(cHora, ':', cSepar)
//Senão, transforma o valor numérico
Else
cHora := Alltrim(Transform(nValor, "@E 99.99"))
//Se o tamanho da hora for menor que 5, adiciona zeros a esquerda
If Len(cHora) < 5
cHora := Replicate('0', 5-Len(cHora)) + cHora
EndIf
//Fazendo tratamento para minutos
cMinutos := SubStr(cHora, At(',', cHora)+1, 2)
cMinutos := StrZero((Val(cMinutos)*60)/100, 2)
//Atualiza a hora com os novos minutos
cHora := SubStr(cHora, 1, At(',', cHora))+cMinutos
//Atualizando o separador
cHora := StrTran(cHora, ',', cSepar)
EndIf
ConOut("> zVal2Hora: "+cHora)
Return cHora
Update 26/10/2015: Conforme dica do usuário Caio, alterei o calculo da hora, onde agora é proporcional conforme os minutos (por exemplo, valor 50 equivale a 30 minutos).
Bom pessoal, por hoje é só.
Abraços e até a próxima.
