Árvore de páginas

CONTEÚDO

  1. Visão geral
  2. Como implementar
  3. Boas práticas
  4. Funções extras

01. Visão geral

Esta técnica deve ser utilizada sempre que for executado um processo que seja longo ou que não seja conhecido o número total de registros a serem processados. A técnica permite manter o usuário informado sobre o andamento da execução e evita o erro "Tempo de inatividade excedido" na execução via Automação de Tarefas.


02. Como implementar

Passos para utilizar o utilitário:

  • Definição de uma variável do tipo handle;
  • Execução do programa utilitário utp/ut-acomp.p de forma persistente utilizando a handle definida anteriormente;
  • Execução da procedure pi-inicializar;
  • Execução da procedure pi-acompanhar para cada iteração;
  • Execução da procedure pi-finalizar ao final da iteração.

Exemplo:

/* definição de variáveis  */
DEFINE VARIABLE h-acomp   AS HANDLE     NO-UNDO.

/* executando de forma persistente o utilitário de acompanhamento */
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
RUN pi-inicializar IN h-acomp (INPUT "Executando rotina xpto").


/* inicio da execucao */

FOR EACH order NO-LOCK:     
    RUN pi-acompanhar IN h-acomp (INPUT STRING(order.order-num)).
END.

RUN pi-finalizar IN h-acomp.

/* fim da execucao */


03. Boas práticas

Em um cenário em que um programa chama A chama um programa B e ambos podem demorar ou processar um número elevado de registros e por isso devem utilizar o utilitário de acompanhamento, a handle do utilitário de acompanhamento deve ser compartilhada entre os programas, pra evitar processamento desnecessário.


Como não fazer:



Dessa maneira, cada chamada para a procedure pi-processa do Programa B irá armazenar e remover da memória uma instância do utilitário de acompanhamento, o que é desnecessário.

Esta maneira também prejudica a performance do programa, pois o utilitário possui uma tratativa para quando executado em Automação de Tarefas atualizar o dado apenas a cada um minuto, para diminuir o número de gravações ao banco, porém caso existam várias instâncias este controle não funcionará adequadamente.


/* progA.p */

/* definição de variáveis  */
DEFINE VARIABLE h-acomp   AS HANDLE     NO-UNDO.
DEFINE VARIABLE h-progB   AS HANDLE     NO-UNDO.

/* executando de forma persistente o utilitário de acompanhamento */
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
RUN pi-inicializar IN h-acomp (INPUT "Executando rotina xpto").

RUN prog/progB.p PERSISTENT SET h-acomp.

/* inicio da execucao */

FOR EACH usuar NO-LOCK:     
    RUN pi-processa IN h-progB (INPUT usuar.usuar-num).
END.

RUN pi-finalizar IN h-acomp.

IF VALID-HANDLE(h-progB) THEN
    DELETE PROCEDURE h-progB.

/* fim da execucao */
/* progB.p */

/* definição de variáveis  */
DEFINE VARIABLE h-acomp   AS HANDLE     NO-UNDO.

PROCEDURE pi-processa:
   DEFINE INPUT PARAM usuarNum AS INTEGER NO-UNDO.

	/* executando de forma persistente o utilitário de acompanhamento */
   RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
   RUN pi-inicializar IN h-acomp (INPUT "Executando rotina xpto").

   FOR EACH grp_usuar NO-LOCK WHERE grp_usuar.usuar-num = usuarNum:
      RUN pi-acompanhar IN h-acomp (INPUT grp_usuar.cod-grp).
   END.

   RUN pi-finalizar IN h-acomp.
END PROCEDURE.

/* fim da execucao */


Como fazer:


Dessa maneira, a instância do utilitário de acompanhamento é compartilhada entre os programas A e B, e caso o programa B seja executado de forma isolada, também estará utilizando o utilitário de acompanhamento sem erros.

/* progA.p */

