Aguardar milésimos de segundo | ABAP Warrior

Aguardar milésimos de segundo

Timer
Há algum tempo postei sobre o comando WAIT UP TO, que faz com seu programa aguarde um determinado tempo em segundos.

E se fosse necessário aguardar um tempo bem específico, algo menor que um segundo??? Com o comando WAIT UP TO não seria possível, pois o tempo mínimo que ele aceita é um segundo. Mas calma, existe como adaptar uma solução técnica pra isso.


Você pode estar se perguntando: mas pra que eu precisaria aguardar menos de 1 (um) segundo??? Sua pergunta faz sentido. Quem aguarda 1/2 (meio) segundo pode perfeitamente aguardar 1 (um) segundo. O problema é quando falamos de grandes quantidades de registros em massa. Se existir um processamento de 300 (trezentos) registros e for necessário colocar uma espera de 1 (um) segundo entre cada registro, já estamos falando de 5 (cinco) minutos de atraso neste processo.




Onde isso é aplicável ?


Participei de um projeto logístico onde foram desenvolvidos programas de impressão de etiquetas de produtos nos processos de recebimento e expedição. Resumidamente, para cada produto processado no estoque do depósito era criada uma etiqueta de identificação do produto dentro do processo. Para que o processo operacional funcionasse corretamente, as etiquetas precisavam ser impressas numa ordem determinada. Se não saíssem na ordem poderiam causar alguma confusão na operação. Com um processamento muito rápido no servidor, praticamente instantâneo, as ordens de impressão eram criadas praticamente juntas, nos mesmos hora, minuto e segundo.

Como garantir que as impressões cheguem na ordem correta para impressão, se são criadas todas praticamente no mesmo instante??? Tínhamos duas opções. A primeira era mudar a estrutura do programa para, ao invés de criar uma etiqueta por ordem de impressão, criar uma única ordem de impressão com paginação por etiqueta. A segunda opção era colocar um pequeno atraso entre a criação de cada etiqueta para que cada ordem de impressão pudesse ser processada única e individualmente.

A primeira opção, embora pareça a solução ideal, representaria um enorme desvio de tempo no projeto. Não impactaria apenas no momento da impressão, mas também seria necessário desenvolver uma série de outros controles. Foi então que optamos pela segunda opção.

Com o comando WAIT UP TO poderíamos fazer um atraso de no mínimo 1 (um) segundo entre cada etiqueta. Mas em cenários com muitos produtos poderia representar um perda significativa no tempo de processamento. Então surgiu a necessidade de aguardar menos de 1 (um) segundo. Seria necessário aguardar milésimos de segundo.

Esse foi apenas um exemplo, mas com certeza existem vários cenários onde esse macete pode ser aplicado.

Codificação


Será necessário declarar três variáveis do tipo TIMESTAMPL.

DATA: l_ts1 TYPE timestampl,
      l_ts2 TYPE timestampl,
      l_ts3 TYPE timestampl.

Apenas sugestão de declaração.

Depois é necessário colocar a codificação, abaixo, no ponto do programa onde será necessário aguardar o tempo.

GET TIME STAMP FIELD l_ts1.
DO.
  GET TIME STAMP FIELD l_ts2.
  l_ts3 = l_ts2 - l_ts1.
  IF l_ts3 GT '0.2'.
    EXIT.
  ENDIF.
ENDDO.

Primeiro existe um comando GET TIME STAMP jogando o valor de data, hora, minuto, segundo e milésimos para dentro da variável L_TS1. Depois dentro do laço DO...ENDDO existe outro comando GET TIME STAMP jogando um valor mais atual de data, hora, minuto, segundo e milésimo para dentro da variável L_TS2. Já a variável L_TS3 recebe a diferença das variáveis L_TS1 e LTS2. Quando o valor de L_TS3 for maior que 200 (duzentos) milésimos de segundo o comando EXIT faz com que o laço DO...ENDDO seja abandonado.

No exemplo acima, a codificação faz aguardar um 200 milésimos de segundo. Você pode alterar este número conforme sua necessidade.

E você, já precisou de algo parecido???
Um grande abraços e até a próxima.
2016-03-12T16:44:00-03:00 2017-04-15T15:32:07Z
Nenhum comentário:
Related Posts Plugin for WordPress, Blogger...