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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | #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