/* definição de variáveis  */
DEFINE VARIABLE h-acomp   AS HANDLE     NO-UNDO.
DEFINE VARIABLE h-progB   AS HANDLE     NO-UNDO.

/* executando de forma persistente o utilitário de acompanhamento */
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
RUN pi-inicializar IN h-acomp (INPUT "Executando rotina xpto").

RUN prog/progB.p PERSISTENT SET h-acomp.
RUN set-handle-acomp IN h-progB (INPUT h-acomp).

/* inicio da execucao */
FOR EACH usuar NO-LOCK:     
    RUN pi-processa IN h-progB (INPUT usuar.usuar-num).
END.

RUN pi-finalizar IN h-acomp.

IF VALID-HANDLE(h-progB) THEN
    DELETE PROCEDURE h-progB.

/* fim da execucao */
/* progB.p */

/* definição de variáveis  */
DEFINE VARIABLE h-acomp       AS HANDLE     NO-UNDO.
DEFINE VARIABLE l-del-acomp   AS LOGICAL INITIAL NO NO-UNDO.

ASSIGN l-del-acomp = TRUE.

PROCEDURE pi-processa:
   DEFINE INPUT PARAM usuarNum AS INTEGER NO-UNDO.

   /* executando de forma persistente o utilitário de acompanhamento */
   IF NOT VALID-HANDLE(h-acomp) THEN
      RUN utp/ut-acomp.p PERSISTENT SET h-acomp.

   RUN pi-inicializar IN h-acomp (INPUT "Executando rotina xpto").

   FOR EACH grp_usuar NO-LOCK WHERE grp_usuar.usuar-num = usuarNum:
      RUN pi-acompanhar IN h-acomp (INPUT grp_usuar.cod-grp).
   END.

   IF VALID-HANDLE(h-acomp) AND l-del-acomp THEN
       RUN pi-finalizar IN h-acomp.
END PROCEDURE.

PROCEDURE set-handle-acomp.
    DEFINE INPUT PARAMETER p-acomp AS HANDLE NO-UNDO.

    ASSIGN h-acomp     = p-acomp
           l-del-acomp = FALSE.
END PROCEDURE.

/* fim da execucao */



03. Funções extras

As funções definidas a seguir tem utilidade apenas quando o utilitário de acompanhamento estiver sendo usado também em uma execução no Datasul Interactive, pois dizem respeito a comportamentos de tela.


Permite definir o título mostrado da janela de barra de processo.

RUN pi-seta-titulo IN h-acomp (INPUT "Exportando Arquivos").

Permite desabilitar ou habilitar o botão cancela, deve-se rodar os procedimentos pi-desabilita-cancela e pi-habilita-cancela logo após a pi-inicializar:

RUN pi-inicializar IN h-acomp (INPUT "Importando arquivos").
RUN pi-desabilita-cancela IN h-acomp .

Permite verificar se o processo foi cancelado, deve-se apenas rodar o procedimento pi-returna-status antes da pi-finalizar e este retornará uma das seguintes informações:

  • NOK: Caso o procedimento tenha sido cancelado;
  • OK: Caso o procedimento tenha sido executado até o fim.
RUN pi-retorna-status IN h-prog (OUTPUT c-status).

Para determinar um intervalo de tempo para a exibição do registro corrente do processamento, deve-se incluir no arquivo .ini utilizado pelo EMS uma nova chave nomeada “TimeAcomp” com o valor do tempo desejado em segundos no bloco de definições Datasul_EMS2. Exemplo:


[Datasul_EMS2]

Show-Report-Program=notepad.exe

TimeAcomp=60

Neste exemplo, o utilitário somente exibirá qual é o registro corrente a cada 60 segundos. Caso não seja informado nenhum valor para “TimeAcomp” ou ela nem mesmo existir no arquivo .ini, o utilitário continuará tendo o comportamento padrão de exibir cada registro processado.