CONTEÚDO
- Visão geral
- Como implementar
- Boas práticas
- 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.
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.