Sempre que temos algum processamento demorado, temos que avisar o usuário qual o status desse processamento e ajudar a identificar travamentos

Hoje vou deixar um exemplo com algumas possiveis barras de progresso.

Se souber de mais alguma me avise que incluo na rotina

 

#Include "Protheus.ch"
#Include "TopConn.ch"
  

/*/{Protheus.doc} SPPROGR
Função SPPROGR, exemplo de uso de barras de progresso
@param Não recebe parametros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Mar|2020
/*/
User Function SPPROGR(lLoop)          
Local nTipo as Numeric
default lLoop := .T.

//Seleção qual tipo de progresso deseja visualizar
nTipoRegua := Aviso('Atenção', 'Qual barra de progresso gostaria de executar?', {'FWMsgRun', 'Processa','MsAguarde', 'MsNewProcess', 'MsgRun','RptStatus', 'Fechar'}, 2)


//Conforme botão selecionado, monta a régua
If nTipoRegua == 1 
    FwMsgRun(,{|oSay|U_TDRFW1(oSay)},'Processando',"",)
ElseIf nTipoRegua == 2
    Processa({|| U_TDRFW2()}, "Calculando...")
ElseIf nTipoRegua == 3
     MsAguarde({|| U_TDRFW3()}, "Aguarde...", "Processando Registros...")
ElseIf nTipoRegua == 4
    oProcess := MsNewProcess():New({|| U_TDRFW4(oProcess)}, "Processando...", "Aguarde...", .T.)
    oProcess:Activate()
ElseIf nTipoRegua == 5
    MsgRun( "Processando" ,, {|| u_TDRFW5() } )
ElseIf nTipoRegua == 6
    RptStatus({|| u_TDRFW5()}, "Aguarde...", "Executando rotina...")
else
    lLoop := .F.
EndIf


If lLoop//chama a rotina novamente apos o processamento selecionado, até selecionar fechar
    u_SPPROGR()
EndIf

Return .T.

  
/*
Exemplo de uso de FWMSGRUM
*/
user Function TDRFW1(oSay)
Local nTotal as Numeric
Local _ni as Numeric
nTotal := 20
For _ni := 1 to nTotal
    //oSay
    Sleep( 500 ) // Para o processamento por 1/2 segundo
Next
Return .t.


/*
Exemplo de uso de PROCESSA
*/
user Function TDRFW2()
Local nTotal as Numeric
Local _ni as Numeric
nTotal :=30
ProcRegua(nTotal) //seta o total de registros
For _ni := 1 to nTotal
    IncProc("Processando registro " + cValToChar(_ni) + " de " + cValToChar(nTotal) + ", aguarde.")
    PROCESSMESSAGES() //Esse methodo deixa o processamento mais lento pois vai atualizar a tela todo momento, para melhor performance, remova esta parte
    Sleep( 500 ) // Para o processamento por 1/2 segundo
Next
Return .t.



/*
Exemplo de uso de MSAGUARDE
*/
user Function TDRFW3()
Local nTotal as Numeric
Local _ni as Numeric
nTotal := 30
ProcRegua(nTotal) //seta o total de registros
For _ni := 1 to nTotal
    MsProcTxt("Analisando registro " + cValToChar(_ni) + " de " + cValToChar(nTotal) + ", aguarde.")
    PROCESSMESSAGES()
    Sleep( 500 ) // Para o processamento por 1/2 segundo
Next
Return .t.



/*
Exemplo de uso de MsNewProcess
*/
user Function TDRFW4(oObj)
Local nTotal as Numeric
Local nTotal2 as Numeric
Local _ni as Numeric
Local _nj as Numeric
nTotal := 5
nTotal2 := 12

oObj:SetRegua1(nTotal) //Total da barra superior
For _nj := 1 to nTotal

    oObj:IncRegua1("Analisando registro " + cValToChar(_nj) + " de " + cValToChar(nTotal) + "...")
    PROCESSMESSAGES()
    oObj:SetRegua2(nTotal2) //Total da barra Inferior
    For _ni := 1 to nTotal2
        oObj:IncRegua2("Posição " + cValToChar(_ni) + " de " + cValToChar(nTotal2) + "...")
        PROCESSMESSAGES()
        Sleep( 500 ) // Para o processamento por 1/2 segundo
    Next

Next _nj

Return .t.



/*
Exemplo de uso de MSGRUN
*/
user Function TDRFW5()
Local nTotal as Numeric
Local _ni as Numeric
nTotal := 60
For _ni := 1 to nTotal
    Sleep( 500 ) // Para o processamento por 1/2 segundo
Next
Return .t.




/*
Exemplo de uso de RptStatus
*/
user Function TDRFW6()
Local nTotal as Numeric
Local _ni as Numeric
nTotal := 60
SetRegua(nTotal)
For _ni := 1 to nTotal
    IncRegua()
    Sleep( 500 ) // Para o processamento por 1/2 segundo
Next
Return .t.

 

O código fonte desse e outros exemplos podem ser encontrados em nosso git.

Post interessantes:

Aprenda a instalar o Protheus aqui.

Retornar datas por extenso aqui.

Aprenda a diferença de path relativo e absoluto aqui.

Dúdivas e sugestões, entre em contato.

Obrigado e até a próxima!

Categorias: ADVPL - Dicas

0 comentário

Deixe um comentário