Bom dia. Caros, Gostaria de tirar uma dúvida, preciso colocar uma barra de status de 'processamento' porém não tem o processo rodando com while por exemplo, existia uma alternativa ?
Bom dia. Caros, Gostaria de tirar uma dúvida, preciso colocar uma barra de status de 'processamento' porém não tem o processo rodando com while por exemplo, existia uma alternativa ?
Marcos,
Eu costumo utilizar a função FWMsgRun
.
Pois ela diferente de todas as demais, não faz IO entre o server e o client, o que prejudica a performance.
A animação dela é feita em CSS então o processamento dessa animação fica só no client.
E se você deseja trocar o label, existe essa possibilidade.
Documentação:
Recentemente o suporte da Totvs me informou que este método era apenas interno e era desaconselhável utilizar, mas pelo post do Daniel agora está público. Acredito ser a melhor forma de barra de processamento.
— Marcos Bispo Abrahão 07 de Jul de 2021Marcos, se entendi bem a tua pergunta, temos algumas situações semelhantes aqui. Temos uma rotina bastante longa e sequencial. Durante a execução dela, vamos atualizando a barra de progresso para o usuário não pensar que o sistema travou.
Fazemos isso usando a classe MsNewProcess() (https://tdn.totvs.com/display/public/PROT/MsNewProcess) Essa classe permite duas barras, a de cima para o processo completo e a de baixo para a etapa do momento.
Caso precise apenas de uma, existem outras possibilidades como Processa() e RptStatus(). Tem um post bem legal no Terminal de Informação mostrando as diferenças. (https://terminaldeinformacao.com/2019/05/08/como-fazer-barras-de-processamento-em-advpl/)
A rotina tem 10 etapas no nosso caso, usamos isso para definir o tamanho da régua e a cada etapa iniciada, atualizamos a régua. Fazemos o mesmo para os passos de cada etapa. Fica algo do tipo:
User Function funcPrinc()
Private oProcess
oProcess := MsNewProcess():New({|| funcExec()}, "Processando Registros", "Aguarde...", .T.)
oProcess:Activate()
Return
Static Function funcExec()
//Define o tamanho da régua 1
oProcess:SetRegua1(10) //O processo todo tem 10 etapas
//INICIA ETAPA 1
//Define o tamanho da régua 2 (itens da etapa)
oProcess:SetRegua2(4) //A etapa 1 tem 4 passos
//Atualiza Régua 1
oProcess:IncRegua1("Executando etapa 1...")
//Atualiza Régua 2
oProcess:IncRegua2("Inicializando...")
//....
//....
//Atualiza Régua 2
oProcess:IncRegua2("Processando dados...")
//....
//....
//Atualiza Régua 2
oProcess:IncRegua2("Validando Cálculos...")
//....
//....
//Atualiza Régua 2
oProcess:IncRegua2("Gravando Dados...")
//....
//....
//INICIA ETAPA 2
//Define o tamanho da régua 2 (itens da etapa)
oProcess:SetRegua2(2) //A etapa 2 tem 2 passos
//Atualiza Régua 1
oProcess:IncRegua1("Executando etapa 2...")
//Atualiza Régua 2
oProcess:IncRegua2("Enviando Dados para API...")
//....
//....
//Atualiza Régua 2
oProcess:IncRegua2("Gravando Resultado...")
//....
//....
Return
Bom dia, eu removi este método de meus fontes por não ser performático.
— Marcos Bispo Abrahão 07 de Jul de 2021