Classe: tNewProcess

Cria uma tela de processamento, separada por janelas onde visualiza-se os Perguntes e o log de processamento, além dos parâmetros (SX6) e tabelas (SX5) da rotina (se houver). Ao confirmar o processamento, pode-se optar em exibir a régua de processamento da rotina. 

A partir da lib 20240520 quando implementados os controles da régua 1 (SetRegua1 e IncRegua1) e executada a rotina via scheduler por meio do "Agendamento" ou "Processamento em Segundo Plano", o usuário será notificado via EventViewer sobre o progresso do processamento (25%, 50%, 75% e Processamento Concluído).

Para maiores informações consulte EventViewer - Eventos de Progresso

Métodos

New

Método construtor da classe tNewProcess.
Sintaxe

tNewProcess(): New ( < cFunction>, [ cTitle], < bProcess>, [ cDescription], [ cPerg], [ aInfoCustom], [ lPanelAux], [ nSizePanelAux], [ cDescriAux], [ lViewExecute], [ lOneMeter], [lSchedAuto] ) --> Nil



Parâmetros


NomeTipoDescriçãoObrigatórioReferência
cFunctionCaracterNome da função que está chamando o objeto.X
cTitleCaracterTítulo da árvore de opções.

bProcessBloco de códigoBloco de execução que será executado ao confirmar a tela.X
cDescriptionCaracterDescrição da rotina

cPergCaracterNome do Pergunte (SX1) a ser utilizado na rotina.

aInfoCustomArray of RecordInformações adicionais carregada na árvore de opções. Estrutura:[1] - Nome da opção[2] - Bloco de execução[3] - Nome do bitmap[4] - Informações do painel auxiliar.

lPanelAuxLógicoSe .T. cria um novo painel auxiliar ao executar a rotina.

nSizePanelAuxNuméricoTamanho do painel auxiliar, utilizado quando lPanelAux = .T.

cDescriAuxCaracterDescrição a ser exibida no painel auxiliar.

lViewExecuteLógicoSe .T. exibe o painel de execução. Se falso, apenas executa a função sem exibir a régua de processamento.

lOneMeterLógico

Se .T. cria apenas uma régua de processamento.



lSchedAuto

Lógico

Se .T. habilita o botão de processamento em segundo plano (execução ocorre pelo Scheduler)

Disponivel a partir da lib 20240520





IncRegua1

Altera mensagem exibida da primeira régua de processamento.


Importante

A quantidade de chamadas do método IncRegua1 deve coincidir exatamente com o valor definido no método SetRegua1.  


Sintaxe

tNewProcess(): IncRegua1 ( [ cMsg] ) -->



Parâmetros


NomeTipoDescriçãoObrigatórioReferência
cMsgCaracterMensagem de processamento da régua.


IncRegua2

Altera mensagem exibida da segunda régua de processamento.



Sintaxe

tNewProcess(): IncRegua2 ( [ cMsg] ) -->



Parâmetros


NomeTipoDescriçãoObrigatórioReferência
cMsgArray of RecordMensagem de processamento da régua.


SaveLog

Grava log de processamento no SXU.
Sintaxe

tNewProcess(): SaveLog ( [ cText] ) -->



Parâmetros


NomeTipoDescriçãoObrigatórioReferência
cTextCaracterTexto para gravação do log



Exemplo:

oProcess:SaveLog("Gravação de log")


Observações

  • A filial gravada no log é sempre a filial utilizada durante a operação.
  • A data gravada no log é sempre a data de login informada no sistema.
  • O usuário gravado é sempre o usuário logado no sistema.

SetRegua1

Seta primeira régua de processamento.
Sintaxe

tNewProcess(): SetRegua1 ( [ nSet] ) →


Parâmetros

NomeTipoDescriçãoObrigatórioReferência
nSetNuméricoTamanho do processamento da régua


Exemplos

oProcess:SetRegua1(1)

SetRegua2

Seta segunda régua de processamento.


Sintaxe

tNewProcess(): SetRegua2 ( [ nSet] ) -->
Parâmetros


NomeTipoDescriçãoObrigatórioReferência
nSetNuméricoTamanho do processamento da régua.



Exemplos

oProcess:SetRegua2(1)


Processamento em Segundo Plano

A partir da lib 20240520 foi disponibilizada a opção de Processamento em Segundo Plano que possibilita o processamento da rotina em segundo plano pelo Scheduler.

Diferente da opção "Agendar" que necessita toda a parametrização de agendamento do Scheduler pelo usuário, a opção "Processamento em Segundo Plano" emite uma tarefa considerando os seguintes pontos:

  • Recorrência: Única
  • Usuário: Usuário logado no momento
  • Empresa/Filial: Empresa/Filial logada no momento
  • Data/hora execução: Data e hora atual
  • Módulo: Módulo logado
  • Rotina: A rotina que implementou o TnewProcess (conforme retorno da função funName())


Importante

  • Em versões de LIB anteriores a 20240520 o desenvolvedor deve fazer todo o tratamento para execução no scheduler, inclusive realizando o desvio para não instancia a classe TNewProcess;
  • Já a partir da lib 20240520 o objeto pode ser instanciado normalmente e inclusive executará automaticamente o código de bloco do parâmetro bProcess, devendo o desenvolvedor tratar apenas questões especificas da rotina que façam uso de interface gráfica;
  • Tendo implementado corretamente os controles de progresso por meio dos métodos SetRegua1 e IncRegua1, serão gerados automaticamente Eventos de Progresso no EventViewer para o usuário que solicitou o processamento (25%, 50%, 75% e Processamento Concluído);
    • Para geração dos eventos, necessário estar com dicionário da Lib atualizado por meio da execução do FwRebuildIndex;
    • Para maiores informações sobre Eventos de Progresso, consultar seção Eventos de Progresso do EventViewer.


