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!
0 comentário