Pular para o conteúdo principal
Esses dias estava precisando montar algo para apresentar o tempo que uma determinada rotina, uma parte eu pesquisei e consegui um função pronta, outra parte foi montada. Compartilhando abaixo a idéia.




/*/{Protheus.doc} TempRest

Exemplo de chamada da função.

** Fonte não compilado, pode haver erros de sintaxe. 

/*/
User Function APrefHR()
 Local nTimeIni  := Seconds()
        Local nI := 1
        Local nFim = 50000

        For Ni := 1 To nFIm
            conout(U_TempRest(nI, nFim,nTimeIni)[4])
        Next

Return Nil 
       
 





/*/{Protheus.doc} TempRest

Faz o calculo de tempo restante para um processo

@author TSC679 - CHARLES REITZ
@since 12/07/2016
@param nTotaisP, numeric, descricao
@param nIncrement, numeric, descricao
@param nTimeIni, numeric, descricao
@return return, return_description
/*/
User Function TempRest(nTotaisP,nIncrement,nTimeIni)
 Local cTempoRest := ""
 Local nHoraRest  := 0
 LOcal nSecAtual  := seconds()
 Local aRetFun  := {nil,nil,nil,nil}
 Local nSecAux  := 0

 If KillApp()
  MsgInfo("Sistema será finalizado.","Atenção - "+ProcName())
  KillApp(.T.)
 EndIf
 //retorna o tempo restante em horas
 //nHoraRest := noROund(((nTotaisP/nIncrement*(nSecAtual-nTimeIni))/60)/60,2)
 nSecAux  := Round(((nSecAtual-nTimeIni)/nIncrement)*(nTotaisP-nIncrement),2)
 nHoraRest :=  Round((nSecAux/60)/60,2)
 aRetFun[1] := U_zVal2Hor(nHoraRest,":")

 //retorna a previsão final da hora
 nHoraFinal := ROund(((nSecAux+nSecAtual)/60)/60,2)
 aRetFun[2] := U_zVal2Hor(nHoraFinal,":")
 aRetFun[3] := ROund((100*nIncrement)/nTotaisP,2)
 aRetFun[4] := cValToChar(nIncrement)+"/"+cValToChar(nTotaisP)+" - "+cValToChar(aRetFun[3])+"% | Prev.Rest.:"+aRetFun[1]+" - Prev.Final:"+aRetFun[2]

Return aRetFun
       
 




/*/{Protheus.doc} zVal2Hora
Converte valor numérico (ex.: 15.30) para hora (ex.: 15:30)

Fonte: https://terminaldeinformacao.com/2015/05/14/converter-valor-numerico-para-hora-em-advpl/

@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 zVal2Hor(nValor, cSepar)
    Local cHora := ""
    Local cMinutos := ""
    Default cSepar := ":"
    Default nValor := -1

    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)

Return cHora
       
 

Postagens mais visitadas deste blog

REST Protheus Converter charset CP1252 para UTF8 com Header Accept UTF-8

O Protheus possui um tag que pode ser utilizada para conversão para UTF8 de forma transparente, basta enviar no header da requisição a TAG ACCEPT com charset=UTF-8, também pode-se adicionar o appllication/json. Accept : application/json; charset=UTF-8 ou Accept : charset=UTF-8 Isso ajuda pois não precisa mais utilizar as funções DecodeUTF8 e EncodeUT8 pois o próprio rest já vai fazer isso.

Recursividade Minha Linda! Estrutura Produtos Protheus SG1

Fato! Depois que você conhece recursividade em sua vida tudo fica mais leve (rss... ) a recursividade pode ser infinita (pode não ta!) se for infinita vai dar problema, não pode. Mas a recursividade nos ajuda a deixar nosso sistema mais flexível e dinâmico para montar uma série de regras de negócio. Hoje vou falar exatamente da SG1, tabela TOTVS Microsiga Protheus que é utilizada para montar a estrutura de um produto dentro PCP (Planejamento e Controle de Produção). Isso séria algo que a recursividade iria ajudar. Na SG1 temos o campos G1_COD (Pai) e G1_COMP (Filho). G1_COD->G1_COMP->G1_COD->G1_COMP->G1_COD->G1_COMP Seria assim o fluxo da informação. Sem mais delongas, abaixo vou deixar o script para MSSQL para apresentar esses dados. Inté! WITH ESTRUT( CODIGO, COD_PAI, COD_COMP, QTD, PERDA, DT_INI, DT_FIM ,TRT ,RECNO, NIVEL ) AS ( SELECT G1_COD PAI, G1_COD, G1_COMP, G1_QUANT, G1_PERDA, G1_INI, G1_FIM,G1_TRT,SG1.R_E_C_N_O_, 1 AS NIVEL FR

Cadastro de funções ADVPL

FWDirRemove( cDir, nType, lComplete, lKillFiles ) Função para remover diretórios, com a vantagem de remover somente o ultimo nível ou todo o caminho. cDir                   Diretório a ser removido lComplete          Remove todo o caminho (.T.) ou apenas o ultimo nível (.F.) lKillFiles             Remove os arquivos antes de tentar remover o diretório FWMakeDir( cDir, lShowMsg ) Função para criar diretório com seus subdiretórios, com a vantagem de criar todo o caminho. cDir                    Diretório a ser criado lShowMsg          Exibe ou não mensagem caso não consiga criar o diretório FwNoAccent( cString ) Retira acentos de uma string cString                 String a ser retirado os acentos Exemplo: cString := 'O avião não pôde aterrissar de manhã' cString := FwNoAccent( cString ) // Retorna : 'O aviao nao pode aterrissar de manha' FWGetSX5( cTable, cKey ) Função de retorno dos campos de uma tabela no SX5 cTable                  Tabela para pesquisa no SX5. Par