TNewProcess simples

TNewProcess customizado



Exemplo
#INCLUDE "PROTHEUS.CH"
#INCLUDE "RWMAKE.CH"

Static Function SchedDef()
       // aReturn[1] - Tipo
       // aReturn[2] - Pergunte
       // aReturn[3] - Alias
       // aReturn[4] - Array de ordem
       // aReturn[5] - Titulo
Return { "P", "MTA410", "", {}, "tNewProc" }

/*/{Protheus.doc} tNewProc
    Exemplo de implementação da classe tNewProcess com opção de processamento em segundo plano
    @type  Function
    @author Bruno Pirolo
    @since 26/04/2024
    @return nil
/*/
Function tNewProc()
Local bProcess := {|oSelf| Executa(oSelf) }    
Local cPerg := "MTA410"  
Local aInfoCustom := {}
Local oProcess

//Adiciona opções customizadas
Aadd(aInfoCustom,{"Visualizar",{|oCenterPanel| visualiza(oCenterPanel)},"WATCH" })
Aadd(aInfoCustom,{"Relatorio" ,{|oCenterPanel| Relat(oCenterPanel) },"RELATORIO"})

//Instancia o objeto tNewProcess
oProcess := tNewProcess():New("tNewPro"                         /*cFunction*/    ,; 
                              "Teste MsNewProcess"              /*cTitle*/       ,; 
                              bProcess                          /*bProcess*/     ,; 
                              "Breve descrição da rotina"       /*cDescription*/ ,; 
                              cPerg                             /*cPerg*/        ,; 
                              aInfoCustom                       /*aInfoCustom*/  ,; 
                              .T.                               /*lPanelAux*/    ,; 
                              5                                 /*nSizePanelAux*/,; 
                              "Descrição do painel Auxiliar"    /*cDescriAux*/   ,; 
                              .T.                               /*lViewExecute*/ ,;
                              .F.                               /*lOneMeter*/    ,;
                              .T.                               /*lSchedAuto*/) 

Return

/*/{Protheus.doc} Executa
    Função de processamento
    @type  Static Function
    @author Bruno Pirolo
    @since 26/04/2024
    @param oProcess, object, Objeto da classe TNewProcess
    @return return_var, return_type, return_description
    @example
    (examples)
    @see (links_or_references)
/*/
static Function Executa(oProcess)   
Local nCountC5 as numeric
Local nCountC6 as numeric

DbSelectArea("SC5")
DbSetOrder(1)

//Calcula a quantidade de registros na tabela SC5
count to nCountC5

//Posiciona no topo da tabela
DbGotop()

/*Define a quantidade de registros que serão processados na régua 1 (deverá 
  corresponder exatamente a quantidade de chamadas do método IncRegua1)*/
oProcess:SetRegua1(nCountC5)         

//Percorre os registros da tabela SC5
While SC5->(!Eof()) 	
    //Incrementa a régua de processamento 1
    oProcess:IncRegua1("Lendo Pedido de Venda:" + SC5->C5_NUM)   

    DbSelectArea("SC6")	
    DbSetOrder(1) //C6_FILIAL, C6_NUM, C6_ITEM, C6_PRODUTO
    
    //Elimina filtros criados na tabela SC6
    DbClearFil()	
    
    //Filtra os registros da SC6
    Set Filter to SC6->C6_FILIAL == xFilial("SC5") .And. SC6->C6_NUM == SC5->C5_NUM	
    
    //Calcula a quantidade de registros na tabela SC5
    COUNT to nCountC6	
    
    //Posiciona no topo da tabela
    DbGotop()	

    /*Define a quantidade de registros que serão processados na régua 2 (deverá 
      corresponder exatamente a quantidade de chamadas do método IncRegua2)*/
    oProcess:SetRegua2(nCountC6)	
    
    While SC6->(!Eof())
        //Incrementa a régua de processamento 2
        oProcess:IncRegua2("Pedido: "+SC5->C5_NUM+" - Item: "+SC6->C6_ITEM)    		
        //Grava log do processo (estes dados serão apresentados na opção Log de Processos do componente)
        oProcess:SaveLog("Item: "+SC6->C6_ITEM)	   		
        Conout("Pedido: "+SC5->C5_NUM+" - Item: "+SC6->C6_ITEM)
        SC6->(DbSkip())	
    End        	
    
    SC5->(DbSkip()) 
End
Return

/*/{Protheus.doc} visualiza
    Função de teste customizada
    @type  Static Function
    @author Bruno Pirolo
    @since 26/04/2024
    @param oCenterPanel, object, Objeto do Painel
    @return Nil
/*/
Static Function visualiza(oCenterPanel)  	
    @ 65,10 Say "Visualiza" SIZE 80,10 OF oCenterPanel PIXEL
Return 

/*/{Protheus.doc} Relat
    Função de teste customizada
    @type  Static Function
    @author Bruno Pirolo
    @since 26/04/2024
    @param oCenterPanel, object, Objeto do Painel
    @return Nil
/*/
Static Function Relat(oCenterPanel)
@ 65,10 Say "Relatório" SIZE 80,10 OF oCenterPanel PIXEL
Return